From a57a2639f0d54cb562d3b9e29b706c903f631b03 Mon Sep 17 00:00:00 2001 From: Joseph Garrone Date: Sun, 29 Sep 2024 23:22:59 +0200 Subject: [PATCH 01/64] Reset --- .editorconfig | 16 - .github/FUNDING.yaml | 4 + .github/workflows/ci.yaml | 139 + .gitignore | 115 +- .prettierignore | 16 +- .prettierrc.json | 24 + .storybook/main.ts | 41 - .storybook/preview-head.html | 25 - .storybook/preview.ts | 14 - .storybook/tsconfig.doc.json | 10 - .storybook/tsconfig.json | 11 - .storybook/typings.d.ts | 4 - .vscode/extensions.json | 4 - .vscode/settings.json | 18 - LICENSE | 21 + README.md | 28 +- angular.json | 46 - eslint.config.js | 115 - package-lock.json | 18646 ---------------- package.json | 96 +- prettier.config.js | 25 - projects/keycloakify-angular/README.md | 24 - projects/keycloakify-angular/account/index.ts | 1 - .../account/ng-package.json | 6 - .../keycloakify-angular/account/public-api.ts | 15 - .../account/src/DefaultPage.ts | 52 - .../src/classes/component-reference.class.ts | 6 - .../src/containers/template.component.html | 125 - .../src/containers/template.component.ts | 71 - .../src/directives/attributes.directive.ts | 19 - .../account/src/directives/index.ts | 2 - .../src/directives/kc-class.directive.ts | 150 - .../src/pages/account/account.component.html | 153 - .../src/pages/account/account.component.ts | 30 - .../applications/applications.component.html | 153 - .../applications/applications.component.ts | 36 - .../federatedIdentity.component.html | 97 - .../federatedIdentity.component.ts | 27 - .../account/src/pages/log/log.component.html | 44 - .../account/src/pages/log/log.component.ts | 27 - .../pages/password/password.component.html | 131 - .../src/pages/password/password.component.ts | 105 - .../pages/sessions/sessions.component.html | 63 - .../src/pages/sessions/sessions.component.ts | 27 - .../src/pages/totp/totp.component.html | 258 - .../account/src/pages/totp/totp.component.ts | 27 - .../src/pipes/advanced-msg-str.pipe.ts | 13 - .../account/src/pipes/index.ts | 7 - .../account/src/pipes/input-type.pipe.ts | 15 - .../pipes/is-array-with-empty-object.pipe.ts | 16 - .../account/src/pipes/kc-sanitize.pipe.ts | 29 - .../account/src/pipes/msg-str.pipe.ts | 14 - .../account/src/pipes/to-array.pipe.ts | 15 - .../account/src/pipes/to-number.pipe.ts | 13 - .../account/src/services/index.ts | 1 - .../src/services/resource-injector.service.ts | 35 - projects/keycloakify-angular/login/index.ts | 1 - .../keycloakify-angular/login/ng-package.json | 6 - .../keycloakify-angular/login/public-api.ts | 17 - .../login/src/DefaultPage.ts | 194 - .../src/classes/component-reference.class.ts | 5 - ...tons-multi-valued-attribute.component.html | 24 - ...uttons-multi-valued-attribute.component.ts | 138 - .../field-errors/field-errors.component.html | 15 - .../field-errors/field-errors.component.ts | 29 - .../group-label/group-label.component.html | 30 - .../group-label/group-label.component.ts | 42 - .../login/src/components/index.ts | 11 - .../input-field-by-type.component.html | 63 - .../input-field-by-type.component.ts | 47 - .../input-tag-selects.component.html | 29 - .../input-tag-selects.component.ts | 137 - .../input-tag/input-tag.component.html | 49 - .../input-tag/input-tag.component.ts | 96 - .../logout-other-sessions.component.html | 19 - .../logout-other-sessions.component.ts | 31 - .../password-wrapper.component.html | 15 - .../password-wrapper.component.ts | 57 - .../select-tag/select-tag.component.html | 31 - .../select-tag/select-tag.component.ts | 95 - .../textarea-tag/textarea-tag.component.html | 18 - .../textarea-tag/textarea-tag.component.ts | 47 - .../user-profile-form-fields.component.html | 85 - .../user-profile-form-fields.component.ts | 77 - .../src/containers/template.component.html | 203 - .../src/containers/template.component.ts | 76 - .../src/directives/attributes.directive.ts | 19 - .../login/src/directives/index.ts | 2 - .../src/directives/kc-class.directive.ts | 150 - .../login/src/pages/code/code.component.html | 26 - .../login/src/pages/code/code.component.ts | 27 - .../delete-account-confirm.component.html | 46 - .../delete-account-confirm.component.ts | 27 - .../delete-credential.component.html | 35 - .../delete-credential.component.ts | 32 - .../src/pages/error/error.component.html | 25 - .../login/src/pages/error/error.component.ts | 27 - .../frontchannel-logout.component.html | 35 - .../frontchannel-logout.component.ts | 37 - .../idp-review-user-profile.component.html | 41 - .../idp-review-user-profile.component.ts | 38 - .../login/src/pages/info/info.component.html | 54 - .../login/src/pages/info/info.component.ts | 53 - .../login-config-totp.component.html | 190 - .../login-config-totp.component.ts | 43 - ...n-idp-link-confirm-override.component.html | 40 - ...gin-idp-link-confirm-override.component.ts | 32 - .../login-idp-link-confirm.component.html | 41 - .../login-idp-link-confirm.component.ts | 32 - .../login-idp-link-email.component.html | 37 - .../login-idp-link-email.component.ts | 27 - .../login-oauth-grant.component.html | 92 - .../login-oauth-grant.component.ts | 28 - ...th2-device-verify-user-code.component.html | 63 - ...auth2-device-verify-user-code.component.ts | 27 - .../pages/login-otp/login-otp.component.html | 103 - .../pages/login-otp/login-otp.component.ts | 33 - .../login-page-expired.component.html | 35 - .../login-page-expired.component.ts | 26 - ...ys-conditional-authenticate.component.html | 203 - ...keys-conditional-authenticate.component.ts | 90 - .../login-password.component.html | 90 - .../login-password.component.ts | 36 - ...-recovery-authn-code-config.component.html | 155 - ...in-recovery-authn-code-config.component.ts | 36 - ...n-recovery-authn-code-input.component.html | 76 - ...gin-recovery-authn-code-input.component.ts | 33 - .../login-reset-otp.component.html | 65 - .../login-reset-otp.component.ts | 32 - .../login-reset-password.component.html | 95 - .../login-reset-password.component.ts | 33 - .../login-update-password.component.html | 116 - .../login-update-password.component.ts | 42 - .../login-update-profile.component.html | 59 - .../login-update-profile.component.ts | 35 - .../login-username.component.html | 161 - .../login-username.component.ts | 38 - .../login-verify-email.component.html | 27 - .../login-verify-email.component.ts | 32 - .../login-x509-info.component.html | 102 - .../login-x509-info.component.ts | 32 - .../src/pages/login/login.component.html | 212 - .../login/src/pages/login/login.component.ts | 47 - .../logout-confirm.component.html | 59 - .../logout-confirm.component.ts | 32 - .../pages/register/register.component.html | 126 - .../src/pages/register/register.component.ts | 51 - .../saml-post-form.component.html | 51 - .../saml-post-form.component.ts | 46 - .../select-authenticator.component.html | 49 - .../select-authenticator.component.ts | 34 - .../src/pages/terms/terms.component.html | 36 - .../login/src/pages/terms/terms.component.ts | 32 - .../update-email/update-email.component.html | 58 - .../update-email/update-email.component.ts | 41 - .../webauthn-authenticate.component.html | 162 - .../webauthn-authenticate.component.ts | 78 - .../webauthn-error.component.html | 60 - .../webauthn-error.component.ts | 42 - .../webauthn-register.component.html | 82 - .../webauthn-register.component.ts | 89 - .../login/src/pipes/advanced-msg-str.pipe.ts | 13 - .../login/src/pipes/index.ts | 6 - .../login/src/pipes/input-type.pipe.ts | 15 - .../login/src/pipes/kc-sanitize.pipe.ts | 29 - .../login/src/pipes/msg-str.pipe.ts | 14 - .../login/src/pipes/to-array.pipe.ts | 15 - .../login/src/pipes/to-number.pipe.ts | 13 - .../login/src/services/index.ts | 2 - .../login-resource-injector.service.ts | 67 - .../src/services/user-profile-form.service.ts | 1361 -- projects/keycloakify-angular/ng-package.json | 7 - projects/keycloakify-angular/package.json | 15 - projects/keycloakify-angular/src/i18n.ts | 9 - .../keycloakify-angular/src/models/index.ts | 1 - .../src/models/script.model.ts | 6 - .../keycloakify-angular.providers.ts | 73 - .../keycloakify-angular/src/public-api.ts | 12 - .../src/services/i18n.service.ts | 5 - .../keycloakify-angular/src/services/index.ts | 2 - .../src/services/resource-injector.service.ts | 50 - .../keycloakify-angular/tsconfig.lib.json | 13 - .../tsconfig.lib.prod.json | 11 - .../keycloakify-angular/tsconfig.spec.json | 15 - scripts/build.ts | 182 + scripts/link-in-app.ts | 158 + scripts/link-in-starter.ts | 49 + scripts/shared/cacheDirPath.ts | 9 + scripts/shared/run.ts | 8 + scripts/shared/startRebuildOnSrcChange.ts | 40 + src/login/KcContext.ts | 1 + src/login/i18n.ts | 4 + src/tsconfig.json | 17 + tsconfig.json | 38 - tsproject.json | 15 + yarn.lock | 1118 + 196 files changed, 1906 insertions(+), 28897 deletions(-) delete mode 100644 .editorconfig create mode 100644 .github/FUNDING.yaml create mode 100644 .github/workflows/ci.yaml create mode 100644 .prettierrc.json delete mode 100644 .storybook/main.ts delete mode 100644 .storybook/preview-head.html delete mode 100644 .storybook/preview.ts delete mode 100644 .storybook/tsconfig.doc.json delete mode 100644 .storybook/tsconfig.json delete mode 100644 .storybook/typings.d.ts delete mode 100644 .vscode/extensions.json delete mode 100644 .vscode/settings.json create mode 100644 LICENSE delete mode 100644 angular.json delete mode 100644 eslint.config.js delete mode 100644 package-lock.json delete mode 100644 prettier.config.js delete mode 100644 projects/keycloakify-angular/README.md delete mode 100644 projects/keycloakify-angular/account/index.ts delete mode 100644 projects/keycloakify-angular/account/ng-package.json delete mode 100644 projects/keycloakify-angular/account/public-api.ts delete mode 100644 projects/keycloakify-angular/account/src/DefaultPage.ts delete mode 100644 projects/keycloakify-angular/account/src/classes/component-reference.class.ts delete mode 100644 projects/keycloakify-angular/account/src/containers/template.component.html delete mode 100644 projects/keycloakify-angular/account/src/containers/template.component.ts delete mode 100644 projects/keycloakify-angular/account/src/directives/attributes.directive.ts delete mode 100644 projects/keycloakify-angular/account/src/directives/index.ts delete mode 100644 projects/keycloakify-angular/account/src/directives/kc-class.directive.ts delete mode 100644 projects/keycloakify-angular/account/src/pages/account/account.component.html delete mode 100644 projects/keycloakify-angular/account/src/pages/account/account.component.ts delete mode 100644 projects/keycloakify-angular/account/src/pages/applications/applications.component.html delete mode 100644 projects/keycloakify-angular/account/src/pages/applications/applications.component.ts delete mode 100644 projects/keycloakify-angular/account/src/pages/federatedIdentity/federatedIdentity.component.html delete mode 100644 projects/keycloakify-angular/account/src/pages/federatedIdentity/federatedIdentity.component.ts delete mode 100644 projects/keycloakify-angular/account/src/pages/log/log.component.html delete mode 100644 projects/keycloakify-angular/account/src/pages/log/log.component.ts delete mode 100644 projects/keycloakify-angular/account/src/pages/password/password.component.html delete mode 100644 projects/keycloakify-angular/account/src/pages/password/password.component.ts delete mode 100644 projects/keycloakify-angular/account/src/pages/sessions/sessions.component.html delete mode 100644 projects/keycloakify-angular/account/src/pages/sessions/sessions.component.ts delete mode 100644 projects/keycloakify-angular/account/src/pages/totp/totp.component.html delete mode 100644 projects/keycloakify-angular/account/src/pages/totp/totp.component.ts delete mode 100644 projects/keycloakify-angular/account/src/pipes/advanced-msg-str.pipe.ts delete mode 100644 projects/keycloakify-angular/account/src/pipes/index.ts delete mode 100644 projects/keycloakify-angular/account/src/pipes/input-type.pipe.ts delete mode 100644 projects/keycloakify-angular/account/src/pipes/is-array-with-empty-object.pipe.ts delete mode 100644 projects/keycloakify-angular/account/src/pipes/kc-sanitize.pipe.ts delete mode 100644 projects/keycloakify-angular/account/src/pipes/msg-str.pipe.ts delete mode 100644 projects/keycloakify-angular/account/src/pipes/to-array.pipe.ts delete mode 100644 projects/keycloakify-angular/account/src/pipes/to-number.pipe.ts delete mode 100644 projects/keycloakify-angular/account/src/services/index.ts delete mode 100644 projects/keycloakify-angular/account/src/services/resource-injector.service.ts delete mode 100644 projects/keycloakify-angular/login/index.ts delete mode 100644 projects/keycloakify-angular/login/ng-package.json delete mode 100644 projects/keycloakify-angular/login/public-api.ts delete mode 100644 projects/keycloakify-angular/login/src/DefaultPage.ts delete mode 100644 projects/keycloakify-angular/login/src/classes/component-reference.class.ts delete mode 100644 projects/keycloakify-angular/login/src/components/add-remove-buttons-multi-valued-attribute/add-remove-buttons-multi-valued-attribute.component.html delete mode 100644 projects/keycloakify-angular/login/src/components/add-remove-buttons-multi-valued-attribute/add-remove-buttons-multi-valued-attribute.component.ts delete mode 100644 projects/keycloakify-angular/login/src/components/field-errors/field-errors.component.html delete mode 100644 projects/keycloakify-angular/login/src/components/field-errors/field-errors.component.ts delete mode 100644 projects/keycloakify-angular/login/src/components/group-label/group-label.component.html delete mode 100644 projects/keycloakify-angular/login/src/components/group-label/group-label.component.ts delete mode 100644 projects/keycloakify-angular/login/src/components/index.ts delete mode 100644 projects/keycloakify-angular/login/src/components/input-field-by-type/input-field-by-type.component.html delete mode 100644 projects/keycloakify-angular/login/src/components/input-field-by-type/input-field-by-type.component.ts delete mode 100644 projects/keycloakify-angular/login/src/components/input-tag-selects/input-tag-selects.component.html delete mode 100644 projects/keycloakify-angular/login/src/components/input-tag-selects/input-tag-selects.component.ts delete mode 100644 projects/keycloakify-angular/login/src/components/input-tag/input-tag.component.html delete mode 100644 projects/keycloakify-angular/login/src/components/input-tag/input-tag.component.ts delete mode 100644 projects/keycloakify-angular/login/src/components/logout-other-sessions/logout-other-sessions.component.html delete mode 100644 projects/keycloakify-angular/login/src/components/logout-other-sessions/logout-other-sessions.component.ts delete mode 100644 projects/keycloakify-angular/login/src/components/password-wrapper/password-wrapper.component.html delete mode 100644 projects/keycloakify-angular/login/src/components/password-wrapper/password-wrapper.component.ts delete mode 100644 projects/keycloakify-angular/login/src/components/select-tag/select-tag.component.html delete mode 100644 projects/keycloakify-angular/login/src/components/select-tag/select-tag.component.ts delete mode 100644 projects/keycloakify-angular/login/src/components/textarea-tag/textarea-tag.component.html delete mode 100644 projects/keycloakify-angular/login/src/components/textarea-tag/textarea-tag.component.ts delete mode 100644 projects/keycloakify-angular/login/src/components/user-profile-form-fields/user-profile-form-fields.component.html delete mode 100644 projects/keycloakify-angular/login/src/components/user-profile-form-fields/user-profile-form-fields.component.ts delete mode 100644 projects/keycloakify-angular/login/src/containers/template.component.html delete mode 100644 projects/keycloakify-angular/login/src/containers/template.component.ts delete mode 100644 projects/keycloakify-angular/login/src/directives/attributes.directive.ts delete mode 100644 projects/keycloakify-angular/login/src/directives/index.ts delete mode 100644 projects/keycloakify-angular/login/src/directives/kc-class.directive.ts delete mode 100644 projects/keycloakify-angular/login/src/pages/code/code.component.html delete mode 100644 projects/keycloakify-angular/login/src/pages/code/code.component.ts delete mode 100644 projects/keycloakify-angular/login/src/pages/delete-account-confirm/delete-account-confirm.component.html delete mode 100644 projects/keycloakify-angular/login/src/pages/delete-account-confirm/delete-account-confirm.component.ts delete mode 100644 projects/keycloakify-angular/login/src/pages/delete-credential/delete-credential.component.html delete mode 100644 projects/keycloakify-angular/login/src/pages/delete-credential/delete-credential.component.ts delete mode 100644 projects/keycloakify-angular/login/src/pages/error/error.component.html delete mode 100644 projects/keycloakify-angular/login/src/pages/error/error.component.ts delete mode 100644 projects/keycloakify-angular/login/src/pages/frontchannel-logout/frontchannel-logout.component.html delete mode 100644 projects/keycloakify-angular/login/src/pages/frontchannel-logout/frontchannel-logout.component.ts delete mode 100644 projects/keycloakify-angular/login/src/pages/idp-review-user-profile/idp-review-user-profile.component.html delete mode 100644 projects/keycloakify-angular/login/src/pages/idp-review-user-profile/idp-review-user-profile.component.ts delete mode 100644 projects/keycloakify-angular/login/src/pages/info/info.component.html delete mode 100644 projects/keycloakify-angular/login/src/pages/info/info.component.ts delete mode 100644 projects/keycloakify-angular/login/src/pages/login-config-totp/login-config-totp.component.html delete mode 100644 projects/keycloakify-angular/login/src/pages/login-config-totp/login-config-totp.component.ts delete mode 100644 projects/keycloakify-angular/login/src/pages/login-idp-link-confirm-override/login-idp-link-confirm-override.component.html delete mode 100644 projects/keycloakify-angular/login/src/pages/login-idp-link-confirm-override/login-idp-link-confirm-override.component.ts delete mode 100644 projects/keycloakify-angular/login/src/pages/login-idp-link-confirm/login-idp-link-confirm.component.html delete mode 100644 projects/keycloakify-angular/login/src/pages/login-idp-link-confirm/login-idp-link-confirm.component.ts delete mode 100644 projects/keycloakify-angular/login/src/pages/login-idp-link-email/login-idp-link-email.component.html delete mode 100644 projects/keycloakify-angular/login/src/pages/login-idp-link-email/login-idp-link-email.component.ts delete mode 100644 projects/keycloakify-angular/login/src/pages/login-oauth-grant/login-oauth-grant.component.html delete mode 100644 projects/keycloakify-angular/login/src/pages/login-oauth-grant/login-oauth-grant.component.ts delete mode 100644 projects/keycloakify-angular/login/src/pages/login-oauth2-device-verify-user-code/login-oauth2-device-verify-user-code.component.html delete mode 100644 projects/keycloakify-angular/login/src/pages/login-oauth2-device-verify-user-code/login-oauth2-device-verify-user-code.component.ts delete mode 100644 projects/keycloakify-angular/login/src/pages/login-otp/login-otp.component.html delete mode 100644 projects/keycloakify-angular/login/src/pages/login-otp/login-otp.component.ts delete mode 100644 projects/keycloakify-angular/login/src/pages/login-page-expired/login-page-expired.component.html delete mode 100644 projects/keycloakify-angular/login/src/pages/login-page-expired/login-page-expired.component.ts delete mode 100644 projects/keycloakify-angular/login/src/pages/login-passkeys-conditional-authenticate/login-passkeys-conditional-authenticate.component.html delete mode 100644 projects/keycloakify-angular/login/src/pages/login-passkeys-conditional-authenticate/login-passkeys-conditional-authenticate.component.ts delete mode 100644 projects/keycloakify-angular/login/src/pages/login-password/login-password.component.html delete mode 100644 projects/keycloakify-angular/login/src/pages/login-password/login-password.component.ts delete mode 100644 projects/keycloakify-angular/login/src/pages/login-recovery-authn-code-config/login-recovery-authn-code-config.component.html delete mode 100644 projects/keycloakify-angular/login/src/pages/login-recovery-authn-code-config/login-recovery-authn-code-config.component.ts delete mode 100644 projects/keycloakify-angular/login/src/pages/login-recovery-authn-code-input/login-recovery-authn-code-input.component.html delete mode 100644 projects/keycloakify-angular/login/src/pages/login-recovery-authn-code-input/login-recovery-authn-code-input.component.ts delete mode 100644 projects/keycloakify-angular/login/src/pages/login-reset-otp/login-reset-otp.component.html delete mode 100644 projects/keycloakify-angular/login/src/pages/login-reset-otp/login-reset-otp.component.ts delete mode 100644 projects/keycloakify-angular/login/src/pages/login-reset-password/login-reset-password.component.html delete mode 100644 projects/keycloakify-angular/login/src/pages/login-reset-password/login-reset-password.component.ts delete mode 100644 projects/keycloakify-angular/login/src/pages/login-update-password/login-update-password.component.html delete mode 100644 projects/keycloakify-angular/login/src/pages/login-update-password/login-update-password.component.ts delete mode 100644 projects/keycloakify-angular/login/src/pages/login-update-profile/login-update-profile.component.html delete mode 100644 projects/keycloakify-angular/login/src/pages/login-update-profile/login-update-profile.component.ts delete mode 100644 projects/keycloakify-angular/login/src/pages/login-username/login-username.component.html delete mode 100644 projects/keycloakify-angular/login/src/pages/login-username/login-username.component.ts delete mode 100644 projects/keycloakify-angular/login/src/pages/login-verify-email/login-verify-email.component.html delete mode 100644 projects/keycloakify-angular/login/src/pages/login-verify-email/login-verify-email.component.ts delete mode 100644 projects/keycloakify-angular/login/src/pages/login-x509-info/login-x509-info.component.html delete mode 100644 projects/keycloakify-angular/login/src/pages/login-x509-info/login-x509-info.component.ts delete mode 100644 projects/keycloakify-angular/login/src/pages/login/login.component.html delete mode 100644 projects/keycloakify-angular/login/src/pages/login/login.component.ts delete mode 100644 projects/keycloakify-angular/login/src/pages/logout-confirm/logout-confirm.component.html delete mode 100644 projects/keycloakify-angular/login/src/pages/logout-confirm/logout-confirm.component.ts delete mode 100644 projects/keycloakify-angular/login/src/pages/register/register.component.html delete mode 100644 projects/keycloakify-angular/login/src/pages/register/register.component.ts delete mode 100644 projects/keycloakify-angular/login/src/pages/saml-post-form/saml-post-form.component.html delete mode 100644 projects/keycloakify-angular/login/src/pages/saml-post-form/saml-post-form.component.ts delete mode 100644 projects/keycloakify-angular/login/src/pages/select-authenticator/select-authenticator.component.html delete mode 100644 projects/keycloakify-angular/login/src/pages/select-authenticator/select-authenticator.component.ts delete mode 100644 projects/keycloakify-angular/login/src/pages/terms/terms.component.html delete mode 100644 projects/keycloakify-angular/login/src/pages/terms/terms.component.ts delete mode 100644 projects/keycloakify-angular/login/src/pages/update-email/update-email.component.html delete mode 100644 projects/keycloakify-angular/login/src/pages/update-email/update-email.component.ts delete mode 100644 projects/keycloakify-angular/login/src/pages/webauthn-authenticate/webauthn-authenticate.component.html delete mode 100644 projects/keycloakify-angular/login/src/pages/webauthn-authenticate/webauthn-authenticate.component.ts delete mode 100644 projects/keycloakify-angular/login/src/pages/webauthn-error/webauthn-error.component.html delete mode 100644 projects/keycloakify-angular/login/src/pages/webauthn-error/webauthn-error.component.ts delete mode 100644 projects/keycloakify-angular/login/src/pages/webauthn-register/webauthn-register.component.html delete mode 100644 projects/keycloakify-angular/login/src/pages/webauthn-register/webauthn-register.component.ts delete mode 100644 projects/keycloakify-angular/login/src/pipes/advanced-msg-str.pipe.ts delete mode 100644 projects/keycloakify-angular/login/src/pipes/index.ts delete mode 100644 projects/keycloakify-angular/login/src/pipes/input-type.pipe.ts delete mode 100644 projects/keycloakify-angular/login/src/pipes/kc-sanitize.pipe.ts delete mode 100644 projects/keycloakify-angular/login/src/pipes/msg-str.pipe.ts delete mode 100644 projects/keycloakify-angular/login/src/pipes/to-array.pipe.ts delete mode 100644 projects/keycloakify-angular/login/src/pipes/to-number.pipe.ts delete mode 100644 projects/keycloakify-angular/login/src/services/index.ts delete mode 100644 projects/keycloakify-angular/login/src/services/login-resource-injector.service.ts delete mode 100644 projects/keycloakify-angular/login/src/services/user-profile-form.service.ts delete mode 100644 projects/keycloakify-angular/ng-package.json delete mode 100644 projects/keycloakify-angular/package.json delete mode 100644 projects/keycloakify-angular/src/i18n.ts delete mode 100644 projects/keycloakify-angular/src/models/index.ts delete mode 100644 projects/keycloakify-angular/src/models/script.model.ts delete mode 100644 projects/keycloakify-angular/src/providers/keycloakify-angular.providers.ts delete mode 100644 projects/keycloakify-angular/src/public-api.ts delete mode 100644 projects/keycloakify-angular/src/services/i18n.service.ts delete mode 100644 projects/keycloakify-angular/src/services/index.ts delete mode 100644 projects/keycloakify-angular/src/services/resource-injector.service.ts delete mode 100644 projects/keycloakify-angular/tsconfig.lib.json delete mode 100644 projects/keycloakify-angular/tsconfig.lib.prod.json delete mode 100644 projects/keycloakify-angular/tsconfig.spec.json create mode 100644 scripts/build.ts create mode 100644 scripts/link-in-app.ts create mode 100644 scripts/link-in-starter.ts create mode 100644 scripts/shared/cacheDirPath.ts create mode 100644 scripts/shared/run.ts create mode 100644 scripts/shared/startRebuildOnSrcChange.ts create mode 100644 src/login/KcContext.ts create mode 100644 src/login/i18n.ts create mode 100644 src/tsconfig.json delete mode 100644 tsconfig.json create mode 100644 tsproject.json create mode 100644 yarn.lock diff --git a/.editorconfig b/.editorconfig deleted file mode 100644 index 59d9a3a3..00000000 --- a/.editorconfig +++ /dev/null @@ -1,16 +0,0 @@ -# Editor configuration, see https://editorconfig.org -root = true - -[*] -charset = utf-8 -indent_style = space -indent_size = 2 -insert_final_newline = true -trim_trailing_whitespace = true - -[*.ts] -quote_type = single - -[*.md] -max_line_length = off -trim_trailing_whitespace = false diff --git a/.github/FUNDING.yaml b/.github/FUNDING.yaml new file mode 100644 index 00000000..daf83ff5 --- /dev/null +++ b/.github/FUNDING.yaml @@ -0,0 +1,4 @@ +# These are supported funding model platforms + +github: [garronej] +custom: ['https://www.ringerhq.com/experts/garronej'] diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml new file mode 100644 index 00000000..9fca0a23 --- /dev/null +++ b/.github/workflows/ci.yaml @@ -0,0 +1,139 @@ +name: ci +on: + push: + branches: + - main + pull_request: + branches: + - main + +jobs: + + test_lint: + runs-on: ubuntu-latest + if: ${{ !github.event.created && github.repository != 'garronej/ts-ci' }} + steps: + - uses: actions/checkout@v4 + - uses: actions/setup-node@v4 + - uses: bahmutov/npm-install@v1 + - name: If this step fails run 'npm run format' then commit again. + run: npm run _format --list-different + test: + runs-on: ${{ matrix.os }} + needs: test_lint + strategy: + matrix: + node: [ '18' ] + os: [ ubuntu-latest ] + name: Test with Node v${{ matrix.node }} on ${{ matrix.os }} + steps: + - uses: actions/checkout@v4 + - uses: actions/setup-node@v4 + with: + node-version: ${{ matrix.node }} + - uses: bahmutov/npm-install@v1 + - run: npm run build + - run: npm run test + + storybook: + runs-on: ubuntu-latest + if: github.event_name == 'push' && github.ref == 'refs/heads/main' + needs: test + steps: + - uses: actions/checkout@v4 + - uses: actions/setup-node@v4 + with: + node-version: '18' + - uses: bahmutov/npm-install@v1 + - run: npm run build-storybook + - run: git remote set-url origin https://git:${GITHUB_TOKEN}@github.com/${{github.repository}}.git + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + - run: npx -y -p gh-pages@3.1.0 gh-pages -d ./storybook-static -u "github-actions-bot " + + check_if_version_upgraded: + name: Check if version upgrade + # When someone forks the repo and opens a PR we want to enables the tests to be run (the previous jobs) + # but obviously only us should be allowed to release. + # In the following check we make sure that we own the branch this CI workflow is running on before continuing. + # Without this check, trying to release would fail anyway because only us have the correct secret.NPM_TOKEN but + # it's cleaner to stop the execution instead of letting the CI crash. + if: | + github.event_name == 'push' || + github.event.pull_request.head.repo.owner.login == github.event.pull_request.base.repo.owner.login + runs-on: ubuntu-latest + needs: test + outputs: + from_version: ${{ steps.step1.outputs.from_version }} + to_version: ${{ steps.step1.outputs.to_version }} + is_upgraded_version: ${{ steps.step1.outputs.is_upgraded_version }} + is_pre_release: ${{steps.step1.outputs.is_pre_release }} + steps: + - uses: garronej/ts-ci@v2.1.2 + id: step1 + with: + action_name: is_package_json_version_upgraded + + create_github_release: + runs-on: ubuntu-latest + # We create release only if the version in the package.json have been upgraded and this CI is running against the main branch. + # We allow branches with a PR open on main to publish pre-release (x.y.z-rc.u) but not actual releases. + if: | + needs.check_if_version_upgraded.outputs.is_upgraded_version == 'true' && + ( + github.event_name == 'push' || + needs.check_if_version_upgraded.outputs.is_pre_release == 'true' + ) + needs: + - check_if_version_upgraded + steps: + - uses: softprops/action-gh-release@v2 + with: + name: Release v${{ needs.check_if_version_upgraded.outputs.to_version }} + tag_name: v${{ needs.check_if_version_upgraded.outputs.to_version }} + target_commitish: ${{ github.head_ref || github.ref }} + generate_release_notes: true + draft: false + prerelease: ${{ needs.check_if_version_upgraded.outputs.is_pre_release == 'true' }} + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + + publish_on_npm: + runs-on: ubuntu-latest + needs: + - create_github_release + - check_if_version_upgraded + steps: + - uses: actions/checkout@v4 + with: + ref: ${{ github.ref }} + - uses: actions/setup-node@v4 + with: + registry-url: https://registry.npmjs.org/ + - uses: bahmutov/npm-install@v1 + - run: npm run build + - run: npx -y -p denoify@1.6.12 enable_short_npm_import_path + env: + DRY_RUN: "0" + - uses: garronej/ts-ci@v2.1.2 + with: + action_name: remove_dark_mode_specific_images_from_readme + - name: Publishing on NPM + run: | + if [ "$(npm show . version)" = "$VERSION" ]; then + echo "This version is already published" + exit 0 + fi + if [ "$NODE_AUTH_TOKEN" = "" ]; then + echo "Can't publish on NPM, You must first create a secret called NPM_TOKEN that contains your NPM auth token. https://help.github.com/en/actions/automating-your-workflow-with-github-actions/creating-and-using-encrypted-secrets" + false + fi + EXTRA_ARGS="" + if [ "$IS_PRE_RELEASE" = "true" ]; then + EXTRA_ARGS="--tag next" + fi + npm publish $EXTRA_ARGS + env: + NODE_AUTH_TOKEN: ${{secrets.NPM_TOKEN}} + VERSION: ${{ needs.check_if_version_upgraded.outputs.to_version }} + IS_PRE_RELEASE: ${{ needs.check_if_version_upgraded.outputs.is_pre_release }} diff --git a/.gitignore b/.gitignore index 18e23652..98f56539 100644 --- a/.gitignore +++ b/.gitignore @@ -1,63 +1,52 @@ -# See http://help.github.com/ignore-files/ for more about ignoring files. - -# Compiled output -/dist -/tmp -/out-tsc -/bazel-out - -# Node -/node_modules -npm-debug.log -yarn-error.log - -# IDEs and editors -.idea/ -.project -.classpath -.c9/ -*.launch -.settings/ -*.sublime-workspace - -# Visual Studio Code -.vscode/* -!.vscode/settings.json -!.vscode/tasks.json -!.vscode/launch.json -!.vscode/extensions.json -.history/* - -# Miscellaneous -/.angular/cache -/.nx/cache -/.nx/workspace-data -.sass-cache/ -/connect.lock -/coverage -/libpeerconnection.log -testem.log -/typings - -# System files -.DS_Store -Thumbs.db - -/src/login/i18n/messages_defaultSet/ -/src/account/i18n/ - -# VS Code devcontainers -.devcontainer -/.yarn -/.yarnrc.yml - -/dist_keycloak -/dist_dev -/build -/storybook-static - -/stories/assets/fonts/ -/build_storybook/ -/storybook-static/ - -*storybook.log \ No newline at end of file +# Logs +logs +*.log +npm-debug.log* + +# Runtime data +pids +*.pid +*.seed + +# Directory for instrumented libs generated by jscoverage/JSCover +lib-cov + +# Coverage directory used by tools like istanbul +coverage + +# nyc test coverage +.nyc_output + +# Grunt intermediate storage (http://gruntjs.com/creating-plugins#storing-task-files) +.grunt + +# node-waf configuration +.lock-wscript + +# Compiled binary addons (http://nodejs.org/api/addons.html) +build/Release + +# Dependency directories +node_modules +jspm_packages + +# Optional npm cache directory +.npm + +# Optional REPL history +.node_repl_history + +.vscode + +.DS_Store + +/dist +/.yarn_home/ + +.idea + +# VS Code devcontainers +.devcontainer +/.yarn +/.yarnrc.yml + diff --git a/.prettierignore b/.prettierignore index a69313a2..6cc2f1d3 100644 --- a/.prettierignore +++ b/.prettierignore @@ -1,5 +1,15 @@ node_modules/ /dist/ -/dist_keycloak/ -/public/keycloak-resources/ -/.vscode/ \ No newline at end of file +/CHANGELOG.md +/.yarn_home/ +/src/test/apps/ +/src/tools/types/ +/build_keycloak/ +/.vscode/ +/src/login/i18n/messages_defaultSet/ +/src/account/i18n/messages_defaultSet/ +/dist_test +/sample_react_project/ +/sample_custom_react_project/ +/keycloakify_starter_test/ +/.storybook/static/keycloak-resources/ \ No newline at end of file diff --git a/.prettierrc.json b/.prettierrc.json new file mode 100644 index 00000000..9a629901 --- /dev/null +++ b/.prettierrc.json @@ -0,0 +1,24 @@ +{ + "printWidth": 90, + "tabWidth": 4, + "useTabs": false, + "semi": true, + "singleQuote": false, + "trailingComma": "none", + "bracketSpacing": true, + "arrowParens": "avoid", + "overrides": [ + { + "files": "*.tsx", + "options": { + "printWidth": 150 + } + }, + { + "files": "useUserProfileForm.tsx", + "options": { + "printWidth": 150 + } + } + ] +} diff --git a/.storybook/main.ts b/.storybook/main.ts deleted file mode 100644 index d2f68168..00000000 --- a/.storybook/main.ts +++ /dev/null @@ -1,41 +0,0 @@ -import type { StorybookConfig } from '@storybook/angular'; -import { StorybookConfigVite } from '@storybook/builder-vite'; -import { UserConfig } from 'vite'; - -const config: StorybookConfig & StorybookConfigVite = { - stories: ['../src/**/*.mdx', '../src/**/*.stories.@(js|jsx|mjs|ts|tsx)'], - addons: ['@storybook/addon-essentials'], - framework: { - name: '@storybook/angular', - options: {}, - }, - core: { - builder: { - name: '@storybook/builder-vite', - options: { - viteConfigPath: undefined, - }, - }, - }, - staticDirs: ['../public'], - async viteFinal(config: UserConfig) { - // Merge custom configuration into the default config - const { mergeConfig } = await import('vite'); - const { default: angular } = await import('@analogjs/vite-plugin-angular'); - - return mergeConfig(config, { - // Add dependencies to pre-optimization - optimizeDeps: { - include: [ - '@storybook/angular', - '@storybook/angular/dist/client', - '@angular/compiler', - '@storybook/blocks', - 'tslib', - ], - }, - plugins: [angular({ jit: true, tsconfig: './.storybook/tsconfig.json' })], - }); - }, -}; -export default config; diff --git a/.storybook/preview-head.html b/.storybook/preview-head.html deleted file mode 100644 index 21f58627..00000000 --- a/.storybook/preview-head.html +++ /dev/null @@ -1,25 +0,0 @@ - diff --git a/.storybook/preview.ts b/.storybook/preview.ts deleted file mode 100644 index adcda96b..00000000 --- a/.storybook/preview.ts +++ /dev/null @@ -1,14 +0,0 @@ -import type { Preview } from '@storybook/react'; - -const preview: Preview = { - parameters: { - controls: { - matchers: { - color: /(background|color)$/i, - date: /Date$/i, - }, - }, - }, -}; - -export default preview; diff --git a/.storybook/tsconfig.doc.json b/.storybook/tsconfig.doc.json deleted file mode 100644 index 22e282bd..00000000 --- a/.storybook/tsconfig.doc.json +++ /dev/null @@ -1,10 +0,0 @@ -// This tsconfig is used by Compodoc to generate the documentation for the project. -// If Compodoc is not used, this file can be deleted. -{ - "extends": "./tsconfig.json", - // Exclude all files that are not needed for documentation generation. - "exclude": ["../src/test.ts", "../src/**/*.spec.ts", "../src/**/*.stories.ts"], - // Please make sure to include all files from which Compodoc should generate documentation. - "include": ["../src/**/*"], - "files": ["./typings.d.ts"] -} diff --git a/.storybook/tsconfig.json b/.storybook/tsconfig.json deleted file mode 100644 index 84d7e742..00000000 --- a/.storybook/tsconfig.json +++ /dev/null @@ -1,11 +0,0 @@ -{ - "extends": "../tsconfig.app.json", - "compilerOptions": { - "types": ["node"], - "allowSyntheticDefaultImports": true, - "resolveJsonModule": true - }, - "exclude": ["../src/test.ts", "../src/**/*.spec.ts"], - "include": ["../src/**/*.stories.*", "./preview.ts"], - "files": ["./typings.d.ts"] -} diff --git a/.storybook/typings.d.ts b/.storybook/typings.d.ts deleted file mode 100644 index f73d61b3..00000000 --- a/.storybook/typings.d.ts +++ /dev/null @@ -1,4 +0,0 @@ -declare module '*.md' { - const content: string; - export default content; -} diff --git a/.vscode/extensions.json b/.vscode/extensions.json deleted file mode 100644 index 9282759e..00000000 --- a/.vscode/extensions.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - // For more information, visit: https://go.microsoft.com/fwlink/?linkid=827846 - "recommendations": ["angular.ng-template", "dbaeumer.vscode-eslint", "esbenp.prettier-vscode"] -} diff --git a/.vscode/settings.json b/.vscode/settings.json deleted file mode 100644 index 04607612..00000000 --- a/.vscode/settings.json +++ /dev/null @@ -1,18 +0,0 @@ -{ - "[html]": { - "editor.defaultFormatter": "esbenp.prettier-vscode", - "editor.codeActionsOnSave": { - "source.fixAll.eslint": "explicit" - }, - "editor.formatOnSave": true - }, - "[typescript]": { - "editor.defaultFormatter": "dbaeumer.vscode-eslint", - "editor.codeActionsOnSave": { - "source.fixAll.eslint": "explicit", - "source.organizeImports": "explicit" - }, - "editor.formatOnSave": true - }, - "eslint.useFlatConfig": true -} diff --git a/LICENSE b/LICENSE new file mode 100644 index 00000000..ccfcf416 --- /dev/null +++ b/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2020 GitHub user u/kathari00 u/LucaPeruzzo u/garronej + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/README.md b/README.md index 0f5e75c8..5ec5fbc0 100644 --- a/README.md +++ b/README.md @@ -1,27 +1 @@ -# MyWorkspace - -This project was generated with [Angular CLI](https://github.com/angular/angular-cli) version 18.2.5. - -## Development server - -Run `ng serve` for a dev server. Navigate to `http://localhost:4200/`. The application will automatically reload if you change any of the source files. - -## Code scaffolding - -Run `ng generate component component-name` to generate a new component. You can also use `ng generate directive|pipe|service|class|guard|interface|enum|module`. - -## Build - -Run `ng build` to build the project. The build artifacts will be stored in the `dist/` directory. - -## Running unit tests - -Run `ng test` to execute the unit tests via [Karma](https://karma-runner.github.io). - -## Running end-to-end tests - -Run `ng e2e` to execute the end-to-end tests via a platform of your choice. To use this command, you need to first add a package that implements end-to-end testing capabilities. - -## Further help - -To get more help on the Angular CLI use `ng help` or go check out the [Angular CLI Overview and Command Reference](https://angular.dev/tools/cli) page. +# @keycloakify/angular diff --git a/angular.json b/angular.json deleted file mode 100644 index d361c6a1..00000000 --- a/angular.json +++ /dev/null @@ -1,46 +0,0 @@ -{ - "$schema": "./node_modules/@angular/cli/lib/config/schema.json", - "version": 1, - "newProjectRoot": "projects", - "projects": { - "keycloakify-angular": { - "projectType": "library", - "root": "projects/keycloakify-angular", - "sourceRoot": "projects/keycloakify-angular", - "prefix": "kc", - "architect": { - "build": { - "builder": "@angular-devkit/build-angular:ng-packagr", - "options": { - "project": "projects/keycloakify-angular/ng-package.json" - }, - "configurations": { - "production": { - "tsConfig": "projects/keycloakify-angular/tsconfig.lib.prod.json" - }, - "development": { - "tsConfig": "projects/keycloakify-angular/tsconfig.lib.json" - } - }, - "defaultConfiguration": "production" - }, - "test": { - "builder": "@angular-devkit/build-angular:karma", - "options": { - "tsConfig": "projects/keycloakify-angular/tsconfig.spec.json", - "polyfills": ["zone.js", "zone.js/testing"] - } - }, - "lint": { - "builder": "@angular-eslint/builder:lint", - "options": { - "lintFilePatterns": [ - "projects/keycloakify-angular/src/**/*.ts", - "projects/keycloakify-angular/src/**/*.html" - ] - } - } - } - } - } -} diff --git a/eslint.config.js b/eslint.config.js deleted file mode 100644 index 58f08d36..00000000 --- a/eslint.config.js +++ /dev/null @@ -1,115 +0,0 @@ -// @ts-check -import eslint from '@eslint/js'; -import tseslint from 'typescript-eslint'; -import angular from 'angular-eslint'; -import { fixupPluginRules } from '@eslint/compat'; -import { configs, rules } from 'eslint-plugin-storybook'; -import prettier from 'eslint-plugin-prettier'; - -const storybook = fixupPluginRules({ - rules, - configs, - meta: { name: 'stroybook', version: '0.8.0' }, -}); - -export default tseslint.config( - {ignores: ['dist', 'node_modules/**', 'dist_keycloak']}, - { - files: ['*.stories.@(ts|tsx|js|jsx|mjs|cjs)', '*.story.@(ts|tsx|js|jsx|mjs|cjs)'], - plugins: { - storybook, - prettier, - }, - rules: { - 'import/no-anonymous-default-export': 'off', - 'storybook/await-interactions': 'error', - 'storybook/context-in-play-function': 'error', - 'storybook/default-exports': 'error', - 'storybook/hierarchy-separator': 'warn', - 'storybook/no-redundant-story-name': 'warn', - 'storybook/prefer-pascal-case': 'warn', - 'storybook/story-exports': 'error', - 'storybook/use-storybook-expect': 'error', - 'storybook/use-storybook-testing-library': 'error', - 'prettier/prettier': ['error', {}], - }, - }, - { - files: ['.storybook/main.@(js|cjs|mjs|ts)'], - plugins: { - storybook, - prettier, - }, - rules: { - 'storybook/no-uninstalled-addons': 'error', - 'prettier/prettier': [ - 'error', - {}, - { - usePrettierrc: true, - }, - ], - }, - }, - { - files: ['**/*.ts'], - plugins: { - prettier, - }, - extends: [ - eslint.configs.recommended, - ...tseslint.configs.recommended, - ...tseslint.configs.stylistic, - ...angular.configs.tsRecommended, - ], - processor: angular.processInlineTemplates, - rules: { - '@typescript-eslint/consistent-type-definitions': 'off', - '@typescript-eslint/no-inferrable-types': 'off', - '@typescript-eslint/no-namespace': 'off', - '@angular-eslint/directive-selector': [ - 'error', - { - type: 'attribute', - prefix: 'kc', - style: 'camelCase', - }, - ], - '@angular-eslint/component-selector': [ - 'error', - { - type: 'element', - prefix: 'kc', - style: 'kebab-case', - }, - ], - 'prettier/prettier': [ - 'error', - {}, - { - usePrettierrc: true, - }, - ], - }, - }, - { - files: ['**/*.html'], - plugins: { - prettier, - }, - extends: [...angular.configs.templateRecommended, ...angular.configs.templateAccessibility], - rules: { - '@angular-eslint/template/interactive-supports-focus': 'off', - '@angular-eslint/template/click-events-have-key-events': 'off', - '@angular-eslint/template/label-has-associated-control': 'off', - '@angular-eslint/template/no-autofocus': 'off', - 'prettier/prettier': [ - 'error', - { parser: 'angular' }, - { - usePrettierrc: true, - }, - ], - }, - }, -); diff --git a/package-lock.json b/package-lock.json deleted file mode 100644 index 7e374a88..00000000 --- a/package-lock.json +++ /dev/null @@ -1,18646 +0,0 @@ -{ - "name": "keycloakify-angular-workspace", - "version": "0.0.0", - "lockfileVersion": 3, - "requires": true, - "packages": { - "": { - "name": "keycloakify-angular-workspace", - "version": "0.0.0", - "devDependencies": { - "@analogjs/vite-plugin-angular": "^1.8.1", - "@analogjs/vitest-angular": "^1.8.1", - "@angular-devkit/build-angular": "^18.2.5", - "@angular/animations": "^18.2.0", - "@angular/cli": "^18.2.5", - "@angular/common": "^18.2.0", - "@angular/compiler": "^18.2.0", - "@angular/compiler-cli": "^18.2.0", - "@angular/core": "^18.2.0", - "@angular/forms": "^18.2.0", - "@angular/platform-browser": "^18.2.0", - "@angular/platform-browser-dynamic": "^18.2.0", - "@eslint/compat": "^1.1.1", - "@storybook/addon-essentials": "^8.3.0", - "@storybook/angular": "^8.3.0", - "@storybook/builder-vite": "^8.3.1", - "@types/node": "^20.0.0", - "@typescript-eslint/types": "^8.6.0", - "@typescript-eslint/utils": "^8.6.0", - "angular-eslint": "^18.3.1", - "eslint": "^9.9.1", - "eslint-plugin-prettier": "^5.2.1", - "eslint-plugin-storybook": "^0.8.0", - "jsdom": "^22.0.0", - "keycloakify": "^11.0.0", - "ng-packagr": "^18.2.0", - "prettier": "^3.3.3", - "prismjs": "^1.29.0", - "rxjs": "~7.8.0", - "storybook": "^8.3.0", - "tslib": "^2.3.0", - "typescript": "~5.5.2", - "typescript-eslint": "^8.2.0", - "vite": "^5.4.6", - "vite-tsconfig-paths": "^4.2.0", - "vitest": "^1.3.1" - } - }, - "node_modules/@ampproject/remapping": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.3.0.tgz", - "integrity": "sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==", - "dev": true, - "dependencies": { - "@jridgewell/gen-mapping": "^0.3.5", - "@jridgewell/trace-mapping": "^0.3.24" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@analogjs/vite-plugin-angular": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/@analogjs/vite-plugin-angular/-/vite-plugin-angular-1.8.1.tgz", - "integrity": "sha512-M7URKKDqAI2/OGe7G02Ch1hsGJ9ZL1u0p9YO9PO0LIJWuDKcsg0Y3KXJtK0GQ2RZ5ErBfxT89o8XYmtY7rP8Xw==", - "dev": true, - "dependencies": { - "ts-morph": "^21.0.0", - "vfile": "^6.0.3" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/brandonroberts" - }, - "peerDependencies": { - "@angular-devkit/build-angular": "^15.0.0 || ^16.0.0 || ^17.0.0 || ^18.0.0", - "@angular/build": "^18.0.0" - }, - "peerDependenciesMeta": { - "@angular-devkit/build-angular": { - "optional": true - }, - "@angular/build": { - "optional": true - } - } - }, - "node_modules/@analogjs/vitest-angular": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/@analogjs/vitest-angular/-/vitest-angular-1.8.1.tgz", - "integrity": "sha512-LJ2erobtW6pobpdZaOWJNRdAaoc4ggvHkn7rL7l9akB6Gu0lWfQy7wn3qYMW+1jv0QDdXC1na0BVCVo06BjH0w==", - "dev": true, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/brandonroberts" - }, - "peerDependencies": { - "@analogjs/vite-plugin-angular": "*", - "@angular-devkit/architect": "^0.1500.0 || ^0.1600.0 || ^0.1700.0 || ^0.1800.0", - "vitest": "^1.3.1 || ^2.0.0" - } - }, - "node_modules/@angular-devkit/architect": { - "version": "0.1800.7", - "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.1800.7.tgz", - "integrity": "sha512-ZYIjdngUOjY6G2XJGHtATLr+HhJWdo7Z3ATlzQTGI9D1a02kW3UFlELQBhFIn+1o78FU6W0STZgyfBH8M7wD2w==", - "dev": true, - "peer": true, - "dependencies": { - "@angular-devkit/core": "18.0.7", - "rxjs": "7.8.1" - }, - "engines": { - "node": "^18.19.1 || ^20.11.1 || >=22.0.0", - "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", - "yarn": ">= 1.13.0" - } - }, - "node_modules/@angular-devkit/architect/node_modules/@angular-devkit/core": { - "version": "18.0.7", - "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-18.0.7.tgz", - "integrity": "sha512-pVmuE37DNuTe3S4Lh1jg6U4dyHljiZiqI99u3gtS7PF765P4AeGlugHIYE7ztC74fYd9gy04sWnbeV+RQuBTVw==", - "dev": true, - "peer": true, - "dependencies": { - "ajv": "8.13.0", - "ajv-formats": "3.0.1", - "jsonc-parser": "3.2.1", - "picomatch": "4.0.2", - "rxjs": "7.8.1", - "source-map": "0.7.4" - }, - "engines": { - "node": "^18.19.1 || ^20.11.1 || >=22.0.0", - "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", - "yarn": ">= 1.13.0" - }, - "peerDependencies": { - "chokidar": "^3.5.2" - }, - "peerDependenciesMeta": { - "chokidar": { - "optional": true - } - } - }, - "node_modules/@angular-devkit/architect/node_modules/ajv": { - "version": "8.13.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.13.0.tgz", - "integrity": "sha512-PRA911Blj99jR5RMeTunVbNXMF6Lp4vZXnk5GQjcnUWUTsrXtekg/pnmFFI2u/I36Y/2bITGS30GZCXei6uNkA==", - "dev": true, - "peer": true, - "dependencies": { - "fast-deep-equal": "^3.1.3", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js": "^4.4.1" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/@angular-devkit/architect/node_modules/jsonc-parser": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.2.1.tgz", - "integrity": "sha512-AilxAyFOAcK5wA1+LeaySVBrHsGQvUFCDWXKpZjzaL0PqW+xfBOttn8GNtWKFWqneyMZj41MWF9Kl6iPWLwgOA==", - "dev": true, - "peer": true - }, - "node_modules/@angular-devkit/build-angular": { - "version": "18.2.5", - "resolved": "https://registry.npmjs.org/@angular-devkit/build-angular/-/build-angular-18.2.5.tgz", - "integrity": "sha512-dIvb0AHoRIMM6tLuG4t6lDDslSAYP77wqytodsN317UzFOuuCPernXbO8NJs+QHxj09nPsem1T5vnvpO2E/PVQ==", - "dev": true, - "dependencies": { - "@ampproject/remapping": "2.3.0", - "@angular-devkit/architect": "0.1802.5", - "@angular-devkit/build-webpack": "0.1802.5", - "@angular-devkit/core": "18.2.5", - "@angular/build": "18.2.5", - "@babel/core": "7.25.2", - "@babel/generator": "7.25.0", - "@babel/helper-annotate-as-pure": "7.24.7", - "@babel/helper-split-export-declaration": "7.24.7", - "@babel/plugin-transform-async-generator-functions": "7.25.0", - "@babel/plugin-transform-async-to-generator": "7.24.7", - "@babel/plugin-transform-runtime": "7.24.7", - "@babel/preset-env": "7.25.3", - "@babel/runtime": "7.25.0", - "@discoveryjs/json-ext": "0.6.1", - "@ngtools/webpack": "18.2.5", - "@vitejs/plugin-basic-ssl": "1.1.0", - "ansi-colors": "4.1.3", - "autoprefixer": "10.4.20", - "babel-loader": "9.1.3", - "browserslist": "^4.21.5", - "copy-webpack-plugin": "12.0.2", - "critters": "0.0.24", - "css-loader": "7.1.2", - "esbuild-wasm": "0.23.0", - "fast-glob": "3.3.2", - "http-proxy-middleware": "3.0.0", - "https-proxy-agent": "7.0.5", - "istanbul-lib-instrument": "6.0.3", - "jsonc-parser": "3.3.1", - "karma-source-map-support": "1.4.0", - "less": "4.2.0", - "less-loader": "12.2.0", - "license-webpack-plugin": "4.0.2", - "loader-utils": "3.3.1", - "magic-string": "0.30.11", - "mini-css-extract-plugin": "2.9.0", - "mrmime": "2.0.0", - "open": "10.1.0", - "ora": "5.4.1", - "parse5-html-rewriting-stream": "7.0.0", - "picomatch": "4.0.2", - "piscina": "4.6.1", - "postcss": "8.4.41", - "postcss-loader": "8.1.1", - "resolve-url-loader": "5.0.0", - "rxjs": "7.8.1", - "sass": "1.77.6", - "sass-loader": "16.0.0", - "semver": "7.6.3", - "source-map-loader": "5.0.0", - "source-map-support": "0.5.21", - "terser": "5.31.6", - "tree-kill": "1.2.2", - "tslib": "2.6.3", - "vite": "5.4.6", - "watchpack": "2.4.1", - "webpack": "5.94.0", - "webpack-dev-middleware": "7.4.2", - "webpack-dev-server": "5.0.4", - "webpack-merge": "6.0.1", - "webpack-subresource-integrity": "5.1.0" - }, - "engines": { - "node": "^18.19.1 || ^20.11.1 || >=22.0.0", - "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", - "yarn": ">= 1.13.0" - }, - "optionalDependencies": { - "esbuild": "0.23.0" - }, - "peerDependencies": { - "@angular/compiler-cli": "^18.0.0", - "@angular/localize": "^18.0.0", - "@angular/platform-server": "^18.0.0", - "@angular/service-worker": "^18.0.0", - "@web/test-runner": "^0.18.0", - "browser-sync": "^3.0.2", - "jest": "^29.5.0", - "jest-environment-jsdom": "^29.5.0", - "karma": "^6.3.0", - "ng-packagr": "^18.0.0", - "protractor": "^7.0.0", - "tailwindcss": "^2.0.0 || ^3.0.0", - "typescript": ">=5.4 <5.6" - }, - "peerDependenciesMeta": { - "@angular/localize": { - "optional": true - }, - "@angular/platform-server": { - "optional": true - }, - "@angular/service-worker": { - "optional": true - }, - "@web/test-runner": { - "optional": true - }, - "browser-sync": { - "optional": true - }, - "jest": { - "optional": true - }, - "jest-environment-jsdom": { - "optional": true - }, - "karma": { - "optional": true - }, - "ng-packagr": { - "optional": true - }, - "protractor": { - "optional": true - }, - "tailwindcss": { - "optional": true - } - } - }, - "node_modules/@angular-devkit/build-angular/node_modules/@angular-devkit/architect": { - "version": "0.1802.5", - "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.1802.5.tgz", - "integrity": "sha512-c7sVoW85Yqj7IYvNKxtNSGS5I7gWpORorg/xxLZX3OkHWXDrwYbb5LN/2p5/Aytxyb0aXl4o5fFOu6CUwcaLUw==", - "dev": true, - "dependencies": { - "@angular-devkit/core": "18.2.5", - "rxjs": "7.8.1" - }, - "engines": { - "node": "^18.19.1 || ^20.11.1 || >=22.0.0", - "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", - "yarn": ">= 1.13.0" - } - }, - "node_modules/@angular-devkit/build-angular/node_modules/@babel/generator": { - "version": "7.25.0", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.25.0.tgz", - "integrity": "sha512-3LEEcj3PVW8pW2R1SR1M89g/qrYk/m/mB/tLqn7dn4sbBUQyTqnlod+II2U4dqiGtUmkcnAmkMDralTFZttRiw==", - "dev": true, - "dependencies": { - "@babel/types": "^7.25.0", - "@jridgewell/gen-mapping": "^0.3.5", - "@jridgewell/trace-mapping": "^0.3.25", - "jsesc": "^2.5.1" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@angular-devkit/build-angular/node_modules/istanbul-lib-instrument": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-6.0.3.tgz", - "integrity": "sha512-Vtgk7L/R2JHyyGW07spoFlB8/lpjiOLTjMdms6AFMraYt3BaJauod/NGrfnVG/y4Ix1JEuMRPDPEj2ua+zz1/Q==", - "dev": true, - "dependencies": { - "@babel/core": "^7.23.9", - "@babel/parser": "^7.23.9", - "@istanbuljs/schema": "^0.1.3", - "istanbul-lib-coverage": "^3.2.0", - "semver": "^7.5.4" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@angular-devkit/build-angular/node_modules/tslib": { - "version": "2.6.3", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.3.tgz", - "integrity": "sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ==", - "dev": true - }, - "node_modules/@angular-devkit/build-webpack": { - "version": "0.1802.5", - "resolved": "https://registry.npmjs.org/@angular-devkit/build-webpack/-/build-webpack-0.1802.5.tgz", - "integrity": "sha512-6qkcrWBdkxojCVHGWcdJaz4G+7QTjFvmc+3g8xvLc9sYvJq1I059gfXhDnC0FxiA0MT4cY/26ECYWUHTD5CJLQ==", - "dev": true, - "dependencies": { - "@angular-devkit/architect": "0.1802.5", - "rxjs": "7.8.1" - }, - "engines": { - "node": "^18.19.1 || ^20.11.1 || >=22.0.0", - "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", - "yarn": ">= 1.13.0" - }, - "peerDependencies": { - "webpack": "^5.30.0", - "webpack-dev-server": "^5.0.2" - } - }, - "node_modules/@angular-devkit/build-webpack/node_modules/@angular-devkit/architect": { - "version": "0.1802.5", - "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.1802.5.tgz", - "integrity": "sha512-c7sVoW85Yqj7IYvNKxtNSGS5I7gWpORorg/xxLZX3OkHWXDrwYbb5LN/2p5/Aytxyb0aXl4o5fFOu6CUwcaLUw==", - "dev": true, - "dependencies": { - "@angular-devkit/core": "18.2.5", - "rxjs": "7.8.1" - }, - "engines": { - "node": "^18.19.1 || ^20.11.1 || >=22.0.0", - "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", - "yarn": ">= 1.13.0" - } - }, - "node_modules/@angular-devkit/core": { - "version": "18.2.5", - "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-18.2.5.tgz", - "integrity": "sha512-r9TumPlJ8PvA2+yz4sp+bUHgtznaVKzhvXTN5qL1k4YP8LJ7iZWMR2FOP+HjukHZOTsenzmV9pszbogabqwoZQ==", - "dev": true, - "dependencies": { - "ajv": "8.17.1", - "ajv-formats": "3.0.1", - "jsonc-parser": "3.3.1", - "picomatch": "4.0.2", - "rxjs": "7.8.1", - "source-map": "0.7.4" - }, - "engines": { - "node": "^18.19.1 || ^20.11.1 || >=22.0.0", - "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", - "yarn": ">= 1.13.0" - }, - "peerDependencies": { - "chokidar": "^3.5.2" - }, - "peerDependenciesMeta": { - "chokidar": { - "optional": true - } - } - }, - "node_modules/@angular-devkit/schematics": { - "version": "18.2.5", - "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-18.2.5.tgz", - "integrity": "sha512-NUmz2UQ1Xl4cf4j1AgkwIfsCjBzAPgfeC3IBrD29hSOBE1Y3j6auqjBkvw50v6mbSPxESND995Xy13HpK1Xflw==", - "dev": true, - "dependencies": { - "@angular-devkit/core": "18.2.5", - "jsonc-parser": "3.3.1", - "magic-string": "0.30.11", - "ora": "5.4.1", - "rxjs": "7.8.1" - }, - "engines": { - "node": "^18.19.1 || ^20.11.1 || >=22.0.0", - "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", - "yarn": ">= 1.13.0" - } - }, - "node_modules/@angular-eslint/builder": { - "version": "18.3.1", - "resolved": "https://registry.npmjs.org/@angular-eslint/builder/-/builder-18.3.1.tgz", - "integrity": "sha512-cPc7Ye9zDs5M4i+feL6vob+mh7yX5vxvOS5KQIhneUrp5e9D+IGuNFMmBLlOPpmklSc9XJBtuvI5Zjuh4z1ETw==", - "dev": true, - "peerDependencies": { - "eslint": "^8.57.0 || ^9.0.0", - "typescript": "*" - } - }, - "node_modules/@angular-eslint/bundled-angular-compiler": { - "version": "18.3.1", - "resolved": "https://registry.npmjs.org/@angular-eslint/bundled-angular-compiler/-/bundled-angular-compiler-18.3.1.tgz", - "integrity": "sha512-sikmkjfsXPpPTku1aQkQ1MNNEKGBgGGRvUN/WeNS9dhCJ4dxU3O7dZctt1aQWj+W3nbuUtDiimAWF5fZHGFE2Q==", - "dev": true - }, - "node_modules/@angular-eslint/eslint-plugin": { - "version": "18.3.1", - "resolved": "https://registry.npmjs.org/@angular-eslint/eslint-plugin/-/eslint-plugin-18.3.1.tgz", - "integrity": "sha512-MP4Nm+SHboF8KdnN0KpPEGAaTTzDLPm3+S/4W3Mg8onqWCyadyd4mActh9mK/pvCj8TVlb/SW1zeTtdMYhwonw==", - "dev": true, - "dependencies": { - "@angular-eslint/bundled-angular-compiler": "18.3.1", - "@angular-eslint/utils": "18.3.1" - }, - "peerDependencies": { - "@typescript-eslint/utils": "^7.11.0 || ^8.0.0", - "eslint": "^8.57.0 || ^9.0.0", - "typescript": "*" - } - }, - "node_modules/@angular-eslint/eslint-plugin-template": { - "version": "18.3.1", - "resolved": "https://registry.npmjs.org/@angular-eslint/eslint-plugin-template/-/eslint-plugin-template-18.3.1.tgz", - "integrity": "sha512-hBJ3+f7VSidvrtYaXH7Vp0sWvblA9jLK2c6uQzhYGWdEDUcTg7g7VI9ThW39WvMbHqkyzNE4PPOynK69cBEDGg==", - "dev": true, - "dependencies": { - "@angular-eslint/bundled-angular-compiler": "18.3.1", - "@angular-eslint/utils": "18.3.1", - "aria-query": "5.3.0", - "axobject-query": "4.1.0" - }, - "peerDependencies": { - "@typescript-eslint/utils": "^7.11.0 || ^8.0.0", - "eslint": "^8.57.0 || ^9.0.0", - "typescript": "*" - } - }, - "node_modules/@angular-eslint/schematics": { - "version": "18.3.1", - "resolved": "https://registry.npmjs.org/@angular-eslint/schematics/-/schematics-18.3.1.tgz", - "integrity": "sha512-BTsQHDu7LjvXannJTb5BqMPCFIHRNN94eRyb60VfjJxB/ZFtsbAQDFFOi5lEZsRsd4mBeUMuL9mW4IMcPtUQ9Q==", - "dev": true, - "dependencies": { - "@angular-eslint/eslint-plugin": "18.3.1", - "@angular-eslint/eslint-plugin-template": "18.3.1", - "ignore": "5.3.2", - "semver": "7.6.3", - "strip-json-comments": "3.1.1" - }, - "peerDependencies": { - "@angular-devkit/core": ">= 18.0.0 < 19.0.0", - "@angular-devkit/schematics": ">= 18.0.0 < 19.0.0" - } - }, - "node_modules/@angular-eslint/template-parser": { - "version": "18.3.1", - "resolved": "https://registry.npmjs.org/@angular-eslint/template-parser/-/template-parser-18.3.1.tgz", - "integrity": "sha512-JUUkfWH1G+u/Uk85ZYvJSt/qwN/Ko+jlXFtzBEcknJZsTWTwBcp36v77gPZe5FmKSziJZpyPUd+7Kiy6tuSCTw==", - "dev": true, - "dependencies": { - "@angular-eslint/bundled-angular-compiler": "18.3.1", - "eslint-scope": "^8.0.2" - }, - "peerDependencies": { - "eslint": "^8.57.0 || ^9.0.0", - "typescript": "*" - } - }, - "node_modules/@angular-eslint/template-parser/node_modules/eslint-scope": { - "version": "8.0.2", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-8.0.2.tgz", - "integrity": "sha512-6E4xmrTw5wtxnLA5wYL3WDfhZ/1bUBGOXV0zQvVRDOtrR8D0p6W7fs3JweNYhwRYeGvd/1CKX2se0/2s7Q/nJA==", - "dev": true, - "dependencies": { - "esrecurse": "^4.3.0", - "estraverse": "^5.2.0" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/@angular-eslint/template-parser/node_modules/estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "dev": true, - "engines": { - "node": ">=4.0" - } - }, - "node_modules/@angular-eslint/utils": { - "version": "18.3.1", - "resolved": "https://registry.npmjs.org/@angular-eslint/utils/-/utils-18.3.1.tgz", - "integrity": "sha512-sd9niZI7h9H2FQ7OLiQsLFBhjhRQTASh+Q0+4+hyjv9idbSHBJli8Gsi2fqj9zhtMKpAZFTrWzuLUpubJ9UYbA==", - "dev": true, - "dependencies": { - "@angular-eslint/bundled-angular-compiler": "18.3.1" - }, - "peerDependencies": { - "@typescript-eslint/utils": "^7.11.0 || ^8.0.0", - "eslint": "^8.57.0 || ^9.0.0", - "typescript": "*" - } - }, - "node_modules/@angular/animations": { - "version": "18.2.5", - "resolved": "https://registry.npmjs.org/@angular/animations/-/animations-18.2.5.tgz", - "integrity": "sha512-IlXtW/Nj48ZzjHUzH1TykZcSR64ScJx39T3IHnjV2z/bVATzZ36JGoadQHdqpJNKBodYJNgtJCGLCbgAvGWY2g==", - "dev": true, - "dependencies": { - "tslib": "^2.3.0" - }, - "engines": { - "node": "^18.19.1 || ^20.11.1 || >=22.0.0" - }, - "peerDependencies": { - "@angular/core": "18.2.5" - } - }, - "node_modules/@angular/build": { - "version": "18.2.5", - "resolved": "https://registry.npmjs.org/@angular/build/-/build-18.2.5.tgz", - "integrity": "sha512-XWkmjzgeUga0SJ0lYSYcTuYOWTyqcln2mNfBp7Ae/GZ+/7+APbedsIZEiZGZwveOIyOpTM5wguNSoe9khDl5Ig==", - "dev": true, - "dependencies": { - "@ampproject/remapping": "2.3.0", - "@angular-devkit/architect": "0.1802.5", - "@babel/core": "7.25.2", - "@babel/helper-annotate-as-pure": "7.24.7", - "@babel/helper-split-export-declaration": "7.24.7", - "@babel/plugin-syntax-import-attributes": "7.24.7", - "@inquirer/confirm": "3.1.22", - "@vitejs/plugin-basic-ssl": "1.1.0", - "browserslist": "^4.23.0", - "critters": "0.0.24", - "esbuild": "0.23.0", - "fast-glob": "3.3.2", - "https-proxy-agent": "7.0.5", - "listr2": "8.2.4", - "lmdb": "3.0.13", - "magic-string": "0.30.11", - "mrmime": "2.0.0", - "parse5-html-rewriting-stream": "7.0.0", - "picomatch": "4.0.2", - "piscina": "4.6.1", - "rollup": "4.20.0", - "sass": "1.77.6", - "semver": "7.6.3", - "vite": "5.4.6", - "watchpack": "2.4.1" - }, - "engines": { - "node": "^18.19.1 || ^20.11.1 || >=22.0.0", - "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", - "yarn": ">= 1.13.0" - }, - "peerDependencies": { - "@angular/compiler-cli": "^18.0.0", - "@angular/localize": "^18.0.0", - "@angular/platform-server": "^18.0.0", - "@angular/service-worker": "^18.0.0", - "less": "^4.2.0", - "postcss": "^8.4.0", - "tailwindcss": "^2.0.0 || ^3.0.0", - "typescript": ">=5.4 <5.6" - }, - "peerDependenciesMeta": { - "@angular/localize": { - "optional": true - }, - "@angular/platform-server": { - "optional": true - }, - "@angular/service-worker": { - "optional": true - }, - "less": { - "optional": true - }, - "postcss": { - "optional": true - }, - "tailwindcss": { - "optional": true - } - } - }, - "node_modules/@angular/build/node_modules/@angular-devkit/architect": { - "version": "0.1802.5", - "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.1802.5.tgz", - "integrity": "sha512-c7sVoW85Yqj7IYvNKxtNSGS5I7gWpORorg/xxLZX3OkHWXDrwYbb5LN/2p5/Aytxyb0aXl4o5fFOu6CUwcaLUw==", - "dev": true, - "dependencies": { - "@angular-devkit/core": "18.2.5", - "rxjs": "7.8.1" - }, - "engines": { - "node": "^18.19.1 || ^20.11.1 || >=22.0.0", - "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", - "yarn": ">= 1.13.0" - } - }, - "node_modules/@angular/build/node_modules/@inquirer/confirm": { - "version": "3.1.22", - "resolved": "https://registry.npmjs.org/@inquirer/confirm/-/confirm-3.1.22.tgz", - "integrity": "sha512-gsAKIOWBm2Q87CDfs9fEo7wJT3fwWIJfnDGMn9Qy74gBnNFOACDNfhUzovubbJjWnKLGBln7/NcSmZwj5DuEXg==", - "dev": true, - "dependencies": { - "@inquirer/core": "^9.0.10", - "@inquirer/type": "^1.5.2" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/@angular/cli": { - "version": "18.2.5", - "resolved": "https://registry.npmjs.org/@angular/cli/-/cli-18.2.5.tgz", - "integrity": "sha512-97uNs0HsOdnMaTlNJKFjIBUXw0wz43uYvSSKmIpBt7eq1LaPLju1G/qpDIHx2YwhMClPrXXrW2H/xdvqZiIw+w==", - "dev": true, - "dependencies": { - "@angular-devkit/architect": "0.1802.5", - "@angular-devkit/core": "18.2.5", - "@angular-devkit/schematics": "18.2.5", - "@inquirer/prompts": "5.3.8", - "@listr2/prompt-adapter-inquirer": "2.0.15", - "@schematics/angular": "18.2.5", - "@yarnpkg/lockfile": "1.1.0", - "ini": "4.1.3", - "jsonc-parser": "3.3.1", - "listr2": "8.2.4", - "npm-package-arg": "11.0.3", - "npm-pick-manifest": "9.1.0", - "pacote": "18.0.6", - "resolve": "1.22.8", - "semver": "7.6.3", - "symbol-observable": "4.0.0", - "yargs": "17.7.2" - }, - "bin": { - "ng": "bin/ng.js" - }, - "engines": { - "node": "^18.19.1 || ^20.11.1 || >=22.0.0", - "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", - "yarn": ">= 1.13.0" - } - }, - "node_modules/@angular/cli/node_modules/@angular-devkit/architect": { - "version": "0.1802.5", - "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.1802.5.tgz", - "integrity": "sha512-c7sVoW85Yqj7IYvNKxtNSGS5I7gWpORorg/xxLZX3OkHWXDrwYbb5LN/2p5/Aytxyb0aXl4o5fFOu6CUwcaLUw==", - "dev": true, - "dependencies": { - "@angular-devkit/core": "18.2.5", - "rxjs": "7.8.1" - }, - "engines": { - "node": "^18.19.1 || ^20.11.1 || >=22.0.0", - "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", - "yarn": ">= 1.13.0" - } - }, - "node_modules/@angular/common": { - "version": "18.2.5", - "resolved": "https://registry.npmjs.org/@angular/common/-/common-18.2.5.tgz", - "integrity": "sha512-m+KJrtbFXTE36jP/po6UAMeUR/enQxRHpVGLCRcIcE7VWVH1ZcOvoW1yqh2A6k+KxWXeajlq/Z04nnMhcoxMRw==", - "dev": true, - "dependencies": { - "tslib": "^2.3.0" - }, - "engines": { - "node": "^18.19.1 || ^20.11.1 || >=22.0.0" - }, - "peerDependencies": { - "@angular/core": "18.2.5", - "rxjs": "^6.5.3 || ^7.4.0" - } - }, - "node_modules/@angular/compiler": { - "version": "18.2.5", - "resolved": "https://registry.npmjs.org/@angular/compiler/-/compiler-18.2.5.tgz", - "integrity": "sha512-vcqe9x4dGGAnMfPhEpcZyiSVgAiqJeK80LqP1vWoAmBR+HeOqAilSv6SflcLAtuTzwgzMMAvD2T+SMCgUvaqww==", - "dev": true, - "dependencies": { - "tslib": "^2.3.0" - }, - "engines": { - "node": "^18.19.1 || ^20.11.1 || >=22.0.0" - }, - "peerDependencies": { - "@angular/core": "18.2.5" - }, - "peerDependenciesMeta": { - "@angular/core": { - "optional": true - } - } - }, - "node_modules/@angular/compiler-cli": { - "version": "18.2.5", - "resolved": "https://registry.npmjs.org/@angular/compiler-cli/-/compiler-cli-18.2.5.tgz", - "integrity": "sha512-CCCtZobUTUfId/RTYtuDCw5R1oK0w65hdAUMRP1MdGmd8bb8DKJA86u1QCWwozL3rbXlIIX4ognQ6urQ43k/Gw==", - "dev": true, - "dependencies": { - "@babel/core": "7.25.2", - "@jridgewell/sourcemap-codec": "^1.4.14", - "chokidar": "^3.0.0", - "convert-source-map": "^1.5.1", - "reflect-metadata": "^0.2.0", - "semver": "^7.0.0", - "tslib": "^2.3.0", - "yargs": "^17.2.1" - }, - "bin": { - "ng-xi18n": "bundles/src/bin/ng_xi18n.js", - "ngc": "bundles/src/bin/ngc.js", - "ngcc": "bundles/ngcc/index.js" - }, - "engines": { - "node": "^18.19.1 || ^20.11.1 || >=22.0.0" - }, - "peerDependencies": { - "@angular/compiler": "18.2.5", - "typescript": ">=5.4 <5.6" - } - }, - "node_modules/@angular/core": { - "version": "18.2.5", - "resolved": "https://registry.npmjs.org/@angular/core/-/core-18.2.5.tgz", - "integrity": "sha512-5BLVc5gXxzanQkADNS9WPsor3vNF5nQcyIHBi5VScErwM5vVZ7ATH1iZwaOg1ykDEVTFVhKDwD0X1aaqGDbhmQ==", - "dev": true, - "dependencies": { - "tslib": "^2.3.0" - }, - "engines": { - "node": "^18.19.1 || ^20.11.1 || >=22.0.0" - }, - "peerDependencies": { - "rxjs": "^6.5.3 || ^7.4.0", - "zone.js": "~0.14.10" - } - }, - "node_modules/@angular/forms": { - "version": "18.2.5", - "resolved": "https://registry.npmjs.org/@angular/forms/-/forms-18.2.5.tgz", - "integrity": "sha512-ohKeH+EZCCIyGSiFYlraWLzssGAZc13P92cuYpXB62322PkcA5u0IT72mML9JWGKRqF2zteVsw4koWHVxXM5mA==", - "dev": true, - "dependencies": { - "tslib": "^2.3.0" - }, - "engines": { - "node": "^18.19.1 || ^20.11.1 || >=22.0.0" - }, - "peerDependencies": { - "@angular/common": "18.2.5", - "@angular/core": "18.2.5", - "@angular/platform-browser": "18.2.5", - "rxjs": "^6.5.3 || ^7.4.0" - } - }, - "node_modules/@angular/platform-browser": { - "version": "18.2.5", - "resolved": "https://registry.npmjs.org/@angular/platform-browser/-/platform-browser-18.2.5.tgz", - "integrity": "sha512-PoX9idwnOpTJBlujzZ2nFGOsmCnZzOH7uNSWIR7trdoq0b1AFXfrxlCQ36qWamk7bbhJI4H28L8YTmKew/nXDA==", - "dev": true, - "dependencies": { - "tslib": "^2.3.0" - }, - "engines": { - "node": "^18.19.1 || ^20.11.1 || >=22.0.0" - }, - "peerDependencies": { - "@angular/animations": "18.2.5", - "@angular/common": "18.2.5", - "@angular/core": "18.2.5" - }, - "peerDependenciesMeta": { - "@angular/animations": { - "optional": true - } - } - }, - "node_modules/@angular/platform-browser-dynamic": { - "version": "18.2.5", - "resolved": "https://registry.npmjs.org/@angular/platform-browser-dynamic/-/platform-browser-dynamic-18.2.5.tgz", - "integrity": "sha512-5u0IuAt1r5e2u2vSKhp3phnaf6hH89B/q7GErfPse1sdDfNI6wHVppxai28PAfAj9gwooJun6MjFWhJFLzS44A==", - "dev": true, - "dependencies": { - "tslib": "^2.3.0" - }, - "engines": { - "node": "^18.19.1 || ^20.11.1 || >=22.0.0" - }, - "peerDependencies": { - "@angular/common": "18.2.5", - "@angular/compiler": "18.2.5", - "@angular/core": "18.2.5", - "@angular/platform-browser": "18.2.5" - } - }, - "node_modules/@babel/code-frame": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.24.7.tgz", - "integrity": "sha512-BcYH1CVJBO9tvyIZ2jVeXgSIMvGZ2FDRvDdOIVQyuklNKSsx+eppDEBq/g47Ayw+RqNFE+URvOShmf+f/qwAlA==", - "dev": true, - "dependencies": { - "@babel/highlight": "^7.24.7", - "picocolors": "^1.0.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/compat-data": { - "version": "7.25.4", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.25.4.tgz", - "integrity": "sha512-+LGRog6RAsCJrrrg/IO6LGmpphNe5DiK30dGjCoxxeGv49B10/3XYGxPsAwrDlMFcFEvdAUavDT8r9k/hSyQqQ==", - "dev": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/core": { - "version": "7.25.2", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.25.2.tgz", - "integrity": "sha512-BBt3opiCOxUr9euZ5/ro/Xv8/V7yJ5bjYMqG/C1YAo8MIKAnumZalCN+msbci3Pigy4lIQfPUpfMM27HMGaYEA==", - "dev": true, - "dependencies": { - "@ampproject/remapping": "^2.2.0", - "@babel/code-frame": "^7.24.7", - "@babel/generator": "^7.25.0", - "@babel/helper-compilation-targets": "^7.25.2", - "@babel/helper-module-transforms": "^7.25.2", - "@babel/helpers": "^7.25.0", - "@babel/parser": "^7.25.0", - "@babel/template": "^7.25.0", - "@babel/traverse": "^7.25.2", - "@babel/types": "^7.25.2", - "convert-source-map": "^2.0.0", - "debug": "^4.1.0", - "gensync": "^1.0.0-beta.2", - "json5": "^2.2.3", - "semver": "^6.3.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/babel" - } - }, - "node_modules/@babel/core/node_modules/convert-source-map": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", - "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", - "dev": true - }, - "node_modules/@babel/core/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true, - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/@babel/generator": { - "version": "7.25.6", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.25.6.tgz", - "integrity": "sha512-VPC82gr1seXOpkjAAKoLhP50vx4vGNlF4msF64dSFq1P8RfB+QAuJWGHPXXPc8QyfVWwwB/TNNU4+ayZmHNbZw==", - "dev": true, - "dependencies": { - "@babel/types": "^7.25.6", - "@jridgewell/gen-mapping": "^0.3.5", - "@jridgewell/trace-mapping": "^0.3.25", - "jsesc": "^2.5.1" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-annotate-as-pure": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.24.7.tgz", - "integrity": "sha512-BaDeOonYvhdKw+JoMVkAixAAJzG2jVPIwWoKBPdYuY9b452e2rPuI9QPYh3KpofZ3pW2akOmwZLOiOsHMiqRAg==", - "dev": true, - "dependencies": { - "@babel/types": "^7.24.7" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-builder-binary-assignment-operator-visitor": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.24.7.tgz", - "integrity": "sha512-xZeCVVdwb4MsDBkkyZ64tReWYrLRHlMN72vP7Bdm3OUOuyFZExhsHUUnuWnm2/XOlAJzR0LfPpB56WXZn0X/lA==", - "dev": true, - "dependencies": { - "@babel/traverse": "^7.24.7", - "@babel/types": "^7.24.7" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-compilation-targets": { - "version": "7.25.2", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.25.2.tgz", - "integrity": "sha512-U2U5LsSaZ7TAt3cfaymQ8WHh0pxvdHoEk6HVpaexxixjyEquMh0L0YNJNM6CTGKMXV1iksi0iZkGw4AcFkPaaw==", - "dev": true, - "dependencies": { - "@babel/compat-data": "^7.25.2", - "@babel/helper-validator-option": "^7.24.8", - "browserslist": "^4.23.1", - "lru-cache": "^5.1.1", - "semver": "^6.3.1" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-compilation-targets/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true, - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/@babel/helper-create-class-features-plugin": { - "version": "7.25.4", - "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.25.4.tgz", - "integrity": "sha512-ro/bFs3/84MDgDmMwbcHgDa8/E6J3QKNTk4xJJnVeFtGE+tL0K26E3pNxhYz2b67fJpt7Aphw5XcploKXuCvCQ==", - "dev": true, - "dependencies": { - "@babel/helper-annotate-as-pure": "^7.24.7", - "@babel/helper-member-expression-to-functions": "^7.24.8", - "@babel/helper-optimise-call-expression": "^7.24.7", - "@babel/helper-replace-supers": "^7.25.0", - "@babel/helper-skip-transparent-expression-wrappers": "^7.24.7", - "@babel/traverse": "^7.25.4", - "semver": "^6.3.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/helper-create-class-features-plugin/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true, - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/@babel/helper-create-regexp-features-plugin": { - "version": "7.25.2", - "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.25.2.tgz", - "integrity": "sha512-+wqVGP+DFmqwFD3EH6TMTfUNeqDehV3E/dl+Sd54eaXqm17tEUNbEIn4sVivVowbvUpOtIGxdo3GoXyDH9N/9g==", - "dev": true, - "dependencies": { - "@babel/helper-annotate-as-pure": "^7.24.7", - "regexpu-core": "^5.3.1", - "semver": "^6.3.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/helper-create-regexp-features-plugin/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true, - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/@babel/helper-define-polyfill-provider": { - "version": "0.6.2", - "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.6.2.tgz", - "integrity": "sha512-LV76g+C502biUK6AyZ3LK10vDpDyCzZnhZFXkH1L75zHPj68+qc8Zfpx2th+gzwA2MzyK+1g/3EPl62yFnVttQ==", - "dev": true, - "dependencies": { - "@babel/helper-compilation-targets": "^7.22.6", - "@babel/helper-plugin-utils": "^7.22.5", - "debug": "^4.1.1", - "lodash.debounce": "^4.0.8", - "resolve": "^1.14.2" - }, - "peerDependencies": { - "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" - } - }, - "node_modules/@babel/helper-member-expression-to-functions": { - "version": "7.24.8", - "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.24.8.tgz", - "integrity": "sha512-LABppdt+Lp/RlBxqrh4qgf1oEH/WxdzQNDJIu5gC/W1GyvPVrOBiItmmM8wan2fm4oYqFuFfkXmlGpLQhPY8CA==", - "dev": true, - "dependencies": { - "@babel/traverse": "^7.24.8", - "@babel/types": "^7.24.8" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-module-imports": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.24.7.tgz", - "integrity": "sha512-8AyH3C+74cgCVVXow/myrynrAGv+nTVg5vKu2nZph9x7RcRwzmh0VFallJuFTZ9mx6u4eSdXZfcOzSqTUm0HCA==", - "dev": true, - "dependencies": { - "@babel/traverse": "^7.24.7", - "@babel/types": "^7.24.7" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-module-transforms": { - "version": "7.25.2", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.25.2.tgz", - "integrity": "sha512-BjyRAbix6j/wv83ftcVJmBt72QtHI56C7JXZoG2xATiLpmoC7dpd8WnkikExHDVPpi/3qCmO6WY1EaXOluiecQ==", - "dev": true, - "dependencies": { - "@babel/helper-module-imports": "^7.24.7", - "@babel/helper-simple-access": "^7.24.7", - "@babel/helper-validator-identifier": "^7.24.7", - "@babel/traverse": "^7.25.2" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/helper-optimise-call-expression": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.24.7.tgz", - "integrity": "sha512-jKiTsW2xmWwxT1ixIdfXUZp+P5yURx2suzLZr5Hi64rURpDYdMW0pv+Uf17EYk2Rd428Lx4tLsnjGJzYKDM/6A==", - "dev": true, - "dependencies": { - "@babel/types": "^7.24.7" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-plugin-utils": { - "version": "7.24.8", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.24.8.tgz", - "integrity": "sha512-FFWx5142D8h2Mgr/iPVGH5G7w6jDn4jUSpZTyDnQO0Yn7Ks2Kuz6Pci8H6MPCoUJegd/UZQ3tAvfLCxQSnWWwg==", - "dev": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-remap-async-to-generator": { - "version": "7.25.0", - "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.25.0.tgz", - "integrity": "sha512-NhavI2eWEIz/H9dbrG0TuOicDhNexze43i5z7lEqwYm0WEZVTwnPpA0EafUTP7+6/W79HWIP2cTe3Z5NiSTVpw==", - "dev": true, - "dependencies": { - "@babel/helper-annotate-as-pure": "^7.24.7", - "@babel/helper-wrap-function": "^7.25.0", - "@babel/traverse": "^7.25.0" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/helper-replace-supers": { - "version": "7.25.0", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.25.0.tgz", - "integrity": "sha512-q688zIvQVYtZu+i2PsdIu/uWGRpfxzr5WESsfpShfZECkO+d2o+WROWezCi/Q6kJ0tfPa5+pUGUlfx2HhrA3Bg==", - "dev": true, - "dependencies": { - "@babel/helper-member-expression-to-functions": "^7.24.8", - "@babel/helper-optimise-call-expression": "^7.24.7", - "@babel/traverse": "^7.25.0" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/helper-simple-access": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.24.7.tgz", - "integrity": "sha512-zBAIvbCMh5Ts+b86r/CjU+4XGYIs+R1j951gxI3KmmxBMhCg4oQMsv6ZXQ64XOm/cvzfU1FmoCyt6+owc5QMYg==", - "dev": true, - "dependencies": { - "@babel/traverse": "^7.24.7", - "@babel/types": "^7.24.7" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-skip-transparent-expression-wrappers": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.24.7.tgz", - "integrity": "sha512-IO+DLT3LQUElMbpzlatRASEyQtfhSE0+m465v++3jyyXeBTBUjtVZg28/gHeV5mrTJqvEKhKroBGAvhW+qPHiQ==", - "dev": true, - "dependencies": { - "@babel/traverse": "^7.24.7", - "@babel/types": "^7.24.7" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-split-export-declaration": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.24.7.tgz", - "integrity": "sha512-oy5V7pD+UvfkEATUKvIjvIAH/xCzfsFVw7ygW2SI6NClZzquT+mwdTfgfdbUiceh6iQO0CHtCPsyze/MZ2YbAA==", - "dev": true, - "dependencies": { - "@babel/types": "^7.24.7" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-string-parser": { - "version": "7.24.8", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.24.8.tgz", - "integrity": "sha512-pO9KhhRcuUyGnJWwyEgnRJTSIZHiT+vMD0kPeD+so0l7mxkMT19g3pjY9GTnHySck/hDzq+dtW/4VgnMkippsQ==", - "dev": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-validator-identifier": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.24.7.tgz", - "integrity": "sha512-rR+PBcQ1SMQDDyF6X0wxtG8QyLCgUB0eRAGguqRLfkCA87l7yAP7ehq8SNj96OOGTO8OBV70KhuFYcIkHXOg0w==", - "dev": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-validator-option": { - "version": "7.24.8", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.24.8.tgz", - "integrity": "sha512-xb8t9tD1MHLungh/AIoWYN+gVHaB9kwlu8gffXGSt3FFEIT7RjS+xWbc2vUD1UTZdIpKj/ab3rdqJ7ufngyi2Q==", - "dev": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-wrap-function": { - "version": "7.25.0", - "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.25.0.tgz", - "integrity": "sha512-s6Q1ebqutSiZnEjaofc/UKDyC4SbzV5n5SrA2Gq8UawLycr3i04f1dX4OzoQVnexm6aOCh37SQNYlJ/8Ku+PMQ==", - "dev": true, - "dependencies": { - "@babel/template": "^7.25.0", - "@babel/traverse": "^7.25.0", - "@babel/types": "^7.25.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helpers": { - "version": "7.25.6", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.25.6.tgz", - "integrity": "sha512-Xg0tn4HcfTijTwfDwYlvVCl43V6h4KyVVX2aEm4qdO/PC6L2YvzLHFdmxhoeSA3eslcE6+ZVXHgWwopXYLNq4Q==", - "dev": true, - "dependencies": { - "@babel/template": "^7.25.0", - "@babel/types": "^7.25.6" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/highlight": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.24.7.tgz", - "integrity": "sha512-EStJpq4OuY8xYfhGVXngigBJRWxftKX9ksiGDnmlY3o7B/V7KIAc9X4oiK87uPJSc/vs5L869bem5fhZa8caZw==", - "dev": true, - "dependencies": { - "@babel/helper-validator-identifier": "^7.24.7", - "chalk": "^2.4.2", - "js-tokens": "^4.0.0", - "picocolors": "^1.0.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/parser": { - "version": "7.25.6", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.25.6.tgz", - "integrity": "sha512-trGdfBdbD0l1ZPmcJ83eNxB9rbEax4ALFTF7fN386TMYbeCQbyme5cOEXQhbGXKebwGaB/J52w1mrklMcbgy6Q==", - "dev": true, - "dependencies": { - "@babel/types": "^7.25.6" - }, - "bin": { - "parser": "bin/babel-parser.js" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@babel/plugin-bugfix-firefox-class-in-computed-class-key": { - "version": "7.25.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-firefox-class-in-computed-class-key/-/plugin-bugfix-firefox-class-in-computed-class-key-7.25.3.tgz", - "integrity": "sha512-wUrcsxZg6rqBXG05HG1FPYgsP6EvwF4WpBbxIpWIIYnH8wG0gzx3yZY3dtEHas4sTAOGkbTsc9EGPxwff8lRoA==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.24.8", - "@babel/traverse": "^7.25.3" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/plugin-bugfix-safari-class-field-initializer-scope": { - "version": "7.25.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-class-field-initializer-scope/-/plugin-bugfix-safari-class-field-initializer-scope-7.25.0.tgz", - "integrity": "sha512-Bm4bH2qsX880b/3ziJ8KD711LT7z4u8CFudmjqle65AZj/HNUFhEf90dqYv6O86buWvSBmeQDjv0Tn2aF/bIBA==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.24.8" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": { - "version": "7.25.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.25.0.tgz", - "integrity": "sha512-lXwdNZtTmeVOOFtwM/WDe7yg1PL8sYhRk/XH0FzbR2HDQ0xC+EnQ/JHeoMYSavtU115tnUk0q9CDyq8si+LMAA==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.24.8" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.24.7.tgz", - "integrity": "sha512-+izXIbke1T33mY4MSNnrqhPXDz01WYhEf3yF5NbnUtkiNnm+XBZJl3kNfoK6NKmYlz/D07+l2GWVK/QfDkNCuQ==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7", - "@babel/helper-skip-transparent-expression-wrappers": "^7.24.7", - "@babel/plugin-transform-optional-chaining": "^7.24.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.13.0" - } - }, - "node_modules/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": { - "version": "7.25.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly/-/plugin-bugfix-v8-static-class-fields-redefine-readonly-7.25.0.tgz", - "integrity": "sha512-tggFrk1AIShG/RUQbEwt2Tr/E+ObkfwrPjR6BjbRvsx24+PSjK8zrq0GWPNCjo8qpRx4DuJzlcvWJqlm+0h3kw==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.24.8", - "@babel/traverse": "^7.25.0" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/plugin-proposal-private-property-in-object": { - "version": "7.21.0-placeholder-for-preset-env.2", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.21.0-placeholder-for-preset-env.2.tgz", - "integrity": "sha512-SOSkfJDddaM7mak6cPEpswyTRnuRltl429hMraQEglW+OkovnCzsiszTmsrlY//qLFjCpQDFRvjdm2wA5pPm9w==", - "dev": true, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-async-generators": { - "version": "7.8.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", - "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-class-properties": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz", - "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.12.13" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-class-static-block": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz", - "integrity": "sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.14.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-dynamic-import": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz", - "integrity": "sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-export-namespace-from": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-export-namespace-from/-/plugin-syntax-export-namespace-from-7.8.3.tgz", - "integrity": "sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.3" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-import-assertions": { - "version": "7.25.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.25.6.tgz", - "integrity": "sha512-aABl0jHw9bZ2karQ/uUD6XP4u0SG22SJrOHFoL6XB1R7dTovOP4TzTlsxOYC5yQ1pdscVK2JTUnF6QL3ARoAiQ==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.24.8" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-import-attributes": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.24.7.tgz", - "integrity": "sha512-hbX+lKKeUMGihnK8nvKqmXBInriT3GVjzXKFriV3YC6APGxMbP8RZNFwy91+hocLXq90Mta+HshoB31802bb8A==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-import-meta": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz", - "integrity": "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.10.4" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-json-strings": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", - "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-logical-assignment-operators": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz", - "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.10.4" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-nullish-coalescing-operator": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", - "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-numeric-separator": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz", - "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.10.4" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-object-rest-spread": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", - "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-optional-catch-binding": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", - "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-optional-chaining": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", - "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-private-property-in-object": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz", - "integrity": "sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.14.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-top-level-await": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz", - "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.14.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-unicode-sets-regex": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-unicode-sets-regex/-/plugin-syntax-unicode-sets-regex-7.18.6.tgz", - "integrity": "sha512-727YkEAPwSIQTv5im8QHz3upqp92JTWhidIC81Tdx4VJYIte/VndKf1qKrfnnhPLiPghStWfvC/iFaMCQu7Nqg==", - "dev": true, - "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/plugin-transform-arrow-functions": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.24.7.tgz", - "integrity": "sha512-Dt9LQs6iEY++gXUwY03DNFat5C2NbO48jj+j/bSAz6b3HgPs39qcPiYt77fDObIcFwj3/C2ICX9YMwGflUoSHQ==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-async-generator-functions": { - "version": "7.25.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.25.0.tgz", - "integrity": "sha512-uaIi2FdqzjpAMvVqvB51S42oC2JEVgh0LDsGfZVDysWE8LrJtQC2jvKmOqEYThKyB7bDEb7BP1GYWDm7tABA0Q==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.24.8", - "@babel/helper-remap-async-to-generator": "^7.25.0", - "@babel/plugin-syntax-async-generators": "^7.8.4", - "@babel/traverse": "^7.25.0" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-async-to-generator": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.24.7.tgz", - "integrity": "sha512-SQY01PcJfmQ+4Ash7NE+rpbLFbmqA2GPIgqzxfFTL4t1FKRq4zTms/7htKpoCUI9OcFYgzqfmCdH53s6/jn5fA==", - "dev": true, - "dependencies": { - "@babel/helper-module-imports": "^7.24.7", - "@babel/helper-plugin-utils": "^7.24.7", - "@babel/helper-remap-async-to-generator": "^7.24.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-block-scoped-functions": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.24.7.tgz", - "integrity": "sha512-yO7RAz6EsVQDaBH18IDJcMB1HnrUn2FJ/Jslc/WtPPWcjhpUJXU/rjbwmluzp7v/ZzWcEhTMXELnnsz8djWDwQ==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-block-scoping": { - "version": "7.25.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.25.0.tgz", - "integrity": "sha512-yBQjYoOjXlFv9nlXb3f1casSHOZkWr29NX+zChVanLg5Nc157CrbEX9D7hxxtTpuFy7Q0YzmmWfJxzvps4kXrQ==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.24.8" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-class-properties": { - "version": "7.25.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.25.4.tgz", - "integrity": "sha512-nZeZHyCWPfjkdU5pA/uHiTaDAFUEqkpzf1YoQT2NeSynCGYq9rxfyI3XpQbfx/a0hSnFH6TGlEXvae5Vi7GD8g==", - "dev": true, - "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.25.4", - "@babel/helper-plugin-utils": "^7.24.8" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-class-static-block": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.24.7.tgz", - "integrity": "sha512-HMXK3WbBPpZQufbMG4B46A90PkuuhN9vBCb5T8+VAHqvAqvcLi+2cKoukcpmUYkszLhScU3l1iudhrks3DggRQ==", - "dev": true, - "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.24.7", - "@babel/helper-plugin-utils": "^7.24.7", - "@babel/plugin-syntax-class-static-block": "^7.14.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.12.0" - } - }, - "node_modules/@babel/plugin-transform-classes": { - "version": "7.25.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.25.4.tgz", - "integrity": "sha512-oexUfaQle2pF/b6E0dwsxQtAol9TLSO88kQvym6HHBWFliV2lGdrPieX+WgMRLSJDVzdYywk7jXbLPuO2KLTLg==", - "dev": true, - "dependencies": { - "@babel/helper-annotate-as-pure": "^7.24.7", - "@babel/helper-compilation-targets": "^7.25.2", - "@babel/helper-plugin-utils": "^7.24.8", - "@babel/helper-replace-supers": "^7.25.0", - "@babel/traverse": "^7.25.4", - "globals": "^11.1.0" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-computed-properties": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.24.7.tgz", - "integrity": "sha512-25cS7v+707Gu6Ds2oY6tCkUwsJ9YIDbggd9+cu9jzzDgiNq7hR/8dkzxWfKWnTic26vsI3EsCXNd4iEB6e8esQ==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7", - "@babel/template": "^7.24.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-destructuring": { - "version": "7.24.8", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.24.8.tgz", - "integrity": "sha512-36e87mfY8TnRxc7yc6M9g9gOB7rKgSahqkIKwLpz4Ppk2+zC2Cy1is0uwtuSG6AE4zlTOUa+7JGz9jCJGLqQFQ==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.24.8" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-dotall-regex": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.24.7.tgz", - "integrity": "sha512-ZOA3W+1RRTSWvyqcMJDLqbchh7U4NRGqwRfFSVbOLS/ePIP4vHB5e8T8eXcuqyN1QkgKyj5wuW0lcS85v4CrSw==", - "dev": true, - "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.24.7", - "@babel/helper-plugin-utils": "^7.24.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-duplicate-keys": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.24.7.tgz", - "integrity": "sha512-JdYfXyCRihAe46jUIliuL2/s0x0wObgwwiGxw/UbgJBr20gQBThrokO4nYKgWkD7uBaqM7+9x5TU7NkExZJyzw==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-duplicate-named-capturing-groups-regex": { - "version": "7.25.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-named-capturing-groups-regex/-/plugin-transform-duplicate-named-capturing-groups-regex-7.25.0.tgz", - "integrity": "sha512-YLpb4LlYSc3sCUa35un84poXoraOiQucUTTu8X1j18JV+gNa8E0nyUf/CjZ171IRGr4jEguF+vzJU66QZhn29g==", - "dev": true, - "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.25.0", - "@babel/helper-plugin-utils": "^7.24.8" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/plugin-transform-dynamic-import": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.24.7.tgz", - "integrity": "sha512-sc3X26PhZQDb3JhORmakcbvkeInvxz+A8oda99lj7J60QRuPZvNAk9wQlTBS1ZynelDrDmTU4pw1tyc5d5ZMUg==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7", - "@babel/plugin-syntax-dynamic-import": "^7.8.3" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-exponentiation-operator": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.24.7.tgz", - "integrity": "sha512-Rqe/vSc9OYgDajNIK35u7ot+KeCoetqQYFXM4Epf7M7ez3lWlOjrDjrwMei6caCVhfdw+mIKD4cgdGNy5JQotQ==", - "dev": true, - "dependencies": { - "@babel/helper-builder-binary-assignment-operator-visitor": "^7.24.7", - "@babel/helper-plugin-utils": "^7.24.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-export-namespace-from": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.24.7.tgz", - "integrity": "sha512-v0K9uNYsPL3oXZ/7F9NNIbAj2jv1whUEtyA6aujhekLs56R++JDQuzRcP2/z4WX5Vg/c5lE9uWZA0/iUoFhLTA==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7", - "@babel/plugin-syntax-export-namespace-from": "^7.8.3" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-for-of": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.24.7.tgz", - "integrity": "sha512-wo9ogrDG1ITTTBsy46oGiN1dS9A7MROBTcYsfS8DtsImMkHk9JXJ3EWQM6X2SUw4x80uGPlwj0o00Uoc6nEE3g==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7", - "@babel/helper-skip-transparent-expression-wrappers": "^7.24.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-function-name": { - "version": "7.25.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.25.1.tgz", - "integrity": "sha512-TVVJVdW9RKMNgJJlLtHsKDTydjZAbwIsn6ySBPQaEAUU5+gVvlJt/9nRmqVbsV/IBanRjzWoaAQKLoamWVOUuA==", - "dev": true, - "dependencies": { - "@babel/helper-compilation-targets": "^7.24.8", - "@babel/helper-plugin-utils": "^7.24.8", - "@babel/traverse": "^7.25.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-json-strings": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.24.7.tgz", - "integrity": "sha512-2yFnBGDvRuxAaE/f0vfBKvtnvvqU8tGpMHqMNpTN2oWMKIR3NqFkjaAgGwawhqK/pIN2T3XdjGPdaG0vDhOBGw==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7", - "@babel/plugin-syntax-json-strings": "^7.8.3" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-literals": { - "version": "7.25.2", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.25.2.tgz", - "integrity": "sha512-HQI+HcTbm9ur3Z2DkO+jgESMAMcYLuN/A7NRw9juzxAezN9AvqvUTnpKP/9kkYANz6u7dFlAyOu44ejuGySlfw==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.24.8" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-logical-assignment-operators": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.24.7.tgz", - "integrity": "sha512-4D2tpwlQ1odXmTEIFWy9ELJcZHqrStlzK/dAOWYyxX3zT0iXQB6banjgeOJQXzEc4S0E0a5A+hahxPaEFYftsw==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7", - "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-member-expression-literals": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.24.7.tgz", - "integrity": "sha512-T/hRC1uqrzXMKLQ6UCwMT85S3EvqaBXDGf0FaMf4446Qx9vKwlghvee0+uuZcDUCZU5RuNi4781UQ7R308zzBw==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-modules-amd": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.24.7.tgz", - "integrity": "sha512-9+pB1qxV3vs/8Hdmz/CulFB8w2tuu6EB94JZFsjdqxQokwGa9Unap7Bo2gGBGIvPmDIVvQrom7r5m/TCDMURhg==", - "dev": true, - "dependencies": { - "@babel/helper-module-transforms": "^7.24.7", - "@babel/helper-plugin-utils": "^7.24.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-modules-commonjs": { - "version": "7.24.8", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.24.8.tgz", - "integrity": "sha512-WHsk9H8XxRs3JXKWFiqtQebdh9b/pTk4EgueygFzYlTKAg0Ud985mSevdNjdXdFBATSKVJGQXP1tv6aGbssLKA==", - "dev": true, - "dependencies": { - "@babel/helper-module-transforms": "^7.24.8", - "@babel/helper-plugin-utils": "^7.24.8", - "@babel/helper-simple-access": "^7.24.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-modules-systemjs": { - "version": "7.25.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.25.0.tgz", - "integrity": "sha512-YPJfjQPDXxyQWg/0+jHKj1llnY5f/R6a0p/vP4lPymxLu7Lvl4k2WMitqi08yxwQcCVUUdG9LCUj4TNEgAp3Jw==", - "dev": true, - "dependencies": { - "@babel/helper-module-transforms": "^7.25.0", - "@babel/helper-plugin-utils": "^7.24.8", - "@babel/helper-validator-identifier": "^7.24.7", - "@babel/traverse": "^7.25.0" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-modules-umd": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.24.7.tgz", - "integrity": "sha512-3aytQvqJ/h9z4g8AsKPLvD4Zqi2qT+L3j7XoFFu1XBlZWEl2/1kWnhmAbxpLgPrHSY0M6UA02jyTiwUVtiKR6A==", - "dev": true, - "dependencies": { - "@babel/helper-module-transforms": "^7.24.7", - "@babel/helper-plugin-utils": "^7.24.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-named-capturing-groups-regex": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.24.7.tgz", - "integrity": "sha512-/jr7h/EWeJtk1U/uz2jlsCioHkZk1JJZVcc8oQsJ1dUlaJD83f4/6Zeh2aHt9BIFokHIsSeDfhUmju0+1GPd6g==", - "dev": true, - "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.24.7", - "@babel/helper-plugin-utils": "^7.24.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/plugin-transform-new-target": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.24.7.tgz", - "integrity": "sha512-RNKwfRIXg4Ls/8mMTza5oPF5RkOW8Wy/WgMAp1/F1yZ8mMbtwXW+HDoJiOsagWrAhI5f57Vncrmr9XeT4CVapA==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-nullish-coalescing-operator": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.24.7.tgz", - "integrity": "sha512-Ts7xQVk1OEocqzm8rHMXHlxvsfZ0cEF2yomUqpKENHWMF4zKk175Y4q8H5knJes6PgYad50uuRmt3UJuhBw8pQ==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7", - "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-numeric-separator": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.24.7.tgz", - "integrity": "sha512-e6q1TiVUzvH9KRvicuxdBTUj4AdKSRwzIyFFnfnezpCfP2/7Qmbb8qbU2j7GODbl4JMkblitCQjKYUaX/qkkwA==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7", - "@babel/plugin-syntax-numeric-separator": "^7.10.4" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-object-rest-spread": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.24.7.tgz", - "integrity": "sha512-4QrHAr0aXQCEFni2q4DqKLD31n2DL+RxcwnNjDFkSG0eNQ/xCavnRkfCUjsyqGC2OviNJvZOF/mQqZBw7i2C5Q==", - "dev": true, - "dependencies": { - "@babel/helper-compilation-targets": "^7.24.7", - "@babel/helper-plugin-utils": "^7.24.7", - "@babel/plugin-syntax-object-rest-spread": "^7.8.3", - "@babel/plugin-transform-parameters": "^7.24.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-object-super": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.24.7.tgz", - "integrity": "sha512-A/vVLwN6lBrMFmMDmPPz0jnE6ZGx7Jq7d6sT/Ev4H65RER6pZ+kczlf1DthF5N0qaPHBsI7UXiE8Zy66nmAovg==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7", - "@babel/helper-replace-supers": "^7.24.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-optional-catch-binding": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.24.7.tgz", - "integrity": "sha512-uLEndKqP5BfBbC/5jTwPxLh9kqPWWgzN/f8w6UwAIirAEqiIVJWWY312X72Eub09g5KF9+Zn7+hT7sDxmhRuKA==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7", - "@babel/plugin-syntax-optional-catch-binding": "^7.8.3" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-optional-chaining": { - "version": "7.24.8", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.24.8.tgz", - "integrity": "sha512-5cTOLSMs9eypEy8JUVvIKOu6NgvbJMnpG62VpIHrTmROdQ+L5mDAaI40g25k5vXti55JWNX5jCkq3HZxXBQANw==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.24.8", - "@babel/helper-skip-transparent-expression-wrappers": "^7.24.7", - "@babel/plugin-syntax-optional-chaining": "^7.8.3" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-parameters": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.24.7.tgz", - "integrity": "sha512-yGWW5Rr+sQOhK0Ot8hjDJuxU3XLRQGflvT4lhlSY0DFvdb3TwKaY26CJzHtYllU0vT9j58hc37ndFPsqT1SrzA==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-private-methods": { - "version": "7.25.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.25.4.tgz", - "integrity": "sha512-ao8BG7E2b/URaUQGqN3Tlsg+M3KlHY6rJ1O1gXAEUnZoyNQnvKyH87Kfg+FoxSeyWUB8ISZZsC91C44ZuBFytw==", - "dev": true, - "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.25.4", - "@babel/helper-plugin-utils": "^7.24.8" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-private-property-in-object": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.24.7.tgz", - "integrity": "sha512-9z76mxwnwFxMyxZWEgdgECQglF2Q7cFLm0kMf8pGwt+GSJsY0cONKj/UuO4bOH0w/uAel3ekS4ra5CEAyJRmDA==", - "dev": true, - "dependencies": { - "@babel/helper-annotate-as-pure": "^7.24.7", - "@babel/helper-create-class-features-plugin": "^7.24.7", - "@babel/helper-plugin-utils": "^7.24.7", - "@babel/plugin-syntax-private-property-in-object": "^7.14.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-property-literals": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.24.7.tgz", - "integrity": "sha512-EMi4MLQSHfd2nrCqQEWxFdha2gBCqU4ZcCng4WBGZ5CJL4bBRW0ptdqqDdeirGZcpALazVVNJqRmsO8/+oNCBA==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-regenerator": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.24.7.tgz", - "integrity": "sha512-lq3fvXPdimDrlg6LWBoqj+r/DEWgONuwjuOuQCSYgRroXDH/IdM1C0IZf59fL5cHLpjEH/O6opIRBbqv7ELnuA==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7", - "regenerator-transform": "^0.15.2" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-reserved-words": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.24.7.tgz", - "integrity": "sha512-0DUq0pHcPKbjFZCfTss/pGkYMfy3vFWydkUBd9r0GHpIyfs2eCDENvqadMycRS9wZCXR41wucAfJHJmwA0UmoQ==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-runtime": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.24.7.tgz", - "integrity": "sha512-YqXjrk4C+a1kZjewqt+Mmu2UuV1s07y8kqcUf4qYLnoqemhR4gRQikhdAhSVJioMjVTu6Mo6pAbaypEA3jY6fw==", - "dev": true, - "dependencies": { - "@babel/helper-module-imports": "^7.24.7", - "@babel/helper-plugin-utils": "^7.24.7", - "babel-plugin-polyfill-corejs2": "^0.4.10", - "babel-plugin-polyfill-corejs3": "^0.10.1", - "babel-plugin-polyfill-regenerator": "^0.6.1", - "semver": "^6.3.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-runtime/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true, - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/@babel/plugin-transform-shorthand-properties": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.24.7.tgz", - "integrity": "sha512-KsDsevZMDsigzbA09+vacnLpmPH4aWjcZjXdyFKGzpplxhbeB4wYtury3vglQkg6KM/xEPKt73eCjPPf1PgXBA==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-spread": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.24.7.tgz", - "integrity": "sha512-x96oO0I09dgMDxJaANcRyD4ellXFLLiWhuwDxKZX5g2rWP1bTPkBSwCYv96VDXVT1bD9aPj8tppr5ITIh8hBng==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7", - "@babel/helper-skip-transparent-expression-wrappers": "^7.24.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-sticky-regex": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.24.7.tgz", - "integrity": "sha512-kHPSIJc9v24zEml5geKg9Mjx5ULpfncj0wRpYtxbvKyTtHCYDkVE3aHQ03FrpEo4gEe2vrJJS1Y9CJTaThA52g==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-template-literals": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.24.7.tgz", - "integrity": "sha512-AfDTQmClklHCOLxtGoP7HkeMw56k1/bTQjwsfhL6pppo/M4TOBSq+jjBUBLmV/4oeFg4GWMavIl44ZeCtmmZTw==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-typeof-symbol": { - "version": "7.24.8", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.24.8.tgz", - "integrity": "sha512-adNTUpDCVnmAE58VEqKlAA6ZBlNkMnWD0ZcW76lyNFN3MJniyGFZfNwERVk8Ap56MCnXztmDr19T4mPTztcuaw==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.24.8" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-unicode-escapes": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.24.7.tgz", - "integrity": "sha512-U3ap1gm5+4edc2Q/P+9VrBNhGkfnf+8ZqppY71Bo/pzZmXhhLdqgaUl6cuB07O1+AQJtCLfaOmswiNbSQ9ivhw==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-unicode-property-regex": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.24.7.tgz", - "integrity": "sha512-uH2O4OV5M9FZYQrwc7NdVmMxQJOCCzFeYudlZSzUAHRFeOujQefa92E74TQDVskNHCzOXoigEuoyzHDhaEaK5w==", - "dev": true, - "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.24.7", - "@babel/helper-plugin-utils": "^7.24.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-unicode-regex": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.24.7.tgz", - "integrity": "sha512-hlQ96MBZSAXUq7ltkjtu3FJCCSMx/j629ns3hA3pXnBXjanNP0LHi+JpPeA81zaWgVK1VGH95Xuy7u0RyQ8kMg==", - "dev": true, - "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.24.7", - "@babel/helper-plugin-utils": "^7.24.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-unicode-sets-regex": { - "version": "7.25.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.25.4.tgz", - "integrity": "sha512-qesBxiWkgN1Q+31xUE9RcMk79eOXXDCv6tfyGMRSs4RGlioSg2WVyQAm07k726cSE56pa+Kb0y9epX2qaXzTvA==", - "dev": true, - "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.25.2", - "@babel/helper-plugin-utils": "^7.24.8" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/preset-env": { - "version": "7.25.3", - "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.25.3.tgz", - "integrity": "sha512-QsYW7UeAaXvLPX9tdVliMJE7MD7M6MLYVTovRTIwhoYQVFHR1rM4wO8wqAezYi3/BpSD+NzVCZ69R6smWiIi8g==", - "dev": true, - "dependencies": { - "@babel/compat-data": "^7.25.2", - "@babel/helper-compilation-targets": "^7.25.2", - "@babel/helper-plugin-utils": "^7.24.8", - "@babel/helper-validator-option": "^7.24.8", - "@babel/plugin-bugfix-firefox-class-in-computed-class-key": "^7.25.3", - "@babel/plugin-bugfix-safari-class-field-initializer-scope": "^7.25.0", - "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.25.0", - "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.24.7", - "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": "^7.25.0", - "@babel/plugin-proposal-private-property-in-object": "7.21.0-placeholder-for-preset-env.2", - "@babel/plugin-syntax-async-generators": "^7.8.4", - "@babel/plugin-syntax-class-properties": "^7.12.13", - "@babel/plugin-syntax-class-static-block": "^7.14.5", - "@babel/plugin-syntax-dynamic-import": "^7.8.3", - "@babel/plugin-syntax-export-namespace-from": "^7.8.3", - "@babel/plugin-syntax-import-assertions": "^7.24.7", - "@babel/plugin-syntax-import-attributes": "^7.24.7", - "@babel/plugin-syntax-import-meta": "^7.10.4", - "@babel/plugin-syntax-json-strings": "^7.8.3", - "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4", - "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", - "@babel/plugin-syntax-numeric-separator": "^7.10.4", - "@babel/plugin-syntax-object-rest-spread": "^7.8.3", - "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", - "@babel/plugin-syntax-optional-chaining": "^7.8.3", - "@babel/plugin-syntax-private-property-in-object": "^7.14.5", - "@babel/plugin-syntax-top-level-await": "^7.14.5", - "@babel/plugin-syntax-unicode-sets-regex": "^7.18.6", - "@babel/plugin-transform-arrow-functions": "^7.24.7", - "@babel/plugin-transform-async-generator-functions": "^7.25.0", - "@babel/plugin-transform-async-to-generator": "^7.24.7", - "@babel/plugin-transform-block-scoped-functions": "^7.24.7", - "@babel/plugin-transform-block-scoping": "^7.25.0", - "@babel/plugin-transform-class-properties": "^7.24.7", - "@babel/plugin-transform-class-static-block": "^7.24.7", - "@babel/plugin-transform-classes": "^7.25.0", - "@babel/plugin-transform-computed-properties": "^7.24.7", - "@babel/plugin-transform-destructuring": "^7.24.8", - "@babel/plugin-transform-dotall-regex": "^7.24.7", - "@babel/plugin-transform-duplicate-keys": "^7.24.7", - "@babel/plugin-transform-duplicate-named-capturing-groups-regex": "^7.25.0", - "@babel/plugin-transform-dynamic-import": "^7.24.7", - "@babel/plugin-transform-exponentiation-operator": "^7.24.7", - "@babel/plugin-transform-export-namespace-from": "^7.24.7", - "@babel/plugin-transform-for-of": "^7.24.7", - "@babel/plugin-transform-function-name": "^7.25.1", - "@babel/plugin-transform-json-strings": "^7.24.7", - "@babel/plugin-transform-literals": "^7.25.2", - "@babel/plugin-transform-logical-assignment-operators": "^7.24.7", - "@babel/plugin-transform-member-expression-literals": "^7.24.7", - "@babel/plugin-transform-modules-amd": "^7.24.7", - "@babel/plugin-transform-modules-commonjs": "^7.24.8", - "@babel/plugin-transform-modules-systemjs": "^7.25.0", - "@babel/plugin-transform-modules-umd": "^7.24.7", - "@babel/plugin-transform-named-capturing-groups-regex": "^7.24.7", - "@babel/plugin-transform-new-target": "^7.24.7", - "@babel/plugin-transform-nullish-coalescing-operator": "^7.24.7", - "@babel/plugin-transform-numeric-separator": "^7.24.7", - "@babel/plugin-transform-object-rest-spread": "^7.24.7", - "@babel/plugin-transform-object-super": "^7.24.7", - "@babel/plugin-transform-optional-catch-binding": "^7.24.7", - "@babel/plugin-transform-optional-chaining": "^7.24.8", - "@babel/plugin-transform-parameters": "^7.24.7", - "@babel/plugin-transform-private-methods": "^7.24.7", - "@babel/plugin-transform-private-property-in-object": "^7.24.7", - "@babel/plugin-transform-property-literals": "^7.24.7", - "@babel/plugin-transform-regenerator": "^7.24.7", - "@babel/plugin-transform-reserved-words": "^7.24.7", - "@babel/plugin-transform-shorthand-properties": "^7.24.7", - "@babel/plugin-transform-spread": "^7.24.7", - "@babel/plugin-transform-sticky-regex": "^7.24.7", - "@babel/plugin-transform-template-literals": "^7.24.7", - "@babel/plugin-transform-typeof-symbol": "^7.24.8", - "@babel/plugin-transform-unicode-escapes": "^7.24.7", - "@babel/plugin-transform-unicode-property-regex": "^7.24.7", - "@babel/plugin-transform-unicode-regex": "^7.24.7", - "@babel/plugin-transform-unicode-sets-regex": "^7.24.7", - "@babel/preset-modules": "0.1.6-no-external-plugins", - "babel-plugin-polyfill-corejs2": "^0.4.10", - "babel-plugin-polyfill-corejs3": "^0.10.4", - "babel-plugin-polyfill-regenerator": "^0.6.1", - "core-js-compat": "^3.37.1", - "semver": "^6.3.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/preset-env/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true, - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/@babel/preset-modules": { - "version": "0.1.6-no-external-plugins", - "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.6-no-external-plugins.tgz", - "integrity": "sha512-HrcgcIESLm9aIR842yhJ5RWan/gebQUJ6E/E5+rf0y9o6oj7w0Br+sWuL6kEQ/o/AdfvR1Je9jG18/gnpwjEyA==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.0.0", - "@babel/types": "^7.4.4", - "esutils": "^2.0.2" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0 || ^8.0.0-0 <8.0.0" - } - }, - "node_modules/@babel/regjsgen": { - "version": "0.8.0", - "resolved": "https://registry.npmjs.org/@babel/regjsgen/-/regjsgen-0.8.0.tgz", - "integrity": "sha512-x/rqGMdzj+fWZvCOYForTghzbtqPDZ5gPwaoNGHdgDfF2QA/XZbCBp4Moo5scrkAMPhB7z26XM/AaHuIJdgauA==", - "dev": true - }, - "node_modules/@babel/runtime": { - "version": "7.25.0", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.25.0.tgz", - "integrity": "sha512-7dRy4DwXwtzBrPbZflqxnvfxLF8kdZXPkhymtDeFoFqE6ldzjQFgYTtYIFARcLEYDrqfBfYcZt1WqFxRoyC9Rw==", - "dev": true, - "dependencies": { - "regenerator-runtime": "^0.14.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/template": { - "version": "7.25.0", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.25.0.tgz", - "integrity": "sha512-aOOgh1/5XzKvg1jvVz7AVrx2piJ2XBi227DHmbY6y+bM9H2FlN+IfecYu4Xl0cNiiVejlsCri89LUsbj8vJD9Q==", - "dev": true, - "dependencies": { - "@babel/code-frame": "^7.24.7", - "@babel/parser": "^7.25.0", - "@babel/types": "^7.25.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/traverse": { - "version": "7.25.6", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.25.6.tgz", - "integrity": "sha512-9Vrcx5ZW6UwK5tvqsj0nGpp/XzqthkT0dqIc9g1AdtygFToNtTF67XzYS//dm+SAK9cp3B9R4ZO/46p63SCjlQ==", - "dev": true, - "dependencies": { - "@babel/code-frame": "^7.24.7", - "@babel/generator": "^7.25.6", - "@babel/parser": "^7.25.6", - "@babel/template": "^7.25.0", - "@babel/types": "^7.25.6", - "debug": "^4.3.1", - "globals": "^11.1.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/types": { - "version": "7.25.6", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.25.6.tgz", - "integrity": "sha512-/l42B1qxpG6RdfYf343Uw1vmDjeNhneUXtzhojE7pDgfpEypmRhI6j1kr17XCVv4Cgl9HdAiQY2x0GwKm7rWCw==", - "dev": true, - "dependencies": { - "@babel/helper-string-parser": "^7.24.8", - "@babel/helper-validator-identifier": "^7.24.7", - "to-fast-properties": "^2.0.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@colors/colors": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/@colors/colors/-/colors-1.5.0.tgz", - "integrity": "sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==", - "dev": true, - "optional": true, - "peer": true, - "engines": { - "node": ">=0.1.90" - } - }, - "node_modules/@discoveryjs/json-ext": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/@discoveryjs/json-ext/-/json-ext-0.6.1.tgz", - "integrity": "sha512-boghen8F0Q8D+0/Q1/1r6DUEieUJ8w2a1gIknExMSHBsJFOr2+0KUfHiVYBvucPwl3+RU5PFBK833FjFCh3BhA==", - "dev": true, - "engines": { - "node": ">=14.17.0" - } - }, - "node_modules/@esbuild/aix-ppc64": { - "version": "0.23.0", - "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.23.0.tgz", - "integrity": "sha512-3sG8Zwa5fMcA9bgqB8AfWPQ+HFke6uD3h1s3RIwUNK8EG7a4buxvuFTs3j1IMs2NXAk9F30C/FF4vxRgQCcmoQ==", - "cpu": [ - "ppc64" - ], - "dev": true, - "optional": true, - "os": [ - "aix" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/android-arm": { - "version": "0.23.0", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.23.0.tgz", - "integrity": "sha512-+KuOHTKKyIKgEEqKbGTK8W7mPp+hKinbMBeEnNzjJGyFcWsfrXjSTNluJHCY1RqhxFurdD8uNXQDei7qDlR6+g==", - "cpu": [ - "arm" - ], - "dev": true, - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/android-arm64": { - "version": "0.23.0", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.23.0.tgz", - "integrity": "sha512-EuHFUYkAVfU4qBdyivULuu03FhJO4IJN9PGuABGrFy4vUuzk91P2d+npxHcFdpUnfYKy0PuV+n6bKIpHOB3prQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/android-x64": { - "version": "0.23.0", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.23.0.tgz", - "integrity": "sha512-WRrmKidLoKDl56LsbBMhzTTBxrsVwTKdNbKDalbEZr0tcsBgCLbEtoNthOW6PX942YiYq8HzEnb4yWQMLQuipQ==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/darwin-arm64": { - "version": "0.23.0", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.23.0.tgz", - "integrity": "sha512-YLntie/IdS31H54Ogdn+v50NuoWF5BDkEUFpiOChVa9UnKpftgwzZRrI4J132ETIi+D8n6xh9IviFV3eXdxfow==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/darwin-x64": { - "version": "0.23.0", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.23.0.tgz", - "integrity": "sha512-IMQ6eme4AfznElesHUPDZ+teuGwoRmVuuixu7sv92ZkdQcPbsNHzutd+rAfaBKo8YK3IrBEi9SLLKWJdEvJniQ==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/freebsd-arm64": { - "version": "0.23.0", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.23.0.tgz", - "integrity": "sha512-0muYWCng5vqaxobq6LB3YNtevDFSAZGlgtLoAc81PjUfiFz36n4KMpwhtAd4he8ToSI3TGyuhyx5xmiWNYZFyw==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/freebsd-x64": { - "version": "0.23.0", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.23.0.tgz", - "integrity": "sha512-XKDVu8IsD0/q3foBzsXGt/KjD/yTKBCIwOHE1XwiXmrRwrX6Hbnd5Eqn/WvDekddK21tfszBSrE/WMaZh+1buQ==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-arm": { - "version": "0.23.0", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.23.0.tgz", - "integrity": "sha512-SEELSTEtOFu5LPykzA395Mc+54RMg1EUgXP+iw2SJ72+ooMwVsgfuwXo5Fn0wXNgWZsTVHwY2cg4Vi/bOD88qw==", - "cpu": [ - "arm" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-arm64": { - "version": "0.23.0", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.23.0.tgz", - "integrity": "sha512-j1t5iG8jE7BhonbsEg5d9qOYcVZv/Rv6tghaXM/Ug9xahM0nX/H2gfu6X6z11QRTMT6+aywOMA8TDkhPo8aCGw==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-ia32": { - "version": "0.23.0", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.23.0.tgz", - "integrity": "sha512-P7O5Tkh2NbgIm2R6x1zGJJsnacDzTFcRWZyTTMgFdVit6E98LTxO+v8LCCLWRvPrjdzXHx9FEOA8oAZPyApWUA==", - "cpu": [ - "ia32" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-loong64": { - "version": "0.23.0", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.23.0.tgz", - "integrity": "sha512-InQwepswq6urikQiIC/kkx412fqUZudBO4SYKu0N+tGhXRWUqAx+Q+341tFV6QdBifpjYgUndV1hhMq3WeJi7A==", - "cpu": [ - "loong64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-mips64el": { - "version": "0.23.0", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.23.0.tgz", - "integrity": "sha512-J9rflLtqdYrxHv2FqXE2i1ELgNjT+JFURt/uDMoPQLcjWQA5wDKgQA4t/dTqGa88ZVECKaD0TctwsUfHbVoi4w==", - "cpu": [ - "mips64el" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-ppc64": { - "version": "0.23.0", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.23.0.tgz", - "integrity": "sha512-cShCXtEOVc5GxU0fM+dsFD10qZ5UpcQ8AM22bYj0u/yaAykWnqXJDpd77ublcX6vdDsWLuweeuSNZk4yUxZwtw==", - "cpu": [ - "ppc64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-riscv64": { - "version": "0.23.0", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.23.0.tgz", - "integrity": "sha512-HEtaN7Y5UB4tZPeQmgz/UhzoEyYftbMXrBCUjINGjh3uil+rB/QzzpMshz3cNUxqXN7Vr93zzVtpIDL99t9aRw==", - "cpu": [ - "riscv64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-s390x": { - "version": "0.23.0", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.23.0.tgz", - "integrity": "sha512-WDi3+NVAuyjg/Wxi+o5KPqRbZY0QhI9TjrEEm+8dmpY9Xir8+HE/HNx2JoLckhKbFopW0RdO2D72w8trZOV+Wg==", - "cpu": [ - "s390x" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-x64": { - "version": "0.23.0", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.23.0.tgz", - "integrity": "sha512-a3pMQhUEJkITgAw6e0bWA+F+vFtCciMjW/LPtoj99MhVt+Mfb6bbL9hu2wmTZgNd994qTAEw+U/r6k3qHWWaOQ==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/netbsd-x64": { - "version": "0.23.0", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.23.0.tgz", - "integrity": "sha512-cRK+YDem7lFTs2Q5nEv/HHc4LnrfBCbH5+JHu6wm2eP+d8OZNoSMYgPZJq78vqQ9g+9+nMuIsAO7skzphRXHyw==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "netbsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/openbsd-arm64": { - "version": "0.23.0", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.23.0.tgz", - "integrity": "sha512-suXjq53gERueVWu0OKxzWqk7NxiUWSUlrxoZK7usiF50C6ipColGR5qie2496iKGYNLhDZkPxBI3erbnYkU0rQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "openbsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/openbsd-x64": { - "version": "0.23.0", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.23.0.tgz", - "integrity": "sha512-6p3nHpby0DM/v15IFKMjAaayFhqnXV52aEmv1whZHX56pdkK+MEaLoQWj+H42ssFarP1PcomVhbsR4pkz09qBg==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "openbsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/sunos-x64": { - "version": "0.23.0", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.23.0.tgz", - "integrity": "sha512-BFelBGfrBwk6LVrmFzCq1u1dZbG4zy/Kp93w2+y83Q5UGYF1d8sCzeLI9NXjKyujjBBniQa8R8PzLFAUrSM9OA==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "sunos" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/win32-arm64": { - "version": "0.23.0", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.23.0.tgz", - "integrity": "sha512-lY6AC8p4Cnb7xYHuIxQ6iYPe6MfO2CC43XXKo9nBXDb35krYt7KGhQnOkRGar5psxYkircpCqfbNDB4uJbS2jQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/win32-ia32": { - "version": "0.23.0", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.23.0.tgz", - "integrity": "sha512-7L1bHlOTcO4ByvI7OXVI5pNN6HSu6pUQq9yodga8izeuB1KcT2UkHaH6118QJwopExPn0rMHIseCTx1CRo/uNA==", - "cpu": [ - "ia32" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/win32-x64": { - "version": "0.23.0", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.23.0.tgz", - "integrity": "sha512-Arm+WgUFLUATuoxCJcahGuk6Yj9Pzxd6l11Zb/2aAuv5kWWvvfhLFo2fni4uSK5vzlUdCGZ/BdV5tH8klj8p8g==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@eslint-community/eslint-utils": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz", - "integrity": "sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==", - "dev": true, - "dependencies": { - "eslint-visitor-keys": "^3.3.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "peerDependencies": { - "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" - } - }, - "node_modules/@eslint-community/regexpp": { - "version": "4.11.1", - "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.11.1.tgz", - "integrity": "sha512-m4DVN9ZqskZoLU5GlWZadwDnYo3vAEydiUayB9widCl9ffWx2IvPnp6n3on5rJmziJSw9Bv+Z3ChDVdMwXCY8Q==", - "dev": true, - "engines": { - "node": "^12.0.0 || ^14.0.0 || >=16.0.0" - } - }, - "node_modules/@eslint/compat": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@eslint/compat/-/compat-1.1.1.tgz", - "integrity": "sha512-lpHyRyplhGPL5mGEh6M9O5nnKk0Gz4bFI+Zu6tKlPpDUN7XshWvH9C/px4UVm87IAANE0W81CEsNGbS1KlzXpA==", - "dev": true, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - } - }, - "node_modules/@eslint/config-array": { - "version": "0.18.0", - "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.18.0.tgz", - "integrity": "sha512-fTxvnS1sRMu3+JjXwJG0j/i4RT9u4qJ+lqS/yCGap4lH4zZGzQ7tu+xZqQmcMZq5OBZDL4QRxQzRjkWcGt8IVw==", - "dev": true, - "dependencies": { - "@eslint/object-schema": "^2.1.4", - "debug": "^4.3.1", - "minimatch": "^3.1.2" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - } - }, - "node_modules/@eslint/core": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.6.0.tgz", - "integrity": "sha512-8I2Q8ykA4J0x0o7cg67FPVnehcqWTBehu/lmY+bolPFHGjh49YzGBMXTvpqVgEbBdvNCSxj6iFgiIyHzf03lzg==", - "dev": true, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - } - }, - "node_modules/@eslint/eslintrc": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.1.0.tgz", - "integrity": "sha512-4Bfj15dVJdoy3RfZmmo86RK1Fwzn6SstsvK9JS+BaVKqC6QQQQyXekNaC+g+LKNgkQ+2VhGAzm6hO40AhMR3zQ==", - "dev": true, - "dependencies": { - "ajv": "^6.12.4", - "debug": "^4.3.2", - "espree": "^10.0.1", - "globals": "^14.0.0", - "ignore": "^5.2.0", - "import-fresh": "^3.2.1", - "js-yaml": "^4.1.0", - "minimatch": "^3.1.2", - "strip-json-comments": "^3.1.1" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/@eslint/eslintrc/node_modules/ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "dev": true, - "dependencies": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/@eslint/eslintrc/node_modules/globals": { - "version": "14.0.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-14.0.0.tgz", - "integrity": "sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==", - "dev": true, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@eslint/eslintrc/node_modules/json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true - }, - "node_modules/@eslint/js": { - "version": "9.11.1", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.11.1.tgz", - "integrity": "sha512-/qu+TWz8WwPWc7/HcIJKi+c+MOm46GdVaSlTTQcaqaL53+GsoA6MxWp5PtTx48qbSP7ylM1Kn7nhvkugfJvRSA==", - "dev": true, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - } - }, - "node_modules/@eslint/object-schema": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-2.1.4.tgz", - "integrity": "sha512-BsWiH1yFGjXXS2yvrf5LyuoSIIbPrGUWob917o+BTKuZ7qJdxX8aJLRxs1fS9n6r7vESrq1OUqb68dANcFXuQQ==", - "dev": true, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - } - }, - "node_modules/@eslint/plugin-kit": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.2.0.tgz", - "integrity": "sha512-vH9PiIMMwvhCx31Af3HiGzsVNULDbyVkHXwlemn/B0TFj/00ho3y55efXrUZTfQipxoHC5u4xq6zblww1zm1Ig==", - "dev": true, - "dependencies": { - "levn": "^0.4.1" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - } - }, - "node_modules/@humanwhocodes/module-importer": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", - "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", - "dev": true, - "engines": { - "node": ">=12.22" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/nzakas" - } - }, - "node_modules/@humanwhocodes/retry": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.3.0.tgz", - "integrity": "sha512-d2CGZR2o7fS6sWB7DG/3a95bGKQyHMACZ5aW8qGkkqQpUoZV6C0X7Pc7l4ZNMZkfNBf4VWNe9E1jRsf0G146Ew==", - "dev": true, - "engines": { - "node": ">=18.18" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/nzakas" - } - }, - "node_modules/@inquirer/checkbox": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/@inquirer/checkbox/-/checkbox-2.5.0.tgz", - "integrity": "sha512-sMgdETOfi2dUHT8r7TT1BTKOwNvdDGFDXYWtQ2J69SvlYNntk9I/gJe7r5yvMwwsuKnYbuRs3pNhx4tgNck5aA==", - "dev": true, - "dependencies": { - "@inquirer/core": "^9.1.0", - "@inquirer/figures": "^1.0.5", - "@inquirer/type": "^1.5.3", - "ansi-escapes": "^4.3.2", - "yoctocolors-cjs": "^2.1.2" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/@inquirer/confirm": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/@inquirer/confirm/-/confirm-3.2.0.tgz", - "integrity": "sha512-oOIwPs0Dvq5220Z8lGL/6LHRTEr9TgLHmiI99Rj1PJ1p1czTys+olrgBqZk4E2qC0YTzeHprxSQmoHioVdJ7Lw==", - "dev": true, - "dependencies": { - "@inquirer/core": "^9.1.0", - "@inquirer/type": "^1.5.3" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/@inquirer/core": { - "version": "9.2.1", - "resolved": "https://registry.npmjs.org/@inquirer/core/-/core-9.2.1.tgz", - "integrity": "sha512-F2VBt7W/mwqEU4bL0RnHNZmC/OxzNx9cOYxHqnXX3MP6ruYvZUZAW9imgN9+h/uBT/oP8Gh888J2OZSbjSeWcg==", - "dev": true, - "dependencies": { - "@inquirer/figures": "^1.0.6", - "@inquirer/type": "^2.0.0", - "@types/mute-stream": "^0.0.4", - "@types/node": "^22.5.5", - "@types/wrap-ansi": "^3.0.0", - "ansi-escapes": "^4.3.2", - "cli-width": "^4.1.0", - "mute-stream": "^1.0.0", - "signal-exit": "^4.1.0", - "strip-ansi": "^6.0.1", - "wrap-ansi": "^6.2.0", - "yoctocolors-cjs": "^2.1.2" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/@inquirer/core/node_modules/@inquirer/type": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@inquirer/type/-/type-2.0.0.tgz", - "integrity": "sha512-XvJRx+2KR3YXyYtPUUy+qd9i7p+GO9Ko6VIIpWlBrpWwXDv8WLFeHTxz35CfQFUiBMLXlGHhGzys7lqit9gWag==", - "dev": true, - "dependencies": { - "mute-stream": "^1.0.0" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/@inquirer/core/node_modules/@types/node": { - "version": "22.6.1", - "resolved": "https://registry.npmjs.org/@types/node/-/node-22.6.1.tgz", - "integrity": "sha512-V48tCfcKb/e6cVUigLAaJDAILdMP0fUW6BidkPK4GpGjXcfbnoHasCZDwz3N3yVt5we2RHm4XTQCpv0KJz9zqw==", - "dev": true, - "dependencies": { - "undici-types": "~6.19.2" - } - }, - "node_modules/@inquirer/editor": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/@inquirer/editor/-/editor-2.2.0.tgz", - "integrity": "sha512-9KHOpJ+dIL5SZli8lJ6xdaYLPPzB8xB9GZItg39MBybzhxA16vxmszmQFrRwbOA918WA2rvu8xhDEg/p6LXKbw==", - "dev": true, - "dependencies": { - "@inquirer/core": "^9.1.0", - "@inquirer/type": "^1.5.3", - "external-editor": "^3.1.0" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/@inquirer/expand": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/@inquirer/expand/-/expand-2.3.0.tgz", - "integrity": "sha512-qnJsUcOGCSG1e5DTOErmv2BPQqrtT6uzqn1vI/aYGiPKq+FgslGZmtdnXbhuI7IlT7OByDoEEqdnhUnVR2hhLw==", - "dev": true, - "dependencies": { - "@inquirer/core": "^9.1.0", - "@inquirer/type": "^1.5.3", - "yoctocolors-cjs": "^2.1.2" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/@inquirer/figures": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/@inquirer/figures/-/figures-1.0.6.tgz", - "integrity": "sha512-yfZzps3Cso2UbM7WlxKwZQh2Hs6plrbjs1QnzQDZhK2DgyCo6D8AaHps9olkNcUFlcYERMqU3uJSp1gmy3s/qQ==", - "dev": true, - "engines": { - "node": ">=18" - } - }, - "node_modules/@inquirer/input": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/@inquirer/input/-/input-2.3.0.tgz", - "integrity": "sha512-XfnpCStx2xgh1LIRqPXrTNEEByqQWoxsWYzNRSEUxJ5c6EQlhMogJ3vHKu8aXuTacebtaZzMAHwEL0kAflKOBw==", - "dev": true, - "dependencies": { - "@inquirer/core": "^9.1.0", - "@inquirer/type": "^1.5.3" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/@inquirer/number": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@inquirer/number/-/number-1.1.0.tgz", - "integrity": "sha512-ilUnia/GZUtfSZy3YEErXLJ2Sljo/mf9fiKc08n18DdwdmDbOzRcTv65H1jjDvlsAuvdFXf4Sa/aL7iw/NanVA==", - "dev": true, - "dependencies": { - "@inquirer/core": "^9.1.0", - "@inquirer/type": "^1.5.3" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/@inquirer/password": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/@inquirer/password/-/password-2.2.0.tgz", - "integrity": "sha512-5otqIpgsPYIshqhgtEwSspBQE40etouR8VIxzpJkv9i0dVHIpyhiivbkH9/dGiMLdyamT54YRdGJLfl8TFnLHg==", - "dev": true, - "dependencies": { - "@inquirer/core": "^9.1.0", - "@inquirer/type": "^1.5.3", - "ansi-escapes": "^4.3.2" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/@inquirer/prompts": { - "version": "5.3.8", - "resolved": "https://registry.npmjs.org/@inquirer/prompts/-/prompts-5.3.8.tgz", - "integrity": "sha512-b2BudQY/Si4Y2a0PdZZL6BeJtl8llgeZa7U2j47aaJSCeAl1e4UI7y8a9bSkO3o/ZbZrgT5muy/34JbsjfIWxA==", - "dev": true, - "dependencies": { - "@inquirer/checkbox": "^2.4.7", - "@inquirer/confirm": "^3.1.22", - "@inquirer/editor": "^2.1.22", - "@inquirer/expand": "^2.1.22", - "@inquirer/input": "^2.2.9", - "@inquirer/number": "^1.0.10", - "@inquirer/password": "^2.1.22", - "@inquirer/rawlist": "^2.2.4", - "@inquirer/search": "^1.0.7", - "@inquirer/select": "^2.4.7" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/@inquirer/rawlist": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/@inquirer/rawlist/-/rawlist-2.3.0.tgz", - "integrity": "sha512-zzfNuINhFF7OLAtGHfhwOW2TlYJyli7lOUoJUXw/uyklcwalV6WRXBXtFIicN8rTRK1XTiPWB4UY+YuW8dsnLQ==", - "dev": true, - "dependencies": { - "@inquirer/core": "^9.1.0", - "@inquirer/type": "^1.5.3", - "yoctocolors-cjs": "^2.1.2" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/@inquirer/search": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@inquirer/search/-/search-1.1.0.tgz", - "integrity": "sha512-h+/5LSj51dx7hp5xOn4QFnUaKeARwUCLs6mIhtkJ0JYPBLmEYjdHSYh7I6GrLg9LwpJ3xeX0FZgAG1q0QdCpVQ==", - "dev": true, - "dependencies": { - "@inquirer/core": "^9.1.0", - "@inquirer/figures": "^1.0.5", - "@inquirer/type": "^1.5.3", - "yoctocolors-cjs": "^2.1.2" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/@inquirer/select": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/@inquirer/select/-/select-2.5.0.tgz", - "integrity": "sha512-YmDobTItPP3WcEI86GvPo+T2sRHkxxOq/kXmsBjHS5BVXUgvgZ5AfJjkvQvZr03T81NnI3KrrRuMzeuYUQRFOA==", - "dev": true, - "dependencies": { - "@inquirer/core": "^9.1.0", - "@inquirer/figures": "^1.0.5", - "@inquirer/type": "^1.5.3", - "ansi-escapes": "^4.3.2", - "yoctocolors-cjs": "^2.1.2" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/@inquirer/type": { - "version": "1.5.5", - "resolved": "https://registry.npmjs.org/@inquirer/type/-/type-1.5.5.tgz", - "integrity": "sha512-MzICLu4yS7V8AA61sANROZ9vT1H3ooca5dSmI1FjZkzq7o/koMsRfQSzRtFo+F3Ao4Sf1C0bpLKejpKB/+j6MA==", - "dev": true, - "dependencies": { - "mute-stream": "^1.0.0" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/@isaacs/cliui": { - "version": "8.0.2", - "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", - "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", - "dev": true, - "dependencies": { - "string-width": "^5.1.2", - "string-width-cjs": "npm:string-width@^4.2.0", - "strip-ansi": "^7.0.1", - "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", - "wrap-ansi": "^8.1.0", - "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/@isaacs/cliui/node_modules/ansi-regex": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz", - "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==", - "dev": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" - } - }, - "node_modules/@isaacs/cliui/node_modules/ansi-styles": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", - "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", - "dev": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/@isaacs/cliui/node_modules/emoji-regex": { - "version": "9.2.2", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", - "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", - "dev": true - }, - "node_modules/@isaacs/cliui/node_modules/string-width": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", - "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", - "dev": true, - "dependencies": { - "eastasianwidth": "^0.2.0", - "emoji-regex": "^9.2.2", - "strip-ansi": "^7.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@isaacs/cliui/node_modules/strip-ansi": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", - "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", - "dev": true, - "dependencies": { - "ansi-regex": "^6.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/strip-ansi?sponsor=1" - } - }, - "node_modules/@isaacs/cliui/node_modules/wrap-ansi": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", - "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", - "dev": true, - "dependencies": { - "ansi-styles": "^6.1.0", - "string-width": "^5.0.1", - "strip-ansi": "^7.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - } - }, - "node_modules/@istanbuljs/schema": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", - "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/@jest/schemas": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.6.3.tgz", - "integrity": "sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==", - "dev": true, - "dependencies": { - "@sinclair/typebox": "^0.27.8" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jridgewell/gen-mapping": { - "version": "0.3.5", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz", - "integrity": "sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==", - "dev": true, - "dependencies": { - "@jridgewell/set-array": "^1.2.1", - "@jridgewell/sourcemap-codec": "^1.4.10", - "@jridgewell/trace-mapping": "^0.3.24" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/resolve-uri": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", - "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", - "dev": true, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/set-array": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz", - "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==", - "dev": true, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/source-map": { - "version": "0.3.6", - "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.6.tgz", - "integrity": "sha512-1ZJTZebgqllO79ue2bm3rIGud/bOe0pP5BjSRCRxxYkEZS8STV7zN84UBbiYu7jy+eCKSnVIUgoWWE/tt+shMQ==", - "dev": true, - "dependencies": { - "@jridgewell/gen-mapping": "^0.3.5", - "@jridgewell/trace-mapping": "^0.3.25" - } - }, - "node_modules/@jridgewell/sourcemap-codec": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz", - "integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==", - "dev": true - }, - "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.25", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", - "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", - "dev": true, - "dependencies": { - "@jridgewell/resolve-uri": "^3.1.0", - "@jridgewell/sourcemap-codec": "^1.4.14" - } - }, - "node_modules/@jsonjoy.com/base64": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@jsonjoy.com/base64/-/base64-1.1.2.tgz", - "integrity": "sha512-q6XAnWQDIMA3+FTiOYajoYqySkO+JSat0ytXGSuRdq9uXE7o92gzuQwQM14xaCRlBLGq3v5miDGC4vkVTn54xA==", - "dev": true, - "engines": { - "node": ">=10.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/streamich" - }, - "peerDependencies": { - "tslib": "2" - } - }, - "node_modules/@jsonjoy.com/json-pack": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@jsonjoy.com/json-pack/-/json-pack-1.1.0.tgz", - "integrity": "sha512-zlQONA+msXPPwHWZMKFVS78ewFczIll5lXiVPwFPCZUsrOKdxc2AvxU1HoNBmMRhqDZUR9HkC3UOm+6pME6Xsg==", - "dev": true, - "dependencies": { - "@jsonjoy.com/base64": "^1.1.1", - "@jsonjoy.com/util": "^1.1.2", - "hyperdyperid": "^1.2.0", - "thingies": "^1.20.0" - }, - "engines": { - "node": ">=10.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/streamich" - }, - "peerDependencies": { - "tslib": "2" - } - }, - "node_modules/@jsonjoy.com/util": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/@jsonjoy.com/util/-/util-1.3.0.tgz", - "integrity": "sha512-Cebt4Vk7k1xHy87kHY7KSPLT77A7Ev7IfOblyLZhtYEhrdQ6fX4EoLq3xOQ3O/DRMEh2ok5nyC180E+ABS8Wmw==", - "dev": true, - "engines": { - "node": ">=10.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/streamich" - }, - "peerDependencies": { - "tslib": "2" - } - }, - "node_modules/@leichtgewicht/ip-codec": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@leichtgewicht/ip-codec/-/ip-codec-2.0.5.tgz", - "integrity": "sha512-Vo+PSpZG2/fmgmiNzYK9qWRh8h/CHrwD0mo1h1DzL4yzHNSfWYujGTYsWGreD000gcgmZ7K4Ys6Tx9TxtsKdDw==", - "dev": true - }, - "node_modules/@listr2/prompt-adapter-inquirer": { - "version": "2.0.15", - "resolved": "https://registry.npmjs.org/@listr2/prompt-adapter-inquirer/-/prompt-adapter-inquirer-2.0.15.tgz", - "integrity": "sha512-MZrGem/Ujjd4cPTLYDfCZK2iKKeiO/8OX13S6jqxldLs0Prf2aGqVlJ77nMBqMv7fzqgXEgjrNHLXcKR8l9lOg==", - "dev": true, - "dependencies": { - "@inquirer/type": "^1.5.1" - }, - "engines": { - "node": ">=18.0.0" - }, - "peerDependencies": { - "@inquirer/prompts": ">= 3 < 6" - } - }, - "node_modules/@lmdb/lmdb-darwin-arm64": { - "version": "3.0.13", - "resolved": "https://registry.npmjs.org/@lmdb/lmdb-darwin-arm64/-/lmdb-darwin-arm64-3.0.13.tgz", - "integrity": "sha512-uiKPB0Fv6WEEOZjruu9a6wnW/8jrjzlZbxXscMB8kuCJ1k6kHpcBnuvaAWcqhbI7rqX5GKziwWEdD+wi2gNLfA==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "darwin" - ] - }, - "node_modules/@lmdb/lmdb-darwin-x64": { - "version": "3.0.13", - "resolved": "https://registry.npmjs.org/@lmdb/lmdb-darwin-x64/-/lmdb-darwin-x64-3.0.13.tgz", - "integrity": "sha512-bEVIIfK5mSQoG1R19qA+fJOvCB+0wVGGnXHT3smchBVahYBdlPn2OsZZKzlHWfb1E+PhLBmYfqB5zQXFP7hJig==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "darwin" - ] - }, - "node_modules/@lmdb/lmdb-linux-arm": { - "version": "3.0.13", - "resolved": "https://registry.npmjs.org/@lmdb/lmdb-linux-arm/-/lmdb-linux-arm-3.0.13.tgz", - "integrity": "sha512-Yml1KlMzOnXj/tnW7yX8U78iAzTk39aILYvCPbqeewAq1kSzl+w59k/fiVkTBfvDi/oW/5YRxL+Fq+Y1Fr1r2Q==", - "cpu": [ - "arm" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@lmdb/lmdb-linux-arm64": { - "version": "3.0.13", - "resolved": "https://registry.npmjs.org/@lmdb/lmdb-linux-arm64/-/lmdb-linux-arm64-3.0.13.tgz", - "integrity": "sha512-afbVrsMgZ9dUTNUchFpj5VkmJRxvht/u335jUJ7o23YTbNbnpmXif3VKQGCtnjSh+CZaqm6N3CPG8KO3zwyZ1Q==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@lmdb/lmdb-linux-x64": { - "version": "3.0.13", - "resolved": "https://registry.npmjs.org/@lmdb/lmdb-linux-x64/-/lmdb-linux-x64-3.0.13.tgz", - "integrity": "sha512-vOtxu0xC0SLdQ2WRXg8Qgd8T32ak4SPqk5zjItRszrJk2BdeXqfGxBJbP7o4aOvSPSmSSv46Lr1EP4HXU8v7Kg==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@lmdb/lmdb-win32-x64": { - "version": "3.0.13", - "resolved": "https://registry.npmjs.org/@lmdb/lmdb-win32-x64/-/lmdb-win32-x64-3.0.13.tgz", - "integrity": "sha512-UCrMJQY/gJnOl3XgbWRZZUvGGBuKy6i0YNSptgMzHBjs+QYDYR1Mt/RLTOPy4fzzves65O1EDmlL//OzEqoLlA==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ] - }, - "node_modules/@mdx-js/react": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@mdx-js/react/-/react-3.0.1.tgz", - "integrity": "sha512-9ZrPIU4MGf6et1m1ov3zKf+q9+deetI51zprKB1D/z3NOb+rUxxtEl3mCjW5wTGh6VhRdwPueh1oRzi6ezkA8A==", - "dev": true, - "dependencies": { - "@types/mdx": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - }, - "peerDependencies": { - "@types/react": ">=16", - "react": ">=16" - } - }, - "node_modules/@msgpackr-extract/msgpackr-extract-darwin-arm64": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@msgpackr-extract/msgpackr-extract-darwin-arm64/-/msgpackr-extract-darwin-arm64-3.0.3.tgz", - "integrity": "sha512-QZHtlVgbAdy2zAqNA9Gu1UpIuI8Xvsd1v8ic6B2pZmeFnFcMWiPLfWXh7TVw4eGEZ/C9TH281KwhVoeQUKbyjw==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "darwin" - ] - }, - "node_modules/@msgpackr-extract/msgpackr-extract-darwin-x64": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@msgpackr-extract/msgpackr-extract-darwin-x64/-/msgpackr-extract-darwin-x64-3.0.3.tgz", - "integrity": "sha512-mdzd3AVzYKuUmiWOQ8GNhl64/IoFGol569zNRdkLReh6LRLHOXxU4U8eq0JwaD8iFHdVGqSy4IjFL4reoWCDFw==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "darwin" - ] - }, - "node_modules/@msgpackr-extract/msgpackr-extract-linux-arm": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@msgpackr-extract/msgpackr-extract-linux-arm/-/msgpackr-extract-linux-arm-3.0.3.tgz", - "integrity": "sha512-fg0uy/dG/nZEXfYilKoRe7yALaNmHoYeIoJuJ7KJ+YyU2bvY8vPv27f7UKhGRpY6euFYqEVhxCFZgAUNQBM3nw==", - "cpu": [ - "arm" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@msgpackr-extract/msgpackr-extract-linux-arm64": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@msgpackr-extract/msgpackr-extract-linux-arm64/-/msgpackr-extract-linux-arm64-3.0.3.tgz", - "integrity": "sha512-YxQL+ax0XqBJDZiKimS2XQaf+2wDGVa1enVRGzEvLLVFeqa5kx2bWbtcSXgsxjQB7nRqqIGFIcLteF/sHeVtQg==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@msgpackr-extract/msgpackr-extract-linux-x64": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@msgpackr-extract/msgpackr-extract-linux-x64/-/msgpackr-extract-linux-x64-3.0.3.tgz", - "integrity": "sha512-cvwNfbP07pKUfq1uH+S6KJ7dT9K8WOE4ZiAcsrSes+UY55E/0jLYc+vq+DO7jlmqRb5zAggExKm0H7O/CBaesg==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@msgpackr-extract/msgpackr-extract-win32-x64": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@msgpackr-extract/msgpackr-extract-win32-x64/-/msgpackr-extract-win32-x64-3.0.3.tgz", - "integrity": "sha512-x0fWaQtYp4E6sktbsdAqnehxDgEc/VwM7uLsRCYWaiGu0ykYdZPiS8zCWdnjHwyiumousxfBm4SO31eXqwEZhQ==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ] - }, - "node_modules/@ngtools/webpack": { - "version": "18.2.5", - "resolved": "https://registry.npmjs.org/@ngtools/webpack/-/webpack-18.2.5.tgz", - "integrity": "sha512-L0n4eHObeqEOYRfSP+e4SeF/dmwxOIFy9xYvYCOUwOLrW4b3+a1+kkT30pqyfL72LFtpf0cmUwaWEFIcWl5PCg==", - "dev": true, - "engines": { - "node": "^18.19.1 || ^20.11.1 || >=22.0.0", - "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", - "yarn": ">= 1.13.0" - }, - "peerDependencies": { - "@angular/compiler-cli": "^18.0.0", - "typescript": ">=5.4 <5.6", - "webpack": "^5.54.0" - } - }, - "node_modules/@nodelib/fs.scandir": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", - "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", - "dev": true, - "dependencies": { - "@nodelib/fs.stat": "2.0.5", - "run-parallel": "^1.1.9" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@nodelib/fs.stat": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", - "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", - "dev": true, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@nodelib/fs.walk": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", - "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", - "dev": true, - "dependencies": { - "@nodelib/fs.scandir": "2.1.5", - "fastq": "^1.6.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@npmcli/agent": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/@npmcli/agent/-/agent-2.2.2.tgz", - "integrity": "sha512-OrcNPXdpSl9UX7qPVRWbmWMCSXrcDa2M9DvrbOTj7ao1S4PlqVFYv9/yLKMkrJKZ/V5A/kDBC690or307i26Og==", - "dev": true, - "dependencies": { - "agent-base": "^7.1.0", - "http-proxy-agent": "^7.0.0", - "https-proxy-agent": "^7.0.1", - "lru-cache": "^10.0.1", - "socks-proxy-agent": "^8.0.3" - }, - "engines": { - "node": "^16.14.0 || >=18.0.0" - } - }, - "node_modules/@npmcli/agent/node_modules/lru-cache": { - "version": "10.4.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", - "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", - "dev": true - }, - "node_modules/@npmcli/fs": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/@npmcli/fs/-/fs-3.1.1.tgz", - "integrity": "sha512-q9CRWjpHCMIh5sVyefoD1cA7PkvILqCZsnSOEUUivORLjxCO/Irmue2DprETiNgEqktDBZaM1Bi+jrarx1XdCg==", - "dev": true, - "dependencies": { - "semver": "^7.3.5" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/@npmcli/git": { - "version": "5.0.8", - "resolved": "https://registry.npmjs.org/@npmcli/git/-/git-5.0.8.tgz", - "integrity": "sha512-liASfw5cqhjNW9UFd+ruwwdEf/lbOAQjLL2XY2dFW/bkJheXDYZgOyul/4gVvEV4BWkTXjYGmDqMw9uegdbJNQ==", - "dev": true, - "dependencies": { - "@npmcli/promise-spawn": "^7.0.0", - "ini": "^4.1.3", - "lru-cache": "^10.0.1", - "npm-pick-manifest": "^9.0.0", - "proc-log": "^4.0.0", - "promise-inflight": "^1.0.1", - "promise-retry": "^2.0.1", - "semver": "^7.3.5", - "which": "^4.0.0" - }, - "engines": { - "node": "^16.14.0 || >=18.0.0" - } - }, - "node_modules/@npmcli/git/node_modules/isexe": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-3.1.1.tgz", - "integrity": "sha512-LpB/54B+/2J5hqQ7imZHfdU31OlgQqx7ZicVlkm9kzg9/w8GKLEcFfJl/t7DCEDueOyBAD6zCCwTO6Fzs0NoEQ==", - "dev": true, - "engines": { - "node": ">=16" - } - }, - "node_modules/@npmcli/git/node_modules/lru-cache": { - "version": "10.4.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", - "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", - "dev": true - }, - "node_modules/@npmcli/git/node_modules/which": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/which/-/which-4.0.0.tgz", - "integrity": "sha512-GlaYyEb07DPxYCKhKzplCWBJtvxZcZMrL+4UkrTSJHHPyZU4mYYTv3qaOe77H7EODLSSopAUFAc6W8U4yqvscg==", - "dev": true, - "dependencies": { - "isexe": "^3.1.1" - }, - "bin": { - "node-which": "bin/which.js" - }, - "engines": { - "node": "^16.13.0 || >=18.0.0" - } - }, - "node_modules/@npmcli/installed-package-contents": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@npmcli/installed-package-contents/-/installed-package-contents-2.1.0.tgz", - "integrity": "sha512-c8UuGLeZpm69BryRykLuKRyKFZYJsZSCT4aVY5ds4omyZqJ172ApzgfKJ5eV/r3HgLdUYgFVe54KSFVjKoe27w==", - "dev": true, - "dependencies": { - "npm-bundled": "^3.0.0", - "npm-normalize-package-bin": "^3.0.0" - }, - "bin": { - "installed-package-contents": "bin/index.js" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/@npmcli/node-gyp": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@npmcli/node-gyp/-/node-gyp-3.0.0.tgz", - "integrity": "sha512-gp8pRXC2oOxu0DUE1/M3bYtb1b3/DbJ5aM113+XJBgfXdussRAsX0YOrOhdd8WvnAR6auDBvJomGAkLKA5ydxA==", - "dev": true, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/@npmcli/package-json": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/@npmcli/package-json/-/package-json-5.2.1.tgz", - "integrity": "sha512-f7zYC6kQautXHvNbLEWgD/uGu1+xCn9izgqBfgItWSx22U0ZDekxN08A1vM8cTxj/cRVe0Q94Ode+tdoYmIOOQ==", - "dev": true, - "dependencies": { - "@npmcli/git": "^5.0.0", - "glob": "^10.2.2", - "hosted-git-info": "^7.0.0", - "json-parse-even-better-errors": "^3.0.0", - "normalize-package-data": "^6.0.0", - "proc-log": "^4.0.0", - "semver": "^7.5.3" - }, - "engines": { - "node": "^16.14.0 || >=18.0.0" - } - }, - "node_modules/@npmcli/package-json/node_modules/brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "dev": true, - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/@npmcli/package-json/node_modules/glob": { - "version": "10.4.5", - "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz", - "integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==", - "dev": true, - "dependencies": { - "foreground-child": "^3.1.0", - "jackspeak": "^3.1.2", - "minimatch": "^9.0.4", - "minipass": "^7.1.2", - "package-json-from-dist": "^1.0.0", - "path-scurry": "^1.11.1" - }, - "bin": { - "glob": "dist/esm/bin.mjs" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/@npmcli/package-json/node_modules/minimatch": { - "version": "9.0.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", - "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", - "dev": true, - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/@npmcli/promise-spawn": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/@npmcli/promise-spawn/-/promise-spawn-7.0.2.tgz", - "integrity": "sha512-xhfYPXoV5Dy4UkY0D+v2KkwvnDfiA/8Mt3sWCGI/hM03NsYIH8ZaG6QzS9x7pje5vHZBZJ2v6VRFVTWACnqcmQ==", - "dev": true, - "dependencies": { - "which": "^4.0.0" - }, - "engines": { - "node": "^16.14.0 || >=18.0.0" - } - }, - "node_modules/@npmcli/promise-spawn/node_modules/isexe": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-3.1.1.tgz", - "integrity": "sha512-LpB/54B+/2J5hqQ7imZHfdU31OlgQqx7ZicVlkm9kzg9/w8GKLEcFfJl/t7DCEDueOyBAD6zCCwTO6Fzs0NoEQ==", - "dev": true, - "engines": { - "node": ">=16" - } - }, - "node_modules/@npmcli/promise-spawn/node_modules/which": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/which/-/which-4.0.0.tgz", - "integrity": "sha512-GlaYyEb07DPxYCKhKzplCWBJtvxZcZMrL+4UkrTSJHHPyZU4mYYTv3qaOe77H7EODLSSopAUFAc6W8U4yqvscg==", - "dev": true, - "dependencies": { - "isexe": "^3.1.1" - }, - "bin": { - "node-which": "bin/which.js" - }, - "engines": { - "node": "^16.13.0 || >=18.0.0" - } - }, - "node_modules/@npmcli/redact": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@npmcli/redact/-/redact-2.0.1.tgz", - "integrity": "sha512-YgsR5jCQZhVmTJvjduTOIHph0L73pK8xwMVaDY0PatySqVM9AZj93jpoXYSJqfHFxFkN9dmqTw6OiqExsS3LPw==", - "dev": true, - "engines": { - "node": "^16.14.0 || >=18.0.0" - } - }, - "node_modules/@npmcli/run-script": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/@npmcli/run-script/-/run-script-8.1.0.tgz", - "integrity": "sha512-y7efHHwghQfk28G2z3tlZ67pLG0XdfYbcVG26r7YIXALRsrVQcTq4/tdenSmdOrEsNahIYA/eh8aEVROWGFUDg==", - "dev": true, - "dependencies": { - "@npmcli/node-gyp": "^3.0.0", - "@npmcli/package-json": "^5.0.0", - "@npmcli/promise-spawn": "^7.0.0", - "node-gyp": "^10.0.0", - "proc-log": "^4.0.0", - "which": "^4.0.0" - }, - "engines": { - "node": "^16.14.0 || >=18.0.0" - } - }, - "node_modules/@npmcli/run-script/node_modules/isexe": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-3.1.1.tgz", - "integrity": "sha512-LpB/54B+/2J5hqQ7imZHfdU31OlgQqx7ZicVlkm9kzg9/w8GKLEcFfJl/t7DCEDueOyBAD6zCCwTO6Fzs0NoEQ==", - "dev": true, - "engines": { - "node": ">=16" - } - }, - "node_modules/@npmcli/run-script/node_modules/which": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/which/-/which-4.0.0.tgz", - "integrity": "sha512-GlaYyEb07DPxYCKhKzplCWBJtvxZcZMrL+4UkrTSJHHPyZU4mYYTv3qaOe77H7EODLSSopAUFAc6W8U4yqvscg==", - "dev": true, - "dependencies": { - "isexe": "^3.1.1" - }, - "bin": { - "node-which": "bin/which.js" - }, - "engines": { - "node": "^16.13.0 || >=18.0.0" - } - }, - "node_modules/@pkgjs/parseargs": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", - "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", - "dev": true, - "optional": true, - "engines": { - "node": ">=14" - } - }, - "node_modules/@pkgr/core": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/@pkgr/core/-/core-0.1.1.tgz", - "integrity": "sha512-cq8o4cWH0ibXh9VGi5P20Tu9XF/0fFXl9EUinr9QfTM7a7p0oTA4iJRCQWppXR1Pg8dSM0UCItCkPwsk9qWWYA==", - "dev": true, - "engines": { - "node": "^12.20.0 || ^14.18.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/unts" - } - }, - "node_modules/@rollup/plugin-json": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/@rollup/plugin-json/-/plugin-json-6.1.0.tgz", - "integrity": "sha512-EGI2te5ENk1coGeADSIwZ7G2Q8CJS2sF120T7jLw4xFw9n7wIOXHo+kIYRAoVpJAN+kmqZSoO3Fp4JtoNF4ReA==", - "dev": true, - "dependencies": { - "@rollup/pluginutils": "^5.1.0" - }, - "engines": { - "node": ">=14.0.0" - }, - "peerDependencies": { - "rollup": "^1.20.0||^2.0.0||^3.0.0||^4.0.0" - }, - "peerDependenciesMeta": { - "rollup": { - "optional": true - } - } - }, - "node_modules/@rollup/plugin-node-resolve": { - "version": "15.3.0", - "resolved": "https://registry.npmjs.org/@rollup/plugin-node-resolve/-/plugin-node-resolve-15.3.0.tgz", - "integrity": "sha512-9eO5McEICxMzJpDW9OnMYSv4Sta3hmt7VtBFz5zR9273suNOydOyq/FrGeGy+KsTRFm8w0SLVhzig2ILFT63Ag==", - "dev": true, - "dependencies": { - "@rollup/pluginutils": "^5.0.1", - "@types/resolve": "1.20.2", - "deepmerge": "^4.2.2", - "is-module": "^1.0.0", - "resolve": "^1.22.1" - }, - "engines": { - "node": ">=14.0.0" - }, - "peerDependencies": { - "rollup": "^2.78.0||^3.0.0||^4.0.0" - }, - "peerDependenciesMeta": { - "rollup": { - "optional": true - } - } - }, - "node_modules/@rollup/pluginutils": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-5.1.2.tgz", - "integrity": "sha512-/FIdS3PyZ39bjZlwqFnWqCOVnW7o963LtKMwQOD0NhQqw22gSr2YY1afu3FxRip4ZCZNsD5jq6Aaz6QV3D/Njw==", - "dev": true, - "dependencies": { - "@types/estree": "^1.0.0", - "estree-walker": "^2.0.2", - "picomatch": "^2.3.1" - }, - "engines": { - "node": ">=14.0.0" - }, - "peerDependencies": { - "rollup": "^1.20.0||^2.0.0||^3.0.0||^4.0.0" - }, - "peerDependenciesMeta": { - "rollup": { - "optional": true - } - } - }, - "node_modules/@rollup/pluginutils/node_modules/picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", - "dev": true, - "engines": { - "node": ">=8.6" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/@rollup/rollup-android-arm-eabi": { - "version": "4.20.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.20.0.tgz", - "integrity": "sha512-TSpWzflCc4VGAUJZlPpgAJE1+V60MePDQnBd7PPkpuEmOy8i87aL6tinFGKBFKuEDikYpig72QzdT3QPYIi+oA==", - "cpu": [ - "arm" - ], - "dev": true, - "optional": true, - "os": [ - "android" - ] - }, - "node_modules/@rollup/rollup-android-arm64": { - "version": "4.20.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.20.0.tgz", - "integrity": "sha512-u00Ro/nok7oGzVuh/FMYfNoGqxU5CPWz1mxV85S2w9LxHR8OoMQBuSk+3BKVIDYgkpeOET5yXkx90OYFc+ytpQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "android" - ] - }, - "node_modules/@rollup/rollup-darwin-arm64": { - "version": "4.20.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.20.0.tgz", - "integrity": "sha512-uFVfvzvsdGtlSLuL0ZlvPJvl6ZmrH4CBwLGEFPe7hUmf7htGAN+aXo43R/V6LATyxlKVC/m6UsLb7jbG+LG39Q==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "darwin" - ] - }, - "node_modules/@rollup/rollup-darwin-x64": { - "version": "4.20.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.20.0.tgz", - "integrity": "sha512-xbrMDdlev53vNXexEa6l0LffojxhqDTBeL+VUxuuIXys4x6xyvbKq5XqTXBCEUA8ty8iEJblHvFaWRJTk/icAQ==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "darwin" - ] - }, - "node_modules/@rollup/rollup-linux-arm-gnueabihf": { - "version": "4.20.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.20.0.tgz", - "integrity": "sha512-jMYvxZwGmoHFBTbr12Xc6wOdc2xA5tF5F2q6t7Rcfab68TT0n+r7dgawD4qhPEvasDsVpQi+MgDzj2faOLsZjA==", - "cpu": [ - "arm" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-arm-musleabihf": { - "version": "4.20.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.20.0.tgz", - "integrity": "sha512-1asSTl4HKuIHIB1GcdFHNNZhxAYEdqML/MW4QmPS4G0ivbEcBr1JKlFLKsIRqjSwOBkdItn3/ZDlyvZ/N6KPlw==", - "cpu": [ - "arm" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-arm64-gnu": { - "version": "4.20.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.20.0.tgz", - "integrity": "sha512-COBb8Bkx56KldOYJfMf6wKeYJrtJ9vEgBRAOkfw6Ens0tnmzPqvlpjZiLgkhg6cA3DGzCmLmmd319pmHvKWWlQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-arm64-musl": { - "version": "4.20.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.20.0.tgz", - "integrity": "sha512-+it+mBSyMslVQa8wSPvBx53fYuZK/oLTu5RJoXogjk6x7Q7sz1GNRsXWjn6SwyJm8E/oMjNVwPhmNdIjwP135Q==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-powerpc64le-gnu": { - "version": "4.20.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.20.0.tgz", - "integrity": "sha512-yAMvqhPfGKsAxHN8I4+jE0CpLWD8cv4z7CK7BMmhjDuz606Q2tFKkWRY8bHR9JQXYcoLfopo5TTqzxgPUjUMfw==", - "cpu": [ - "ppc64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-riscv64-gnu": { - "version": "4.20.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.20.0.tgz", - "integrity": "sha512-qmuxFpfmi/2SUkAw95TtNq/w/I7Gpjurx609OOOV7U4vhvUhBcftcmXwl3rqAek+ADBwSjIC4IVNLiszoj3dPA==", - "cpu": [ - "riscv64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-s390x-gnu": { - "version": "4.20.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.20.0.tgz", - "integrity": "sha512-I0BtGXddHSHjV1mqTNkgUZLnS3WtsqebAXv11D5BZE/gfw5KoyXSAXVqyJximQXNvNzUo4GKlCK/dIwXlz+jlg==", - "cpu": [ - "s390x" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-x64-gnu": { - "version": "4.20.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.20.0.tgz", - "integrity": "sha512-y+eoL2I3iphUg9tN9GB6ku1FA8kOfmF4oUEWhztDJ4KXJy1agk/9+pejOuZkNFhRwHAOxMsBPLbXPd6mJiCwew==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-x64-musl": { - "version": "4.20.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.20.0.tgz", - "integrity": "sha512-hM3nhW40kBNYUkZb/r9k2FKK+/MnKglX7UYd4ZUy5DJs8/sMsIbqWK2piZtVGE3kcXVNj3B2IrUYROJMMCikNg==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-win32-arm64-msvc": { - "version": "4.20.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.20.0.tgz", - "integrity": "sha512-psegMvP+Ik/Bg7QRJbv8w8PAytPA7Uo8fpFjXyCRHWm6Nt42L+JtoqH8eDQ5hRP7/XW2UiIriy1Z46jf0Oa1kA==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ] - }, - "node_modules/@rollup/rollup-win32-ia32-msvc": { - "version": "4.20.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.20.0.tgz", - "integrity": "sha512-GabekH3w4lgAJpVxkk7hUzUf2hICSQO0a/BLFA11/RMxQT92MabKAqyubzDZmMOC/hcJNlc+rrypzNzYl4Dx7A==", - "cpu": [ - "ia32" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ] - }, - "node_modules/@rollup/rollup-win32-x64-msvc": { - "version": "4.20.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.20.0.tgz", - "integrity": "sha512-aJ1EJSuTdGnM6qbVC4B5DSmozPTqIag9fSzXRNNo+humQLG89XpPgdt16Ia56ORD7s+H8Pmyx44uczDQ0yDzpg==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ] - }, - "node_modules/@rollup/wasm-node": { - "version": "4.22.4", - "resolved": "https://registry.npmjs.org/@rollup/wasm-node/-/wasm-node-4.22.4.tgz", - "integrity": "sha512-2AXpNT2gtSyGangSWTwmspOnu0wVMBLC6U/wJ8fs58JhtlAy+B3jNOuaN+7x9blilAoiwBk9187ybhrs7kaCpg==", - "dev": true, - "dependencies": { - "@types/estree": "1.0.5" - }, - "bin": { - "rollup": "dist/bin/rollup" - }, - "engines": { - "node": ">=18.0.0", - "npm": ">=8.0.0" - }, - "optionalDependencies": { - "fsevents": "~2.3.2" - } - }, - "node_modules/@rollup/wasm-node/node_modules/@types/estree": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.5.tgz", - "integrity": "sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==", - "dev": true - }, - "node_modules/@schematics/angular": { - "version": "18.2.5", - "resolved": "https://registry.npmjs.org/@schematics/angular/-/angular-18.2.5.tgz", - "integrity": "sha512-tBXhk9OGT4U6VsBNbuCNl2ITDOF3NYdGrEieIHU+lHSkpJNGZUIGxCgXCETXkmXDq1pe4wFZSKelWjeqYDfX0g==", - "dev": true, - "dependencies": { - "@angular-devkit/core": "18.2.5", - "@angular-devkit/schematics": "18.2.5", - "jsonc-parser": "3.3.1" - }, - "engines": { - "node": "^18.19.1 || ^20.11.1 || >=22.0.0", - "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", - "yarn": ">= 1.13.0" - } - }, - "node_modules/@sigstore/bundle": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/@sigstore/bundle/-/bundle-2.3.2.tgz", - "integrity": "sha512-wueKWDk70QixNLB363yHc2D2ItTgYiMTdPwK8D9dKQMR3ZQ0c35IxP5xnwQ8cNLoCgCRcHf14kE+CLIvNX1zmA==", - "dev": true, - "dependencies": { - "@sigstore/protobuf-specs": "^0.3.2" - }, - "engines": { - "node": "^16.14.0 || >=18.0.0" - } - }, - "node_modules/@sigstore/core": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@sigstore/core/-/core-1.1.0.tgz", - "integrity": "sha512-JzBqdVIyqm2FRQCulY6nbQzMpJJpSiJ8XXWMhtOX9eKgaXXpfNOF53lzQEjIydlStnd/eFtuC1dW4VYdD93oRg==", - "dev": true, - "engines": { - "node": "^16.14.0 || >=18.0.0" - } - }, - "node_modules/@sigstore/protobuf-specs": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/@sigstore/protobuf-specs/-/protobuf-specs-0.3.2.tgz", - "integrity": "sha512-c6B0ehIWxMI8wiS/bj6rHMPqeFvngFV7cDU/MY+B16P9Z3Mp9k8L93eYZ7BYzSickzuqAQqAq0V956b3Ju6mLw==", - "dev": true, - "engines": { - "node": "^16.14.0 || >=18.0.0" - } - }, - "node_modules/@sigstore/sign": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/@sigstore/sign/-/sign-2.3.2.tgz", - "integrity": "sha512-5Vz5dPVuunIIvC5vBb0APwo7qKA4G9yM48kPWJT+OEERs40md5GoUR1yedwpekWZ4m0Hhw44m6zU+ObsON+iDA==", - "dev": true, - "dependencies": { - "@sigstore/bundle": "^2.3.2", - "@sigstore/core": "^1.0.0", - "@sigstore/protobuf-specs": "^0.3.2", - "make-fetch-happen": "^13.0.1", - "proc-log": "^4.2.0", - "promise-retry": "^2.0.1" - }, - "engines": { - "node": "^16.14.0 || >=18.0.0" - } - }, - "node_modules/@sigstore/tuf": { - "version": "2.3.4", - "resolved": "https://registry.npmjs.org/@sigstore/tuf/-/tuf-2.3.4.tgz", - "integrity": "sha512-44vtsveTPUpqhm9NCrbU8CWLe3Vck2HO1PNLw7RIajbB7xhtn5RBPm1VNSCMwqGYHhDsBJG8gDF0q4lgydsJvw==", - "dev": true, - "dependencies": { - "@sigstore/protobuf-specs": "^0.3.2", - "tuf-js": "^2.2.1" - }, - "engines": { - "node": "^16.14.0 || >=18.0.0" - } - }, - "node_modules/@sigstore/verify": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@sigstore/verify/-/verify-1.2.1.tgz", - "integrity": "sha512-8iKx79/F73DKbGfRf7+t4dqrc0bRr0thdPrxAtCKWRm/F0tG71i6O1rvlnScncJLLBZHn3h8M3c1BSUAb9yu8g==", - "dev": true, - "dependencies": { - "@sigstore/bundle": "^2.3.2", - "@sigstore/core": "^1.1.0", - "@sigstore/protobuf-specs": "^0.3.2" - }, - "engines": { - "node": "^16.14.0 || >=18.0.0" - } - }, - "node_modules/@sinclair/typebox": { - "version": "0.27.8", - "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.8.tgz", - "integrity": "sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==", - "dev": true - }, - "node_modules/@sindresorhus/merge-streams": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/@sindresorhus/merge-streams/-/merge-streams-2.3.0.tgz", - "integrity": "sha512-LtoMMhxAlorcGhmFYI+LhPgbPZCkgP6ra1YL604EeF6U98pLlQ3iWIGMdWSC+vWmPBWBNgmDBAhnAobLROJmwg==", - "dev": true, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@socket.io/component-emitter": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/@socket.io/component-emitter/-/component-emitter-3.1.2.tgz", - "integrity": "sha512-9BCxFwvbGg/RsZK9tjXd8s4UcwR0MWeFQ1XEKIQVVvAGJyINdrqKMcTRyLoK8Rse1GjzLV9cwjWV1olXRWEXVA==", - "dev": true, - "optional": true, - "peer": true - }, - "node_modules/@storybook/addon-actions": { - "version": "8.3.2", - "resolved": "https://registry.npmjs.org/@storybook/addon-actions/-/addon-actions-8.3.2.tgz", - "integrity": "sha512-Ds2lNyEpeVO0TexoXEHpE3kRcA7rJm5X5nWz4PdvF7kiC1aX5ZMy2qEPZOH6Jvalysm+PChw4Ib+lCaoIFGOJg==", - "dev": true, - "dependencies": { - "@storybook/global": "^5.0.0", - "@types/uuid": "^9.0.1", - "dequal": "^2.0.2", - "polished": "^4.2.2", - "uuid": "^9.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/storybook" - }, - "peerDependencies": { - "storybook": "^8.3.2" - } - }, - "node_modules/@storybook/addon-actions/node_modules/uuid": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.1.tgz", - "integrity": "sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==", - "dev": true, - "funding": [ - "https://github.com/sponsors/broofa", - "https://github.com/sponsors/ctavan" - ], - "bin": { - "uuid": "dist/bin/uuid" - } - }, - "node_modules/@storybook/addon-backgrounds": { - "version": "8.3.2", - "resolved": "https://registry.npmjs.org/@storybook/addon-backgrounds/-/addon-backgrounds-8.3.2.tgz", - "integrity": "sha512-5dPyynGRp2ZAZrpG2tadbdBk7X7GySoRuZwkQebNFGv+JZ8LoeQ/qc8yUOL+vfWKFGqvjOmX5R55IUHLYsw2NQ==", - "dev": true, - "dependencies": { - "@storybook/global": "^5.0.0", - "memoizerific": "^1.11.3", - "ts-dedent": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/storybook" - }, - "peerDependencies": { - "storybook": "^8.3.2" - } - }, - "node_modules/@storybook/addon-controls": { - "version": "8.3.2", - "resolved": "https://registry.npmjs.org/@storybook/addon-controls/-/addon-controls-8.3.2.tgz", - "integrity": "sha512-YHoSMWSR1fItPb5S/3gOIhn9T6HcWcTxEJrjuuDk1hySmBmA+ojVJqmcI5MoNG3XtGigSXGJ/K2wmU57wZH4xw==", - "dev": true, - "dependencies": { - "@storybook/global": "^5.0.0", - "dequal": "^2.0.2", - "lodash": "^4.17.21", - "ts-dedent": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/storybook" - }, - "peerDependencies": { - "storybook": "^8.3.2" - } - }, - "node_modules/@storybook/addon-docs": { - "version": "8.3.2", - "resolved": "https://registry.npmjs.org/@storybook/addon-docs/-/addon-docs-8.3.2.tgz", - "integrity": "sha512-DPmWhvnHap8bmtiJOYpmo9MYpuJW5QyV6MhmGhpe60A9yH9TRTIf3h7uGpyX3TgtrYxC07Sw/8GaY0UfendJGg==", - "dev": true, - "dependencies": { - "@mdx-js/react": "^3.0.0", - "@storybook/blocks": "8.3.2", - "@storybook/csf-plugin": "8.3.2", - "@storybook/global": "^5.0.0", - "@storybook/react-dom-shim": "8.3.2", - "@types/react": "^16.8.0 || ^17.0.0 || ^18.0.0", - "fs-extra": "^11.1.0", - "react": "^16.8.0 || ^17.0.0 || ^18.0.0", - "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0", - "rehype-external-links": "^3.0.0", - "rehype-slug": "^6.0.0", - "ts-dedent": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/storybook" - }, - "peerDependencies": { - "storybook": "^8.3.2" - } - }, - "node_modules/@storybook/addon-docs/node_modules/fs-extra": { - "version": "11.2.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.2.0.tgz", - "integrity": "sha512-PmDi3uwK5nFuXh7XDTlVnS17xJS7vW36is2+w3xcv8SVxiB4NyATf4ctkVY5bkSjX0Y4nbvZCq1/EjtEyr9ktw==", - "dev": true, - "dependencies": { - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - }, - "engines": { - "node": ">=14.14" - } - }, - "node_modules/@storybook/addon-docs/node_modules/jsonfile": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", - "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", - "dev": true, - "dependencies": { - "universalify": "^2.0.0" - }, - "optionalDependencies": { - "graceful-fs": "^4.1.6" - } - }, - "node_modules/@storybook/addon-docs/node_modules/universalify": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", - "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", - "dev": true, - "engines": { - "node": ">= 10.0.0" - } - }, - "node_modules/@storybook/addon-essentials": { - "version": "8.3.2", - "resolved": "https://registry.npmjs.org/@storybook/addon-essentials/-/addon-essentials-8.3.2.tgz", - "integrity": "sha512-r0wnw5dbqeVklSjMkA5dTLufmm20IZSskSmadbXOOZBKFqANm15LRGdQ7+Pfr8N0XF4//tFwnvIfw+hMmKGFEQ==", - "dev": true, - "dependencies": { - "@storybook/addon-actions": "8.3.2", - "@storybook/addon-backgrounds": "8.3.2", - "@storybook/addon-controls": "8.3.2", - "@storybook/addon-docs": "8.3.2", - "@storybook/addon-highlight": "8.3.2", - "@storybook/addon-measure": "8.3.2", - "@storybook/addon-outline": "8.3.2", - "@storybook/addon-toolbars": "8.3.2", - "@storybook/addon-viewport": "8.3.2", - "ts-dedent": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/storybook" - }, - "peerDependencies": { - "storybook": "^8.3.2" - } - }, - "node_modules/@storybook/addon-highlight": { - "version": "8.3.2", - "resolved": "https://registry.npmjs.org/@storybook/addon-highlight/-/addon-highlight-8.3.2.tgz", - "integrity": "sha512-JFL/JLBZfa89POgi8lBdt8TzzCS1bgN/X6Qj1MlTq3pxHYqO66eG8DtMLjpuXKOhs8Dhdgs9/uxy5Yd+MFVRmQ==", - "dev": true, - "dependencies": { - "@storybook/global": "^5.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/storybook" - }, - "peerDependencies": { - "storybook": "^8.3.2" - } - }, - "node_modules/@storybook/addon-measure": { - "version": "8.3.2", - "resolved": "https://registry.npmjs.org/@storybook/addon-measure/-/addon-measure-8.3.2.tgz", - "integrity": "sha512-5RPF2oEw5XnTmz2cvjqz2WGnqOrJ1NxXIuJc6QeO6EXQqqjPnj/9rV/MBmzMd9cjk8Ud8c4AA5+jJbl4IgcwhQ==", - "dev": true, - "dependencies": { - "@storybook/global": "^5.0.0", - "tiny-invariant": "^1.3.1" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/storybook" - }, - "peerDependencies": { - "storybook": "^8.3.2" - } - }, - "node_modules/@storybook/addon-outline": { - "version": "8.3.2", - "resolved": "https://registry.npmjs.org/@storybook/addon-outline/-/addon-outline-8.3.2.tgz", - "integrity": "sha512-VxUYCHPCZQDwnj/9U4d6QLsfGi9wHGO0hOENjC5ZCwzMNCq6t7XNRToSsq4zUPucH5XKaQW2vyTdbNdUQiki4Q==", - "dev": true, - "dependencies": { - "@storybook/global": "^5.0.0", - "ts-dedent": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/storybook" - }, - "peerDependencies": { - "storybook": "^8.3.2" - } - }, - "node_modules/@storybook/addon-toolbars": { - "version": "8.3.2", - "resolved": "https://registry.npmjs.org/@storybook/addon-toolbars/-/addon-toolbars-8.3.2.tgz", - "integrity": "sha512-y3mokzvoeEE1ga96c8KX7anb9fU5wRGWZBsX7cQkm5ebXHsXjH2Y0pcdFnw6UxFbPMjh70LlZF9UhXnz7UC7Hw==", - "dev": true, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/storybook" - }, - "peerDependencies": { - "storybook": "^8.3.2" - } - }, - "node_modules/@storybook/addon-viewport": { - "version": "8.3.2", - "resolved": "https://registry.npmjs.org/@storybook/addon-viewport/-/addon-viewport-8.3.2.tgz", - "integrity": "sha512-AyXpQ2ntpRoNfOWPnaUX4CTWSj163ncgzcoUyBRWL/yiu/PcMK4tlQ141mWwoamAcXEVDK40Q0vWmRwZ06C2gw==", - "dev": true, - "dependencies": { - "memoizerific": "^1.11.3" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/storybook" - }, - "peerDependencies": { - "storybook": "^8.3.2" - } - }, - "node_modules/@storybook/angular": { - "version": "8.3.2", - "resolved": "https://registry.npmjs.org/@storybook/angular/-/angular-8.3.2.tgz", - "integrity": "sha512-nCmeMYNtCLQNZ+sey7etTvKUy6AzbQ7/+H8BX3zDwGsAbZvPGWsAyXjvwfL0K94+q0qe7hduNx24kh2Q/leMug==", - "dev": true, - "dependencies": { - "@storybook/builder-webpack5": "8.3.2", - "@storybook/components": "^8.3.2", - "@storybook/core-webpack": "8.3.2", - "@storybook/global": "^5.0.0", - "@storybook/manager-api": "^8.3.2", - "@storybook/preview-api": "^8.3.2", - "@storybook/theming": "^8.3.2", - "@types/node": "^22.0.0", - "@types/react": "^18.0.37", - "@types/react-dom": "^18.0.11", - "@types/semver": "^7.3.4", - "@types/webpack-env": "^1.18.0", - "fd-package-json": "^1.2.0", - "find-up": "^5.0.0", - "semver": "^7.3.7", - "telejson": "^7.2.0", - "ts-dedent": "^2.0.0", - "tsconfig-paths-webpack-plugin": "^4.0.1", - "util-deprecate": "^1.0.2", - "webpack": "5" - }, - "engines": { - "node": ">=18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/storybook" - }, - "peerDependencies": { - "@angular-devkit/architect": ">=0.1500.0 < 0.1900.0", - "@angular-devkit/build-angular": ">=15.0.0 < 19.0.0", - "@angular-devkit/core": ">=15.0.0 < 19.0.0", - "@angular/cli": ">=15.0.0 < 19.0.0", - "@angular/common": ">=15.0.0 < 19.0.0", - "@angular/compiler": ">=15.0.0 < 19.0.0", - "@angular/compiler-cli": ">=15.0.0 < 19.0.0", - "@angular/core": ">=15.0.0 < 19.0.0", - "@angular/forms": ">=15.0.0 < 19.0.0", - "@angular/platform-browser": ">=15.0.0 < 19.0.0", - "@angular/platform-browser-dynamic": ">=15.0.0 < 19.0.0", - "rxjs": "^6.0.0 || ^7.4.0", - "storybook": "^8.3.2", - "typescript": "^4.0.0 || ^5.0.0", - "zone.js": ">= 0.11.1 < 1.0.0" - }, - "peerDependenciesMeta": { - "@angular/cli": { - "optional": true - } - } - }, - "node_modules/@storybook/angular/node_modules/@types/node": { - "version": "22.6.1", - "resolved": "https://registry.npmjs.org/@types/node/-/node-22.6.1.tgz", - "integrity": "sha512-V48tCfcKb/e6cVUigLAaJDAILdMP0fUW6BidkPK4GpGjXcfbnoHasCZDwz3N3yVt5we2RHm4XTQCpv0KJz9zqw==", - "dev": true, - "dependencies": { - "undici-types": "~6.19.2" - } - }, - "node_modules/@storybook/angular/node_modules/find-up": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", - "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", - "dev": true, - "dependencies": { - "locate-path": "^6.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@storybook/angular/node_modules/locate-path": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", - "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", - "dev": true, - "dependencies": { - "p-locate": "^5.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@storybook/angular/node_modules/p-limit": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", - "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", - "dev": true, - "dependencies": { - "yocto-queue": "^0.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@storybook/angular/node_modules/p-locate": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", - "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", - "dev": true, - "dependencies": { - "p-limit": "^3.0.2" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@storybook/angular/node_modules/path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/@storybook/angular/node_modules/yocto-queue": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", - "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@storybook/blocks": { - "version": "8.3.2", - "resolved": "https://registry.npmjs.org/@storybook/blocks/-/blocks-8.3.2.tgz", - "integrity": "sha512-z6XTg5fC5XT/8vYYtFqVhQtBYw5MkSlkQF5HM1ntxlEesN4tGd14SjFd24nWuoAHq4G5D2D8KNt41IoNdzeD1A==", - "dev": true, - "dependencies": { - "@storybook/csf": "^0.1.11", - "@storybook/global": "^5.0.0", - "@storybook/icons": "^1.2.10", - "@types/lodash": "^4.14.167", - "color-convert": "^2.0.1", - "dequal": "^2.0.2", - "lodash": "^4.17.21", - "markdown-to-jsx": "^7.4.5", - "memoizerific": "^1.11.3", - "polished": "^4.2.2", - "react-colorful": "^5.1.2", - "telejson": "^7.2.0", - "ts-dedent": "^2.0.0", - "util-deprecate": "^1.0.2" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/storybook" - }, - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta", - "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta", - "storybook": "^8.3.2" - }, - "peerDependenciesMeta": { - "react": { - "optional": true - }, - "react-dom": { - "optional": true - } - } - }, - "node_modules/@storybook/blocks/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/@storybook/blocks/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "node_modules/@storybook/builder-vite": { - "version": "8.3.2", - "resolved": "https://registry.npmjs.org/@storybook/builder-vite/-/builder-vite-8.3.2.tgz", - "integrity": "sha512-mq6T2J8gDiIuO8+nLBzQkMRncDb+zLiBmRrudwSNum3cFLPLDV1Y4JSzsoG/SjlQz1feUEqTO9by6i7wxKh+Cw==", - "dev": true, - "dependencies": { - "@storybook/csf-plugin": "8.3.2", - "@types/find-cache-dir": "^3.2.1", - "browser-assert": "^1.2.1", - "es-module-lexer": "^1.5.0", - "express": "^4.19.2", - "find-cache-dir": "^3.0.0", - "fs-extra": "^11.1.0", - "magic-string": "^0.30.0", - "ts-dedent": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/storybook" - }, - "peerDependencies": { - "@preact/preset-vite": "*", - "storybook": "^8.3.2", - "typescript": ">= 4.3.x", - "vite": "^4.0.0 || ^5.0.0", - "vite-plugin-glimmerx": "*" - }, - "peerDependenciesMeta": { - "@preact/preset-vite": { - "optional": true - }, - "typescript": { - "optional": true - }, - "vite-plugin-glimmerx": { - "optional": true - } - } - }, - "node_modules/@storybook/builder-vite/node_modules/find-cache-dir": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.2.tgz", - "integrity": "sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig==", - "dev": true, - "dependencies": { - "commondir": "^1.0.1", - "make-dir": "^3.0.2", - "pkg-dir": "^4.1.0" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/avajs/find-cache-dir?sponsor=1" - } - }, - "node_modules/@storybook/builder-vite/node_modules/find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "dev": true, - "dependencies": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@storybook/builder-vite/node_modules/fs-extra": { - "version": "11.2.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.2.0.tgz", - "integrity": "sha512-PmDi3uwK5nFuXh7XDTlVnS17xJS7vW36is2+w3xcv8SVxiB4NyATf4ctkVY5bkSjX0Y4nbvZCq1/EjtEyr9ktw==", - "dev": true, - "dependencies": { - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - }, - "engines": { - "node": ">=14.14" - } - }, - "node_modules/@storybook/builder-vite/node_modules/jsonfile": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", - "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", - "dev": true, - "dependencies": { - "universalify": "^2.0.0" - }, - "optionalDependencies": { - "graceful-fs": "^4.1.6" - } - }, - "node_modules/@storybook/builder-vite/node_modules/locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "dev": true, - "dependencies": { - "p-locate": "^4.1.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@storybook/builder-vite/node_modules/make-dir": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", - "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", - "dev": true, - "dependencies": { - "semver": "^6.0.0" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@storybook/builder-vite/node_modules/p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "dev": true, - "dependencies": { - "p-try": "^2.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@storybook/builder-vite/node_modules/p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "dev": true, - "dependencies": { - "p-limit": "^2.2.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@storybook/builder-vite/node_modules/path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/@storybook/builder-vite/node_modules/pkg-dir": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", - "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", - "dev": true, - "dependencies": { - "find-up": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@storybook/builder-vite/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true, - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/@storybook/builder-vite/node_modules/universalify": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", - "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", - "dev": true, - "engines": { - "node": ">= 10.0.0" - } - }, - "node_modules/@storybook/builder-webpack5": { - "version": "8.3.2", - "resolved": "https://registry.npmjs.org/@storybook/builder-webpack5/-/builder-webpack5-8.3.2.tgz", - "integrity": "sha512-+Jy/iI1DoXTyIYurTSVvuoIgsibpO2WeZo52I/eoNeAvD9HguxmiZ4sBek4f6850jM7TLNFnhhOS0/7GzucmHw==", - "dev": true, - "dependencies": { - "@storybook/core-webpack": "8.3.2", - "@types/node": "^22.0.0", - "@types/semver": "^7.3.4", - "browser-assert": "^1.2.1", - "case-sensitive-paths-webpack-plugin": "^2.4.0", - "cjs-module-lexer": "^1.2.3", - "constants-browserify": "^1.0.0", - "css-loader": "^6.7.1", - "es-module-lexer": "^1.5.0", - "express": "^4.19.2", - "fork-ts-checker-webpack-plugin": "^8.0.0", - "fs-extra": "^11.1.0", - "html-webpack-plugin": "^5.5.0", - "magic-string": "^0.30.5", - "path-browserify": "^1.0.1", - "process": "^0.11.10", - "semver": "^7.3.7", - "style-loader": "^3.3.1", - "terser-webpack-plugin": "^5.3.1", - "ts-dedent": "^2.0.0", - "url": "^0.11.0", - "util": "^0.12.4", - "util-deprecate": "^1.0.2", - "webpack": "5", - "webpack-dev-middleware": "^6.1.2", - "webpack-hot-middleware": "^2.25.1", - "webpack-virtual-modules": "^0.6.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/storybook" - }, - "peerDependencies": { - "storybook": "^8.3.2" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@storybook/builder-webpack5/node_modules/@types/node": { - "version": "22.6.1", - "resolved": "https://registry.npmjs.org/@types/node/-/node-22.6.1.tgz", - "integrity": "sha512-V48tCfcKb/e6cVUigLAaJDAILdMP0fUW6BidkPK4GpGjXcfbnoHasCZDwz3N3yVt5we2RHm4XTQCpv0KJz9zqw==", - "dev": true, - "dependencies": { - "undici-types": "~6.19.2" - } - }, - "node_modules/@storybook/builder-webpack5/node_modules/css-loader": { - "version": "6.11.0", - "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-6.11.0.tgz", - "integrity": "sha512-CTJ+AEQJjq5NzLga5pE39qdiSV56F8ywCIsqNIRF0r7BDgWsN25aazToqAFg7ZrtA/U016xudB3ffgweORxX7g==", - "dev": true, - "dependencies": { - "icss-utils": "^5.1.0", - "postcss": "^8.4.33", - "postcss-modules-extract-imports": "^3.1.0", - "postcss-modules-local-by-default": "^4.0.5", - "postcss-modules-scope": "^3.2.0", - "postcss-modules-values": "^4.0.0", - "postcss-value-parser": "^4.2.0", - "semver": "^7.5.4" - }, - "engines": { - "node": ">= 12.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "@rspack/core": "0.x || 1.x", - "webpack": "^5.0.0" - }, - "peerDependenciesMeta": { - "@rspack/core": { - "optional": true - }, - "webpack": { - "optional": true - } - } - }, - "node_modules/@storybook/builder-webpack5/node_modules/fs-extra": { - "version": "11.2.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.2.0.tgz", - "integrity": "sha512-PmDi3uwK5nFuXh7XDTlVnS17xJS7vW36is2+w3xcv8SVxiB4NyATf4ctkVY5bkSjX0Y4nbvZCq1/EjtEyr9ktw==", - "dev": true, - "dependencies": { - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - }, - "engines": { - "node": ">=14.14" - } - }, - "node_modules/@storybook/builder-webpack5/node_modules/jsonfile": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", - "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", - "dev": true, - "dependencies": { - "universalify": "^2.0.0" - }, - "optionalDependencies": { - "graceful-fs": "^4.1.6" - } - }, - "node_modules/@storybook/builder-webpack5/node_modules/memfs": { - "version": "3.5.3", - "resolved": "https://registry.npmjs.org/memfs/-/memfs-3.5.3.tgz", - "integrity": "sha512-UERzLsxzllchadvbPs5aolHh65ISpKpM+ccLbOJ8/vvpBKmAWf+la7dXFy7Mr0ySHbdHrFv5kGFCUHHe6GFEmw==", - "dev": true, - "dependencies": { - "fs-monkey": "^1.0.4" - }, - "engines": { - "node": ">= 4.0.0" - } - }, - "node_modules/@storybook/builder-webpack5/node_modules/universalify": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", - "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", - "dev": true, - "engines": { - "node": ">= 10.0.0" - } - }, - "node_modules/@storybook/builder-webpack5/node_modules/webpack-dev-middleware": { - "version": "6.1.3", - "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-6.1.3.tgz", - "integrity": "sha512-A4ChP0Qj8oGociTs6UdlRUGANIGrCDL3y+pmQMc+dSsraXHCatFpmMey4mYELA+juqwUqwQsUgJJISXl1KWmiw==", - "dev": true, - "dependencies": { - "colorette": "^2.0.10", - "memfs": "^3.4.12", - "mime-types": "^2.1.31", - "range-parser": "^1.2.1", - "schema-utils": "^4.0.0" - }, - "engines": { - "node": ">= 14.15.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "webpack": "^5.0.0" - }, - "peerDependenciesMeta": { - "webpack": { - "optional": true - } - } - }, - "node_modules/@storybook/components": { - "version": "8.3.2", - "resolved": "https://registry.npmjs.org/@storybook/components/-/components-8.3.2.tgz", - "integrity": "sha512-yB/ETNTNVZi8xvVsTMWvtiI4APRj2zzAa3nHyQO0X+DC4jjysT9D1ruL6jZJ/2DHMp7A9U6v2if83dby/kszfg==", - "dev": true, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/storybook" - }, - "peerDependencies": { - "storybook": "^8.3.2" - } - }, - "node_modules/@storybook/core": { - "version": "8.3.2", - "resolved": "https://registry.npmjs.org/@storybook/core/-/core-8.3.2.tgz", - "integrity": "sha512-DVXs9AZzXHUKEhi5hKQ4gmH2ODFFM9hmd3odnlqenIINxGynbRtAGzU8pMhjrTRSrnlLr1liGew1IcY+hwkFjQ==", - "dev": true, - "dependencies": { - "@storybook/csf": "^0.1.11", - "@types/express": "^4.17.21", - "better-opn": "^3.0.2", - "browser-assert": "^1.2.1", - "esbuild": "^0.18.0 || ^0.19.0 || ^0.20.0 || ^0.21.0 || ^0.22.0 || ^0.23.0", - "esbuild-register": "^3.5.0", - "express": "^4.19.2", - "jsdoc-type-pratt-parser": "^4.0.0", - "process": "^0.11.10", - "recast": "^0.23.5", - "semver": "^7.6.2", - "util": "^0.12.5", - "ws": "^8.2.3" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/storybook" - } - }, - "node_modules/@storybook/core-webpack": { - "version": "8.3.2", - "resolved": "https://registry.npmjs.org/@storybook/core-webpack/-/core-webpack-8.3.2.tgz", - "integrity": "sha512-WOmtvnH7qZR6UaN3QsXRqj8xeztRDH5jms4f7+jnudB9xs+Fn7cEkns1SdMh0QK8BOt1bTCdoSwq2kFbszfgZA==", - "dev": true, - "dependencies": { - "@types/node": "^22.0.0", - "ts-dedent": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/storybook" - }, - "peerDependencies": { - "storybook": "^8.3.2" - } - }, - "node_modules/@storybook/core-webpack/node_modules/@types/node": { - "version": "22.6.1", - "resolved": "https://registry.npmjs.org/@types/node/-/node-22.6.1.tgz", - "integrity": "sha512-V48tCfcKb/e6cVUigLAaJDAILdMP0fUW6BidkPK4GpGjXcfbnoHasCZDwz3N3yVt5we2RHm4XTQCpv0KJz9zqw==", - "dev": true, - "dependencies": { - "undici-types": "~6.19.2" - } - }, - "node_modules/@storybook/csf": { - "version": "0.1.11", - "resolved": "https://registry.npmjs.org/@storybook/csf/-/csf-0.1.11.tgz", - "integrity": "sha512-dHYFQH3mA+EtnCkHXzicbLgsvzYjcDJ1JWsogbItZogkPHgSJM/Wr71uMkcvw8v9mmCyP4NpXJuu6bPoVsOnzg==", - "dev": true, - "dependencies": { - "type-fest": "^2.19.0" - } - }, - "node_modules/@storybook/csf-plugin": { - "version": "8.3.2", - "resolved": "https://registry.npmjs.org/@storybook/csf-plugin/-/csf-plugin-8.3.2.tgz", - "integrity": "sha512-9UvoBkYDLzf/0e2lQMPyBCJHrrEMxvhL7fraVX2c5OxwVUwgQnHlgNR3zxzw1Nr/AWyC5OKYlaE1eM10JVm2GA==", - "dev": true, - "dependencies": { - "unplugin": "^1.3.1" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/storybook" - }, - "peerDependencies": { - "storybook": "^8.3.2" - } - }, - "node_modules/@storybook/csf/node_modules/type-fest": { - "version": "2.19.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-2.19.0.tgz", - "integrity": "sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==", - "dev": true, - "engines": { - "node": ">=12.20" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@storybook/global": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/@storybook/global/-/global-5.0.0.tgz", - "integrity": "sha512-FcOqPAXACP0I3oJ/ws6/rrPT9WGhu915Cg8D02a9YxLo0DE9zI+a9A5gRGvmQ09fiWPukqI8ZAEoQEdWUKMQdQ==", - "dev": true - }, - "node_modules/@storybook/icons": { - "version": "1.2.12", - "resolved": "https://registry.npmjs.org/@storybook/icons/-/icons-1.2.12.tgz", - "integrity": "sha512-UxgyK5W3/UV4VrI3dl6ajGfHM4aOqMAkFLWe2KibeQudLf6NJpDrDMSHwZj+3iKC4jFU7dkKbbtH2h/al4sW3Q==", - "dev": true, - "engines": { - "node": ">=14.0.0" - }, - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0 || ^18.0.0", - "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0" - } - }, - "node_modules/@storybook/manager-api": { - "version": "8.3.2", - "resolved": "https://registry.npmjs.org/@storybook/manager-api/-/manager-api-8.3.2.tgz", - "integrity": "sha512-8FuwE3BGsLPF0H154+1X/4krSbvmH5xu5YmaVTVDV8DRPlBeRIlNV0HDiZfBvftF4EB7fRYolzghXQplHIX8Fg==", - "dev": true, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/storybook" - }, - "peerDependencies": { - "storybook": "^8.3.2" - } - }, - "node_modules/@storybook/preview-api": { - "version": "8.3.2", - "resolved": "https://registry.npmjs.org/@storybook/preview-api/-/preview-api-8.3.2.tgz", - "integrity": "sha512-bZvqahrS5oXkiVmqt9rPhlpo/xYLKT7QUWKKIDBRJDp+1mYbQhgsP5NhjUtUdaC+HSofAFzJmVFmixyquYsoGw==", - "dev": true, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/storybook" - }, - "peerDependencies": { - "storybook": "^8.3.2" - } - }, - "node_modules/@storybook/react-dom-shim": { - "version": "8.3.2", - "resolved": "https://registry.npmjs.org/@storybook/react-dom-shim/-/react-dom-shim-8.3.2.tgz", - "integrity": "sha512-fYL7jh9yFkiKIqRJedqTcrmyoVzS/cMxZD/EFfDRaonMVlLlYJQKocuvR1li1iyeKLvd5lxZsHuQ80c98AkDMA==", - "dev": true, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/storybook" - }, - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta", - "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta", - "storybook": "^8.3.2" - } - }, - "node_modules/@storybook/theming": { - "version": "8.3.2", - "resolved": "https://registry.npmjs.org/@storybook/theming/-/theming-8.3.2.tgz", - "integrity": "sha512-JXAVc08Tlbu4GTTMGNmwUy69lShqSpJixAJc4bvWTnNAtPTRltiNJCg/KJ0GauEyRFk8ZR2Ha4KhN3DB1felNQ==", - "dev": true, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/storybook" - }, - "peerDependencies": { - "storybook": "^8.3.2" - } - }, - "node_modules/@tootallnate/once": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-2.0.0.tgz", - "integrity": "sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==", - "dev": true, - "engines": { - "node": ">= 10" - } - }, - "node_modules/@ts-morph/common": { - "version": "0.22.0", - "resolved": "https://registry.npmjs.org/@ts-morph/common/-/common-0.22.0.tgz", - "integrity": "sha512-HqNBuV/oIlMKdkLshXd1zKBqNQCsuPEsgQOkfFQ/eUKjRlwndXW1AjN9LVkBEIukm00gGXSRmfkl0Wv5VXLnlw==", - "dev": true, - "dependencies": { - "fast-glob": "^3.3.2", - "minimatch": "^9.0.3", - "mkdirp": "^3.0.1", - "path-browserify": "^1.0.1" - } - }, - "node_modules/@ts-morph/common/node_modules/brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "dev": true, - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/@ts-morph/common/node_modules/minimatch": { - "version": "9.0.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", - "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", - "dev": true, - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/@ts-morph/common/node_modules/mkdirp": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-3.0.1.tgz", - "integrity": "sha512-+NsyUUAZDmo6YVHzL/stxSu3t9YS1iljliy3BSDrXJ/dkn1KYdmtZODGGjLcc9XLgVVpH4KshHB8XmZgMhaBXg==", - "dev": true, - "bin": { - "mkdirp": "dist/cjs/src/bin.js" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/@tufjs/canonical-json": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@tufjs/canonical-json/-/canonical-json-2.0.0.tgz", - "integrity": "sha512-yVtV8zsdo8qFHe+/3kw81dSLyF7D576A5cCFCi4X7B39tWT7SekaEFUnvnWJHz+9qO7qJTah1JbrDjWKqFtdWA==", - "dev": true, - "engines": { - "node": "^16.14.0 || >=18.0.0" - } - }, - "node_modules/@tufjs/models": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@tufjs/models/-/models-2.0.1.tgz", - "integrity": "sha512-92F7/SFyufn4DXsha9+QfKnN03JGqtMFMXgSHbZOo8JG59WkTni7UzAouNQDf7AuP9OAMxVOPQcqG3sB7w+kkg==", - "dev": true, - "dependencies": { - "@tufjs/canonical-json": "2.0.0", - "minimatch": "^9.0.4" - }, - "engines": { - "node": "^16.14.0 || >=18.0.0" - } - }, - "node_modules/@tufjs/models/node_modules/brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "dev": true, - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/@tufjs/models/node_modules/minimatch": { - "version": "9.0.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", - "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", - "dev": true, - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/@types/body-parser": { - "version": "1.19.5", - "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.5.tgz", - "integrity": "sha512-fB3Zu92ucau0iQ0JMCFQE7b/dv8Ot07NI3KaZIkIUNXq82k4eBAqUaneXfleGY9JWskeS9y+u0nXMyspcuQrCg==", - "dev": true, - "dependencies": { - "@types/connect": "*", - "@types/node": "*" - } - }, - "node_modules/@types/bonjour": { - "version": "3.5.13", - "resolved": "https://registry.npmjs.org/@types/bonjour/-/bonjour-3.5.13.tgz", - "integrity": "sha512-z9fJ5Im06zvUL548KvYNecEVlA7cVDkGUi6kZusb04mpyEFKCIZJvloCcmpmLaIahDpOQGHaHmG6imtPMmPXGQ==", - "dev": true, - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/connect": { - "version": "3.4.38", - "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.38.tgz", - "integrity": "sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==", - "dev": true, - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/connect-history-api-fallback": { - "version": "1.5.4", - "resolved": "https://registry.npmjs.org/@types/connect-history-api-fallback/-/connect-history-api-fallback-1.5.4.tgz", - "integrity": "sha512-n6Cr2xS1h4uAulPRdlw6Jl6s1oG8KrVilPN2yUITEs+K48EzMJJ3W1xy8K5eWuFvjp3R74AOIGSmp2UfBJ8HFw==", - "dev": true, - "dependencies": { - "@types/express-serve-static-core": "*", - "@types/node": "*" - } - }, - "node_modules/@types/cookie": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/@types/cookie/-/cookie-0.4.1.tgz", - "integrity": "sha512-XW/Aa8APYr6jSVVA1y/DEIZX0/GMKLEVekNG727R8cs56ahETkRAy/3DR7+fJyh7oUgGwNQaRfXCun0+KbWY7Q==", - "dev": true, - "optional": true, - "peer": true - }, - "node_modules/@types/cors": { - "version": "2.8.17", - "resolved": "https://registry.npmjs.org/@types/cors/-/cors-2.8.17.tgz", - "integrity": "sha512-8CGDvrBj1zgo2qE+oS3pOCyYNqCPryMWY2bGfwA0dcfopWGgxs+78df0Rs3rc9THP4JkOhLsAa+15VdpAqkcUA==", - "dev": true, - "optional": true, - "peer": true, - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/estree": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.6.tgz", - "integrity": "sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==", - "dev": true - }, - "node_modules/@types/express": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.21.tgz", - "integrity": "sha512-ejlPM315qwLpaQlQDTjPdsUFSc6ZsP4AN6AlWnogPjQ7CVi7PYF3YVz+CY3jE2pwYf7E/7HlDAN0rV2GxTG0HQ==", - "dev": true, - "dependencies": { - "@types/body-parser": "*", - "@types/express-serve-static-core": "^4.17.33", - "@types/qs": "*", - "@types/serve-static": "*" - } - }, - "node_modules/@types/express-serve-static-core": { - "version": "4.19.5", - "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.19.5.tgz", - "integrity": "sha512-y6W03tvrACO72aijJ5uF02FRq5cgDR9lUxddQ8vyF+GvmjJQqbzDcJngEjURc+ZsG31VI3hODNZJ2URj86pzmg==", - "dev": true, - "dependencies": { - "@types/node": "*", - "@types/qs": "*", - "@types/range-parser": "*", - "@types/send": "*" - } - }, - "node_modules/@types/find-cache-dir": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/@types/find-cache-dir/-/find-cache-dir-3.2.1.tgz", - "integrity": "sha512-frsJrz2t/CeGifcu/6uRo4b+SzAwT4NYCVPu1GN8IB9XTzrpPkGuV0tmh9mN+/L0PklAlsC3u5Fxt0ju00LXIw==", - "dev": true - }, - "node_modules/@types/hast": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/@types/hast/-/hast-3.0.4.tgz", - "integrity": "sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==", - "dev": true, - "dependencies": { - "@types/unist": "*" - } - }, - "node_modules/@types/html-minifier-terser": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/@types/html-minifier-terser/-/html-minifier-terser-6.1.0.tgz", - "integrity": "sha512-oh/6byDPnL1zeNXFrDXFLyZjkr1MsBG667IM792caf1L2UPOOMf65NFzjUH/ltyfwjAGfs1rsX1eftK0jC/KIg==", - "dev": true - }, - "node_modules/@types/http-errors": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/@types/http-errors/-/http-errors-2.0.4.tgz", - "integrity": "sha512-D0CFMMtydbJAegzOyHjtiKPLlvnm3iTZyZRSZoLq2mRhDdmLfIWOCYPfQJ4cu2erKghU++QvjcUjp/5h7hESpA==", - "dev": true - }, - "node_modules/@types/http-proxy": { - "version": "1.17.15", - "resolved": "https://registry.npmjs.org/@types/http-proxy/-/http-proxy-1.17.15.tgz", - "integrity": "sha512-25g5atgiVNTIv0LBDTg1H74Hvayx0ajtJPLLcYE3whFv75J0pWNtOBzaXJQgDTmrX1bx5U9YC2w/n65BN1HwRQ==", - "dev": true, - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/json-schema": { - "version": "7.0.15", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", - "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", - "dev": true - }, - "node_modules/@types/lodash": { - "version": "4.17.9", - "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.17.9.tgz", - "integrity": "sha512-w9iWudx1XWOHW5lQRS9iKpK/XuRhnN+0T7HvdCCd802FYkT1AMTnxndJHGrNJwRoRHkslGr4S29tjm1cT7x/7w==", - "dev": true - }, - "node_modules/@types/mdx": { - "version": "2.0.13", - "resolved": "https://registry.npmjs.org/@types/mdx/-/mdx-2.0.13.tgz", - "integrity": "sha512-+OWZQfAYyio6YkJb3HLxDrvnx6SWWDbC0zVPfBRzUk0/nqoDyf6dNxQi3eArPe8rJ473nobTMQ/8Zk+LxJ+Yuw==", - "dev": true - }, - "node_modules/@types/mime": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.5.tgz", - "integrity": "sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w==", - "dev": true - }, - "node_modules/@types/mute-stream": { - "version": "0.0.4", - "resolved": "https://registry.npmjs.org/@types/mute-stream/-/mute-stream-0.0.4.tgz", - "integrity": "sha512-CPM9nzrCPPJHQNA9keH9CVkVI+WR5kMa+7XEs5jcGQ0VoAGnLv242w8lIVgwAEfmE4oufJRaTc9PNLQl0ioAow==", - "dev": true, - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/node": { - "version": "20.16.6", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.16.6.tgz", - "integrity": "sha512-T7PpxM/6yeDE+AdlVysT62BX6/bECZOmQAgiFg5NoBd5MQheZ3tzal7f1wvzfiEcmrcJNRi2zRr2nY2zF+0uqw==", - "dev": true, - "dependencies": { - "undici-types": "~6.19.2" - } - }, - "node_modules/@types/node-forge": { - "version": "1.3.11", - "resolved": "https://registry.npmjs.org/@types/node-forge/-/node-forge-1.3.11.tgz", - "integrity": "sha512-FQx220y22OKNTqaByeBGqHWYz4cl94tpcxeFdvBo3wjG6XPBuZ0BNgNZRV5J5TFmmcsJ4IzsLkmGRiQbnYsBEQ==", - "dev": true, - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/parse-json": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.2.tgz", - "integrity": "sha512-dISoDXWWQwUquiKsyZ4Ng+HX2KsPL7LyHKHQwgGFEA3IaKac4Obd+h2a/a6waisAoepJlBcx9paWqjA8/HVjCw==", - "dev": true - }, - "node_modules/@types/prop-types": { - "version": "15.7.13", - "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.13.tgz", - "integrity": "sha512-hCZTSvwbzWGvhqxp/RqVqwU999pBf2vp7hzIjiYOsl8wqOmUxkQ6ddw1cV3l8811+kdUFus/q4d1Y3E3SyEifA==", - "dev": true - }, - "node_modules/@types/qs": { - "version": "6.9.16", - "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.16.tgz", - "integrity": "sha512-7i+zxXdPD0T4cKDuxCUXJ4wHcsJLwENa6Z3dCu8cfCK743OGy5Nu1RmAGqDPsoTDINVEcdXKRvR/zre+P2Ku1A==", - "dev": true - }, - "node_modules/@types/range-parser": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.7.tgz", - "integrity": "sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ==", - "dev": true - }, - "node_modules/@types/react": { - "version": "18.3.8", - "resolved": "https://registry.npmjs.org/@types/react/-/react-18.3.8.tgz", - "integrity": "sha512-syBUrW3/XpnW4WJ41Pft+I+aPoDVbrBVQGEnbD7NijDGlVC+8gV/XKRY+7vMDlfPpbwYt0l1vd/Sj8bJGMbs9Q==", - "dev": true, - "dependencies": { - "@types/prop-types": "*", - "csstype": "^3.0.2" - } - }, - "node_modules/@types/react-dom": { - "version": "18.3.0", - "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.3.0.tgz", - "integrity": "sha512-EhwApuTmMBmXuFOikhQLIBUn6uFg81SwLMOAUgodJF14SOBOCMdU04gDoYi0WOJJHD144TL32z4yDqCW3dnkQg==", - "dev": true, - "dependencies": { - "@types/react": "*" - } - }, - "node_modules/@types/resolve": { - "version": "1.20.2", - "resolved": "https://registry.npmjs.org/@types/resolve/-/resolve-1.20.2.tgz", - "integrity": "sha512-60BCwRFOZCQhDncwQdxxeOEEkbc5dIMccYLwbxsS4TUNeVECQ/pBJ0j09mrHOl/JJvpRPGwO9SvE4nR2Nb/a4Q==", - "dev": true - }, - "node_modules/@types/retry": { - "version": "0.12.2", - "resolved": "https://registry.npmjs.org/@types/retry/-/retry-0.12.2.tgz", - "integrity": "sha512-XISRgDJ2Tc5q4TRqvgJtzsRkFYNJzZrhTdtMoGVBttwzzQJkPnS3WWTFc7kuDRoPtPakl+T+OfdEUjYJj7Jbow==", - "dev": true - }, - "node_modules/@types/semver": { - "version": "7.5.8", - "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.8.tgz", - "integrity": "sha512-I8EUhyrgfLrcTkzV3TSsGyl1tSuPrEDzr0yd5m90UgNxQkyDXULk3b6MlQqTCpZpNtWe1K0hzclnZkTcLBe2UQ==", - "dev": true - }, - "node_modules/@types/send": { - "version": "0.17.4", - "resolved": "https://registry.npmjs.org/@types/send/-/send-0.17.4.tgz", - "integrity": "sha512-x2EM6TJOybec7c52BX0ZspPodMsQUd5L6PRwOunVyVUhXiBSKf3AezDL8Dgvgt5o0UfKNfuA0eMLr2wLT4AiBA==", - "dev": true, - "dependencies": { - "@types/mime": "^1", - "@types/node": "*" - } - }, - "node_modules/@types/serve-index": { - "version": "1.9.4", - "resolved": "https://registry.npmjs.org/@types/serve-index/-/serve-index-1.9.4.tgz", - "integrity": "sha512-qLpGZ/c2fhSs5gnYsQxtDEq3Oy8SXPClIXkW5ghvAvsNuVSA8k+gCONcUCS/UjLEYvYps+e8uBtfgXgvhwfNug==", - "dev": true, - "dependencies": { - "@types/express": "*" - } - }, - "node_modules/@types/serve-static": { - "version": "1.15.7", - "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.7.tgz", - "integrity": "sha512-W8Ym+h8nhuRwaKPaDw34QUkwsGi6Rc4yYqvKFo5rm2FUEhCFbzVWrxXUxuKK8TASjWsysJY0nsmNCGhCOIsrOw==", - "dev": true, - "dependencies": { - "@types/http-errors": "*", - "@types/node": "*", - "@types/send": "*" - } - }, - "node_modules/@types/sockjs": { - "version": "0.3.36", - "resolved": "https://registry.npmjs.org/@types/sockjs/-/sockjs-0.3.36.tgz", - "integrity": "sha512-MK9V6NzAS1+Ud7JV9lJLFqW85VbC9dq3LmwZCuBe4wBDgKC0Kj/jd8Xl+nSviU+Qc3+m7umHHyHg//2KSa0a0Q==", - "dev": true, - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/unist": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.3.tgz", - "integrity": "sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==", - "dev": true - }, - "node_modules/@types/uuid": { - "version": "9.0.8", - "resolved": "https://registry.npmjs.org/@types/uuid/-/uuid-9.0.8.tgz", - "integrity": "sha512-jg+97EGIcY9AGHJJRaaPVgetKDsrTgbRjQ5Msgjh/DQKEFl0DtyRr/VCOyD1T2R1MNeWPK/u7JoGhlDZnKBAfA==", - "dev": true - }, - "node_modules/@types/webpack-env": { - "version": "1.18.5", - "resolved": "https://registry.npmjs.org/@types/webpack-env/-/webpack-env-1.18.5.tgz", - "integrity": "sha512-wz7kjjRRj8/Lty4B+Kr0LN6Ypc/3SymeCCGSbaXp2leH0ZVg/PriNiOwNj4bD4uphI7A8NXS4b6Gl373sfO5mA==", - "dev": true - }, - "node_modules/@types/wrap-ansi": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@types/wrap-ansi/-/wrap-ansi-3.0.0.tgz", - "integrity": "sha512-ltIpx+kM7g/MLRZfkbL7EsCEjfzCcScLpkg37eXEtx5kmrAKBkTJwd1GIAjDSL8wTpM6Hzn5YO4pSb91BEwu1g==", - "dev": true - }, - "node_modules/@types/ws": { - "version": "8.5.12", - "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.5.12.tgz", - "integrity": "sha512-3tPRkv1EtkDpzlgyKyI8pGsGZAGPEaXeu0DOj5DI25Ja91bdAYddYHbADRYVrZMRbfW+1l5YwXVDKohDJNQxkQ==", - "dev": true, - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@typescript-eslint/eslint-plugin": { - "version": "8.7.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.7.0.tgz", - "integrity": "sha512-RIHOoznhA3CCfSTFiB6kBGLQtB/sox+pJ6jeFu6FxJvqL8qRxq/FfGO/UhsGgQM9oGdXkV4xUgli+dt26biB6A==", - "dev": true, - "dependencies": { - "@eslint-community/regexpp": "^4.10.0", - "@typescript-eslint/scope-manager": "8.7.0", - "@typescript-eslint/type-utils": "8.7.0", - "@typescript-eslint/utils": "8.7.0", - "@typescript-eslint/visitor-keys": "8.7.0", - "graphemer": "^1.4.0", - "ignore": "^5.3.1", - "natural-compare": "^1.4.0", - "ts-api-utils": "^1.3.0" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "@typescript-eslint/parser": "^8.0.0 || ^8.0.0-alpha.0", - "eslint": "^8.57.0 || ^9.0.0" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@typescript-eslint/parser": { - "version": "8.7.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.7.0.tgz", - "integrity": "sha512-lN0btVpj2unxHlNYLI//BQ7nzbMJYBVQX5+pbNXvGYazdlgYonMn4AhhHifQ+J4fGRYA/m1DjaQjx+fDetqBOQ==", - "dev": true, - "dependencies": { - "@typescript-eslint/scope-manager": "8.7.0", - "@typescript-eslint/types": "8.7.0", - "@typescript-eslint/typescript-estree": "8.7.0", - "@typescript-eslint/visitor-keys": "8.7.0", - "debug": "^4.3.4" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^8.57.0 || ^9.0.0" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@typescript-eslint/scope-manager": { - "version": "8.7.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.7.0.tgz", - "integrity": "sha512-87rC0k3ZlDOuz82zzXRtQ7Akv3GKhHs0ti4YcbAJtaomllXoSO8hi7Ix3ccEvCd824dy9aIX+j3d2UMAfCtVpg==", - "dev": true, - "dependencies": { - "@typescript-eslint/types": "8.7.0", - "@typescript-eslint/visitor-keys": "8.7.0" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/type-utils": { - "version": "8.7.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.7.0.tgz", - "integrity": "sha512-tl0N0Mj3hMSkEYhLkjREp54OSb/FI6qyCzfiiclvJvOqre6hsZTGSnHtmFLDU8TIM62G7ygEa1bI08lcuRwEnQ==", - "dev": true, - "dependencies": { - "@typescript-eslint/typescript-estree": "8.7.0", - "@typescript-eslint/utils": "8.7.0", - "debug": "^4.3.4", - "ts-api-utils": "^1.3.0" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@typescript-eslint/types": { - "version": "8.7.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.7.0.tgz", - "integrity": "sha512-LLt4BLHFwSfASHSF2K29SZ+ZCsbQOM+LuarPjRUuHm+Qd09hSe3GCeaQbcCr+Mik+0QFRmep/FyZBO6fJ64U3w==", - "dev": true, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/typescript-estree": { - "version": "8.7.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.7.0.tgz", - "integrity": "sha512-MC8nmcGHsmfAKxwnluTQpNqceniT8SteVwd2voYlmiSWGOtjvGXdPl17dYu2797GVscK30Z04WRM28CrKS9WOg==", - "dev": true, - "dependencies": { - "@typescript-eslint/types": "8.7.0", - "@typescript-eslint/visitor-keys": "8.7.0", - "debug": "^4.3.4", - "fast-glob": "^3.3.2", - "is-glob": "^4.0.3", - "minimatch": "^9.0.4", - "semver": "^7.6.0", - "ts-api-utils": "^1.3.0" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@typescript-eslint/typescript-estree/node_modules/brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "dev": true, - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/@typescript-eslint/typescript-estree/node_modules/minimatch": { - "version": "9.0.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", - "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", - "dev": true, - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/@typescript-eslint/utils": { - "version": "8.7.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.7.0.tgz", - "integrity": "sha512-ZbdUdwsl2X/s3CiyAu3gOlfQzpbuG3nTWKPoIvAu1pu5r8viiJvv2NPN2AqArL35NCYtw/lrPPfM4gxrMLNLPw==", - "dev": true, - "dependencies": { - "@eslint-community/eslint-utils": "^4.4.0", - "@typescript-eslint/scope-manager": "8.7.0", - "@typescript-eslint/types": "8.7.0", - "@typescript-eslint/typescript-estree": "8.7.0" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^8.57.0 || ^9.0.0" - } - }, - "node_modules/@typescript-eslint/visitor-keys": { - "version": "8.7.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.7.0.tgz", - "integrity": "sha512-b1tx0orFCCh/THWPQa2ZwWzvOeyzzp36vkJYOpVg0u8UVOIsfVrnuC9FqAw9gRKn+rG2VmWQ/zDJZzkxUnj/XQ==", - "dev": true, - "dependencies": { - "@typescript-eslint/types": "8.7.0", - "eslint-visitor-keys": "^3.4.3" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@ungap/structured-clone": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.2.0.tgz", - "integrity": "sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==", - "dev": true - }, - "node_modules/@vitejs/plugin-basic-ssl": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@vitejs/plugin-basic-ssl/-/plugin-basic-ssl-1.1.0.tgz", - "integrity": "sha512-wO4Dk/rm8u7RNhOf95ZzcEmC9rYOncYgvq4z3duaJrCgjN8BxAnDVyndanfcJZ0O6XZzHz6Q0hTimxTg8Y9g/A==", - "dev": true, - "engines": { - "node": ">=14.6.0" - }, - "peerDependencies": { - "vite": "^3.0.0 || ^4.0.0 || ^5.0.0" - } - }, - "node_modules/@vitest/expect": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-1.6.0.tgz", - "integrity": "sha512-ixEvFVQjycy/oNgHjqsL6AZCDduC+tflRluaHIzKIsdbzkLn2U/iBnVeJwB6HsIjQBdfMR8Z0tRxKUsvFJEeWQ==", - "dev": true, - "dependencies": { - "@vitest/spy": "1.6.0", - "@vitest/utils": "1.6.0", - "chai": "^4.3.10" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "node_modules/@vitest/runner": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-1.6.0.tgz", - "integrity": "sha512-P4xgwPjwesuBiHisAVz/LSSZtDjOTPYZVmNAnpHHSR6ONrf8eCJOFRvUwdHn30F5M1fxhqtl7QZQUk2dprIXAg==", - "dev": true, - "dependencies": { - "@vitest/utils": "1.6.0", - "p-limit": "^5.0.0", - "pathe": "^1.1.1" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "node_modules/@vitest/runner/node_modules/p-limit": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-5.0.0.tgz", - "integrity": "sha512-/Eaoq+QyLSiXQ4lyYV23f14mZRQcXnxfHrN0vCai+ak9G0pp9iEQukIIZq5NccEvwRB8PUnZT0KsOoDCINS1qQ==", - "dev": true, - "dependencies": { - "yocto-queue": "^1.0.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@vitest/snapshot": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-1.6.0.tgz", - "integrity": "sha512-+Hx43f8Chus+DCmygqqfetcAZrDJwvTj0ymqjQq4CvmpKFSTVteEOBzCusu1x2tt4OJcvBflyHUE0DZSLgEMtQ==", - "dev": true, - "dependencies": { - "magic-string": "^0.30.5", - "pathe": "^1.1.1", - "pretty-format": "^29.7.0" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "node_modules/@vitest/spy": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-1.6.0.tgz", - "integrity": "sha512-leUTap6B/cqi/bQkXUu6bQV5TZPx7pmMBKBQiI0rJA8c3pB56ZsaTbREnF7CJfmvAS4V2cXIBAh/3rVwrrCYgw==", - "dev": true, - "dependencies": { - "tinyspy": "^2.2.0" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "node_modules/@vitest/utils": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-1.6.0.tgz", - "integrity": "sha512-21cPiuGMoMZwiOHa2i4LXkMkMkCGzA+MVFV70jRwHo95dL4x/ts5GZhML1QWuy7yfp3WzK3lRvZi3JnXTYqrBw==", - "dev": true, - "dependencies": { - "diff-sequences": "^29.6.3", - "estree-walker": "^3.0.3", - "loupe": "^2.3.7", - "pretty-format": "^29.7.0" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "node_modules/@vitest/utils/node_modules/estree-walker": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz", - "integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==", - "dev": true, - "dependencies": { - "@types/estree": "^1.0.0" - } - }, - "node_modules/@webassemblyjs/ast": { - "version": "1.12.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.12.1.tgz", - "integrity": "sha512-EKfMUOPRRUTy5UII4qJDGPpqfwjOmZ5jeGFwid9mnoqIFK+e0vqoi1qH56JpmZSzEL53jKnNzScdmftJyG5xWg==", - "dev": true, - "dependencies": { - "@webassemblyjs/helper-numbers": "1.11.6", - "@webassemblyjs/helper-wasm-bytecode": "1.11.6" - } - }, - "node_modules/@webassemblyjs/floating-point-hex-parser": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.6.tgz", - "integrity": "sha512-ejAj9hfRJ2XMsNHk/v6Fu2dGS+i4UaXBXGemOfQ/JfQ6mdQg/WXtwleQRLLS4OvfDhv8rYnVwH27YJLMyYsxhw==", - "dev": true - }, - "node_modules/@webassemblyjs/helper-api-error": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.6.tgz", - "integrity": "sha512-o0YkoP4pVu4rN8aTJgAyj9hC2Sv5UlkzCHhxqWj8butaLvnpdc2jOwh4ewE6CX0txSfLn/UYaV/pheS2Txg//Q==", - "dev": true - }, - "node_modules/@webassemblyjs/helper-buffer": { - "version": "1.12.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.12.1.tgz", - "integrity": "sha512-nzJwQw99DNDKr9BVCOZcLuJJUlqkJh+kVzVl6Fmq/tI5ZtEyWT1KZMyOXltXLZJmDtvLCDgwsyrkohEtopTXCw==", - "dev": true - }, - "node_modules/@webassemblyjs/helper-numbers": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.6.tgz", - "integrity": "sha512-vUIhZ8LZoIWHBohiEObxVm6hwP034jwmc9kuq5GdHZH0wiLVLIPcMCdpJzG4C11cHoQ25TFIQj9kaVADVX7N3g==", - "dev": true, - "dependencies": { - "@webassemblyjs/floating-point-hex-parser": "1.11.6", - "@webassemblyjs/helper-api-error": "1.11.6", - "@xtuc/long": "4.2.2" - } - }, - "node_modules/@webassemblyjs/helper-wasm-bytecode": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.6.tgz", - "integrity": "sha512-sFFHKwcmBprO9e7Icf0+gddyWYDViL8bpPjJJl0WHxCdETktXdmtWLGVzoHbqUcY4Be1LkNfwTmXOJUFZYSJdA==", - "dev": true - }, - "node_modules/@webassemblyjs/helper-wasm-section": { - "version": "1.12.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.12.1.tgz", - "integrity": "sha512-Jif4vfB6FJlUlSbgEMHUyk1j234GTNG9dBJ4XJdOySoj518Xj0oGsNi59cUQF4RRMS9ouBUxDDdyBVfPTypa5g==", - "dev": true, - "dependencies": { - "@webassemblyjs/ast": "1.12.1", - "@webassemblyjs/helper-buffer": "1.12.1", - "@webassemblyjs/helper-wasm-bytecode": "1.11.6", - "@webassemblyjs/wasm-gen": "1.12.1" - } - }, - "node_modules/@webassemblyjs/ieee754": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.11.6.tgz", - "integrity": "sha512-LM4p2csPNvbij6U1f19v6WR56QZ8JcHg3QIJTlSwzFcmx6WSORicYj6I63f9yU1kEUtrpG+kjkiIAkevHpDXrg==", - "dev": true, - "dependencies": { - "@xtuc/ieee754": "^1.2.0" - } - }, - "node_modules/@webassemblyjs/leb128": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.11.6.tgz", - "integrity": "sha512-m7a0FhE67DQXgouf1tbN5XQcdWoNgaAuoULHIfGFIEVKA6tu/edls6XnIlkmS6FrXAquJRPni3ZZKjw6FSPjPQ==", - "dev": true, - "dependencies": { - "@xtuc/long": "4.2.2" - } - }, - "node_modules/@webassemblyjs/utf8": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.11.6.tgz", - "integrity": "sha512-vtXf2wTQ3+up9Zsg8sa2yWiQpzSsMyXj0qViVP6xKGCUT8p8YJ6HqI7l5eCnWx1T/FYdsv07HQs2wTFbbof/RA==", - "dev": true - }, - "node_modules/@webassemblyjs/wasm-edit": { - "version": "1.12.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.12.1.tgz", - "integrity": "sha512-1DuwbVvADvS5mGnXbE+c9NfA8QRcZ6iKquqjjmR10k6o+zzsRVesil54DKexiowcFCPdr/Q0qaMgB01+SQ1u6g==", - "dev": true, - "dependencies": { - "@webassemblyjs/ast": "1.12.1", - "@webassemblyjs/helper-buffer": "1.12.1", - "@webassemblyjs/helper-wasm-bytecode": "1.11.6", - "@webassemblyjs/helper-wasm-section": "1.12.1", - "@webassemblyjs/wasm-gen": "1.12.1", - "@webassemblyjs/wasm-opt": "1.12.1", - "@webassemblyjs/wasm-parser": "1.12.1", - "@webassemblyjs/wast-printer": "1.12.1" - } - }, - "node_modules/@webassemblyjs/wasm-gen": { - "version": "1.12.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.12.1.tgz", - "integrity": "sha512-TDq4Ojh9fcohAw6OIMXqiIcTq5KUXTGRkVxbSo1hQnSy6lAM5GSdfwWeSxpAo0YzgsgF182E/U0mDNhuA0tW7w==", - "dev": true, - "dependencies": { - "@webassemblyjs/ast": "1.12.1", - "@webassemblyjs/helper-wasm-bytecode": "1.11.6", - "@webassemblyjs/ieee754": "1.11.6", - "@webassemblyjs/leb128": "1.11.6", - "@webassemblyjs/utf8": "1.11.6" - } - }, - "node_modules/@webassemblyjs/wasm-opt": { - "version": "1.12.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.12.1.tgz", - "integrity": "sha512-Jg99j/2gG2iaz3hijw857AVYekZe2SAskcqlWIZXjji5WStnOpVoat3gQfT/Q5tb2djnCjBtMocY/Su1GfxPBg==", - "dev": true, - "dependencies": { - "@webassemblyjs/ast": "1.12.1", - "@webassemblyjs/helper-buffer": "1.12.1", - "@webassemblyjs/wasm-gen": "1.12.1", - "@webassemblyjs/wasm-parser": "1.12.1" - } - }, - "node_modules/@webassemblyjs/wasm-parser": { - "version": "1.12.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.12.1.tgz", - "integrity": "sha512-xikIi7c2FHXysxXe3COrVUPSheuBtpcfhbpFj4gmu7KRLYOzANztwUU0IbsqvMqzuNK2+glRGWCEqZo1WCLyAQ==", - "dev": true, - "dependencies": { - "@webassemblyjs/ast": "1.12.1", - "@webassemblyjs/helper-api-error": "1.11.6", - "@webassemblyjs/helper-wasm-bytecode": "1.11.6", - "@webassemblyjs/ieee754": "1.11.6", - "@webassemblyjs/leb128": "1.11.6", - "@webassemblyjs/utf8": "1.11.6" - } - }, - "node_modules/@webassemblyjs/wast-printer": { - "version": "1.12.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.12.1.tgz", - "integrity": "sha512-+X4WAlOisVWQMikjbcvY2e0rwPsKQ9F688lksZhBcPycBBuii3O7m8FACbDMWDojpAqvjIncrG8J0XHKyQfVeA==", - "dev": true, - "dependencies": { - "@webassemblyjs/ast": "1.12.1", - "@xtuc/long": "4.2.2" - } - }, - "node_modules/@xtuc/ieee754": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", - "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==", - "dev": true - }, - "node_modules/@xtuc/long": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz", - "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==", - "dev": true - }, - "node_modules/@yarnpkg/lockfile": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@yarnpkg/lockfile/-/lockfile-1.1.0.tgz", - "integrity": "sha512-GpSwvyXOcOOlV70vbnzjj4fW5xW/FdUF6nQEt1ENy7m4ZCczi1+/buVUPAqmGfqznsORNFzUMjctTIp8a9tuCQ==", - "dev": true - }, - "node_modules/abab": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.6.tgz", - "integrity": "sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA==", - "deprecated": "Use your platform's native atob() and btoa() methods instead", - "dev": true - }, - "node_modules/abbrev": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-2.0.0.tgz", - "integrity": "sha512-6/mh1E2u2YgEsCHdY0Yx5oW+61gZU+1vXaoiHHrpKeuRNNgFvS+/jrwHiQhB5apAf5oB7UB7E19ol2R2LKH8hQ==", - "dev": true, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/accepts": { - "version": "1.3.8", - "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", - "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", - "dev": true, - "dependencies": { - "mime-types": "~2.1.34", - "negotiator": "0.6.3" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/acorn": { - "version": "8.12.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.12.1.tgz", - "integrity": "sha512-tcpGyI9zbizT9JbV6oYE477V6mTlXvvi0T0G3SNIYE2apm/G5huBa1+K89VGeovbg+jycCrfhl3ADxErOuO6Jg==", - "dev": true, - "bin": { - "acorn": "bin/acorn" - }, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/acorn-import-attributes": { - "version": "1.9.5", - "resolved": "https://registry.npmjs.org/acorn-import-attributes/-/acorn-import-attributes-1.9.5.tgz", - "integrity": "sha512-n02Vykv5uA3eHGM/Z2dQrcD56kL8TyDb2p1+0P83PClMnC/nc+anbQRhIOWnSq4Ke/KvDPrY3C9hDtC/A3eHnQ==", - "dev": true, - "peerDependencies": { - "acorn": "^8" - } - }, - "node_modules/acorn-jsx": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", - "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", - "dev": true, - "peerDependencies": { - "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" - } - }, - "node_modules/acorn-walk": { - "version": "8.3.4", - "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.4.tgz", - "integrity": "sha512-ueEepnujpqee2o5aIYnvHU6C0A42MNdsIDeqy5BydrkuC5R1ZuUFnm27EeFJGoEHJQgn3uleRvmTXaJgfXbt4g==", - "dev": true, - "dependencies": { - "acorn": "^8.11.0" - }, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/adjust-sourcemap-loader": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/adjust-sourcemap-loader/-/adjust-sourcemap-loader-4.0.0.tgz", - "integrity": "sha512-OXwN5b9pCUXNQHJpwwD2qP40byEmSgzj8B4ydSN0uMNYWiFmJ6x6KwUllMmfk8Rwu/HJDFR7U8ubsWBoN0Xp0A==", - "dev": true, - "dependencies": { - "loader-utils": "^2.0.0", - "regex-parser": "^2.2.11" - }, - "engines": { - "node": ">=8.9" - } - }, - "node_modules/adjust-sourcemap-loader/node_modules/loader-utils": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.4.tgz", - "integrity": "sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw==", - "dev": true, - "dependencies": { - "big.js": "^5.2.2", - "emojis-list": "^3.0.0", - "json5": "^2.1.2" - }, - "engines": { - "node": ">=8.9.0" - } - }, - "node_modules/agent-base": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.1.tgz", - "integrity": "sha512-H0TSyFNDMomMNJQBn8wFV5YC/2eJ+VXECwOadZJT554xP6cODZHPX3H9QMQECxvrgiSOP1pHjy1sMWQVYJOUOA==", - "dev": true, - "dependencies": { - "debug": "^4.3.4" - }, - "engines": { - "node": ">= 14" - } - }, - "node_modules/aggregate-error": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", - "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", - "dev": true, - "dependencies": { - "clean-stack": "^2.0.0", - "indent-string": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/ajv": { - "version": "8.17.1", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", - "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", - "dev": true, - "dependencies": { - "fast-deep-equal": "^3.1.3", - "fast-uri": "^3.0.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/ajv-formats": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-3.0.1.tgz", - "integrity": "sha512-8iUql50EUR+uUcdRQ3HDqa6EVyo3docL8g5WJ3FNcWmu62IbkGUue/pEyLBW8VGKKucTPgqeks4fIU1DA4yowQ==", - "dev": true, - "dependencies": { - "ajv": "^8.0.0" - }, - "peerDependencies": { - "ajv": "^8.0.0" - }, - "peerDependenciesMeta": { - "ajv": { - "optional": true - } - } - }, - "node_modules/ajv-keywords": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", - "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", - "dev": true, - "dependencies": { - "fast-deep-equal": "^3.1.3" - }, - "peerDependencies": { - "ajv": "^8.8.2" - } - }, - "node_modules/angular-eslint": { - "version": "18.3.1", - "resolved": "https://registry.npmjs.org/angular-eslint/-/angular-eslint-18.3.1.tgz", - "integrity": "sha512-p3/1DfH8TpsMHUDMLECn6/1uPcHjd7/0tL8prXZuO93mZFV4Y+P9MBwLheA14tw8UXbnKWXW8SZz9hov6PaLRw==", - "dev": true, - "dependencies": { - "@angular-eslint/builder": "18.3.1", - "@angular-eslint/eslint-plugin": "18.3.1", - "@angular-eslint/eslint-plugin-template": "18.3.1", - "@angular-eslint/schematics": "18.3.1", - "@angular-eslint/template-parser": "18.3.1" - }, - "peerDependencies": { - "eslint": "^8.57.0 || ^9.0.0", - "typescript": "*", - "typescript-eslint": "^8.0.0" - } - }, - "node_modules/ansi-colors": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.3.tgz", - "integrity": "sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/ansi-escapes": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", - "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", - "dev": true, - "dependencies": { - "type-fest": "^0.21.3" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/ansi-html-community": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/ansi-html-community/-/ansi-html-community-0.0.8.tgz", - "integrity": "sha512-1APHAyr3+PCamwNw3bXCPp4HFLONZt/yIH0sZp0/469KWNTEy+qN5jQ3GVX6DMZ1UXAi34yVwtTeaG/HpBuuzw==", - "dev": true, - "engines": [ - "node >= 0.8.0" - ], - "bin": { - "ansi-html": "bin/ansi-html" - } - }, - "node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "dependencies": { - "color-convert": "^1.9.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/anymatch": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", - "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", - "dev": true, - "dependencies": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/anymatch/node_modules/picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", - "dev": true, - "engines": { - "node": ">=8.6" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/argparse": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", - "dev": true - }, - "node_modules/aria-query": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.3.0.tgz", - "integrity": "sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A==", - "dev": true, - "dependencies": { - "dequal": "^2.0.3" - } - }, - "node_modules/array-flatten": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", - "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==", - "dev": true - }, - "node_modules/assertion-error": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.1.0.tgz", - "integrity": "sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==", - "dev": true, - "engines": { - "node": "*" - } - }, - "node_modules/ast-types": { - "version": "0.16.1", - "resolved": "https://registry.npmjs.org/ast-types/-/ast-types-0.16.1.tgz", - "integrity": "sha512-6t10qk83GOG8p0vKmaCr8eiilZwO171AvbROMtvvNiwrTly62t+7XkA8RdIIVbpMhCASAsxgAzdRSwh6nw/5Dg==", - "dev": true, - "dependencies": { - "tslib": "^2.0.1" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/asynckit": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", - "dev": true - }, - "node_modules/autoprefixer": { - "version": "10.4.20", - "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.20.tgz", - "integrity": "sha512-XY25y5xSv/wEoqzDyXXME4AFfkZI0P23z6Fs3YgymDnKJkCGOnkL0iTxCa85UTqaSgfcqyf3UA6+c7wUvx/16g==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/autoprefixer" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "dependencies": { - "browserslist": "^4.23.3", - "caniuse-lite": "^1.0.30001646", - "fraction.js": "^4.3.7", - "normalize-range": "^0.1.2", - "picocolors": "^1.0.1", - "postcss-value-parser": "^4.2.0" - }, - "bin": { - "autoprefixer": "bin/autoprefixer" - }, - "engines": { - "node": "^10 || ^12 || >=14" - }, - "peerDependencies": { - "postcss": "^8.1.0" - } - }, - "node_modules/available-typed-arrays": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz", - "integrity": "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==", - "dev": true, - "dependencies": { - "possible-typed-array-names": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/axobject-query": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-4.1.0.tgz", - "integrity": "sha512-qIj0G9wZbMGNLjLmg1PT6v2mE9AH2zlnADJD/2tC6E00hgmhUOfEB6greHPAfLRSufHqROIUTkw6E+M3lH0PTQ==", - "dev": true, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/babel-loader": { - "version": "9.1.3", - "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-9.1.3.tgz", - "integrity": "sha512-xG3ST4DglodGf8qSwv0MdeWLhrDsw/32QMdTO5T1ZIp9gQur0HkCyFs7Awskr10JKXFXwpAhiCuYX5oGXnRGbw==", - "dev": true, - "dependencies": { - "find-cache-dir": "^4.0.0", - "schema-utils": "^4.0.0" - }, - "engines": { - "node": ">= 14.15.0" - }, - "peerDependencies": { - "@babel/core": "^7.12.0", - "webpack": ">=5" - } - }, - "node_modules/babel-plugin-polyfill-corejs2": { - "version": "0.4.11", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.11.tgz", - "integrity": "sha512-sMEJ27L0gRHShOh5G54uAAPaiCOygY/5ratXuiyb2G46FmlSpc9eFCzYVyDiPxfNbwzA7mYahmjQc5q+CZQ09Q==", - "dev": true, - "dependencies": { - "@babel/compat-data": "^7.22.6", - "@babel/helper-define-polyfill-provider": "^0.6.2", - "semver": "^6.3.1" - }, - "peerDependencies": { - "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" - } - }, - "node_modules/babel-plugin-polyfill-corejs2/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true, - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/babel-plugin-polyfill-corejs3": { - "version": "0.10.6", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.10.6.tgz", - "integrity": "sha512-b37+KR2i/khY5sKmWNVQAnitvquQbNdWy6lJdsr0kmquCKEEUgMKK4SboVM3HtfnZilfjr4MMQ7vY58FVWDtIA==", - "dev": true, - "dependencies": { - "@babel/helper-define-polyfill-provider": "^0.6.2", - "core-js-compat": "^3.38.0" - }, - "peerDependencies": { - "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" - } - }, - "node_modules/babel-plugin-polyfill-regenerator": { - "version": "0.6.2", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.6.2.tgz", - "integrity": "sha512-2R25rQZWP63nGwaAswvDazbPXfrM3HwVoBXK6HcqeKrSrL/JqcC/rDcf95l4r7LXLyxDXc8uQDa064GubtCABg==", - "dev": true, - "dependencies": { - "@babel/helper-define-polyfill-provider": "^0.6.2" - }, - "peerDependencies": { - "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" - } - }, - "node_modules/balanced-match": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", - "dev": true - }, - "node_modules/base64-js": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", - "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, - "node_modules/base64id": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/base64id/-/base64id-2.0.0.tgz", - "integrity": "sha512-lGe34o6EHj9y3Kts9R4ZYs/Gr+6N7MCaMlIFA3F1R2O5/m7K06AxfSeO5530PEERE6/WyEg3lsuyw4GHlPZHog==", - "dev": true, - "optional": true, - "peer": true, - "engines": { - "node": "^4.5.0 || >= 5.9" - } - }, - "node_modules/batch": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/batch/-/batch-0.6.1.tgz", - "integrity": "sha512-x+VAiMRL6UPkx+kudNvxTl6hB2XNNCG2r+7wixVfIYwu/2HKRXimwQyaumLjMveWvT2Hkd/cAJw+QBMfJ/EKVw==", - "dev": true - }, - "node_modules/better-opn": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/better-opn/-/better-opn-3.0.2.tgz", - "integrity": "sha512-aVNobHnJqLiUelTaHat9DZ1qM2w0C0Eym4LPI/3JxOnSokGVdsl1T1kN7TFvsEAD8G47A6VKQ0TVHqbBnYMJlQ==", - "dev": true, - "dependencies": { - "open": "^8.0.4" - }, - "engines": { - "node": ">=12.0.0" - } - }, - "node_modules/better-opn/node_modules/define-lazy-prop": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz", - "integrity": "sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/better-opn/node_modules/is-docker": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", - "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==", - "dev": true, - "bin": { - "is-docker": "cli.js" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/better-opn/node_modules/is-wsl": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", - "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", - "dev": true, - "dependencies": { - "is-docker": "^2.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/better-opn/node_modules/open": { - "version": "8.4.2", - "resolved": "https://registry.npmjs.org/open/-/open-8.4.2.tgz", - "integrity": "sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==", - "dev": true, - "dependencies": { - "define-lazy-prop": "^2.0.0", - "is-docker": "^2.1.1", - "is-wsl": "^2.2.0" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/big.js": { - "version": "5.2.2", - "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", - "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==", - "dev": true, - "engines": { - "node": "*" - } - }, - "node_modules/binary-extensions": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz", - "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==", - "dev": true, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/bl": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", - "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", - "dev": true, - "dependencies": { - "buffer": "^5.5.0", - "inherits": "^2.0.4", - "readable-stream": "^3.4.0" - } - }, - "node_modules/body-parser": { - "version": "1.20.3", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.3.tgz", - "integrity": "sha512-7rAxByjUMqQ3/bHJy7D6OGXvx/MMc4IqBn/X0fcM1QUcAItpZrBEYhWGem+tzXH90c+G01ypMcYJBO9Y30203g==", - "dev": true, - "dependencies": { - "bytes": "3.1.2", - "content-type": "~1.0.5", - "debug": "2.6.9", - "depd": "2.0.0", - "destroy": "1.2.0", - "http-errors": "2.0.0", - "iconv-lite": "0.4.24", - "on-finished": "2.4.1", - "qs": "6.13.0", - "raw-body": "2.5.2", - "type-is": "~1.6.18", - "unpipe": "1.0.0" - }, - "engines": { - "node": ">= 0.8", - "npm": "1.2.8000 || >= 1.4.16" - } - }, - "node_modules/body-parser/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/body-parser/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "dev": true - }, - "node_modules/bonjour-service": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/bonjour-service/-/bonjour-service-1.2.1.tgz", - "integrity": "sha512-oSzCS2zV14bh2kji6vNe7vrpJYCHGvcZnlffFQ1MEoX/WOeQ/teD8SYWKR942OI3INjq8OMNJlbPK5LLLUxFDw==", - "dev": true, - "dependencies": { - "fast-deep-equal": "^3.1.3", - "multicast-dns": "^7.2.5" - } - }, - "node_modules/boolbase": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", - "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==", - "dev": true - }, - "node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/braces": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", - "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", - "dev": true, - "dependencies": { - "fill-range": "^7.1.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/browser-assert": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/browser-assert/-/browser-assert-1.2.1.tgz", - "integrity": "sha512-nfulgvOR6S4gt9UKCeGJOuSGBPGiFT6oQ/2UBnvTY/5aQ1PnksW72fhZkM30DzoRRv2WpwZf1vHHEr3mtuXIWQ==", - "dev": true - }, - "node_modules/browserslist": { - "version": "4.23.3", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.23.3.tgz", - "integrity": "sha512-btwCFJVjI4YWDNfau8RhZ+B1Q/VLoUITrm3RlP6y1tYGWIOa+InuYiRGXUBXo8nA1qKmHMyLB/iVQg5TT4eFoA==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/browserslist" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "dependencies": { - "caniuse-lite": "^1.0.30001646", - "electron-to-chromium": "^1.5.4", - "node-releases": "^2.0.18", - "update-browserslist-db": "^1.1.0" - }, - "bin": { - "browserslist": "cli.js" - }, - "engines": { - "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" - } - }, - "node_modules/buffer": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", - "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "dependencies": { - "base64-js": "^1.3.1", - "ieee754": "^1.1.13" - } - }, - "node_modules/buffer-from": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", - "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", - "dev": true - }, - "node_modules/bundle-name": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/bundle-name/-/bundle-name-4.1.0.tgz", - "integrity": "sha512-tjwM5exMg6BGRI+kNmTntNsvdZS1X8BFYS6tnJ2hdH0kVxM6/eVZ2xy+FqStSWvYmtfFMDLIxurorHwDKfDz5Q==", - "dev": true, - "dependencies": { - "run-applescript": "^7.0.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/bytes": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", - "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", - "dev": true, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/cac": { - "version": "6.7.14", - "resolved": "https://registry.npmjs.org/cac/-/cac-6.7.14.tgz", - "integrity": "sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/cacache": { - "version": "18.0.4", - "resolved": "https://registry.npmjs.org/cacache/-/cacache-18.0.4.tgz", - "integrity": "sha512-B+L5iIa9mgcjLbliir2th36yEwPftrzteHYujzsx3dFP/31GCHcIeS8f5MGd80odLOjaOvSpU3EEAmRQptkxLQ==", - "dev": true, - "dependencies": { - "@npmcli/fs": "^3.1.0", - "fs-minipass": "^3.0.0", - "glob": "^10.2.2", - "lru-cache": "^10.0.1", - "minipass": "^7.0.3", - "minipass-collect": "^2.0.1", - "minipass-flush": "^1.0.5", - "minipass-pipeline": "^1.2.4", - "p-map": "^4.0.0", - "ssri": "^10.0.0", - "tar": "^6.1.11", - "unique-filename": "^3.0.0" - }, - "engines": { - "node": "^16.14.0 || >=18.0.0" - } - }, - "node_modules/cacache/node_modules/brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "dev": true, - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/cacache/node_modules/glob": { - "version": "10.4.5", - "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz", - "integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==", - "dev": true, - "dependencies": { - "foreground-child": "^3.1.0", - "jackspeak": "^3.1.2", - "minimatch": "^9.0.4", - "minipass": "^7.1.2", - "package-json-from-dist": "^1.0.0", - "path-scurry": "^1.11.1" - }, - "bin": { - "glob": "dist/esm/bin.mjs" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/cacache/node_modules/lru-cache": { - "version": "10.4.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", - "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", - "dev": true - }, - "node_modules/cacache/node_modules/minimatch": { - "version": "9.0.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", - "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", - "dev": true, - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/call-bind": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.7.tgz", - "integrity": "sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==", - "dev": true, - "dependencies": { - "es-define-property": "^1.0.0", - "es-errors": "^1.3.0", - "function-bind": "^1.1.2", - "get-intrinsic": "^1.2.4", - "set-function-length": "^1.2.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/callsites": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/camel-case": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-4.1.2.tgz", - "integrity": "sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw==", - "dev": true, - "dependencies": { - "pascal-case": "^3.1.2", - "tslib": "^2.0.3" - } - }, - "node_modules/caniuse-lite": { - "version": "1.0.30001663", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001663.tgz", - "integrity": "sha512-o9C3X27GLKbLeTYZ6HBOLU1tsAcBZsLis28wrVzddShCS16RujjHp9GDHKZqrB3meE0YjhawvMFsGb/igqiPzA==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/caniuse-lite" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ] - }, - "node_modules/case-sensitive-paths-webpack-plugin": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/case-sensitive-paths-webpack-plugin/-/case-sensitive-paths-webpack-plugin-2.4.0.tgz", - "integrity": "sha512-roIFONhcxog0JSSWbvVAh3OocukmSgpqOH6YpMkCvav/ySIV3JKg4Dc8vYtQjYi/UxpNE36r/9v+VqTQqgkYmw==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/chai": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/chai/-/chai-4.5.0.tgz", - "integrity": "sha512-RITGBfijLkBddZvnn8jdqoTypxvqbOLYQkGGxXzeFjVHvudaPw0HNFD9x928/eUwYWd2dPCugVqspGALTZZQKw==", - "dev": true, - "dependencies": { - "assertion-error": "^1.1.0", - "check-error": "^1.0.3", - "deep-eql": "^4.1.3", - "get-func-name": "^2.0.2", - "loupe": "^2.3.6", - "pathval": "^1.1.1", - "type-detect": "^4.1.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/chardet": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz", - "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==", - "dev": true - }, - "node_modules/check-error": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/check-error/-/check-error-1.0.3.tgz", - "integrity": "sha512-iKEoDYaRmd1mxM90a2OEfWhjsjPpYPuQ+lMYsoxB126+t8fw7ySEO48nmDg5COTjxDI65/Y2OWpeEHk3ZOe8zg==", - "dev": true, - "dependencies": { - "get-func-name": "^2.0.2" - }, - "engines": { - "node": "*" - } - }, - "node_modules/chokidar": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", - "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", - "dev": true, - "dependencies": { - "anymatch": "~3.1.2", - "braces": "~3.0.2", - "glob-parent": "~5.1.2", - "is-binary-path": "~2.1.0", - "is-glob": "~4.0.1", - "normalize-path": "~3.0.0", - "readdirp": "~3.6.0" - }, - "engines": { - "node": ">= 8.10.0" - }, - "funding": { - "url": "https://paulmillr.com/funding/" - }, - "optionalDependencies": { - "fsevents": "~2.3.2" - } - }, - "node_modules/chownr": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", - "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==", - "dev": true, - "engines": { - "node": ">=10" - } - }, - "node_modules/chrome-trace-event": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.4.tgz", - "integrity": "sha512-rNjApaLzuwaOTjCiT8lSDdGN1APCiqkChLMJxJPWLunPAt5fy8xgU9/jNOchV84wfIxrA0lRQB7oCT8jrn/wrQ==", - "dev": true, - "engines": { - "node": ">=6.0" - } - }, - "node_modules/cjs-module-lexer": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.4.1.tgz", - "integrity": "sha512-cuSVIHi9/9E/+821Qjdvngor+xpnlwnuwIyZOaLmHBVdXL+gP+I6QQB9VkO7RI77YIcTV+S1W9AreJ5eN63JBA==", - "dev": true - }, - "node_modules/clean-css": { - "version": "5.3.3", - "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-5.3.3.tgz", - "integrity": "sha512-D5J+kHaVb/wKSFcyyV75uCn8fiY4sV38XJoe4CUyGQ+mOU/fMVYUdH1hJC+CJQ5uY3EnW27SbJYS4X8BiLrAFg==", - "dev": true, - "dependencies": { - "source-map": "~0.6.0" - }, - "engines": { - "node": ">= 10.0" - } - }, - "node_modules/clean-css/node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/clean-stack": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", - "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/cli-cursor": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-5.0.0.tgz", - "integrity": "sha512-aCj4O5wKyszjMmDT4tZj93kxyydN/K5zPWSCe6/0AV/AA1pqe5ZBIw0a2ZfPQV7lL5/yb5HsUreJ6UFAF1tEQw==", - "dev": true, - "dependencies": { - "restore-cursor": "^5.0.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/cli-spinners": { - "version": "2.9.2", - "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.9.2.tgz", - "integrity": "sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg==", - "dev": true, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/cli-truncate": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-4.0.0.tgz", - "integrity": "sha512-nPdaFdQ0h/GEigbPClz11D0v/ZJEwxmeVZGeMo3Z5StPtUTkA9o1lD6QwoirYiSDzbcwn2XcjwmCp68W1IS4TA==", - "dev": true, - "dependencies": { - "slice-ansi": "^5.0.0", - "string-width": "^7.0.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/cli-width": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-4.1.0.tgz", - "integrity": "sha512-ouuZd4/dm2Sw5Gmqy6bGyNNNe1qt9RpmxveLSO7KcgsTnU7RXfsw+/bukWGo1abgBiMAic068rclZsO4IWmmxQ==", - "dev": true, - "engines": { - "node": ">= 12" - } - }, - "node_modules/cliui": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", - "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", - "dev": true, - "dependencies": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.1", - "wrap-ansi": "^7.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/cliui/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/cliui/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/cliui/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "node_modules/cliui/node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true - }, - "node_modules/cliui/node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/cliui/node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dev": true, - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/cliui/node_modules/wrap-ansi": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - } - }, - "node_modules/clone": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", - "integrity": "sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==", - "dev": true, - "engines": { - "node": ">=0.8" - } - }, - "node_modules/clone-deep": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-4.0.1.tgz", - "integrity": "sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==", - "dev": true, - "dependencies": { - "is-plain-object": "^2.0.4", - "kind-of": "^6.0.2", - "shallow-clone": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/code-block-writer": { - "version": "12.0.0", - "resolved": "https://registry.npmjs.org/code-block-writer/-/code-block-writer-12.0.0.tgz", - "integrity": "sha512-q4dMFMlXtKR3XNBHyMHt/3pwYNA69EDk00lloMOaaUMKPUXBw6lpXtbu3MMVG6/uOihGnRDOlkyqsONEUj60+w==", - "dev": true - }, - "node_modules/color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dev": true, - "dependencies": { - "color-name": "1.1.3" - } - }, - "node_modules/color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", - "dev": true - }, - "node_modules/colorette": { - "version": "2.0.20", - "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.20.tgz", - "integrity": "sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==", - "dev": true - }, - "node_modules/combined-stream": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", - "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", - "dev": true, - "dependencies": { - "delayed-stream": "~1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/commander": { - "version": "12.1.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-12.1.0.tgz", - "integrity": "sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA==", - "dev": true, - "engines": { - "node": ">=18" - } - }, - "node_modules/common-path-prefix": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/common-path-prefix/-/common-path-prefix-3.0.0.tgz", - "integrity": "sha512-QE33hToZseCH3jS0qN96O/bSh3kaw/h+Tq7ngyY9eWDUnTlTNUyqfqvCXioLe5Na5jFsL78ra/wuBU4iuEgd4w==", - "dev": true - }, - "node_modules/commondir": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", - "integrity": "sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==", - "dev": true - }, - "node_modules/compressible": { - "version": "2.0.18", - "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz", - "integrity": "sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==", - "dev": true, - "dependencies": { - "mime-db": ">= 1.43.0 < 2" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/compression": { - "version": "1.7.4", - "resolved": "https://registry.npmjs.org/compression/-/compression-1.7.4.tgz", - "integrity": "sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ==", - "dev": true, - "dependencies": { - "accepts": "~1.3.5", - "bytes": "3.0.0", - "compressible": "~2.0.16", - "debug": "2.6.9", - "on-headers": "~1.0.2", - "safe-buffer": "5.1.2", - "vary": "~1.1.2" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/compression/node_modules/bytes": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", - "integrity": "sha512-pMhOfFDPiv9t5jjIXkHosWmkSyQbvsgEVNkz0ERHbuLh2T/7j4Mqqpz523Fe8MVY89KC6Sh/QfS2sM+SjgFDcw==", - "dev": true, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/compression/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/compression/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "dev": true - }, - "node_modules/compression/node_modules/safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true - }, - "node_modules/concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", - "dev": true - }, - "node_modules/confbox": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/confbox/-/confbox-0.1.7.tgz", - "integrity": "sha512-uJcB/FKZtBMCJpK8MQji6bJHgu1tixKPxRLeGkNzBoOZzpnZUJm0jm2/sBDWcuBx1dYgxV4JU+g5hmNxCyAmdA==", - "dev": true - }, - "node_modules/connect": { - "version": "3.7.0", - "resolved": "https://registry.npmjs.org/connect/-/connect-3.7.0.tgz", - "integrity": "sha512-ZqRXc+tZukToSNmh5C2iWMSoV3X1YUcPbqEM4DkEG5tNQXrQUZCNVGGv3IuicnkMtPfGf3Xtp8WCXs295iQ1pQ==", - "dev": true, - "optional": true, - "peer": true, - "dependencies": { - "debug": "2.6.9", - "finalhandler": "1.1.2", - "parseurl": "~1.3.3", - "utils-merge": "1.0.1" - }, - "engines": { - "node": ">= 0.10.0" - } - }, - "node_modules/connect-history-api-fallback": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/connect-history-api-fallback/-/connect-history-api-fallback-2.0.0.tgz", - "integrity": "sha512-U73+6lQFmfiNPrYbXqr6kZ1i1wiRqXnp2nhMsINseWXO8lDau0LGEffJ8kQi4EjLZympVgRdvqjAgiZ1tgzDDA==", - "dev": true, - "engines": { - "node": ">=0.8" - } - }, - "node_modules/connect/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "optional": true, - "peer": true, - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/connect/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "dev": true, - "optional": true, - "peer": true - }, - "node_modules/constants-browserify": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/constants-browserify/-/constants-browserify-1.0.0.tgz", - "integrity": "sha512-xFxOwqIzR/e1k1gLiWEophSCMqXcwVHIH7akf7b/vxcUeGunlj3hvZaaqxwHsTgn+IndtkQJgSztIDWeumWJDQ==", - "dev": true - }, - "node_modules/content-disposition": { - "version": "0.5.4", - "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", - "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", - "dev": true, - "dependencies": { - "safe-buffer": "5.2.1" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/content-type": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", - "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", - "dev": true, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/convert-source-map": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", - "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==", - "dev": true - }, - "node_modules/cookie": { - "version": "0.4.2", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.2.tgz", - "integrity": "sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA==", - "dev": true, - "optional": true, - "peer": true, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/cookie-signature": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", - "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==", - "dev": true - }, - "node_modules/copy-anything": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/copy-anything/-/copy-anything-2.0.6.tgz", - "integrity": "sha512-1j20GZTsvKNkc4BY3NpMOM8tt///wY3FpIzozTOFO2ffuZcV61nojHXVKIy3WM+7ADCy5FVhdZYHYDdgTU0yJw==", - "dev": true, - "dependencies": { - "is-what": "^3.14.1" - }, - "funding": { - "url": "https://github.com/sponsors/mesqueeb" - } - }, - "node_modules/copy-webpack-plugin": { - "version": "12.0.2", - "resolved": "https://registry.npmjs.org/copy-webpack-plugin/-/copy-webpack-plugin-12.0.2.tgz", - "integrity": "sha512-SNwdBeHyII+rWvee/bTnAYyO8vfVdcSTud4EIb6jcZ8inLeWucJE0DnxXQBjlQ5zlteuuvooGQy3LIyGxhvlOA==", - "dev": true, - "dependencies": { - "fast-glob": "^3.3.2", - "glob-parent": "^6.0.1", - "globby": "^14.0.0", - "normalize-path": "^3.0.0", - "schema-utils": "^4.2.0", - "serialize-javascript": "^6.0.2" - }, - "engines": { - "node": ">= 18.12.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "webpack": "^5.1.0" - } - }, - "node_modules/copy-webpack-plugin/node_modules/glob-parent": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", - "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", - "dev": true, - "dependencies": { - "is-glob": "^4.0.3" - }, - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/core-js-compat": { - "version": "3.38.1", - "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.38.1.tgz", - "integrity": "sha512-JRH6gfXxGmrzF3tZ57lFx97YARxCXPaMzPo6jELZhv88pBH5VXpQ+y0znKGlFnzuaihqhLbefxSJxWJMPtfDzw==", - "dev": true, - "dependencies": { - "browserslist": "^4.23.3" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/core-js" - } - }, - "node_modules/core-util-is": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", - "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==", - "dev": true - }, - "node_modules/cors": { - "version": "2.8.5", - "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz", - "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==", - "dev": true, - "optional": true, - "peer": true, - "dependencies": { - "object-assign": "^4", - "vary": "^1" - }, - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/cosmiconfig": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-9.0.0.tgz", - "integrity": "sha512-itvL5h8RETACmOTFc4UfIyB2RfEHi71Ax6E/PivVxq9NseKbOWpeyHEOIbmAw1rs8Ak0VursQNww7lf7YtUwzg==", - "dev": true, - "dependencies": { - "env-paths": "^2.2.1", - "import-fresh": "^3.3.0", - "js-yaml": "^4.1.0", - "parse-json": "^5.2.0" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/d-fischer" - }, - "peerDependencies": { - "typescript": ">=4.9.5" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/critters": { - "version": "0.0.24", - "resolved": "https://registry.npmjs.org/critters/-/critters-0.0.24.tgz", - "integrity": "sha512-Oyqew0FGM0wYUSNqR0L6AteO5MpMoUU0rhKRieXeiKs+PmRTxiJMyaunYB2KF6fQ3dzChXKCpbFOEJx3OQ1v/Q==", - "dev": true, - "dependencies": { - "chalk": "^4.1.0", - "css-select": "^5.1.0", - "dom-serializer": "^2.0.0", - "domhandler": "^5.0.2", - "htmlparser2": "^8.0.2", - "postcss": "^8.4.23", - "postcss-media-query-parser": "^0.2.3" - } - }, - "node_modules/critters/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/critters/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/critters/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/critters/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "node_modules/critters/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/critters/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/cross-spawn": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", - "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", - "dev": true, - "dependencies": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/cross-spawn/node_modules/which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "dev": true, - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "node-which": "bin/node-which" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/css-loader": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-7.1.2.tgz", - "integrity": "sha512-6WvYYn7l/XEGN8Xu2vWFt9nVzrCn39vKyTEFf/ExEyoksJjjSZV/0/35XPlMbpnr6VGhZIUg5yJrL8tGfes/FA==", - "dev": true, - "dependencies": { - "icss-utils": "^5.1.0", - "postcss": "^8.4.33", - "postcss-modules-extract-imports": "^3.1.0", - "postcss-modules-local-by-default": "^4.0.5", - "postcss-modules-scope": "^3.2.0", - "postcss-modules-values": "^4.0.0", - "postcss-value-parser": "^4.2.0", - "semver": "^7.5.4" - }, - "engines": { - "node": ">= 18.12.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "@rspack/core": "0.x || 1.x", - "webpack": "^5.27.0" - }, - "peerDependenciesMeta": { - "@rspack/core": { - "optional": true - }, - "webpack": { - "optional": true - } - } - }, - "node_modules/css-select": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/css-select/-/css-select-5.1.0.tgz", - "integrity": "sha512-nwoRF1rvRRnnCqqY7updORDsuqKzqYJ28+oSMaJMMgOauh3fvwHqMS7EZpIPqK8GL+g9mKxF1vP/ZjSeNjEVHg==", - "dev": true, - "dependencies": { - "boolbase": "^1.0.0", - "css-what": "^6.1.0", - "domhandler": "^5.0.2", - "domutils": "^3.0.1", - "nth-check": "^2.0.1" - }, - "funding": { - "url": "https://github.com/sponsors/fb55" - } - }, - "node_modules/css-what": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.1.0.tgz", - "integrity": "sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==", - "dev": true, - "engines": { - "node": ">= 6" - }, - "funding": { - "url": "https://github.com/sponsors/fb55" - } - }, - "node_modules/cssesc": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", - "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", - "dev": true, - "bin": { - "cssesc": "bin/cssesc" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/cssstyle": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-3.0.0.tgz", - "integrity": "sha512-N4u2ABATi3Qplzf0hWbVCdjenim8F3ojEXpBDF5hBpjzW182MjNGLqfmQ0SkSPeQ+V86ZXgeH8aXj6kayd4jgg==", - "dev": true, - "dependencies": { - "rrweb-cssom": "^0.6.0" - }, - "engines": { - "node": ">=14" - } - }, - "node_modules/csstype": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz", - "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==", - "dev": true - }, - "node_modules/custom-event": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/custom-event/-/custom-event-1.0.1.tgz", - "integrity": "sha512-GAj5FOq0Hd+RsCGVJxZuKaIDXDf3h6GQoNEjFgbLLI/trgtavwUbSnZ5pVfg27DVCaWjIohryS0JFwIJyT2cMg==", - "dev": true, - "optional": true, - "peer": true - }, - "node_modules/data-urls": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-4.0.0.tgz", - "integrity": "sha512-/mMTei/JXPqvFqQtfyTowxmJVwr2PVAeCcDxyFf6LhoOu/09TX2OX3kb2wzi4DMXcfj4OItwDOnhl5oziPnT6g==", - "dev": true, - "dependencies": { - "abab": "^2.0.6", - "whatwg-mimetype": "^3.0.0", - "whatwg-url": "^12.0.0" - }, - "engines": { - "node": ">=14" - } - }, - "node_modules/date-format": { - "version": "4.0.14", - "resolved": "https://registry.npmjs.org/date-format/-/date-format-4.0.14.tgz", - "integrity": "sha512-39BOQLs9ZjKh0/patS9nrT8wc3ioX3/eA/zgbKNopnF2wCqJEoxywwwElATYvRsXdnOxA/OQeQoFZ3rFjVajhg==", - "dev": true, - "optional": true, - "peer": true, - "engines": { - "node": ">=4.0" - } - }, - "node_modules/debug": { - "version": "4.3.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.7.tgz", - "integrity": "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==", - "dev": true, - "dependencies": { - "ms": "^2.1.3" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/decimal.js": { - "version": "10.4.3", - "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.4.3.tgz", - "integrity": "sha512-VBBaLc1MgL5XpzgIP7ny5Z6Nx3UrRkIViUkPUdtl9aya5amy3De1gsUUSB1g3+3sExYNjCAsAznmukyxCb1GRA==", - "dev": true - }, - "node_modules/deep-eql": { - "version": "4.1.4", - "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-4.1.4.tgz", - "integrity": "sha512-SUwdGfqdKOwxCPeVYjwSyRpJ7Z+fhpwIAtmCUdZIWZ/YP5R9WAsyuSgpLVDi9bjWoN2LXHNss/dk3urXtdQxGg==", - "dev": true, - "dependencies": { - "type-detect": "^4.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/deep-is": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", - "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", - "dev": true - }, - "node_modules/deepmerge": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz", - "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/default-browser": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/default-browser/-/default-browser-5.2.1.tgz", - "integrity": "sha512-WY/3TUME0x3KPYdRRxEJJvXRHV4PyPoUsxtZa78lwItwRQRHhd2U9xOscaT/YTf8uCXIAjeJOFBVEh/7FtD8Xg==", - "dev": true, - "dependencies": { - "bundle-name": "^4.1.0", - "default-browser-id": "^5.0.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/default-browser-id": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/default-browser-id/-/default-browser-id-5.0.0.tgz", - "integrity": "sha512-A6p/pu/6fyBcA1TRz/GqWYPViplrftcW2gZC9q79ngNCKAeR/X3gcEdXQHl4KNXV+3wgIJ1CPkJQ3IHM6lcsyA==", - "dev": true, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/default-gateway": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/default-gateway/-/default-gateway-6.0.3.tgz", - "integrity": "sha512-fwSOJsbbNzZ/CUFpqFBqYfYNLj1NbMPm8MMCIzHjC83iSJRBEGmDUxU+WP661BaBQImeC2yHwXtz+P/O9o+XEg==", - "dev": true, - "dependencies": { - "execa": "^5.0.0" - }, - "engines": { - "node": ">= 10" - } - }, - "node_modules/defaults": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.4.tgz", - "integrity": "sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==", - "dev": true, - "dependencies": { - "clone": "^1.0.2" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/define-data-property": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", - "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", - "dev": true, - "dependencies": { - "es-define-property": "^1.0.0", - "es-errors": "^1.3.0", - "gopd": "^1.0.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/define-lazy-prop": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-3.0.0.tgz", - "integrity": "sha512-N+MeXYoqr3pOgn8xfyRPREN7gHakLYjhsHhWGT3fWAiL4IkAt0iDw14QiiEm2bE30c5XX5q0FtAA3CK5f9/BUg==", - "dev": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/delayed-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", - "dev": true, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/depd": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", - "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", - "dev": true, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/dependency-graph": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/dependency-graph/-/dependency-graph-1.0.0.tgz", - "integrity": "sha512-cW3gggJ28HZ/LExwxP2B++aiKxhJXMSIt9K48FOXQkm+vuG5gyatXnLsONRJdzO/7VfjDIiaOOa/bs4l464Lwg==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/dequal": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz", - "integrity": "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/destroy": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", - "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", - "dev": true, - "engines": { - "node": ">= 0.8", - "npm": "1.2.8000 || >= 1.4.16" - } - }, - "node_modules/detect-libc": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.3.tgz", - "integrity": "sha512-bwy0MGW55bG41VqxxypOsdSdGqLwXPI/focwgTYCFMbdUiBAxLg9CFzG08sz2aqzknwiX7Hkl0bQENjg8iLByw==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/detect-node": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.1.0.tgz", - "integrity": "sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==", - "dev": true - }, - "node_modules/di": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/di/-/di-0.0.1.tgz", - "integrity": "sha512-uJaamHkagcZtHPqCIHZxnFrXlunQXgBOsZSUOWwFw31QJCAbyTBoHMW75YOTur5ZNx8pIeAKgf6GWIgaqqiLhA==", - "dev": true, - "optional": true, - "peer": true - }, - "node_modules/diff-sequences": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-29.6.3.tgz", - "integrity": "sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==", - "dev": true, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/dns-packet": { - "version": "5.6.1", - "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-5.6.1.tgz", - "integrity": "sha512-l4gcSouhcgIKRvyy99RNVOgxXiicE+2jZoNmaNmZ6JXiGajBOJAesk1OBlJuM5k2c+eudGdLxDqXuPCKIj6kpw==", - "dev": true, - "dependencies": { - "@leichtgewicht/ip-codec": "^2.0.1" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/dom-converter": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/dom-converter/-/dom-converter-0.2.0.tgz", - "integrity": "sha512-gd3ypIPfOMr9h5jIKq8E3sHOTCjeirnl0WK5ZdS1AW0Odt0b1PaWaHdJ4Qk4klv+YB9aJBS7mESXjFoDQPu6DA==", - "dev": true, - "dependencies": { - "utila": "~0.4" - } - }, - "node_modules/dom-serialize": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/dom-serialize/-/dom-serialize-2.2.1.tgz", - "integrity": "sha512-Yra4DbvoW7/Z6LBN560ZwXMjoNOSAN2wRsKFGc4iBeso+mpIA6qj1vfdf9HpMaKAqG6wXTy+1SYEzmNpKXOSsQ==", - "dev": true, - "optional": true, - "peer": true, - "dependencies": { - "custom-event": "~1.0.0", - "ent": "~2.2.0", - "extend": "^3.0.0", - "void-elements": "^2.0.0" - } - }, - "node_modules/dom-serializer": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz", - "integrity": "sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==", - "dev": true, - "dependencies": { - "domelementtype": "^2.3.0", - "domhandler": "^5.0.2", - "entities": "^4.2.0" - }, - "funding": { - "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" - } - }, - "node_modules/domelementtype": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", - "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/fb55" - } - ] - }, - "node_modules/domexception": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/domexception/-/domexception-4.0.0.tgz", - "integrity": "sha512-A2is4PLG+eeSfoTMA95/s4pvAoSo2mKtiM5jlHkAVewmiO8ISFTFKZjH7UAM1Atli/OT/7JHOrJRJiMKUZKYBw==", - "deprecated": "Use your platform's native DOMException instead", - "dev": true, - "dependencies": { - "webidl-conversions": "^7.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/domhandler": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz", - "integrity": "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==", - "dev": true, - "dependencies": { - "domelementtype": "^2.3.0" - }, - "engines": { - "node": ">= 4" - }, - "funding": { - "url": "https://github.com/fb55/domhandler?sponsor=1" - } - }, - "node_modules/domutils": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.1.0.tgz", - "integrity": "sha512-H78uMmQtI2AhgDJjWeQmHwJJ2bLPD3GMmO7Zja/ZZh84wkm+4ut+IUnUdRa8uCGX88DiVx1j6FRe1XfxEgjEZA==", - "dev": true, - "dependencies": { - "dom-serializer": "^2.0.0", - "domelementtype": "^2.3.0", - "domhandler": "^5.0.3" - }, - "funding": { - "url": "https://github.com/fb55/domutils?sponsor=1" - } - }, - "node_modules/dot-case": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/dot-case/-/dot-case-3.0.4.tgz", - "integrity": "sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==", - "dev": true, - "dependencies": { - "no-case": "^3.0.4", - "tslib": "^2.0.3" - } - }, - "node_modules/eastasianwidth": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", - "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", - "dev": true - }, - "node_modules/ee-first": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", - "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==", - "dev": true - }, - "node_modules/electron-to-chromium": { - "version": "1.5.28", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.28.tgz", - "integrity": "sha512-VufdJl+rzaKZoYVUijN13QcXVF5dWPZANeFTLNy+OSpHdDL5ynXTF35+60RSBbaQYB1ae723lQXHCrf4pyLsMw==", - "dev": true - }, - "node_modules/emoji-regex": { - "version": "10.4.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.4.0.tgz", - "integrity": "sha512-EC+0oUMY1Rqm4O6LLrgjtYDvcVYTy7chDnM4Q7030tP4Kwj3u/pR6gP9ygnp2CJMK5Gq+9Q2oqmrFJAz01DXjw==", - "dev": true - }, - "node_modules/emojis-list": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz", - "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==", - "dev": true, - "engines": { - "node": ">= 4" - } - }, - "node_modules/encodeurl": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", - "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", - "dev": true, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/encoding": { - "version": "0.1.13", - "resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.13.tgz", - "integrity": "sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==", - "dev": true, - "optional": true, - "dependencies": { - "iconv-lite": "^0.6.2" - } - }, - "node_modules/encoding/node_modules/iconv-lite": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", - "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", - "dev": true, - "optional": true, - "dependencies": { - "safer-buffer": ">= 2.1.2 < 3.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/engine.io": { - "version": "6.6.1", - "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-6.6.1.tgz", - "integrity": "sha512-NEpDCw9hrvBW+hVEOK4T7v0jFJ++KgtPl4jKFwsZVfG1XhS0dCrSb3VMb9gPAd7VAdW52VT1EnaNiU2vM8C0og==", - "dev": true, - "optional": true, - "peer": true, - "dependencies": { - "@types/cookie": "^0.4.1", - "@types/cors": "^2.8.12", - "@types/node": ">=10.0.0", - "accepts": "~1.3.4", - "base64id": "2.0.0", - "cookie": "~0.4.1", - "cors": "~2.8.5", - "debug": "~4.3.1", - "engine.io-parser": "~5.2.1", - "ws": "~8.17.1" - }, - "engines": { - "node": ">=10.2.0" - } - }, - "node_modules/engine.io-parser": { - "version": "5.2.3", - "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-5.2.3.tgz", - "integrity": "sha512-HqD3yTBfnBxIrbnM1DoD6Pcq8NECnh8d4As1Qgh0z5Gg3jRRIqijury0CL3ghu/edArpUYiYqQiDUQBIs4np3Q==", - "dev": true, - "optional": true, - "peer": true, - "engines": { - "node": ">=10.0.0" - } - }, - "node_modules/enhanced-resolve": { - "version": "5.17.1", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.17.1.tgz", - "integrity": "sha512-LMHl3dXhTcfv8gM4kEzIUeTQ+7fpdA0l2tUf34BddXPkz2A5xJ5L/Pchd5BL6rdccM9QGvu0sWZzK1Z1t4wwyg==", - "dev": true, - "dependencies": { - "graceful-fs": "^4.2.4", - "tapable": "^2.2.0" - }, - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/ent": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/ent/-/ent-2.2.1.tgz", - "integrity": "sha512-QHuXVeZx9d+tIQAz/XztU0ZwZf2Agg9CcXcgE1rurqvdBeDBrpSwjl8/6XUqMg7tw2Y7uAdKb2sRv+bSEFqQ5A==", - "dev": true, - "optional": true, - "peer": true, - "dependencies": { - "punycode": "^1.4.1" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/entities": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", - "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", - "dev": true, - "engines": { - "node": ">=0.12" - }, - "funding": { - "url": "https://github.com/fb55/entities?sponsor=1" - } - }, - "node_modules/env-paths": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz", - "integrity": "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/environment": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/environment/-/environment-1.1.0.tgz", - "integrity": "sha512-xUtoPkMggbz0MPyPiIWr1Kp4aeWJjDZ6SMvURhimjdZgsRuDplF5/s9hcgGhyXMhs+6vpnuoiZ2kFiu3FMnS8Q==", - "dev": true, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/err-code": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/err-code/-/err-code-2.0.3.tgz", - "integrity": "sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA==", - "dev": true - }, - "node_modules/errno": { - "version": "0.1.8", - "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.8.tgz", - "integrity": "sha512-dJ6oBr5SQ1VSd9qkk7ByRgb/1SH4JZjCHSW/mr63/QcXO9zLVxvJ6Oy13nio03rxpSnVDDjFor75SjVeZWPW/A==", - "dev": true, - "optional": true, - "dependencies": { - "prr": "~1.0.1" - }, - "bin": { - "errno": "cli.js" - } - }, - "node_modules/error-ex": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", - "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", - "dev": true, - "dependencies": { - "is-arrayish": "^0.2.1" - } - }, - "node_modules/es-define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.0.tgz", - "integrity": "sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==", - "dev": true, - "dependencies": { - "get-intrinsic": "^1.2.4" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/es-errors": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", - "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", - "dev": true, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/es-module-lexer": { - "version": "1.5.4", - "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.5.4.tgz", - "integrity": "sha512-MVNK56NiMrOwitFB7cqDwq0CQutbw+0BvLshJSse0MUNU+y1FC3bUS/AQg7oUng+/wKrrki7JfmwtVHkVfPLlw==", - "dev": true - }, - "node_modules/esbuild": { - "version": "0.23.0", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.23.0.tgz", - "integrity": "sha512-1lvV17H2bMYda/WaFb2jLPeHU3zml2k4/yagNMG8Q/YtfMjCwEUZa2eXXMgZTVSL5q1n4H7sQ0X6CdJDqqeCFA==", - "dev": true, - "hasInstallScript": true, - "bin": { - "esbuild": "bin/esbuild" - }, - "engines": { - "node": ">=18" - }, - "optionalDependencies": { - "@esbuild/aix-ppc64": "0.23.0", - "@esbuild/android-arm": "0.23.0", - "@esbuild/android-arm64": "0.23.0", - "@esbuild/android-x64": "0.23.0", - "@esbuild/darwin-arm64": "0.23.0", - "@esbuild/darwin-x64": "0.23.0", - "@esbuild/freebsd-arm64": "0.23.0", - "@esbuild/freebsd-x64": "0.23.0", - "@esbuild/linux-arm": "0.23.0", - "@esbuild/linux-arm64": "0.23.0", - "@esbuild/linux-ia32": "0.23.0", - "@esbuild/linux-loong64": "0.23.0", - "@esbuild/linux-mips64el": "0.23.0", - "@esbuild/linux-ppc64": "0.23.0", - "@esbuild/linux-riscv64": "0.23.0", - "@esbuild/linux-s390x": "0.23.0", - "@esbuild/linux-x64": "0.23.0", - "@esbuild/netbsd-x64": "0.23.0", - "@esbuild/openbsd-arm64": "0.23.0", - "@esbuild/openbsd-x64": "0.23.0", - "@esbuild/sunos-x64": "0.23.0", - "@esbuild/win32-arm64": "0.23.0", - "@esbuild/win32-ia32": "0.23.0", - "@esbuild/win32-x64": "0.23.0" - } - }, - "node_modules/esbuild-register": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/esbuild-register/-/esbuild-register-3.6.0.tgz", - "integrity": "sha512-H2/S7Pm8a9CL1uhp9OvjwrBh5Pvx0H8qVOxNu8Wed9Y7qv56MPtq+GGM8RJpq6glYJn9Wspr8uw7l55uyinNeg==", - "dev": true, - "dependencies": { - "debug": "^4.3.4" - }, - "peerDependencies": { - "esbuild": ">=0.12 <1" - } - }, - "node_modules/esbuild-wasm": { - "version": "0.23.0", - "resolved": "https://registry.npmjs.org/esbuild-wasm/-/esbuild-wasm-0.23.0.tgz", - "integrity": "sha512-6jP8UmWy6R6TUUV8bMuC3ZyZ6lZKI56x0tkxyCIqWwRRJ/DgeQKneh/Oid5EoGoPFLrGNkz47ZEtWAYuiY/u9g==", - "dev": true, - "bin": { - "esbuild": "bin/esbuild" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/escalade": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", - "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/escape-html": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", - "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==", - "dev": true - }, - "node_modules/escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "dev": true, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/eslint": { - "version": "9.11.1", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.11.1.tgz", - "integrity": "sha512-MobhYKIoAO1s1e4VUrgx1l1Sk2JBR/Gqjjgw8+mfgoLE2xwsHur4gdfTxyTgShrhvdVFTaJSgMiQBl1jv/AWxg==", - "dev": true, - "dependencies": { - "@eslint-community/eslint-utils": "^4.2.0", - "@eslint-community/regexpp": "^4.11.0", - "@eslint/config-array": "^0.18.0", - "@eslint/core": "^0.6.0", - "@eslint/eslintrc": "^3.1.0", - "@eslint/js": "9.11.1", - "@eslint/plugin-kit": "^0.2.0", - "@humanwhocodes/module-importer": "^1.0.1", - "@humanwhocodes/retry": "^0.3.0", - "@nodelib/fs.walk": "^1.2.8", - "@types/estree": "^1.0.6", - "@types/json-schema": "^7.0.15", - "ajv": "^6.12.4", - "chalk": "^4.0.0", - "cross-spawn": "^7.0.2", - "debug": "^4.3.2", - "escape-string-regexp": "^4.0.0", - "eslint-scope": "^8.0.2", - "eslint-visitor-keys": "^4.0.0", - "espree": "^10.1.0", - "esquery": "^1.5.0", - "esutils": "^2.0.2", - "fast-deep-equal": "^3.1.3", - "file-entry-cache": "^8.0.0", - "find-up": "^5.0.0", - "glob-parent": "^6.0.2", - "ignore": "^5.2.0", - "imurmurhash": "^0.1.4", - "is-glob": "^4.0.0", - "is-path-inside": "^3.0.3", - "json-stable-stringify-without-jsonify": "^1.0.1", - "lodash.merge": "^4.6.2", - "minimatch": "^3.1.2", - "natural-compare": "^1.4.0", - "optionator": "^0.9.3", - "strip-ansi": "^6.0.1", - "text-table": "^0.2.0" - }, - "bin": { - "eslint": "bin/eslint.js" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "url": "https://eslint.org/donate" - }, - "peerDependencies": { - "jiti": "*" - }, - "peerDependenciesMeta": { - "jiti": { - "optional": true - } - } - }, - "node_modules/eslint-plugin-prettier": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-5.2.1.tgz", - "integrity": "sha512-gH3iR3g4JfF+yYPaJYkN7jEl9QbweL/YfkoRlNnuIEHEz1vHVlCmWOS+eGGiRuzHQXdJFCOTxRgvju9b8VUmrw==", - "dev": true, - "dependencies": { - "prettier-linter-helpers": "^1.0.0", - "synckit": "^0.9.1" - }, - "engines": { - "node": "^14.18.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint-plugin-prettier" - }, - "peerDependencies": { - "@types/eslint": ">=8.0.0", - "eslint": ">=8.0.0", - "eslint-config-prettier": "*", - "prettier": ">=3.0.0" - }, - "peerDependenciesMeta": { - "@types/eslint": { - "optional": true - }, - "eslint-config-prettier": { - "optional": true - } - } - }, - "node_modules/eslint-plugin-storybook": { - "version": "0.8.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-storybook/-/eslint-plugin-storybook-0.8.0.tgz", - "integrity": "sha512-CZeVO5EzmPY7qghO2t64oaFM+8FTaD4uzOEjHKp516exyTKo+skKAL9GI3QALS2BXhyALJjNtwbmr1XinGE8bA==", - "dev": true, - "dependencies": { - "@storybook/csf": "^0.0.1", - "@typescript-eslint/utils": "^5.62.0", - "requireindex": "^1.2.0", - "ts-dedent": "^2.2.0" - }, - "engines": { - "node": ">= 18" - }, - "peerDependencies": { - "eslint": ">=6" - } - }, - "node_modules/eslint-plugin-storybook/node_modules/@storybook/csf": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/@storybook/csf/-/csf-0.0.1.tgz", - "integrity": "sha512-USTLkZze5gkel8MYCujSRBVIrUQ3YPBrLOx7GNk/0wttvVtlzWXAq9eLbQ4p/NicGxP+3T7KPEMVV//g+yubpw==", - "dev": true, - "dependencies": { - "lodash": "^4.17.15" - } - }, - "node_modules/eslint-scope": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", - "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", - "dev": true, - "dependencies": { - "esrecurse": "^4.3.0", - "estraverse": "^4.1.1" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/eslint-visitor-keys": { - "version": "3.4.3", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", - "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", - "dev": true, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/eslint/node_modules/ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "dev": true, - "dependencies": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/eslint/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/eslint/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/eslint/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/eslint/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "node_modules/eslint/node_modules/escape-string-regexp": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", - "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/eslint/node_modules/eslint-scope": { - "version": "8.0.2", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-8.0.2.tgz", - "integrity": "sha512-6E4xmrTw5wtxnLA5wYL3WDfhZ/1bUBGOXV0zQvVRDOtrR8D0p6W7fs3JweNYhwRYeGvd/1CKX2se0/2s7Q/nJA==", - "dev": true, - "dependencies": { - "esrecurse": "^4.3.0", - "estraverse": "^5.2.0" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/eslint/node_modules/eslint-visitor-keys": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.0.0.tgz", - "integrity": "sha512-OtIRv/2GyiF6o/d8K7MYKKbXrOUBIK6SfkIRM4Z0dY3w+LiQ0vy3F57m0Z71bjbyeiWFiHJ8brqnmE6H6/jEuw==", - "dev": true, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/eslint/node_modules/estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "dev": true, - "engines": { - "node": ">=4.0" - } - }, - "node_modules/eslint/node_modules/find-up": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", - "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", - "dev": true, - "dependencies": { - "locate-path": "^6.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/eslint/node_modules/glob-parent": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", - "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", - "dev": true, - "dependencies": { - "is-glob": "^4.0.3" - }, - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/eslint/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/eslint/node_modules/json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true - }, - "node_modules/eslint/node_modules/locate-path": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", - "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", - "dev": true, - "dependencies": { - "p-locate": "^5.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/eslint/node_modules/p-limit": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", - "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", - "dev": true, - "dependencies": { - "yocto-queue": "^0.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/eslint/node_modules/p-locate": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", - "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", - "dev": true, - "dependencies": { - "p-limit": "^3.0.2" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/eslint/node_modules/path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/eslint/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/eslint/node_modules/yocto-queue": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", - "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/espree": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/espree/-/espree-10.1.0.tgz", - "integrity": "sha512-M1M6CpiE6ffoigIOWYO9UDP8TMUw9kqb21tf+08IgDYjCsOvCuDt4jQcZmoYxx+w7zlKw9/N0KXfto+I8/FrXA==", - "dev": true, - "dependencies": { - "acorn": "^8.12.0", - "acorn-jsx": "^5.3.2", - "eslint-visitor-keys": "^4.0.0" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/espree/node_modules/eslint-visitor-keys": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.0.0.tgz", - "integrity": "sha512-OtIRv/2GyiF6o/d8K7MYKKbXrOUBIK6SfkIRM4Z0dY3w+LiQ0vy3F57m0Z71bjbyeiWFiHJ8brqnmE6H6/jEuw==", - "dev": true, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/esprima": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", - "dev": true, - "bin": { - "esparse": "bin/esparse.js", - "esvalidate": "bin/esvalidate.js" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/esquery": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.6.0.tgz", - "integrity": "sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==", - "dev": true, - "dependencies": { - "estraverse": "^5.1.0" - }, - "engines": { - "node": ">=0.10" - } - }, - "node_modules/esquery/node_modules/estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "dev": true, - "engines": { - "node": ">=4.0" - } - }, - "node_modules/esrecurse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", - "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", - "dev": true, - "dependencies": { - "estraverse": "^5.2.0" - }, - "engines": { - "node": ">=4.0" - } - }, - "node_modules/esrecurse/node_modules/estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "dev": true, - "engines": { - "node": ">=4.0" - } - }, - "node_modules/estraverse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", - "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", - "dev": true, - "engines": { - "node": ">=4.0" - } - }, - "node_modules/estree-walker": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", - "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==", - "dev": true - }, - "node_modules/esutils": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", - "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/etag": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", - "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", - "dev": true, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/eventemitter3": { - "version": "4.0.7", - "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", - "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==", - "dev": true - }, - "node_modules/events": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", - "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", - "dev": true, - "engines": { - "node": ">=0.8.x" - } - }, - "node_modules/execa": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", - "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", - "dev": true, - "dependencies": { - "cross-spawn": "^7.0.3", - "get-stream": "^6.0.0", - "human-signals": "^2.1.0", - "is-stream": "^2.0.0", - "merge-stream": "^2.0.0", - "npm-run-path": "^4.0.1", - "onetime": "^5.1.2", - "signal-exit": "^3.0.3", - "strip-final-newline": "^2.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sindresorhus/execa?sponsor=1" - } - }, - "node_modules/execa/node_modules/onetime": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", - "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", - "dev": true, - "dependencies": { - "mimic-fn": "^2.1.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/execa/node_modules/signal-exit": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", - "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", - "dev": true - }, - "node_modules/exponential-backoff": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/exponential-backoff/-/exponential-backoff-3.1.1.tgz", - "integrity": "sha512-dX7e/LHVJ6W3DE1MHWi9S1EYzDESENfLrYohG2G++ovZrYOkm4Knwa0mc1cn84xJOR4KEU0WSchhLbd0UklbHw==", - "dev": true - }, - "node_modules/express": { - "version": "4.21.0", - "resolved": "https://registry.npmjs.org/express/-/express-4.21.0.tgz", - "integrity": "sha512-VqcNGcj/Id5ZT1LZ/cfihi3ttTn+NJmkli2eZADigjq29qTlWi/hAQ43t/VLPq8+UX06FCEx3ByOYet6ZFblng==", - "dev": true, - "dependencies": { - "accepts": "~1.3.8", - "array-flatten": "1.1.1", - "body-parser": "1.20.3", - "content-disposition": "0.5.4", - "content-type": "~1.0.4", - "cookie": "0.6.0", - "cookie-signature": "1.0.6", - "debug": "2.6.9", - "depd": "2.0.0", - "encodeurl": "~2.0.0", - "escape-html": "~1.0.3", - "etag": "~1.8.1", - "finalhandler": "1.3.1", - "fresh": "0.5.2", - "http-errors": "2.0.0", - "merge-descriptors": "1.0.3", - "methods": "~1.1.2", - "on-finished": "2.4.1", - "parseurl": "~1.3.3", - "path-to-regexp": "0.1.10", - "proxy-addr": "~2.0.7", - "qs": "6.13.0", - "range-parser": "~1.2.1", - "safe-buffer": "5.2.1", - "send": "0.19.0", - "serve-static": "1.16.2", - "setprototypeof": "1.2.0", - "statuses": "2.0.1", - "type-is": "~1.6.18", - "utils-merge": "1.0.1", - "vary": "~1.1.2" - }, - "engines": { - "node": ">= 0.10.0" - } - }, - "node_modules/express/node_modules/cookie": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.6.0.tgz", - "integrity": "sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw==", - "dev": true, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/express/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/express/node_modules/encodeurl": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz", - "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==", - "dev": true, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/express/node_modules/finalhandler": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.3.1.tgz", - "integrity": "sha512-6BN9trH7bp3qvnrRyzsBz+g3lZxTNZTbVO2EV1CS0WIcDbawYVdYvGflME/9QP0h0pYlCDBCTjYa9nZzMDpyxQ==", - "dev": true, - "dependencies": { - "debug": "2.6.9", - "encodeurl": "~2.0.0", - "escape-html": "~1.0.3", - "on-finished": "2.4.1", - "parseurl": "~1.3.3", - "statuses": "2.0.1", - "unpipe": "~1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/express/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "dev": true - }, - "node_modules/express/node_modules/statuses": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", - "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", - "dev": true, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/extend": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", - "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", - "dev": true, - "optional": true, - "peer": true - }, - "node_modules/external-editor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz", - "integrity": "sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==", - "dev": true, - "dependencies": { - "chardet": "^0.7.0", - "iconv-lite": "^0.4.24", - "tmp": "^0.0.33" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/fast-deep-equal": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", - "dev": true - }, - "node_modules/fast-diff": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/fast-diff/-/fast-diff-1.3.0.tgz", - "integrity": "sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw==", - "dev": true - }, - "node_modules/fast-glob": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz", - "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==", - "dev": true, - "dependencies": { - "@nodelib/fs.stat": "^2.0.2", - "@nodelib/fs.walk": "^1.2.3", - "glob-parent": "^5.1.2", - "merge2": "^1.3.0", - "micromatch": "^4.0.4" - }, - "engines": { - "node": ">=8.6.0" - } - }, - "node_modules/fast-json-stable-stringify": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", - "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", - "dev": true - }, - "node_modules/fast-levenshtein": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", - "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", - "dev": true - }, - "node_modules/fast-uri": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.0.1.tgz", - "integrity": "sha512-MWipKbbYiYI0UC7cl8m/i/IWTqfC8YXsqjzybjddLsFjStroQzsHXkc73JutMvBiXmOvapk+axIl79ig5t55Bw==", - "dev": true - }, - "node_modules/fastq": { - "version": "1.17.1", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.17.1.tgz", - "integrity": "sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==", - "dev": true, - "dependencies": { - "reusify": "^1.0.4" - } - }, - "node_modules/faye-websocket": { - "version": "0.11.4", - "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.4.tgz", - "integrity": "sha512-CzbClwlXAuiRQAlUyfqPgvPoNKTckTPGfwZV4ZdAhVcP2lh9KUxJg2b5GkE7XbjKQ3YJnQ9z6D9ntLAlB+tP8g==", - "dev": true, - "dependencies": { - "websocket-driver": ">=0.5.1" - }, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/fd-package-json": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/fd-package-json/-/fd-package-json-1.2.0.tgz", - "integrity": "sha512-45LSPmWf+gC5tdCQMNH4s9Sr00bIkiD9aN7dc5hqkrEw1geRYyDQS1v1oMHAW3ysfxfndqGsrDREHHjNNbKUfA==", - "dev": true, - "dependencies": { - "walk-up-path": "^3.0.1" - } - }, - "node_modules/file-entry-cache": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-8.0.0.tgz", - "integrity": "sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==", - "dev": true, - "dependencies": { - "flat-cache": "^4.0.0" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/fill-range": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", - "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", - "dev": true, - "dependencies": { - "to-regex-range": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/finalhandler": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz", - "integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==", - "dev": true, - "optional": true, - "peer": true, - "dependencies": { - "debug": "2.6.9", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "on-finished": "~2.3.0", - "parseurl": "~1.3.3", - "statuses": "~1.5.0", - "unpipe": "~1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/finalhandler/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "optional": true, - "peer": true, - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/finalhandler/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "dev": true, - "optional": true, - "peer": true - }, - "node_modules/finalhandler/node_modules/on-finished": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", - "integrity": "sha512-ikqdkGAAyf/X/gPhXGvfgAytDZtDbr+bkNUJ0N9h5MI/dmdgCs3l6hoHrcUv41sRKew3jIwrp4qQDXiK99Utww==", - "dev": true, - "optional": true, - "peer": true, - "dependencies": { - "ee-first": "1.1.1" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/find-cache-dir": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-4.0.0.tgz", - "integrity": "sha512-9ZonPT4ZAK4a+1pUPVPZJapbi7O5qbbJPdYw/NOQWZZbVLdDTYM3A4R9z/DpAM08IDaFGsvPgiGZ82WEwUDWjg==", - "dev": true, - "dependencies": { - "common-path-prefix": "^3.0.0", - "pkg-dir": "^7.0.0" - }, - "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/find-up": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-6.3.0.tgz", - "integrity": "sha512-v2ZsoEuVHYy8ZIlYqwPe/39Cy+cFDzp4dXPaxNvkEuouymu+2Jbz0PxpKarJHYJTmv2HWT3O382qY8l4jMWthw==", - "dev": true, - "dependencies": { - "locate-path": "^7.1.0", - "path-exists": "^5.0.0" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/flat": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz", - "integrity": "sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==", - "dev": true, - "bin": { - "flat": "cli.js" - } - }, - "node_modules/flat-cache": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-4.0.1.tgz", - "integrity": "sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==", - "dev": true, - "dependencies": { - "flatted": "^3.2.9", - "keyv": "^4.5.4" - }, - "engines": { - "node": ">=16" - } - }, - "node_modules/flatted": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.1.tgz", - "integrity": "sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==", - "dev": true - }, - "node_modules/follow-redirects": { - "version": "1.15.9", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.9.tgz", - "integrity": "sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ==", - "dev": true, - "funding": [ - { - "type": "individual", - "url": "https://github.com/sponsors/RubenVerborgh" - } - ], - "engines": { - "node": ">=4.0" - }, - "peerDependenciesMeta": { - "debug": { - "optional": true - } - } - }, - "node_modules/for-each": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", - "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==", - "dev": true, - "dependencies": { - "is-callable": "^1.1.3" - } - }, - "node_modules/foreground-child": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.0.tgz", - "integrity": "sha512-Ld2g8rrAyMYFXBhEqMz8ZAHBi4J4uS1i/CxGMDnjyFWddMXLVcDp051DZfu+t7+ab7Wv6SMqpWmyFIj5UbfFvg==", - "dev": true, - "dependencies": { - "cross-spawn": "^7.0.0", - "signal-exit": "^4.0.1" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/fork-ts-checker-webpack-plugin": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/fork-ts-checker-webpack-plugin/-/fork-ts-checker-webpack-plugin-8.0.0.tgz", - "integrity": "sha512-mX3qW3idpueT2klaQXBzrIM/pHw+T0B/V9KHEvNrqijTq9NFnMZU6oreVxDYcf33P8a5cW+67PjodNHthGnNVg==", - "dev": true, - "dependencies": { - "@babel/code-frame": "^7.16.7", - "chalk": "^4.1.2", - "chokidar": "^3.5.3", - "cosmiconfig": "^7.0.1", - "deepmerge": "^4.2.2", - "fs-extra": "^10.0.0", - "memfs": "^3.4.1", - "minimatch": "^3.0.4", - "node-abort-controller": "^3.0.1", - "schema-utils": "^3.1.1", - "semver": "^7.3.5", - "tapable": "^2.2.1" - }, - "engines": { - "node": ">=12.13.0", - "yarn": ">=1.0.0" - }, - "peerDependencies": { - "typescript": ">3.6.0", - "webpack": "^5.11.0" - } - }, - "node_modules/fork-ts-checker-webpack-plugin/node_modules/ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "dev": true, - "dependencies": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/fork-ts-checker-webpack-plugin/node_modules/ajv-keywords": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", - "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", - "dev": true, - "peerDependencies": { - "ajv": "^6.9.1" - } - }, - "node_modules/fork-ts-checker-webpack-plugin/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/fork-ts-checker-webpack-plugin/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/fork-ts-checker-webpack-plugin/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/fork-ts-checker-webpack-plugin/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "node_modules/fork-ts-checker-webpack-plugin/node_modules/cosmiconfig": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.1.0.tgz", - "integrity": "sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA==", - "dev": true, - "dependencies": { - "@types/parse-json": "^4.0.0", - "import-fresh": "^3.2.1", - "parse-json": "^5.0.0", - "path-type": "^4.0.0", - "yaml": "^1.10.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/fork-ts-checker-webpack-plugin/node_modules/fs-extra": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", - "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", - "dev": true, - "dependencies": { - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/fork-ts-checker-webpack-plugin/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/fork-ts-checker-webpack-plugin/node_modules/json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true - }, - "node_modules/fork-ts-checker-webpack-plugin/node_modules/jsonfile": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", - "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", - "dev": true, - "dependencies": { - "universalify": "^2.0.0" - }, - "optionalDependencies": { - "graceful-fs": "^4.1.6" - } - }, - "node_modules/fork-ts-checker-webpack-plugin/node_modules/memfs": { - "version": "3.5.3", - "resolved": "https://registry.npmjs.org/memfs/-/memfs-3.5.3.tgz", - "integrity": "sha512-UERzLsxzllchadvbPs5aolHh65ISpKpM+ccLbOJ8/vvpBKmAWf+la7dXFy7Mr0ySHbdHrFv5kGFCUHHe6GFEmw==", - "dev": true, - "dependencies": { - "fs-monkey": "^1.0.4" - }, - "engines": { - "node": ">= 4.0.0" - } - }, - "node_modules/fork-ts-checker-webpack-plugin/node_modules/path-type": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", - "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/fork-ts-checker-webpack-plugin/node_modules/schema-utils": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz", - "integrity": "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==", - "dev": true, - "dependencies": { - "@types/json-schema": "^7.0.8", - "ajv": "^6.12.5", - "ajv-keywords": "^3.5.2" - }, - "engines": { - "node": ">= 10.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - } - }, - "node_modules/fork-ts-checker-webpack-plugin/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/fork-ts-checker-webpack-plugin/node_modules/universalify": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", - "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", - "dev": true, - "engines": { - "node": ">= 10.0.0" - } - }, - "node_modules/form-data": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", - "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", - "dev": true, - "dependencies": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.8", - "mime-types": "^2.1.12" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/forwarded": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", - "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", - "dev": true, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/fraction.js": { - "version": "4.3.7", - "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.3.7.tgz", - "integrity": "sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew==", - "dev": true, - "engines": { - "node": "*" - }, - "funding": { - "type": "patreon", - "url": "https://github.com/sponsors/rawify" - } - }, - "node_modules/fresh": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", - "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", - "dev": true, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/fs-extra": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", - "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", - "dev": true, - "optional": true, - "peer": true, - "dependencies": { - "graceful-fs": "^4.2.0", - "jsonfile": "^4.0.0", - "universalify": "^0.1.0" - }, - "engines": { - "node": ">=6 <7 || >=8" - } - }, - "node_modules/fs-minipass": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-3.0.3.tgz", - "integrity": "sha512-XUBA9XClHbnJWSfBzjkm6RvPsyg3sryZt06BEQoXcF7EK/xpGaQYJgQKDJSUH5SGZ76Y7pFx1QBnXz09rU5Fbw==", - "dev": true, - "dependencies": { - "minipass": "^7.0.3" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/fs-monkey": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/fs-monkey/-/fs-monkey-1.0.6.tgz", - "integrity": "sha512-b1FMfwetIKymC0eioW7mTywihSQE4oLzQn1dB6rZB5fx/3NpNEdAWeCSMB+60/AeT0TCXsxzAlcYVEFCTAksWg==", - "dev": true - }, - "node_modules/fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", - "dev": true, - "optional": true, - "peer": true - }, - "node_modules/fsevents": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", - "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", - "dev": true, - "hasInstallScript": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^8.16.0 || ^10.6.0 || >=11.0.0" - } - }, - "node_modules/function-bind": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", - "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", - "dev": true, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/gensync": { - "version": "1.0.0-beta.2", - "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", - "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", - "dev": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/get-caller-file": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", - "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", - "dev": true, - "engines": { - "node": "6.* || 8.* || >= 10.*" - } - }, - "node_modules/get-east-asian-width": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/get-east-asian-width/-/get-east-asian-width-1.2.0.tgz", - "integrity": "sha512-2nk+7SIVb14QrgXFHcm84tD4bKQz0RxPuMT8Ag5KPOq7J5fEmAg0UbXdTOSHqNuHSU28k55qnceesxXRZGzKWA==", - "dev": true, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/get-func-name": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.2.tgz", - "integrity": "sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ==", - "dev": true, - "engines": { - "node": "*" - } - }, - "node_modules/get-intrinsic": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.4.tgz", - "integrity": "sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==", - "dev": true, - "dependencies": { - "es-errors": "^1.3.0", - "function-bind": "^1.1.2", - "has-proto": "^1.0.1", - "has-symbols": "^1.0.3", - "hasown": "^2.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/get-stream": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", - "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/github-slugger": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/github-slugger/-/github-slugger-2.0.0.tgz", - "integrity": "sha512-IaOQ9puYtjrkq7Y0Ygl9KDZnrf/aiUJYUpVf89y8kyaxbRG7Y1SrX/jaumrv81vc61+kiMempujsM3Yw7w5qcw==", - "dev": true - }, - "node_modules/glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "deprecated": "Glob versions prior to v9 are no longer supported", - "dev": true, - "optional": true, - "peer": true, - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dev": true, - "dependencies": { - "is-glob": "^4.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/glob-to-regexp": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz", - "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==", - "dev": true - }, - "node_modules/globals": { - "version": "11.12.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", - "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/globby": { - "version": "14.0.2", - "resolved": "https://registry.npmjs.org/globby/-/globby-14.0.2.tgz", - "integrity": "sha512-s3Fq41ZVh7vbbe2PN3nrW7yC7U7MFVc5c98/iTl9c2GawNMKx/J648KQRW6WKkuU8GIbbh2IXfIRQjOZnXcTnw==", - "dev": true, - "dependencies": { - "@sindresorhus/merge-streams": "^2.1.0", - "fast-glob": "^3.3.2", - "ignore": "^5.2.4", - "path-type": "^5.0.0", - "slash": "^5.1.0", - "unicorn-magic": "^0.1.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/globrex": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/globrex/-/globrex-0.1.2.tgz", - "integrity": "sha512-uHJgbwAMwNFf5mLst7IWLNg14x1CkeqglJb/K3doi4dw6q2IvAAmM/Y81kevy83wP+Sst+nutFTYOGg3d1lsxg==", - "dev": true - }, - "node_modules/gopd": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", - "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", - "dev": true, - "dependencies": { - "get-intrinsic": "^1.1.3" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/graceful-fs": { - "version": "4.2.11", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", - "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", - "dev": true - }, - "node_modules/graphemer": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", - "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", - "dev": true - }, - "node_modules/handle-thing": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/handle-thing/-/handle-thing-2.0.1.tgz", - "integrity": "sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg==", - "dev": true - }, - "node_modules/has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/has-property-descriptors": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", - "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", - "dev": true, - "dependencies": { - "es-define-property": "^1.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-proto": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.3.tgz", - "integrity": "sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==", - "dev": true, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-symbols": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", - "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", - "dev": true, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-tostringtag": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", - "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", - "dev": true, - "dependencies": { - "has-symbols": "^1.0.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/hasown": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", - "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", - "dev": true, - "dependencies": { - "function-bind": "^1.1.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/hast-util-heading-rank": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/hast-util-heading-rank/-/hast-util-heading-rank-3.0.0.tgz", - "integrity": "sha512-EJKb8oMUXVHcWZTDepnr+WNbfnXKFNf9duMesmr4S8SXTJBJ9M4Yok08pu9vxdJwdlGRhVumk9mEhkEvKGifwA==", - "dev": true, - "dependencies": { - "@types/hast": "^3.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/hast-util-is-element": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/hast-util-is-element/-/hast-util-is-element-3.0.0.tgz", - "integrity": "sha512-Val9mnv2IWpLbNPqc/pUem+a7Ipj2aHacCwgNfTiK0vJKl0LF+4Ba4+v1oPHFpf3bLYmreq0/l3Gud9S5OH42g==", - "dev": true, - "dependencies": { - "@types/hast": "^3.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/hast-util-to-string": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/hast-util-to-string/-/hast-util-to-string-3.0.0.tgz", - "integrity": "sha512-OGkAxX1Ua3cbcW6EJ5pT/tslVb90uViVkcJ4ZZIMW/R33DX/AkcJcRrPebPwJkHYwlDHXz4aIwvAAaAdtrACFA==", - "dev": true, - "dependencies": { - "@types/hast": "^3.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/he": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", - "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", - "dev": true, - "bin": { - "he": "bin/he" - } - }, - "node_modules/hosted-git-info": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-7.0.2.tgz", - "integrity": "sha512-puUZAUKT5m8Zzvs72XWy3HtvVbTWljRE66cP60bxJzAqf2DgICo7lYTY2IHUmLnNpjYvw5bvmoHvPc0QO2a62w==", - "dev": true, - "dependencies": { - "lru-cache": "^10.0.1" - }, - "engines": { - "node": "^16.14.0 || >=18.0.0" - } - }, - "node_modules/hosted-git-info/node_modules/lru-cache": { - "version": "10.4.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", - "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", - "dev": true - }, - "node_modules/hpack.js": { - "version": "2.1.6", - "resolved": "https://registry.npmjs.org/hpack.js/-/hpack.js-2.1.6.tgz", - "integrity": "sha512-zJxVehUdMGIKsRaNt7apO2Gqp0BdqW5yaiGHXXmbpvxgBYVZnAql+BJb4RO5ad2MgpbZKn5G6nMnegrH1FcNYQ==", - "dev": true, - "dependencies": { - "inherits": "^2.0.1", - "obuf": "^1.0.0", - "readable-stream": "^2.0.1", - "wbuf": "^1.1.0" - } - }, - "node_modules/hpack.js/node_modules/readable-stream": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", - "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", - "dev": true, - "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "node_modules/hpack.js/node_modules/safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true - }, - "node_modules/hpack.js/node_modules/string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, - "dependencies": { - "safe-buffer": "~5.1.0" - } - }, - "node_modules/html-encoding-sniffer": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-3.0.0.tgz", - "integrity": "sha512-oWv4T4yJ52iKrufjnyZPkrN0CH3QnrUqdB6In1g5Fe1mia8GmF36gnfNySxoZtxD5+NmYw1EElVXiBk93UeskA==", - "dev": true, - "dependencies": { - "whatwg-encoding": "^2.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/html-entities": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-2.5.2.tgz", - "integrity": "sha512-K//PSRMQk4FZ78Kyau+mZurHn3FH0Vwr+H36eE0rPbeYkRRi9YxceYPhuN60UwWorxyKHhqoAJl2OFKa4BVtaA==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/mdevils" - }, - { - "type": "patreon", - "url": "https://patreon.com/mdevils" - } - ] - }, - "node_modules/html-minifier-terser": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/html-minifier-terser/-/html-minifier-terser-6.1.0.tgz", - "integrity": "sha512-YXxSlJBZTP7RS3tWnQw74ooKa6L9b9i9QYXY21eUEvhZ3u9XLfv6OnFsQq6RxkhHygsaUMvYsZRV5rU/OVNZxw==", - "dev": true, - "dependencies": { - "camel-case": "^4.1.2", - "clean-css": "^5.2.2", - "commander": "^8.3.0", - "he": "^1.2.0", - "param-case": "^3.0.4", - "relateurl": "^0.2.7", - "terser": "^5.10.0" - }, - "bin": { - "html-minifier-terser": "cli.js" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/html-minifier-terser/node_modules/commander": { - "version": "8.3.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-8.3.0.tgz", - "integrity": "sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==", - "dev": true, - "engines": { - "node": ">= 12" - } - }, - "node_modules/html-webpack-plugin": { - "version": "5.6.0", - "resolved": "https://registry.npmjs.org/html-webpack-plugin/-/html-webpack-plugin-5.6.0.tgz", - "integrity": "sha512-iwaY4wzbe48AfKLZ/Cc8k0L+FKG6oSNRaZ8x5A/T/IVDGyXcbHncM9TdDa93wn0FsSm82FhTKW7f3vS61thXAw==", - "dev": true, - "dependencies": { - "@types/html-minifier-terser": "^6.0.0", - "html-minifier-terser": "^6.0.2", - "lodash": "^4.17.21", - "pretty-error": "^4.0.0", - "tapable": "^2.0.0" - }, - "engines": { - "node": ">=10.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/html-webpack-plugin" - }, - "peerDependencies": { - "@rspack/core": "0.x || 1.x", - "webpack": "^5.20.0" - }, - "peerDependenciesMeta": { - "@rspack/core": { - "optional": true - }, - "webpack": { - "optional": true - } - } - }, - "node_modules/htmlparser2": { - "version": "8.0.2", - "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-8.0.2.tgz", - "integrity": "sha512-GYdjWKDkbRLkZ5geuHs5NY1puJ+PXwP7+fHPRz06Eirsb9ugf6d8kkXav6ADhcODhFFPMIXyxkxSuMf3D6NCFA==", - "dev": true, - "funding": [ - "https://github.com/fb55/htmlparser2?sponsor=1", - { - "type": "github", - "url": "https://github.com/sponsors/fb55" - } - ], - "dependencies": { - "domelementtype": "^2.3.0", - "domhandler": "^5.0.3", - "domutils": "^3.0.1", - "entities": "^4.4.0" - } - }, - "node_modules/http-cache-semantics": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.1.tgz", - "integrity": "sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==", - "dev": true - }, - "node_modules/http-deceiver": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/http-deceiver/-/http-deceiver-1.2.7.tgz", - "integrity": "sha512-LmpOGxTfbpgtGVxJrj5k7asXHCgNZp5nLfp+hWc8QQRqtb7fUy6kRY3BO1h9ddF6yIPYUARgxGOwB42DnxIaNw==", - "dev": true - }, - "node_modules/http-errors": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", - "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", - "dev": true, - "dependencies": { - "depd": "2.0.0", - "inherits": "2.0.4", - "setprototypeof": "1.2.0", - "statuses": "2.0.1", - "toidentifier": "1.0.1" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/http-errors/node_modules/statuses": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", - "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", - "dev": true, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/http-parser-js": { - "version": "0.5.8", - "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.8.tgz", - "integrity": "sha512-SGeBX54F94Wgu5RH3X5jsDtf4eHyRogWX1XGT3b4HuW3tQPM4AaBzoUji/4AAJNXCEOWZ5O0DgZmJw1947gD5Q==", - "dev": true - }, - "node_modules/http-proxy": { - "version": "1.18.1", - "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.18.1.tgz", - "integrity": "sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==", - "dev": true, - "dependencies": { - "eventemitter3": "^4.0.0", - "follow-redirects": "^1.0.0", - "requires-port": "^1.0.0" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/http-proxy-agent": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-7.0.2.tgz", - "integrity": "sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==", - "dev": true, - "dependencies": { - "agent-base": "^7.1.0", - "debug": "^4.3.4" - }, - "engines": { - "node": ">= 14" - } - }, - "node_modules/http-proxy-middleware": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-3.0.0.tgz", - "integrity": "sha512-36AV1fIaI2cWRzHo+rbcxhe3M3jUDCNzc4D5zRl57sEWRAxdXYtw7FSQKYY6PDKssiAKjLYypbssHk+xs/kMXw==", - "dev": true, - "dependencies": { - "@types/http-proxy": "^1.17.10", - "debug": "^4.3.4", - "http-proxy": "^1.18.1", - "is-glob": "^4.0.1", - "is-plain-obj": "^3.0.0", - "micromatch": "^4.0.5" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/https-proxy-agent": { - "version": "7.0.5", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.5.tgz", - "integrity": "sha512-1e4Wqeblerz+tMKPIq2EMGiiWW1dIjZOksyHWSUm1rmuvw/how9hBHZ38lAGj5ID4Ik6EdkOw7NmWPy6LAwalw==", - "dev": true, - "dependencies": { - "agent-base": "^7.0.2", - "debug": "4" - }, - "engines": { - "node": ">= 14" - } - }, - "node_modules/human-signals": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", - "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", - "dev": true, - "engines": { - "node": ">=10.17.0" - } - }, - "node_modules/hyperdyperid": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/hyperdyperid/-/hyperdyperid-1.2.0.tgz", - "integrity": "sha512-Y93lCzHYgGWdrJ66yIktxiaGULYc6oGiABxhcO5AufBeOyoIdZF7bIfLaOrbM0iGIOXQQgxxRrFEnb+Y6w1n4A==", - "dev": true, - "engines": { - "node": ">=10.18" - } - }, - "node_modules/iconv-lite": { - "version": "0.4.24", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", - "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", - "dev": true, - "dependencies": { - "safer-buffer": ">= 2.1.2 < 3" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/icss-utils": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/icss-utils/-/icss-utils-5.1.0.tgz", - "integrity": "sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA==", - "dev": true, - "engines": { - "node": "^10 || ^12 || >= 14" - }, - "peerDependencies": { - "postcss": "^8.1.0" - } - }, - "node_modules/ieee754": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", - "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, - "node_modules/ignore": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", - "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", - "dev": true, - "engines": { - "node": ">= 4" - } - }, - "node_modules/ignore-walk": { - "version": "6.0.5", - "resolved": "https://registry.npmjs.org/ignore-walk/-/ignore-walk-6.0.5.tgz", - "integrity": "sha512-VuuG0wCnjhnylG1ABXT3dAuIpTNDs/G8jlpmwXY03fXoXy/8ZK8/T+hMzt8L4WnrLCJgdybqgPagnF/f97cg3A==", - "dev": true, - "dependencies": { - "minimatch": "^9.0.0" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/ignore-walk/node_modules/brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "dev": true, - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/ignore-walk/node_modules/minimatch": { - "version": "9.0.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", - "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", - "dev": true, - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/image-size": { - "version": "0.5.5", - "resolved": "https://registry.npmjs.org/image-size/-/image-size-0.5.5.tgz", - "integrity": "sha512-6TDAlDPZxUFCv+fuOkIoXT/V/f3Qbq8e37p+YOiYrUv3v9cc3/6x78VdfPgFVaB9dZYeLUfKgHRebpkm/oP2VQ==", - "dev": true, - "optional": true, - "bin": { - "image-size": "bin/image-size.js" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/immutable": { - "version": "4.3.7", - "resolved": "https://registry.npmjs.org/immutable/-/immutable-4.3.7.tgz", - "integrity": "sha512-1hqclzwYwjRDFLjcFxOM5AYkkG0rpFPpr1RLPMEuGczoS7YA8gLhy8SWXYRAA/XwfEHpfo3cw5JGioS32fnMRw==", - "dev": true - }, - "node_modules/import-fresh": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", - "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", - "dev": true, - "dependencies": { - "parent-module": "^1.0.0", - "resolve-from": "^4.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/imurmurhash": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", - "dev": true, - "engines": { - "node": ">=0.8.19" - } - }, - "node_modules/indent-string": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", - "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", - "deprecated": "This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.", - "dev": true, - "optional": true, - "peer": true, - "dependencies": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "node_modules/inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "dev": true - }, - "node_modules/ini": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/ini/-/ini-4.1.3.tgz", - "integrity": "sha512-X7rqawQBvfdjS10YU1y1YVreA3SsLrW9dX2CewP2EbBJM4ypVNLDkO5y04gejPwKIY9lR+7r9gn3rFPt/kmWFg==", - "dev": true, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/injection-js": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/injection-js/-/injection-js-2.4.0.tgz", - "integrity": "sha512-6jiJt0tCAo9zjHbcwLiPL+IuNe9SQ6a9g0PEzafThW3fOQi0mrmiJGBJvDD6tmhPh8cQHIQtCOrJuBfQME4kPA==", - "dev": true, - "dependencies": { - "tslib": "^2.0.0" - } - }, - "node_modules/ip-address": { - "version": "9.0.5", - "resolved": "https://registry.npmjs.org/ip-address/-/ip-address-9.0.5.tgz", - "integrity": "sha512-zHtQzGojZXTwZTHQqra+ETKd4Sn3vgi7uBmlPoXVWZqYvuKmtI0l/VZTjqGmJY9x88GGOaZ9+G9ES8hC4T4X8g==", - "dev": true, - "dependencies": { - "jsbn": "1.1.0", - "sprintf-js": "^1.1.3" - }, - "engines": { - "node": ">= 12" - } - }, - "node_modules/ipaddr.js": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-2.2.0.tgz", - "integrity": "sha512-Ag3wB2o37wslZS19hZqorUnrnzSkpOVy+IiiDEiTqNubEYpYuHWIf6K4psgN2ZWKExS4xhVCrRVfb/wfW8fWJA==", - "dev": true, - "engines": { - "node": ">= 10" - } - }, - "node_modules/is-absolute-url": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/is-absolute-url/-/is-absolute-url-4.0.1.tgz", - "integrity": "sha512-/51/TKE88Lmm7Gc4/8btclNXWS+g50wXhYJq8HWIBAGUBnoAdRu1aXeh364t/O7wXDAcTJDP8PNuNKWUDWie+A==", - "dev": true, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/is-arguments": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.1.tgz", - "integrity": "sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-arrayish": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", - "dev": true - }, - "node_modules/is-binary-path": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", - "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", - "dev": true, - "dependencies": { - "binary-extensions": "^2.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/is-callable": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", - "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", - "dev": true, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-core-module": { - "version": "2.15.1", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.15.1.tgz", - "integrity": "sha512-z0vtXSwucUJtANQWldhbtbt7BnL0vxiFjIdDLAatwhDYty2bad6s+rijD6Ri4YuYJubLzIJLUidCh09e1djEVQ==", - "dev": true, - "dependencies": { - "hasown": "^2.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-docker": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-3.0.0.tgz", - "integrity": "sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ==", - "dev": true, - "bin": { - "is-docker": "cli.js" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-fullwidth-code-point": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-4.0.0.tgz", - "integrity": "sha512-O4L094N2/dZ7xqVdrXhh9r1KODPJpFms8B5sGdJLPy664AgvXsreZUyCQQNItZRDlYug4xStLjNp/sz3HvBowQ==", - "dev": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/is-generator-function": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.0.10.tgz", - "integrity": "sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==", - "dev": true, - "dependencies": { - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-glob": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", - "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", - "dev": true, - "dependencies": { - "is-extglob": "^2.1.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-inside-container": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-inside-container/-/is-inside-container-1.0.0.tgz", - "integrity": "sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA==", - "dev": true, - "dependencies": { - "is-docker": "^3.0.0" - }, - "bin": { - "is-inside-container": "cli.js" - }, - "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/is-interactive": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-interactive/-/is-interactive-1.0.0.tgz", - "integrity": "sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/is-lambda": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-lambda/-/is-lambda-1.0.1.tgz", - "integrity": "sha512-z7CMFGNrENq5iFB9Bqo64Xk6Y9sg+epq1myIcdHaGnbMTYOxvzsEtdYqQUylB7LxfkvgrrjP32T6Ywciio9UIQ==", - "dev": true - }, - "node_modules/is-module": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-module/-/is-module-1.0.0.tgz", - "integrity": "sha512-51ypPSPCoTEIN9dy5Oy+h4pShgJmPCygKfyRCISBI+JoWT/2oJvK8QPxmwv7b/p239jXrm9M1mlQbyKJ5A152g==", - "dev": true - }, - "node_modules/is-network-error": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-network-error/-/is-network-error-1.1.0.tgz", - "integrity": "sha512-tUdRRAnhT+OtCZR/LxZelH/C7QtjtFrTu5tXCA8pl55eTUElUHT+GPYV8MBMBvea/j+NxQqVt3LbWMRir7Gx9g==", - "dev": true, - "engines": { - "node": ">=16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "dev": true, - "engines": { - "node": ">=0.12.0" - } - }, - "node_modules/is-path-inside": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", - "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/is-plain-obj": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-3.0.0.tgz", - "integrity": "sha512-gwsOE28k+23GP1B6vFl1oVh/WOzmawBrKwo5Ev6wMKzPkaXaCDIQKzLnvsA42DRlbVTWorkgTKIviAKCWkfUwA==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/is-plain-object": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", - "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", - "dev": true, - "dependencies": { - "isobject": "^3.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-potential-custom-element-name": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz", - "integrity": "sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==", - "dev": true - }, - "node_modules/is-stream": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", - "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", - "dev": true, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/is-typed-array": { - "version": "1.1.13", - "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.13.tgz", - "integrity": "sha512-uZ25/bUAlUY5fR4OKT4rZQEBrzQWYV9ZJYGGsUmEJ6thodVJ1HX64ePQ6Z0qPWP+m+Uq6e9UugrE38jeYsDSMw==", - "dev": true, - "dependencies": { - "which-typed-array": "^1.1.14" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-unicode-supported": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", - "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/is-what": { - "version": "3.14.1", - "resolved": "https://registry.npmjs.org/is-what/-/is-what-3.14.1.tgz", - "integrity": "sha512-sNxgpk9793nzSs7bA6JQJGeIuRBQhAaNGG77kzYQgMkrID+lS6SlK07K5LaptscDlSaIgH+GPFzf+d75FVxozA==", - "dev": true - }, - "node_modules/is-wsl": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-3.1.0.tgz", - "integrity": "sha512-UcVfVfaK4Sc4m7X3dUSoHoozQGBEFeDC+zVo06t98xe8CzHSZZBekNXH+tu0NalHolcJ/QAGqS46Hef7QXBIMw==", - "dev": true, - "dependencies": { - "is-inside-container": "^1.0.0" - }, - "engines": { - "node": ">=16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", - "dev": true - }, - "node_modules/isbinaryfile": { - "version": "4.0.10", - "resolved": "https://registry.npmjs.org/isbinaryfile/-/isbinaryfile-4.0.10.tgz", - "integrity": "sha512-iHrqe5shvBUcFbmZq9zOQHBoeOhZJu6RQGrDpBgenUm/Am+F3JM2MgQj+rK3Z601fzrL5gLZWtAPH2OBaSVcyw==", - "dev": true, - "optional": true, - "peer": true, - "engines": { - "node": ">= 8.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/gjtorikian/" - } - }, - "node_modules/isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", - "dev": true - }, - "node_modules/isobject": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/istanbul-lib-coverage": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.2.tgz", - "integrity": "sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/jackspeak": { - "version": "3.4.3", - "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz", - "integrity": "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==", - "dev": true, - "dependencies": { - "@isaacs/cliui": "^8.0.2" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - }, - "optionalDependencies": { - "@pkgjs/parseargs": "^0.11.0" - } - }, - "node_modules/jest-worker": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz", - "integrity": "sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==", - "dev": true, - "dependencies": { - "@types/node": "*", - "merge-stream": "^2.0.0", - "supports-color": "^8.0.0" - }, - "engines": { - "node": ">= 10.13.0" - } - }, - "node_modules/jest-worker/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-worker/node_modules/supports-color": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", - "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", - "dev": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/supports-color?sponsor=1" - } - }, - "node_modules/jiti": { - "version": "1.21.6", - "resolved": "https://registry.npmjs.org/jiti/-/jiti-1.21.6.tgz", - "integrity": "sha512-2yTgeWTWzMWkHu6Jp9NKgePDaYHbntiwvYuuJLbbN9vl7DC9DvXKOB2BC3ZZ92D3cvV/aflH0osDfwpHepQ53w==", - "dev": true, - "bin": { - "jiti": "bin/jiti.js" - } - }, - "node_modules/js-tokens": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", - "dev": true - }, - "node_modules/js-yaml": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", - "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", - "dev": true, - "dependencies": { - "argparse": "^2.0.1" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, - "node_modules/jsbn": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-1.1.0.tgz", - "integrity": "sha512-4bYVV3aAMtDTTu4+xsDYa6sy9GyJ69/amsu9sYF2zqjiEoZA5xJi3BrfX3uY+/IekIu7MwdObdbDWpoZdBv3/A==", - "dev": true - }, - "node_modules/jsdoc-type-pratt-parser": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/jsdoc-type-pratt-parser/-/jsdoc-type-pratt-parser-4.1.0.tgz", - "integrity": "sha512-Hicd6JK5Njt2QB6XYFS7ok9e37O8AYk3jTcppG4YVQnYjOemymvTcmc7OWsmq/Qqj5TdRFO5/x/tIPmBeRtGHg==", - "dev": true, - "engines": { - "node": ">=12.0.0" - } - }, - "node_modules/jsdom": { - "version": "22.1.0", - "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-22.1.0.tgz", - "integrity": "sha512-/9AVW7xNbsBv6GfWho4TTNjEo9fe6Zhf9O7s0Fhhr3u+awPwAJMKwAMXnkk5vBxflqLW9hTHX/0cs+P3gW+cQw==", - "dev": true, - "dependencies": { - "abab": "^2.0.6", - "cssstyle": "^3.0.0", - "data-urls": "^4.0.0", - "decimal.js": "^10.4.3", - "domexception": "^4.0.0", - "form-data": "^4.0.0", - "html-encoding-sniffer": "^3.0.0", - "http-proxy-agent": "^5.0.0", - "https-proxy-agent": "^5.0.1", - "is-potential-custom-element-name": "^1.0.1", - "nwsapi": "^2.2.4", - "parse5": "^7.1.2", - "rrweb-cssom": "^0.6.0", - "saxes": "^6.0.0", - "symbol-tree": "^3.2.4", - "tough-cookie": "^4.1.2", - "w3c-xmlserializer": "^4.0.0", - "webidl-conversions": "^7.0.0", - "whatwg-encoding": "^2.0.0", - "whatwg-mimetype": "^3.0.0", - "whatwg-url": "^12.0.1", - "ws": "^8.13.0", - "xml-name-validator": "^4.0.0" - }, - "engines": { - "node": ">=16" - }, - "peerDependencies": { - "canvas": "^2.5.0" - }, - "peerDependenciesMeta": { - "canvas": { - "optional": true - } - } - }, - "node_modules/jsdom/node_modules/agent-base": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", - "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", - "dev": true, - "dependencies": { - "debug": "4" - }, - "engines": { - "node": ">= 6.0.0" - } - }, - "node_modules/jsdom/node_modules/http-proxy-agent": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-5.0.0.tgz", - "integrity": "sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w==", - "dev": true, - "dependencies": { - "@tootallnate/once": "2", - "agent-base": "6", - "debug": "4" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/jsdom/node_modules/https-proxy-agent": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", - "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", - "dev": true, - "dependencies": { - "agent-base": "6", - "debug": "4" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/jsesc": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", - "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", - "dev": true, - "bin": { - "jsesc": "bin/jsesc" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/json-buffer": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", - "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", - "dev": true - }, - "node_modules/json-parse-even-better-errors": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-3.0.2.tgz", - "integrity": "sha512-fi0NG4bPjCHunUJffmLd0gxssIgkNmArMvis4iNah6Owg1MCJjWhEcDLmsK6iGkJq3tHwbDkTlce70/tmXN4cQ==", - "dev": true, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/json-schema-traverse": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", - "dev": true - }, - "node_modules/json-stable-stringify-without-jsonify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", - "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", - "dev": true - }, - "node_modules/json5": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", - "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", - "dev": true, - "bin": { - "json5": "lib/cli.js" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/jsonc-parser": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.3.1.tgz", - "integrity": "sha512-HUgH65KyejrUFPvHFPbqOY0rsFip3Bo5wb4ngvdi1EpCYWUQDC5V+Y7mZws+DLkr4M//zQJoanu1SP+87Dv1oQ==", - "dev": true - }, - "node_modules/jsonfile": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", - "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==", - "dev": true, - "optional": true, - "peer": true, - "optionalDependencies": { - "graceful-fs": "^4.1.6" - } - }, - "node_modules/jsonparse": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/jsonparse/-/jsonparse-1.3.1.tgz", - "integrity": "sha512-POQXvpdL69+CluYsillJ7SUhKvytYjW9vG/GKpnf+xP8UWgYEM/RaMzHHofbALDiKbbP1W8UEYmgGl39WkPZsg==", - "dev": true, - "engines": [ - "node >= 0.2.0" - ] - }, - "node_modules/karma": { - "version": "6.4.4", - "resolved": "https://registry.npmjs.org/karma/-/karma-6.4.4.tgz", - "integrity": "sha512-LrtUxbdvt1gOpo3gxG+VAJlJAEMhbWlM4YrFQgql98FwF7+K8K12LYO4hnDdUkNjeztYrOXEMqgTajSWgmtI/w==", - "dev": true, - "optional": true, - "peer": true, - "dependencies": { - "@colors/colors": "1.5.0", - "body-parser": "^1.19.0", - "braces": "^3.0.2", - "chokidar": "^3.5.1", - "connect": "^3.7.0", - "di": "^0.0.1", - "dom-serialize": "^2.2.1", - "glob": "^7.1.7", - "graceful-fs": "^4.2.6", - "http-proxy": "^1.18.1", - "isbinaryfile": "^4.0.8", - "lodash": "^4.17.21", - "log4js": "^6.4.1", - "mime": "^2.5.2", - "minimatch": "^3.0.4", - "mkdirp": "^0.5.5", - "qjobs": "^1.2.0", - "range-parser": "^1.2.1", - "rimraf": "^3.0.2", - "socket.io": "^4.7.2", - "source-map": "^0.6.1", - "tmp": "^0.2.1", - "ua-parser-js": "^0.7.30", - "yargs": "^16.1.1" - }, - "bin": { - "karma": "bin/karma" - }, - "engines": { - "node": ">= 10" - } - }, - "node_modules/karma-source-map-support": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/karma-source-map-support/-/karma-source-map-support-1.4.0.tgz", - "integrity": "sha512-RsBECncGO17KAoJCYXjv+ckIz+Ii9NCi+9enk+rq6XC81ezYkb4/RHE6CTXdA7IOJqoF3wcaLfVG0CPmE5ca6A==", - "dev": true, - "dependencies": { - "source-map-support": "^0.5.5" - } - }, - "node_modules/karma/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "optional": true, - "peer": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/karma/node_modules/cliui": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", - "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", - "dev": true, - "optional": true, - "peer": true, - "dependencies": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", - "wrap-ansi": "^7.0.0" - } - }, - "node_modules/karma/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "optional": true, - "peer": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/karma/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true, - "optional": true, - "peer": true - }, - "node_modules/karma/node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true, - "optional": true, - "peer": true - }, - "node_modules/karma/node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true, - "optional": true, - "peer": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/karma/node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true, - "optional": true, - "peer": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/karma/node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dev": true, - "optional": true, - "peer": true, - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/karma/node_modules/tmp": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.3.tgz", - "integrity": "sha512-nZD7m9iCPC5g0pYmcaxogYKggSfLsdxl8of3Q/oIbqCqLLIO9IAF0GWjX1z9NZRHPiXv8Wex4yDCaZsgEw0Y8w==", - "dev": true, - "optional": true, - "peer": true, - "engines": { - "node": ">=14.14" - } - }, - "node_modules/karma/node_modules/wrap-ansi": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "dev": true, - "optional": true, - "peer": true, - "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - } - }, - "node_modules/karma/node_modules/yargs": { - "version": "16.2.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", - "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", - "dev": true, - "optional": true, - "peer": true, - "dependencies": { - "cliui": "^7.0.2", - "escalade": "^3.1.1", - "get-caller-file": "^2.0.5", - "require-directory": "^2.1.1", - "string-width": "^4.2.0", - "y18n": "^5.0.5", - "yargs-parser": "^20.2.2" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/karma/node_modules/yargs-parser": { - "version": "20.2.9", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", - "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", - "dev": true, - "optional": true, - "peer": true, - "engines": { - "node": ">=10" - } - }, - "node_modules/keycloakify": { - "version": "11.0.0", - "resolved": "https://registry.npmjs.org/keycloakify/-/keycloakify-11.0.0.tgz", - "integrity": "sha512-PW5j2lSTxr/yN4qJ4/TNQIuuPkaZN2gTZiXpGIYL4PMgWsDLkj+xfZrI7am7snbgOGg63GQ4gKVvirl5atIuuA==", - "dev": true, - "dependencies": { - "tsafe": "^1.6.6" - }, - "bin": { - "keycloakify": "bin/main.js" - } - }, - "node_modules/keyv": { - "version": "4.5.4", - "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", - "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", - "dev": true, - "dependencies": { - "json-buffer": "3.0.1" - } - }, - "node_modules/kind-of": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", - "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/launch-editor": { - "version": "2.9.1", - "resolved": "https://registry.npmjs.org/launch-editor/-/launch-editor-2.9.1.tgz", - "integrity": "sha512-Gcnl4Bd+hRO9P9icCP/RVVT2o8SFlPXofuCxvA2SaZuH45whSvf5p8x5oih5ftLiVhEI4sp5xDY+R+b3zJBh5w==", - "dev": true, - "dependencies": { - "picocolors": "^1.0.0", - "shell-quote": "^1.8.1" - } - }, - "node_modules/less": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/less/-/less-4.2.0.tgz", - "integrity": "sha512-P3b3HJDBtSzsXUl0im2L7gTO5Ubg8mEN6G8qoTS77iXxXX4Hvu4Qj540PZDvQ8V6DmX6iXo98k7Md0Cm1PrLaA==", - "dev": true, - "dependencies": { - "copy-anything": "^2.0.1", - "parse-node-version": "^1.0.1", - "tslib": "^2.3.0" - }, - "bin": { - "lessc": "bin/lessc" - }, - "engines": { - "node": ">=6" - }, - "optionalDependencies": { - "errno": "^0.1.1", - "graceful-fs": "^4.1.2", - "image-size": "~0.5.0", - "make-dir": "^2.1.0", - "mime": "^1.4.1", - "needle": "^3.1.0", - "source-map": "~0.6.0" - } - }, - "node_modules/less-loader": { - "version": "12.2.0", - "resolved": "https://registry.npmjs.org/less-loader/-/less-loader-12.2.0.tgz", - "integrity": "sha512-MYUxjSQSBUQmowc0l5nPieOYwMzGPUaTzB6inNW/bdPEG9zOL3eAAD1Qw5ZxSPk7we5dMojHwNODYMV1hq4EVg==", - "dev": true, - "engines": { - "node": ">= 18.12.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "@rspack/core": "0.x || 1.x", - "less": "^3.5.0 || ^4.0.0", - "webpack": "^5.0.0" - }, - "peerDependenciesMeta": { - "@rspack/core": { - "optional": true - }, - "webpack": { - "optional": true - } - } - }, - "node_modules/less/node_modules/make-dir": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz", - "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==", - "dev": true, - "optional": true, - "dependencies": { - "pify": "^4.0.1", - "semver": "^5.6.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/less/node_modules/mime": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", - "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", - "dev": true, - "optional": true, - "bin": { - "mime": "cli.js" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/less/node_modules/semver": { - "version": "5.7.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", - "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", - "dev": true, - "optional": true, - "bin": { - "semver": "bin/semver" - } - }, - "node_modules/less/node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true, - "optional": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/levn": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", - "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", - "dev": true, - "dependencies": { - "prelude-ls": "^1.2.1", - "type-check": "~0.4.0" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/license-webpack-plugin": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/license-webpack-plugin/-/license-webpack-plugin-4.0.2.tgz", - "integrity": "sha512-771TFWFD70G1wLTC4oU2Cw4qvtmNrIw+wRvBtn+okgHl7slJVi7zfNcdmqDL72BojM30VNJ2UHylr1o77U37Jw==", - "dev": true, - "dependencies": { - "webpack-sources": "^3.0.0" - }, - "peerDependenciesMeta": { - "webpack": { - "optional": true - }, - "webpack-sources": { - "optional": true - } - } - }, - "node_modules/lines-and-columns": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", - "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", - "dev": true - }, - "node_modules/listr2": { - "version": "8.2.4", - "resolved": "https://registry.npmjs.org/listr2/-/listr2-8.2.4.tgz", - "integrity": "sha512-opevsywziHd3zHCVQGAj8zu+Z3yHNkkoYhWIGnq54RrCVwLz0MozotJEDnKsIBLvkfLGN6BLOyAeRrYI0pKA4g==", - "dev": true, - "dependencies": { - "cli-truncate": "^4.0.0", - "colorette": "^2.0.20", - "eventemitter3": "^5.0.1", - "log-update": "^6.1.0", - "rfdc": "^1.4.1", - "wrap-ansi": "^9.0.0" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/listr2/node_modules/ansi-regex": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz", - "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==", - "dev": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" - } - }, - "node_modules/listr2/node_modules/ansi-styles": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", - "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", - "dev": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/listr2/node_modules/eventemitter3": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-5.0.1.tgz", - "integrity": "sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==", - "dev": true - }, - "node_modules/listr2/node_modules/strip-ansi": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", - "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", - "dev": true, - "dependencies": { - "ansi-regex": "^6.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/strip-ansi?sponsor=1" - } - }, - "node_modules/listr2/node_modules/wrap-ansi": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-9.0.0.tgz", - "integrity": "sha512-G8ura3S+3Z2G+mkgNRq8dqaFZAuxfsxpBB8OCTGRTCtp+l/v9nbFNmCUP1BZMts3G1142MsZfn6eeUKrr4PD1Q==", - "dev": true, - "dependencies": { - "ansi-styles": "^6.2.1", - "string-width": "^7.0.0", - "strip-ansi": "^7.1.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - } - }, - "node_modules/lmdb": { - "version": "3.0.13", - "resolved": "https://registry.npmjs.org/lmdb/-/lmdb-3.0.13.tgz", - "integrity": "sha512-UGe+BbaSUQtAMZobTb4nHvFMrmvuAQKSeaqAX2meTEQjfsbpl5sxdHD8T72OnwD4GU9uwNhYXIVe4QGs8N9Zyw==", - "dev": true, - "hasInstallScript": true, - "dependencies": { - "msgpackr": "^1.10.2", - "node-addon-api": "^6.1.0", - "node-gyp-build-optional-packages": "5.2.2", - "ordered-binary": "^1.4.1", - "weak-lru-cache": "^1.2.2" - }, - "bin": { - "download-lmdb-prebuilds": "bin/download-prebuilds.js" - }, - "optionalDependencies": { - "@lmdb/lmdb-darwin-arm64": "3.0.13", - "@lmdb/lmdb-darwin-x64": "3.0.13", - "@lmdb/lmdb-linux-arm": "3.0.13", - "@lmdb/lmdb-linux-arm64": "3.0.13", - "@lmdb/lmdb-linux-x64": "3.0.13", - "@lmdb/lmdb-win32-x64": "3.0.13" - } - }, - "node_modules/loader-runner": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.3.0.tgz", - "integrity": "sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==", - "dev": true, - "engines": { - "node": ">=6.11.5" - } - }, - "node_modules/loader-utils": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-3.3.1.tgz", - "integrity": "sha512-FMJTLMXfCLMLfJxcX9PFqX5qD88Z5MRGaZCVzfuqeZSPsyiBzs+pahDQjbIWz2QIzPZz0NX9Zy4FX3lmK6YHIg==", - "dev": true, - "engines": { - "node": ">= 12.13.0" - } - }, - "node_modules/local-pkg": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/local-pkg/-/local-pkg-0.5.0.tgz", - "integrity": "sha512-ok6z3qlYyCDS4ZEU27HaU6x/xZa9Whf8jD4ptH5UZTQYZVYeb9bnZ3ojVhiJNLiXK1Hfc0GNbLXcmZ5plLDDBg==", - "dev": true, - "dependencies": { - "mlly": "^1.4.2", - "pkg-types": "^1.0.3" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/antfu" - } - }, - "node_modules/locate-path": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-7.2.0.tgz", - "integrity": "sha512-gvVijfZvn7R+2qyPX8mAuKcFGDf6Nc61GdvGafQsHL0sBIxfKzA+usWn4GFC/bk+QdwPUD4kWFJLhElipq+0VA==", - "dev": true, - "dependencies": { - "p-locate": "^6.0.0" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/lodash": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", - "dev": true - }, - "node_modules/lodash.debounce": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", - "integrity": "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==", - "dev": true - }, - "node_modules/lodash.merge": { - "version": "4.6.2", - "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", - "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", - "dev": true - }, - "node_modules/log-symbols": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", - "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", - "dev": true, - "dependencies": { - "chalk": "^4.1.0", - "is-unicode-supported": "^0.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/log-symbols/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/log-symbols/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/log-symbols/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/log-symbols/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "node_modules/log-symbols/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/log-symbols/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/log-update": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/log-update/-/log-update-6.1.0.tgz", - "integrity": "sha512-9ie8ItPR6tjY5uYJh8K/Zrv/RMZ5VOlOWvtZdEHYSTFKZfIBPQa9tOAEeAWhd+AnIneLJ22w5fjOYtoutpWq5w==", - "dev": true, - "dependencies": { - "ansi-escapes": "^7.0.0", - "cli-cursor": "^5.0.0", - "slice-ansi": "^7.1.0", - "strip-ansi": "^7.1.0", - "wrap-ansi": "^9.0.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/log-update/node_modules/ansi-escapes": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-7.0.0.tgz", - "integrity": "sha512-GdYO7a61mR0fOlAsvC9/rIHf7L96sBc6dEWzeOu+KAea5bZyQRPIpojrVoI4AXGJS/ycu/fBTdLrUkA4ODrvjw==", - "dev": true, - "dependencies": { - "environment": "^1.0.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/log-update/node_modules/ansi-regex": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz", - "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==", - "dev": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" - } - }, - "node_modules/log-update/node_modules/ansi-styles": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", - "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", - "dev": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/log-update/node_modules/is-fullwidth-code-point": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-5.0.0.tgz", - "integrity": "sha512-OVa3u9kkBbw7b8Xw5F9P+D/T9X+Z4+JruYVNapTjPYZYUznQ5YfWeFkOj606XYYW8yugTfC8Pj0hYqvi4ryAhA==", - "dev": true, - "dependencies": { - "get-east-asian-width": "^1.0.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/log-update/node_modules/slice-ansi": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-7.1.0.tgz", - "integrity": "sha512-bSiSngZ/jWeX93BqeIAbImyTbEihizcwNjFoRUIY/T1wWQsfsm2Vw1agPKylXvQTU7iASGdHhyqRlqQzfz+Htg==", - "dev": true, - "dependencies": { - "ansi-styles": "^6.2.1", - "is-fullwidth-code-point": "^5.0.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/chalk/slice-ansi?sponsor=1" - } - }, - "node_modules/log-update/node_modules/strip-ansi": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", - "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", - "dev": true, - "dependencies": { - "ansi-regex": "^6.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/strip-ansi?sponsor=1" - } - }, - "node_modules/log-update/node_modules/wrap-ansi": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-9.0.0.tgz", - "integrity": "sha512-G8ura3S+3Z2G+mkgNRq8dqaFZAuxfsxpBB8OCTGRTCtp+l/v9nbFNmCUP1BZMts3G1142MsZfn6eeUKrr4PD1Q==", - "dev": true, - "dependencies": { - "ansi-styles": "^6.2.1", - "string-width": "^7.0.0", - "strip-ansi": "^7.1.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - } - }, - "node_modules/log4js": { - "version": "6.9.1", - "resolved": "https://registry.npmjs.org/log4js/-/log4js-6.9.1.tgz", - "integrity": "sha512-1somDdy9sChrr9/f4UlzhdaGfDR2c/SaD2a4T7qEkG4jTS57/B3qmnjLYePwQ8cqWnUHZI0iAKxMBpCZICiZ2g==", - "dev": true, - "optional": true, - "peer": true, - "dependencies": { - "date-format": "^4.0.14", - "debug": "^4.3.4", - "flatted": "^3.2.7", - "rfdc": "^1.3.0", - "streamroller": "^3.1.5" - }, - "engines": { - "node": ">=8.0" - } - }, - "node_modules/loose-envify": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", - "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", - "dev": true, - "dependencies": { - "js-tokens": "^3.0.0 || ^4.0.0" - }, - "bin": { - "loose-envify": "cli.js" - } - }, - "node_modules/loupe": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/loupe/-/loupe-2.3.7.tgz", - "integrity": "sha512-zSMINGVYkdpYSOBmLi0D1Uo7JU9nVdQKrHxC8eYlV+9YKK9WePqAlL7lSlorG/U2Fw1w0hTBmaa/jrQ3UbPHtA==", - "dev": true, - "dependencies": { - "get-func-name": "^2.0.1" - } - }, - "node_modules/lower-case": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-2.0.2.tgz", - "integrity": "sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==", - "dev": true, - "dependencies": { - "tslib": "^2.0.3" - } - }, - "node_modules/lru-cache": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", - "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", - "dev": true, - "dependencies": { - "yallist": "^3.0.2" - } - }, - "node_modules/magic-string": { - "version": "0.30.11", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.11.tgz", - "integrity": "sha512-+Wri9p0QHMy+545hKww7YAu5NyzF8iomPL/RQazugQ9+Ez4Ic3mERMd8ZTX5rfK944j+560ZJi8iAwgak1Ac7A==", - "dev": true, - "dependencies": { - "@jridgewell/sourcemap-codec": "^1.5.0" - } - }, - "node_modules/make-fetch-happen": { - "version": "13.0.1", - "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-13.0.1.tgz", - "integrity": "sha512-cKTUFc/rbKUd/9meOvgrpJ2WrNzymt6jfRDdwg5UCnVzv9dTpEj9JS5m3wtziXVCjluIXyL8pcaukYqezIzZQA==", - "dev": true, - "dependencies": { - "@npmcli/agent": "^2.0.0", - "cacache": "^18.0.0", - "http-cache-semantics": "^4.1.1", - "is-lambda": "^1.0.1", - "minipass": "^7.0.2", - "minipass-fetch": "^3.0.0", - "minipass-flush": "^1.0.5", - "minipass-pipeline": "^1.2.4", - "negotiator": "^0.6.3", - "proc-log": "^4.2.0", - "promise-retry": "^2.0.1", - "ssri": "^10.0.0" - }, - "engines": { - "node": "^16.14.0 || >=18.0.0" - } - }, - "node_modules/map-or-similar": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/map-or-similar/-/map-or-similar-1.5.0.tgz", - "integrity": "sha512-0aF7ZmVon1igznGI4VS30yugpduQW3y3GkcgGJOp7d8x8QrizhigUxjI/m2UojsXXto+jLAH3KSz+xOJTiORjg==", - "dev": true - }, - "node_modules/markdown-to-jsx": { - "version": "7.5.0", - "resolved": "https://registry.npmjs.org/markdown-to-jsx/-/markdown-to-jsx-7.5.0.tgz", - "integrity": "sha512-RrBNcMHiFPcz/iqIj0n3wclzHXjwS7mzjBNWecKKVhNTIxQepIix6Il/wZCn2Cg5Y1ow2Qi84+eJrryFRWBEWw==", - "dev": true, - "engines": { - "node": ">= 10" - }, - "peerDependencies": { - "react": ">= 0.14.0" - } - }, - "node_modules/media-typer": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", - "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", - "dev": true, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/memfs": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/memfs/-/memfs-4.12.0.tgz", - "integrity": "sha512-74wDsex5tQDSClVkeK1vtxqYCAgCoXxx+K4NSHzgU/muYVYByFqa+0RnrPO9NM6naWm1+G9JmZ0p6QHhXmeYfA==", - "dev": true, - "dependencies": { - "@jsonjoy.com/json-pack": "^1.0.3", - "@jsonjoy.com/util": "^1.3.0", - "tree-dump": "^1.0.1", - "tslib": "^2.0.0" - }, - "engines": { - "node": ">= 4.0.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/streamich" - } - }, - "node_modules/memoizerific": { - "version": "1.11.3", - "resolved": "https://registry.npmjs.org/memoizerific/-/memoizerific-1.11.3.tgz", - "integrity": "sha512-/EuHYwAPdLtXwAwSZkh/Gutery6pD2KYd44oQLhAvQp/50mpyduZh8Q7PYHXTCJ+wuXxt7oij2LXyIJOOYFPog==", - "dev": true, - "dependencies": { - "map-or-similar": "^1.5.0" - } - }, - "node_modules/merge-descriptors": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.3.tgz", - "integrity": "sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ==", - "dev": true, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/merge-stream": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", - "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", - "dev": true - }, - "node_modules/merge2": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", - "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", - "dev": true, - "engines": { - "node": ">= 8" - } - }, - "node_modules/methods": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", - "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==", - "dev": true, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/micromatch": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", - "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", - "dev": true, - "dependencies": { - "braces": "^3.0.3", - "picomatch": "^2.3.1" - }, - "engines": { - "node": ">=8.6" - } - }, - "node_modules/micromatch/node_modules/picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", - "dev": true, - "engines": { - "node": ">=8.6" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/mime": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-2.6.0.tgz", - "integrity": "sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg==", - "dev": true, - "optional": true, - "peer": true, - "bin": { - "mime": "cli.js" - }, - "engines": { - "node": ">=4.0.0" - } - }, - "node_modules/mime-db": { - "version": "1.52.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", - "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", - "dev": true, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/mime-types": { - "version": "2.1.35", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", - "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", - "dev": true, - "dependencies": { - "mime-db": "1.52.0" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/mimic-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", - "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/mimic-function": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/mimic-function/-/mimic-function-5.0.1.tgz", - "integrity": "sha512-VP79XUPxV2CigYP3jWwAUFSku2aKqBH7uTAapFWCBqutsbmDo96KY5o8uh6U+/YSIn5OxJnXp73beVkpqMIGhA==", - "dev": true, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/mini-css-extract-plugin": { - "version": "2.9.0", - "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-2.9.0.tgz", - "integrity": "sha512-Zs1YsZVfemekSZG+44vBsYTLQORkPMwnlv+aehcxK/NLKC+EGhDB39/YePYYqx/sTk6NnYpuqikhSn7+JIevTA==", - "dev": true, - "dependencies": { - "schema-utils": "^4.0.0", - "tapable": "^2.2.1" - }, - "engines": { - "node": ">= 12.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "webpack": "^5.0.0" - } - }, - "node_modules/minimalistic-assert": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", - "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==", - "dev": true - }, - "node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/minimist": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", - "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", - "dev": true, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/minipass": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", - "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", - "dev": true, - "engines": { - "node": ">=16 || 14 >=14.17" - } - }, - "node_modules/minipass-collect": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/minipass-collect/-/minipass-collect-2.0.1.tgz", - "integrity": "sha512-D7V8PO9oaz7PWGLbCACuI1qEOsq7UKfLotx/C0Aet43fCUB/wfQ7DYeq2oR/svFJGYDHPr38SHATeaj/ZoKHKw==", - "dev": true, - "dependencies": { - "minipass": "^7.0.3" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - } - }, - "node_modules/minipass-fetch": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-3.0.5.tgz", - "integrity": "sha512-2N8elDQAtSnFV0Dk7gt15KHsS0Fyz6CbYZ360h0WTYV1Ty46li3rAXVOQj1THMNLdmrD9Vt5pBPtWtVkpwGBqg==", - "dev": true, - "dependencies": { - "minipass": "^7.0.3", - "minipass-sized": "^1.0.3", - "minizlib": "^2.1.2" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - }, - "optionalDependencies": { - "encoding": "^0.1.13" - } - }, - "node_modules/minipass-flush": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/minipass-flush/-/minipass-flush-1.0.5.tgz", - "integrity": "sha512-JmQSYYpPUqX5Jyn1mXaRwOda1uQ8HP5KAT/oDSLCzt1BYRhQU0/hDtsB1ufZfEEzMZ9aAVmsBw8+FWsIXlClWw==", - "dev": true, - "dependencies": { - "minipass": "^3.0.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/minipass-flush/node_modules/minipass": { - "version": "3.3.6", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", - "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", - "dev": true, - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/minipass-flush/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - }, - "node_modules/minipass-pipeline": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/minipass-pipeline/-/minipass-pipeline-1.2.4.tgz", - "integrity": "sha512-xuIq7cIOt09RPRJ19gdi4b+RiNvDFYe5JH+ggNvBqGqpQXcru3PcRmOZuHBKWK1Txf9+cQ+HMVN4d6z46LZP7A==", - "dev": true, - "dependencies": { - "minipass": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/minipass-pipeline/node_modules/minipass": { - "version": "3.3.6", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", - "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", - "dev": true, - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/minipass-pipeline/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - }, - "node_modules/minipass-sized": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/minipass-sized/-/minipass-sized-1.0.3.tgz", - "integrity": "sha512-MbkQQ2CTiBMlA2Dm/5cY+9SWFEN8pzzOXi6rlM5Xxq0Yqbda5ZQy9sU75a673FE9ZK0Zsbr6Y5iP6u9nktfg2g==", - "dev": true, - "dependencies": { - "minipass": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/minipass-sized/node_modules/minipass": { - "version": "3.3.6", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", - "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", - "dev": true, - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/minipass-sized/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - }, - "node_modules/minizlib": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz", - "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==", - "dev": true, - "dependencies": { - "minipass": "^3.0.0", - "yallist": "^4.0.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/minizlib/node_modules/minipass": { - "version": "3.3.6", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", - "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", - "dev": true, - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/minizlib/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - }, - "node_modules/mkdirp": { - "version": "0.5.6", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", - "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", - "dev": true, - "optional": true, - "peer": true, - "dependencies": { - "minimist": "^1.2.6" - }, - "bin": { - "mkdirp": "bin/cmd.js" - } - }, - "node_modules/mlly": { - "version": "1.7.1", - "resolved": "https://registry.npmjs.org/mlly/-/mlly-1.7.1.tgz", - "integrity": "sha512-rrVRZRELyQzrIUAVMHxP97kv+G786pHmOKzuFII8zDYahFBS7qnHh2AlYSl1GAHhaMPCz6/oHjVMcfFYgFYHgA==", - "dev": true, - "dependencies": { - "acorn": "^8.11.3", - "pathe": "^1.1.2", - "pkg-types": "^1.1.1", - "ufo": "^1.5.3" - } - }, - "node_modules/mrmime": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/mrmime/-/mrmime-2.0.0.tgz", - "integrity": "sha512-eu38+hdgojoyq63s+yTpN4XMBdt5l8HhMhc4VKLO9KM5caLIBvUm4thi7fFaxyTmCKeNnXZ5pAlBwCUnhA09uw==", - "dev": true, - "engines": { - "node": ">=10" - } - }, - "node_modules/ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", - "dev": true - }, - "node_modules/msgpackr": { - "version": "1.11.0", - "resolved": "https://registry.npmjs.org/msgpackr/-/msgpackr-1.11.0.tgz", - "integrity": "sha512-I8qXuuALqJe5laEBYoFykChhSXLikZmUhccjGsPuSJ/7uPip2TJ7lwdIQwWSAi0jGZDXv4WOP8Qg65QZRuXxXw==", - "dev": true, - "optionalDependencies": { - "msgpackr-extract": "^3.0.2" - } - }, - "node_modules/msgpackr-extract": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/msgpackr-extract/-/msgpackr-extract-3.0.3.tgz", - "integrity": "sha512-P0efT1C9jIdVRefqjzOQ9Xml57zpOXnIuS+csaB4MdZbTdmGDLo8XhzBG1N7aO11gKDDkJvBLULeFTo46wwreA==", - "dev": true, - "hasInstallScript": true, - "optional": true, - "dependencies": { - "node-gyp-build-optional-packages": "5.2.2" - }, - "bin": { - "download-msgpackr-prebuilds": "bin/download-prebuilds.js" - }, - "optionalDependencies": { - "@msgpackr-extract/msgpackr-extract-darwin-arm64": "3.0.3", - "@msgpackr-extract/msgpackr-extract-darwin-x64": "3.0.3", - "@msgpackr-extract/msgpackr-extract-linux-arm": "3.0.3", - "@msgpackr-extract/msgpackr-extract-linux-arm64": "3.0.3", - "@msgpackr-extract/msgpackr-extract-linux-x64": "3.0.3", - "@msgpackr-extract/msgpackr-extract-win32-x64": "3.0.3" - } - }, - "node_modules/multicast-dns": { - "version": "7.2.5", - "resolved": "https://registry.npmjs.org/multicast-dns/-/multicast-dns-7.2.5.tgz", - "integrity": "sha512-2eznPJP8z2BFLX50tf0LuODrpINqP1RVIm/CObbTcBRITQgmC/TjcREF1NeTBzIcR5XO/ukWo+YHOjBbFwIupg==", - "dev": true, - "dependencies": { - "dns-packet": "^5.2.2", - "thunky": "^1.0.2" - }, - "bin": { - "multicast-dns": "cli.js" - } - }, - "node_modules/mute-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-1.0.0.tgz", - "integrity": "sha512-avsJQhyd+680gKXyG/sQc0nXaC6rBkPOfyHYcFb9+hdkqQkR9bdnkJ0AMZhke0oesPqIO+mFFJ+IdBc7mst4IA==", - "dev": true, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/nanoid": { - "version": "3.3.7", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz", - "integrity": "sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "bin": { - "nanoid": "bin/nanoid.cjs" - }, - "engines": { - "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" - } - }, - "node_modules/natural-compare": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", - "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", - "dev": true - }, - "node_modules/needle": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/needle/-/needle-3.3.1.tgz", - "integrity": "sha512-6k0YULvhpw+RoLNiQCRKOl09Rv1dPLr8hHnVjHqdolKwDrdNyk+Hmrthi4lIGPPz3r39dLx0hsF5s40sZ3Us4Q==", - "dev": true, - "optional": true, - "dependencies": { - "iconv-lite": "^0.6.3", - "sax": "^1.2.4" - }, - "bin": { - "needle": "bin/needle" - }, - "engines": { - "node": ">= 4.4.x" - } - }, - "node_modules/needle/node_modules/iconv-lite": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", - "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", - "dev": true, - "optional": true, - "dependencies": { - "safer-buffer": ">= 2.1.2 < 3.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/negotiator": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", - "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", - "dev": true, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/neo-async": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", - "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", - "dev": true - }, - "node_modules/ng-packagr": { - "version": "18.2.1", - "resolved": "https://registry.npmjs.org/ng-packagr/-/ng-packagr-18.2.1.tgz", - "integrity": "sha512-dy9ZDpZb3QpAz+Y/m8VAu7ctr2VrnRU3gmQwJagnNybVJtCsKn3lZA3IW7Z7GTLoG5IALSPouiCgiB/C8ozv7w==", - "dev": true, - "dependencies": { - "@rollup/plugin-json": "^6.1.0", - "@rollup/plugin-node-resolve": "^15.2.3", - "@rollup/wasm-node": "^4.18.0", - "ajv": "^8.12.0", - "ansi-colors": "^4.1.3", - "browserslist": "^4.22.1", - "cacache": "^18.0.0", - "chokidar": "^3.5.3", - "commander": "^12.0.0", - "convert-source-map": "^2.0.0", - "dependency-graph": "^1.0.0", - "esbuild": "^0.23.0", - "fast-glob": "^3.3.1", - "find-cache-dir": "^3.3.2", - "injection-js": "^2.4.0", - "jsonc-parser": "^3.2.0", - "less": "^4.2.0", - "ora": "^5.1.0", - "piscina": "^4.4.0", - "postcss": "^8.4.31", - "rxjs": "^7.8.1", - "sass": "^1.69.5" - }, - "bin": { - "ng-packagr": "cli/main.js" - }, - "engines": { - "node": "^18.19.1 || >=20.11.1" - }, - "optionalDependencies": { - "rollup": "^4.18.0" - }, - "peerDependencies": { - "@angular/compiler-cli": "^18.0.0 || ^18.2.0-next.0", - "tailwindcss": "^2.0.0 || ^3.0.0", - "tslib": "^2.3.0", - "typescript": ">=5.4 <5.6" - }, - "peerDependenciesMeta": { - "tailwindcss": { - "optional": true - } - } - }, - "node_modules/ng-packagr/node_modules/convert-source-map": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", - "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", - "dev": true - }, - "node_modules/ng-packagr/node_modules/find-cache-dir": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.2.tgz", - "integrity": "sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig==", - "dev": true, - "dependencies": { - "commondir": "^1.0.1", - "make-dir": "^3.0.2", - "pkg-dir": "^4.1.0" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/avajs/find-cache-dir?sponsor=1" - } - }, - "node_modules/ng-packagr/node_modules/find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "dev": true, - "dependencies": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/ng-packagr/node_modules/locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "dev": true, - "dependencies": { - "p-locate": "^4.1.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/ng-packagr/node_modules/make-dir": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", - "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", - "dev": true, - "dependencies": { - "semver": "^6.0.0" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/ng-packagr/node_modules/p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "dev": true, - "dependencies": { - "p-try": "^2.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/ng-packagr/node_modules/p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "dev": true, - "dependencies": { - "p-limit": "^2.2.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/ng-packagr/node_modules/path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/ng-packagr/node_modules/pkg-dir": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", - "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", - "dev": true, - "dependencies": { - "find-up": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/ng-packagr/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true, - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/nice-napi": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/nice-napi/-/nice-napi-1.0.2.tgz", - "integrity": "sha512-px/KnJAJZf5RuBGcfD+Sp2pAKq0ytz8j+1NehvgIGFkvtvFrDM3T8E4x/JJODXK9WZow8RRGrbA9QQ3hs+pDhA==", - "dev": true, - "hasInstallScript": true, - "optional": true, - "os": [ - "!win32" - ], - "dependencies": { - "node-addon-api": "^3.0.0", - "node-gyp-build": "^4.2.2" - } - }, - "node_modules/nice-napi/node_modules/node-addon-api": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-3.2.1.tgz", - "integrity": "sha512-mmcei9JghVNDYydghQmeDX8KoAm0FAiYyIcUt/N4nhyAipB17pllZQDOJD2fotxABnt4Mdz+dKTO7eftLg4d0A==", - "dev": true, - "optional": true - }, - "node_modules/no-case": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/no-case/-/no-case-3.0.4.tgz", - "integrity": "sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==", - "dev": true, - "dependencies": { - "lower-case": "^2.0.2", - "tslib": "^2.0.3" - } - }, - "node_modules/node-abort-controller": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/node-abort-controller/-/node-abort-controller-3.1.1.tgz", - "integrity": "sha512-AGK2yQKIjRuqnc6VkX2Xj5d+QW8xZ87pa1UK6yA6ouUyuxfHuMP6umE5QK7UmTeOAymo+Zx1Fxiuw9rVx8taHQ==", - "dev": true - }, - "node_modules/node-addon-api": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-6.1.0.tgz", - "integrity": "sha512-+eawOlIgy680F0kBzPUNFhMZGtJ1YmqM6l4+Crf4IkImjYrO/mqPwRMh352g23uIaQKFItcQ64I7KMaJxHgAVA==", - "dev": true - }, - "node_modules/node-forge": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-1.3.1.tgz", - "integrity": "sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA==", - "dev": true, - "engines": { - "node": ">= 6.13.0" - } - }, - "node_modules/node-gyp": { - "version": "10.2.0", - "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-10.2.0.tgz", - "integrity": "sha512-sp3FonBAaFe4aYTcFdZUn2NYkbP7xroPGYvQmP4Nl5PxamznItBnNCgjrVTKrEfQynInMsJvZrdmqUnysCJ8rw==", - "dev": true, - "dependencies": { - "env-paths": "^2.2.0", - "exponential-backoff": "^3.1.1", - "glob": "^10.3.10", - "graceful-fs": "^4.2.6", - "make-fetch-happen": "^13.0.0", - "nopt": "^7.0.0", - "proc-log": "^4.1.0", - "semver": "^7.3.5", - "tar": "^6.2.1", - "which": "^4.0.0" - }, - "bin": { - "node-gyp": "bin/node-gyp.js" - }, - "engines": { - "node": "^16.14.0 || >=18.0.0" - } - }, - "node_modules/node-gyp-build": { - "version": "4.8.2", - "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.8.2.tgz", - "integrity": "sha512-IRUxE4BVsHWXkV/SFOut4qTlagw2aM8T5/vnTsmrHJvVoKueJHRc/JaFND7QDDc61kLYUJ6qlZM3sqTSyx2dTw==", - "dev": true, - "optional": true, - "bin": { - "node-gyp-build": "bin.js", - "node-gyp-build-optional": "optional.js", - "node-gyp-build-test": "build-test.js" - } - }, - "node_modules/node-gyp-build-optional-packages": { - "version": "5.2.2", - "resolved": "https://registry.npmjs.org/node-gyp-build-optional-packages/-/node-gyp-build-optional-packages-5.2.2.tgz", - "integrity": "sha512-s+w+rBWnpTMwSFbaE0UXsRlg7hU4FjekKU4eyAih5T8nJuNZT1nNsskXpxmeqSK9UzkBl6UgRlnKc8hz8IEqOw==", - "dev": true, - "dependencies": { - "detect-libc": "^2.0.1" - }, - "bin": { - "node-gyp-build-optional-packages": "bin.js", - "node-gyp-build-optional-packages-optional": "optional.js", - "node-gyp-build-optional-packages-test": "build-test.js" - } - }, - "node_modules/node-gyp/node_modules/brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "dev": true, - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/node-gyp/node_modules/glob": { - "version": "10.4.5", - "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz", - "integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==", - "dev": true, - "dependencies": { - "foreground-child": "^3.1.0", - "jackspeak": "^3.1.2", - "minimatch": "^9.0.4", - "minipass": "^7.1.2", - "package-json-from-dist": "^1.0.0", - "path-scurry": "^1.11.1" - }, - "bin": { - "glob": "dist/esm/bin.mjs" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/node-gyp/node_modules/isexe": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-3.1.1.tgz", - "integrity": "sha512-LpB/54B+/2J5hqQ7imZHfdU31OlgQqx7ZicVlkm9kzg9/w8GKLEcFfJl/t7DCEDueOyBAD6zCCwTO6Fzs0NoEQ==", - "dev": true, - "engines": { - "node": ">=16" - } - }, - "node_modules/node-gyp/node_modules/minimatch": { - "version": "9.0.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", - "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", - "dev": true, - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/node-gyp/node_modules/which": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/which/-/which-4.0.0.tgz", - "integrity": "sha512-GlaYyEb07DPxYCKhKzplCWBJtvxZcZMrL+4UkrTSJHHPyZU4mYYTv3qaOe77H7EODLSSopAUFAc6W8U4yqvscg==", - "dev": true, - "dependencies": { - "isexe": "^3.1.1" - }, - "bin": { - "node-which": "bin/which.js" - }, - "engines": { - "node": "^16.13.0 || >=18.0.0" - } - }, - "node_modules/node-releases": { - "version": "2.0.18", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.18.tgz", - "integrity": "sha512-d9VeXT4SJ7ZeOqGX6R5EM022wpL+eWPooLI+5UpWn2jCT1aosUQEhQP214x33Wkwx3JQMvIm+tIoVOdodFS40g==", - "dev": true - }, - "node_modules/nopt": { - "version": "7.2.1", - "resolved": "https://registry.npmjs.org/nopt/-/nopt-7.2.1.tgz", - "integrity": "sha512-taM24ViiimT/XntxbPyJQzCG+p4EKOpgD3mxFwW38mGjVUrfERQOeY4EDHjdnptttfHuHQXFx+lTP08Q+mLa/w==", - "dev": true, - "dependencies": { - "abbrev": "^2.0.0" - }, - "bin": { - "nopt": "bin/nopt.js" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/normalize-package-data": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-6.0.2.tgz", - "integrity": "sha512-V6gygoYb/5EmNI+MEGrWkC+e6+Rr7mTmfHrxDbLzxQogBkgzo76rkok0Am6thgSF7Mv2nLOajAJj5vDJZEFn7g==", - "dev": true, - "dependencies": { - "hosted-git-info": "^7.0.0", - "semver": "^7.3.5", - "validate-npm-package-license": "^3.0.4" - }, - "engines": { - "node": "^16.14.0 || >=18.0.0" - } - }, - "node_modules/normalize-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/normalize-range": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz", - "integrity": "sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/npm-bundled": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/npm-bundled/-/npm-bundled-3.0.1.tgz", - "integrity": "sha512-+AvaheE/ww1JEwRHOrn4WHNzOxGtVp+adrg2AeZS/7KuxGUYFuBta98wYpfHBbJp6Tg6j1NKSEVHNcfZzJHQwQ==", - "dev": true, - "dependencies": { - "npm-normalize-package-bin": "^3.0.0" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/npm-install-checks": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/npm-install-checks/-/npm-install-checks-6.3.0.tgz", - "integrity": "sha512-W29RiK/xtpCGqn6f3ixfRYGk+zRyr+Ew9F2E20BfXxT5/euLdA/Nm7fO7OeTGuAmTs30cpgInyJ0cYe708YTZw==", - "dev": true, - "dependencies": { - "semver": "^7.1.1" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/npm-normalize-package-bin": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/npm-normalize-package-bin/-/npm-normalize-package-bin-3.0.1.tgz", - "integrity": "sha512-dMxCf+zZ+3zeQZXKxmyuCKlIDPGuv8EF940xbkC4kQVDTtqoh6rJFO+JTKSA6/Rwi0getWmtuy4Itup0AMcaDQ==", - "dev": true, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/npm-package-arg": { - "version": "11.0.3", - "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-11.0.3.tgz", - "integrity": "sha512-sHGJy8sOC1YraBywpzQlIKBE4pBbGbiF95U6Auspzyem956E0+FtDtsx1ZxlOJkQCZ1AFXAY/yuvtFYrOxF+Bw==", - "dev": true, - "dependencies": { - "hosted-git-info": "^7.0.0", - "proc-log": "^4.0.0", - "semver": "^7.3.5", - "validate-npm-package-name": "^5.0.0" - }, - "engines": { - "node": "^16.14.0 || >=18.0.0" - } - }, - "node_modules/npm-packlist": { - "version": "8.0.2", - "resolved": "https://registry.npmjs.org/npm-packlist/-/npm-packlist-8.0.2.tgz", - "integrity": "sha512-shYrPFIS/JLP4oQmAwDyk5HcyysKW8/JLTEA32S0Z5TzvpaeeX2yMFfoK1fjEBnCBvVyIB/Jj/GBFdm0wsgzbA==", - "dev": true, - "dependencies": { - "ignore-walk": "^6.0.4" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/npm-pick-manifest": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/npm-pick-manifest/-/npm-pick-manifest-9.1.0.tgz", - "integrity": "sha512-nkc+3pIIhqHVQr085X9d2JzPzLyjzQS96zbruppqC9aZRm/x8xx6xhI98gHtsfELP2bE+loHq8ZaHFHhe+NauA==", - "dev": true, - "dependencies": { - "npm-install-checks": "^6.0.0", - "npm-normalize-package-bin": "^3.0.0", - "npm-package-arg": "^11.0.0", - "semver": "^7.3.5" - }, - "engines": { - "node": "^16.14.0 || >=18.0.0" - } - }, - "node_modules/npm-registry-fetch": { - "version": "17.1.0", - "resolved": "https://registry.npmjs.org/npm-registry-fetch/-/npm-registry-fetch-17.1.0.tgz", - "integrity": "sha512-5+bKQRH0J1xG1uZ1zMNvxW0VEyoNWgJpY9UDuluPFLKDfJ9u2JmmjmTJV1srBGQOROfdBMiVvnH2Zvpbm+xkVA==", - "dev": true, - "dependencies": { - "@npmcli/redact": "^2.0.0", - "jsonparse": "^1.3.1", - "make-fetch-happen": "^13.0.0", - "minipass": "^7.0.2", - "minipass-fetch": "^3.0.0", - "minizlib": "^2.1.2", - "npm-package-arg": "^11.0.0", - "proc-log": "^4.0.0" - }, - "engines": { - "node": "^16.14.0 || >=18.0.0" - } - }, - "node_modules/npm-run-path": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", - "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", - "dev": true, - "dependencies": { - "path-key": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/nth-check": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz", - "integrity": "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==", - "dev": true, - "dependencies": { - "boolbase": "^1.0.0" - }, - "funding": { - "url": "https://github.com/fb55/nth-check?sponsor=1" - } - }, - "node_modules/nwsapi": { - "version": "2.2.12", - "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.12.tgz", - "integrity": "sha512-qXDmcVlZV4XRtKFzddidpfVP4oMSGhga+xdMc25mv8kaLUHtgzCDhUxkrN8exkGdTlLNaXj7CV3GtON7zuGZ+w==", - "dev": true - }, - "node_modules/object-assign": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", - "dev": true, - "optional": true, - "peer": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/object-inspect": { - "version": "1.13.2", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.2.tgz", - "integrity": "sha512-IRZSRuzJiynemAXPYtPe5BoI/RESNYR7TYm50MC5Mqbd3Jmw5y790sErYw3V6SryFJD64b74qQQs9wn5Bg/k3g==", - "dev": true, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/obuf": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/obuf/-/obuf-1.1.2.tgz", - "integrity": "sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==", - "dev": true - }, - "node_modules/on-finished": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", - "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", - "dev": true, - "dependencies": { - "ee-first": "1.1.1" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/on-headers": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.2.tgz", - "integrity": "sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==", - "dev": true, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", - "dev": true, - "optional": true, - "peer": true, - "dependencies": { - "wrappy": "1" - } - }, - "node_modules/onetime": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-7.0.0.tgz", - "integrity": "sha512-VXJjc87FScF88uafS3JllDgvAm+c/Slfz06lorj2uAY34rlUu0Nt+v8wreiImcrgAjjIHp1rXpTDlLOGw29WwQ==", - "dev": true, - "dependencies": { - "mimic-function": "^5.0.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/open": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/open/-/open-10.1.0.tgz", - "integrity": "sha512-mnkeQ1qP5Ue2wd+aivTD3NHd/lZ96Lu0jgf0pwktLPtx6cTZiH7tyeGRRHs0zX0rbrahXPnXlUnbeXyaBBuIaw==", - "dev": true, - "dependencies": { - "default-browser": "^5.2.1", - "define-lazy-prop": "^3.0.0", - "is-inside-container": "^1.0.0", - "is-wsl": "^3.1.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/optionator": { - "version": "0.9.4", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz", - "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==", - "dev": true, - "dependencies": { - "deep-is": "^0.1.3", - "fast-levenshtein": "^2.0.6", - "levn": "^0.4.1", - "prelude-ls": "^1.2.1", - "type-check": "^0.4.0", - "word-wrap": "^1.2.5" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/ora": { - "version": "5.4.1", - "resolved": "https://registry.npmjs.org/ora/-/ora-5.4.1.tgz", - "integrity": "sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==", - "dev": true, - "dependencies": { - "bl": "^4.1.0", - "chalk": "^4.1.0", - "cli-cursor": "^3.1.0", - "cli-spinners": "^2.5.0", - "is-interactive": "^1.0.0", - "is-unicode-supported": "^0.1.0", - "log-symbols": "^4.1.0", - "strip-ansi": "^6.0.0", - "wcwidth": "^1.0.1" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/ora/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/ora/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/ora/node_modules/cli-cursor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", - "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", - "dev": true, - "dependencies": { - "restore-cursor": "^3.1.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/ora/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/ora/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "node_modules/ora/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/ora/node_modules/onetime": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", - "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", - "dev": true, - "dependencies": { - "mimic-fn": "^2.1.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/ora/node_modules/restore-cursor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", - "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", - "dev": true, - "dependencies": { - "onetime": "^5.1.0", - "signal-exit": "^3.0.2" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/ora/node_modules/signal-exit": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", - "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", - "dev": true - }, - "node_modules/ora/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/ordered-binary": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/ordered-binary/-/ordered-binary-1.5.1.tgz", - "integrity": "sha512-5VyHfHY3cd0iza71JepYG50My+YUbrFtGoUz2ooEydPyPM7Aai/JW098juLr+RG6+rDJuzNNTsEQu2DZa1A41A==", - "dev": true - }, - "node_modules/os-tmpdir": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", - "integrity": "sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/p-limit": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-4.0.0.tgz", - "integrity": "sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ==", - "dev": true, - "dependencies": { - "yocto-queue": "^1.0.0" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/p-locate": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-6.0.0.tgz", - "integrity": "sha512-wPrq66Llhl7/4AGC6I+cqxT07LhXvWL08LNXz1fENOw0Ap4sRZZ/gZpTTJ5jpurzzzfS2W/Ge9BY3LgLjCShcw==", - "dev": true, - "dependencies": { - "p-limit": "^4.0.0" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/p-map": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz", - "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==", - "dev": true, - "dependencies": { - "aggregate-error": "^3.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/p-retry": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/p-retry/-/p-retry-6.2.0.tgz", - "integrity": "sha512-JA6nkq6hKyWLLasXQXUrO4z8BUZGUt/LjlJxx8Gb2+2ntodU/SS63YZ8b0LUTbQ8ZB9iwOfhEPhg4ykKnn2KsA==", - "dev": true, - "dependencies": { - "@types/retry": "0.12.2", - "is-network-error": "^1.0.0", - "retry": "^0.13.1" - }, - "engines": { - "node": ">=16.17" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/p-retry/node_modules/retry": { - "version": "0.13.1", - "resolved": "https://registry.npmjs.org/retry/-/retry-0.13.1.tgz", - "integrity": "sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==", - "dev": true, - "engines": { - "node": ">= 4" - } - }, - "node_modules/p-try": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/package-json-from-dist": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.0.tgz", - "integrity": "sha512-dATvCeZN/8wQsGywez1mzHtTlP22H8OEfPrVMLNr4/eGa+ijtLn/6M5f0dY8UKNrC2O9UCU6SSoG3qRKnt7STw==", - "dev": true - }, - "node_modules/pacote": { - "version": "18.0.6", - "resolved": "https://registry.npmjs.org/pacote/-/pacote-18.0.6.tgz", - "integrity": "sha512-+eK3G27SMwsB8kLIuj4h1FUhHtwiEUo21Tw8wNjmvdlpOEr613edv+8FUsTj/4F/VN5ywGE19X18N7CC2EJk6A==", - "dev": true, - "dependencies": { - "@npmcli/git": "^5.0.0", - "@npmcli/installed-package-contents": "^2.0.1", - "@npmcli/package-json": "^5.1.0", - "@npmcli/promise-spawn": "^7.0.0", - "@npmcli/run-script": "^8.0.0", - "cacache": "^18.0.0", - "fs-minipass": "^3.0.0", - "minipass": "^7.0.2", - "npm-package-arg": "^11.0.0", - "npm-packlist": "^8.0.0", - "npm-pick-manifest": "^9.0.0", - "npm-registry-fetch": "^17.0.0", - "proc-log": "^4.0.0", - "promise-retry": "^2.0.1", - "sigstore": "^2.2.0", - "ssri": "^10.0.0", - "tar": "^6.1.11" - }, - "bin": { - "pacote": "bin/index.js" - }, - "engines": { - "node": "^16.14.0 || >=18.0.0" - } - }, - "node_modules/param-case": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/param-case/-/param-case-3.0.4.tgz", - "integrity": "sha512-RXlj7zCYokReqWpOPH9oYivUzLYZ5vAPIfEmCTNViosC78F8F0H9y7T7gG2M39ymgutxF5gcFEsyZQSph9Bp3A==", - "dev": true, - "dependencies": { - "dot-case": "^3.0.4", - "tslib": "^2.0.3" - } - }, - "node_modules/parent-module": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", - "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", - "dev": true, - "dependencies": { - "callsites": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/parse-json": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", - "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", - "dev": true, - "dependencies": { - "@babel/code-frame": "^7.0.0", - "error-ex": "^1.3.1", - "json-parse-even-better-errors": "^2.3.0", - "lines-and-columns": "^1.1.6" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/parse-json/node_modules/json-parse-even-better-errors": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", - "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", - "dev": true - }, - "node_modules/parse-node-version": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/parse-node-version/-/parse-node-version-1.0.1.tgz", - "integrity": "sha512-3YHlOa/JgH6Mnpr05jP9eDG254US9ek25LyIxZlDItp2iJtwyaXQb57lBYLdT3MowkUFYEV2XXNAYIPlESvJlA==", - "dev": true, - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/parse5": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.1.2.tgz", - "integrity": "sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw==", - "dev": true, - "dependencies": { - "entities": "^4.4.0" - }, - "funding": { - "url": "https://github.com/inikulin/parse5?sponsor=1" - } - }, - "node_modules/parse5-html-rewriting-stream": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/parse5-html-rewriting-stream/-/parse5-html-rewriting-stream-7.0.0.tgz", - "integrity": "sha512-mazCyGWkmCRWDI15Zp+UiCqMp/0dgEmkZRvhlsqqKYr4SsVm/TvnSpD9fCvqCA2zoWJcfRym846ejWBBHRiYEg==", - "dev": true, - "dependencies": { - "entities": "^4.3.0", - "parse5": "^7.0.0", - "parse5-sax-parser": "^7.0.0" - }, - "funding": { - "url": "https://github.com/inikulin/parse5?sponsor=1" - } - }, - "node_modules/parse5-sax-parser": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/parse5-sax-parser/-/parse5-sax-parser-7.0.0.tgz", - "integrity": "sha512-5A+v2SNsq8T6/mG3ahcz8ZtQ0OUFTatxPbeidoMB7tkJSGDY3tdfl4MHovtLQHkEn5CGxijNWRQHhRQ6IRpXKg==", - "dev": true, - "dependencies": { - "parse5": "^7.0.0" - }, - "funding": { - "url": "https://github.com/inikulin/parse5?sponsor=1" - } - }, - "node_modules/parseurl": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", - "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", - "dev": true, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/pascal-case": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/pascal-case/-/pascal-case-3.1.2.tgz", - "integrity": "sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g==", - "dev": true, - "dependencies": { - "no-case": "^3.0.4", - "tslib": "^2.0.3" - } - }, - "node_modules/path-browserify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-1.0.1.tgz", - "integrity": "sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==", - "dev": true - }, - "node_modules/path-exists": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-5.0.0.tgz", - "integrity": "sha512-RjhtfwJOxzcFmNOi6ltcbcu4Iu+FL3zEj83dk4kAS+fVpTxXLO1b38RvJgT/0QwvV/L3aY9TAnyv0EOqW4GoMQ==", - "dev": true, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - } - }, - "node_modules/path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", - "dev": true, - "optional": true, - "peer": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/path-key": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/path-parse": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", - "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", - "dev": true - }, - "node_modules/path-scurry": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz", - "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==", - "dev": true, - "dependencies": { - "lru-cache": "^10.2.0", - "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" - }, - "engines": { - "node": ">=16 || 14 >=14.18" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/path-scurry/node_modules/lru-cache": { - "version": "10.4.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", - "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", - "dev": true - }, - "node_modules/path-to-regexp": { - "version": "0.1.10", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.10.tgz", - "integrity": "sha512-7lf7qcQidTku0Gu3YDPc8DJ1q7OOucfa/BSsIwjuh56VU7katFvuM8hULfkwB3Fns/rsVF7PwPKVw1sl5KQS9w==", - "dev": true - }, - "node_modules/path-type": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-5.0.0.tgz", - "integrity": "sha512-5HviZNaZcfqP95rwpv+1HDgUamezbqdSYTyzjTvwtJSnIH+3vnbmWsItli8OFEndS984VT55M3jduxZbX351gg==", - "dev": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/pathe": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/pathe/-/pathe-1.1.2.tgz", - "integrity": "sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ==", - "dev": true - }, - "node_modules/pathval": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/pathval/-/pathval-1.1.1.tgz", - "integrity": "sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==", - "dev": true, - "engines": { - "node": "*" - } - }, - "node_modules/picocolors": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.0.tgz", - "integrity": "sha512-TQ92mBOW0l3LeMeyLV6mzy/kWr8lkd/hp3mTg7wYK7zJhuBStmGMBG0BdeDZS/dZx1IukaX6Bk11zcln25o1Aw==", - "dev": true - }, - "node_modules/picomatch": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.2.tgz", - "integrity": "sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==", - "dev": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/pify": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", - "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", - "dev": true, - "optional": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/piscina": { - "version": "4.6.1", - "resolved": "https://registry.npmjs.org/piscina/-/piscina-4.6.1.tgz", - "integrity": "sha512-z30AwWGtQE+Apr+2WBZensP2lIvwoaMcOPkQlIEmSGMJNUvaYACylPYrQM6wSdUNJlnDVMSpLv7xTMJqlVshOA==", - "dev": true, - "optionalDependencies": { - "nice-napi": "^1.0.2" - } - }, - "node_modules/pkg-dir": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-7.0.0.tgz", - "integrity": "sha512-Ie9z/WINcxxLp27BKOCHGde4ITq9UklYKDzVo1nhk5sqGEXU3FpkwP5GM2voTGJkGd9B3Otl+Q4uwSOeSUtOBA==", - "dev": true, - "dependencies": { - "find-up": "^6.3.0" - }, - "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/pkg-types": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/pkg-types/-/pkg-types-1.2.0.tgz", - "integrity": "sha512-+ifYuSSqOQ8CqP4MbZA5hDpb97n3E8SVWdJe+Wms9kj745lmd3b7EZJiqvmLwAlmRfjrI7Hi5z3kdBJ93lFNPA==", - "dev": true, - "dependencies": { - "confbox": "^0.1.7", - "mlly": "^1.7.1", - "pathe": "^1.1.2" - } - }, - "node_modules/polished": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/polished/-/polished-4.3.1.tgz", - "integrity": "sha512-OBatVyC/N7SCW/FaDHrSd+vn0o5cS855TOmYi4OkdWUMSJCET/xip//ch8xGUvtr3i44X9LVyWwQlRMTN3pwSA==", - "dev": true, - "dependencies": { - "@babel/runtime": "^7.17.8" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/possible-typed-array-names": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.0.0.tgz", - "integrity": "sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q==", - "dev": true, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/postcss": { - "version": "8.4.41", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.41.tgz", - "integrity": "sha512-TesUflQ0WKZqAvg52PWL6kHgLKP6xB6heTOdoYM0Wt2UHyxNa4K25EZZMgKns3BH1RLVbZCREPpLY0rhnNoHVQ==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/postcss" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "dependencies": { - "nanoid": "^3.3.7", - "picocolors": "^1.0.1", - "source-map-js": "^1.2.0" - }, - "engines": { - "node": "^10 || ^12 || >=14" - } - }, - "node_modules/postcss-loader": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/postcss-loader/-/postcss-loader-8.1.1.tgz", - "integrity": "sha512-0IeqyAsG6tYiDRCYKQJLAmgQr47DX6N7sFSWvQxt6AcupX8DIdmykuk/o/tx0Lze3ErGHJEp5OSRxrelC6+NdQ==", - "dev": true, - "dependencies": { - "cosmiconfig": "^9.0.0", - "jiti": "^1.20.0", - "semver": "^7.5.4" - }, - "engines": { - "node": ">= 18.12.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "@rspack/core": "0.x || 1.x", - "postcss": "^7.0.0 || ^8.0.1", - "webpack": "^5.0.0" - }, - "peerDependenciesMeta": { - "@rspack/core": { - "optional": true - }, - "webpack": { - "optional": true - } - } - }, - "node_modules/postcss-media-query-parser": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/postcss-media-query-parser/-/postcss-media-query-parser-0.2.3.tgz", - "integrity": "sha512-3sOlxmbKcSHMjlUXQZKQ06jOswE7oVkXPxmZdoB1r5l0q6gTFTQSHxNxOrCccElbW7dxNytifNEo8qidX2Vsig==", - "dev": true - }, - "node_modules/postcss-modules-extract-imports": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-3.1.0.tgz", - "integrity": "sha512-k3kNe0aNFQDAZGbin48pL2VNidTF0w4/eASDsxlyspobzU3wZQLOGj7L9gfRe0Jo9/4uud09DsjFNH7winGv8Q==", - "dev": true, - "engines": { - "node": "^10 || ^12 || >= 14" - }, - "peerDependencies": { - "postcss": "^8.1.0" - } - }, - "node_modules/postcss-modules-local-by-default": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.0.5.tgz", - "integrity": "sha512-6MieY7sIfTK0hYfafw1OMEG+2bg8Q1ocHCpoWLqOKj3JXlKu4G7btkmM/B7lFubYkYWmRSPLZi5chid63ZaZYw==", - "dev": true, - "dependencies": { - "icss-utils": "^5.0.0", - "postcss-selector-parser": "^6.0.2", - "postcss-value-parser": "^4.1.0" - }, - "engines": { - "node": "^10 || ^12 || >= 14" - }, - "peerDependencies": { - "postcss": "^8.1.0" - } - }, - "node_modules/postcss-modules-scope": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-3.2.0.tgz", - "integrity": "sha512-oq+g1ssrsZOsx9M96c5w8laRmvEu9C3adDSjI8oTcbfkrTE8hx/zfyobUoWIxaKPO8bt6S62kxpw5GqypEw1QQ==", - "dev": true, - "dependencies": { - "postcss-selector-parser": "^6.0.4" - }, - "engines": { - "node": "^10 || ^12 || >= 14" - }, - "peerDependencies": { - "postcss": "^8.1.0" - } - }, - "node_modules/postcss-modules-values": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/postcss-modules-values/-/postcss-modules-values-4.0.0.tgz", - "integrity": "sha512-RDxHkAiEGI78gS2ofyvCsu7iycRv7oqw5xMWn9iMoR0N/7mf9D50ecQqUo5BZ9Zh2vH4bCUR/ktCqbB9m8vJjQ==", - "dev": true, - "dependencies": { - "icss-utils": "^5.0.0" - }, - "engines": { - "node": "^10 || ^12 || >= 14" - }, - "peerDependencies": { - "postcss": "^8.1.0" - } - }, - "node_modules/postcss-selector-parser": { - "version": "6.1.2", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.1.2.tgz", - "integrity": "sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==", - "dev": true, - "dependencies": { - "cssesc": "^3.0.0", - "util-deprecate": "^1.0.2" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/postcss-value-parser": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", - "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", - "dev": true - }, - "node_modules/prelude-ls": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", - "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", - "dev": true, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/prettier": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.3.3.tgz", - "integrity": "sha512-i2tDNA0O5IrMO757lfrdQZCc2jPNDVntV0m/+4whiDfWaTKfMNgR7Qz0NAeGz/nRqF4m5/6CLzbP4/liHt12Ew==", - "dev": true, - "bin": { - "prettier": "bin/prettier.cjs" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/prettier/prettier?sponsor=1" - } - }, - "node_modules/prettier-linter-helpers": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/prettier-linter-helpers/-/prettier-linter-helpers-1.0.0.tgz", - "integrity": "sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==", - "dev": true, - "dependencies": { - "fast-diff": "^1.1.2" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/pretty-error": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/pretty-error/-/pretty-error-4.0.0.tgz", - "integrity": "sha512-AoJ5YMAcXKYxKhuJGdcvse+Voc6v1RgnsR3nWcYU7q4t6z0Q6T86sv5Zq8VIRbOWWFpvdGE83LtdSMNd+6Y0xw==", - "dev": true, - "dependencies": { - "lodash": "^4.17.20", - "renderkid": "^3.0.0" - } - }, - "node_modules/pretty-format": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", - "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", - "dev": true, - "dependencies": { - "@jest/schemas": "^29.6.3", - "ansi-styles": "^5.0.0", - "react-is": "^18.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/pretty-format/node_modules/ansi-styles": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", - "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/prismjs": { - "version": "1.29.0", - "resolved": "https://registry.npmjs.org/prismjs/-/prismjs-1.29.0.tgz", - "integrity": "sha512-Kx/1w86q/epKcmte75LNrEoT+lX8pBpavuAbvJWRXar7Hz8jrtF+e3vY751p0R8H9HdArwaCTNDDzHg/ScJK1Q==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/proc-log": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/proc-log/-/proc-log-4.2.0.tgz", - "integrity": "sha512-g8+OnU/L2v+wyiVK+D5fA34J7EH8jZ8DDlvwhRCMxmMj7UCBvxiO1mGeN+36JXIKF4zevU4kRBd8lVgG9vLelA==", - "dev": true, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/process": { - "version": "0.11.10", - "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", - "integrity": "sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==", - "dev": true, - "engines": { - "node": ">= 0.6.0" - } - }, - "node_modules/process-nextick-args": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", - "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", - "dev": true - }, - "node_modules/promise-inflight": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/promise-inflight/-/promise-inflight-1.0.1.tgz", - "integrity": "sha512-6zWPyEOFaQBJYcGMHBKTKJ3u6TBsnMFOIZSa6ce1e/ZrrsOlnHRHbabMjLiBYKp+n44X9eUI6VUPaukCXHuG4g==", - "dev": true - }, - "node_modules/promise-retry": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/promise-retry/-/promise-retry-2.0.1.tgz", - "integrity": "sha512-y+WKFlBR8BGXnsNlIHFGPZmyDf3DFMoLhaflAnyZgV6rG6xu+JwesTo2Q9R6XwYmtmwAFCkAk3e35jEdoeh/3g==", - "dev": true, - "dependencies": { - "err-code": "^2.0.2", - "retry": "^0.12.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/proxy-addr": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", - "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", - "dev": true, - "dependencies": { - "forwarded": "0.2.0", - "ipaddr.js": "1.9.1" - }, - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/proxy-addr/node_modules/ipaddr.js": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", - "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", - "dev": true, - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/prr": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz", - "integrity": "sha512-yPw4Sng1gWghHQWj0B3ZggWUm4qVbPwPFcRG8KyxiU7J2OHFSoEHKS+EZ3fv5l1t9CyCiop6l/ZYeWbrgoQejw==", - "dev": true, - "optional": true - }, - "node_modules/psl": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/psl/-/psl-1.9.0.tgz", - "integrity": "sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==", - "dev": true - }, - "node_modules/punycode": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", - "integrity": "sha512-jmYNElW7yvO7TV33CjSmvSiE2yco3bV2czu/OzDKdMNVZQWfxCblURLhf+47syQRBntjfLdd/H0egrzIG+oaFQ==", - "dev": true - }, - "node_modules/qjobs": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/qjobs/-/qjobs-1.2.0.tgz", - "integrity": "sha512-8YOJEHtxpySA3fFDyCRxA+UUV+fA+rTWnuWvylOK/NCjhY+b4ocCtmu8TtsWb+mYeU+GCHf/S66KZF/AsteKHg==", - "dev": true, - "optional": true, - "peer": true, - "engines": { - "node": ">=0.9" - } - }, - "node_modules/qs": { - "version": "6.13.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.13.0.tgz", - "integrity": "sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg==", - "dev": true, - "dependencies": { - "side-channel": "^1.0.6" - }, - "engines": { - "node": ">=0.6" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/querystringify": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.2.0.tgz", - "integrity": "sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==", - "dev": true - }, - "node_modules/queue-microtask": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", - "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, - "node_modules/randombytes": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", - "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", - "dev": true, - "dependencies": { - "safe-buffer": "^5.1.0" - } - }, - "node_modules/range-parser": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", - "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", - "dev": true, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/raw-body": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.2.tgz", - "integrity": "sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==", - "dev": true, - "dependencies": { - "bytes": "3.1.2", - "http-errors": "2.0.0", - "iconv-lite": "0.4.24", - "unpipe": "1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/react": { - "version": "18.3.1", - "resolved": "https://registry.npmjs.org/react/-/react-18.3.1.tgz", - "integrity": "sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==", - "dev": true, - "dependencies": { - "loose-envify": "^1.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/react-colorful": { - "version": "5.6.1", - "resolved": "https://registry.npmjs.org/react-colorful/-/react-colorful-5.6.1.tgz", - "integrity": "sha512-1exovf0uGTGyq5mXQT0zgQ80uvj2PCwvF8zY1RN9/vbJVSjSo3fsB/4L3ObbF7u70NduSiK4xu4Y6q1MHoUGEw==", - "dev": true, - "peerDependencies": { - "react": ">=16.8.0", - "react-dom": ">=16.8.0" - } - }, - "node_modules/react-dom": { - "version": "18.3.1", - "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.3.1.tgz", - "integrity": "sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==", - "dev": true, - "dependencies": { - "loose-envify": "^1.1.0", - "scheduler": "^0.23.2" - }, - "peerDependencies": { - "react": "^18.3.1" - } - }, - "node_modules/react-is": { - "version": "18.3.1", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", - "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==", - "dev": true - }, - "node_modules/readable-stream": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", - "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", - "dev": true, - "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/readdirp": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", - "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", - "dev": true, - "dependencies": { - "picomatch": "^2.2.1" - }, - "engines": { - "node": ">=8.10.0" - } - }, - "node_modules/readdirp/node_modules/picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", - "dev": true, - "engines": { - "node": ">=8.6" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/recast": { - "version": "0.23.9", - "resolved": "https://registry.npmjs.org/recast/-/recast-0.23.9.tgz", - "integrity": "sha512-Hx/BGIbwj+Des3+xy5uAtAbdCyqK9y9wbBcDFDYanLS9JnMqf7OeF87HQwUimE87OEc72mr6tkKUKMBBL+hF9Q==", - "dev": true, - "dependencies": { - "ast-types": "^0.16.1", - "esprima": "~4.0.0", - "source-map": "~0.6.1", - "tiny-invariant": "^1.3.3", - "tslib": "^2.0.1" - }, - "engines": { - "node": ">= 4" - } - }, - "node_modules/recast/node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/reflect-metadata": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/reflect-metadata/-/reflect-metadata-0.2.2.tgz", - "integrity": "sha512-urBwgfrvVP/eAyXx4hluJivBKzuEbSQs9rKWCrCkbSxNv8mxPcUZKeuoF3Uy4mJl3Lwprp6yy5/39VWigZ4K6Q==", - "dev": true - }, - "node_modules/regenerate": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz", - "integrity": "sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==", - "dev": true - }, - "node_modules/regenerate-unicode-properties": { - "version": "10.2.0", - "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-10.2.0.tgz", - "integrity": "sha512-DqHn3DwbmmPVzeKj9woBadqmXxLvQoQIwu7nopMc72ztvxVmVk2SBhSnx67zuye5TP+lJsb/TBQsjLKhnDf3MA==", - "dev": true, - "dependencies": { - "regenerate": "^1.4.2" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/regenerator-runtime": { - "version": "0.14.1", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz", - "integrity": "sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==", - "dev": true - }, - "node_modules/regenerator-transform": { - "version": "0.15.2", - "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.15.2.tgz", - "integrity": "sha512-hfMp2BoF0qOk3uc5V20ALGDS2ddjQaLrdl7xrGXvAIow7qeWRM2VA2HuCHkUKk9slq3VwEwLNK3DFBqDfPGYtg==", - "dev": true, - "dependencies": { - "@babel/runtime": "^7.8.4" - } - }, - "node_modules/regex-parser": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/regex-parser/-/regex-parser-2.3.0.tgz", - "integrity": "sha512-TVILVSz2jY5D47F4mA4MppkBrafEaiUWJO/TcZHEIuI13AqoZMkK1WMA4Om1YkYbTx+9Ki1/tSUXbceyr9saRg==", - "dev": true - }, - "node_modules/regexpu-core": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-5.3.2.tgz", - "integrity": "sha512-RAM5FlZz+Lhmo7db9L298p2vHP5ZywrVXmVXpmAD9GuL5MPH6t9ROw1iA/wfHkQ76Qe7AaPF0nGuim96/IrQMQ==", - "dev": true, - "dependencies": { - "@babel/regjsgen": "^0.8.0", - "regenerate": "^1.4.2", - "regenerate-unicode-properties": "^10.1.0", - "regjsparser": "^0.9.1", - "unicode-match-property-ecmascript": "^2.0.0", - "unicode-match-property-value-ecmascript": "^2.1.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/regjsparser": { - "version": "0.9.1", - "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.9.1.tgz", - "integrity": "sha512-dQUtn90WanSNl+7mQKcXAgZxvUe7Z0SqXlgzv0za4LwiUhyzBC58yQO3liFoUgu8GiJVInAhJjkj1N0EtQ5nkQ==", - "dev": true, - "dependencies": { - "jsesc": "~0.5.0" - }, - "bin": { - "regjsparser": "bin/parser" - } - }, - "node_modules/regjsparser/node_modules/jsesc": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", - "integrity": "sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA==", - "dev": true, - "bin": { - "jsesc": "bin/jsesc" - } - }, - "node_modules/rehype-external-links": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/rehype-external-links/-/rehype-external-links-3.0.0.tgz", - "integrity": "sha512-yp+e5N9V3C6bwBeAC4n796kc86M4gJCdlVhiMTxIrJG5UHDMh+PJANf9heqORJbt1nrCbDwIlAZKjANIaVBbvw==", - "dev": true, - "dependencies": { - "@types/hast": "^3.0.0", - "@ungap/structured-clone": "^1.0.0", - "hast-util-is-element": "^3.0.0", - "is-absolute-url": "^4.0.0", - "space-separated-tokens": "^2.0.0", - "unist-util-visit": "^5.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/rehype-slug": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/rehype-slug/-/rehype-slug-6.0.0.tgz", - "integrity": "sha512-lWyvf/jwu+oS5+hL5eClVd3hNdmwM1kAC0BUvEGD19pajQMIzcNUd/k9GsfQ+FfECvX+JE+e9/btsKH0EjJT6A==", - "dev": true, - "dependencies": { - "@types/hast": "^3.0.0", - "github-slugger": "^2.0.0", - "hast-util-heading-rank": "^3.0.0", - "hast-util-to-string": "^3.0.0", - "unist-util-visit": "^5.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/relateurl": { - "version": "0.2.7", - "resolved": "https://registry.npmjs.org/relateurl/-/relateurl-0.2.7.tgz", - "integrity": "sha512-G08Dxvm4iDN3MLM0EsP62EDV9IuhXPR6blNz6Utcp7zyV3tr4HVNINt6MpaRWbxoOHT3Q7YN2P+jaHX8vUbgog==", - "dev": true, - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/renderkid": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/renderkid/-/renderkid-3.0.0.tgz", - "integrity": "sha512-q/7VIQA8lmM1hF+jn+sFSPWGlMkSAeNYcPLmDQx2zzuiDfaLrOmumR8iaUKlenFgh0XRPIUeSPlH3A+AW3Z5pg==", - "dev": true, - "dependencies": { - "css-select": "^4.1.3", - "dom-converter": "^0.2.0", - "htmlparser2": "^6.1.0", - "lodash": "^4.17.21", - "strip-ansi": "^6.0.1" - } - }, - "node_modules/renderkid/node_modules/css-select": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/css-select/-/css-select-4.3.0.tgz", - "integrity": "sha512-wPpOYtnsVontu2mODhA19JrqWxNsfdatRKd64kmpRbQgh1KtItko5sTnEpPdpSaJszTOhEMlF/RPz28qj4HqhQ==", - "dev": true, - "dependencies": { - "boolbase": "^1.0.0", - "css-what": "^6.0.1", - "domhandler": "^4.3.1", - "domutils": "^2.8.0", - "nth-check": "^2.0.1" - }, - "funding": { - "url": "https://github.com/sponsors/fb55" - } - }, - "node_modules/renderkid/node_modules/dom-serializer": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.4.1.tgz", - "integrity": "sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag==", - "dev": true, - "dependencies": { - "domelementtype": "^2.0.1", - "domhandler": "^4.2.0", - "entities": "^2.0.0" - }, - "funding": { - "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" - } - }, - "node_modules/renderkid/node_modules/domhandler": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.3.1.tgz", - "integrity": "sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==", - "dev": true, - "dependencies": { - "domelementtype": "^2.2.0" - }, - "engines": { - "node": ">= 4" - }, - "funding": { - "url": "https://github.com/fb55/domhandler?sponsor=1" - } - }, - "node_modules/renderkid/node_modules/domutils": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.8.0.tgz", - "integrity": "sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==", - "dev": true, - "dependencies": { - "dom-serializer": "^1.0.1", - "domelementtype": "^2.2.0", - "domhandler": "^4.2.0" - }, - "funding": { - "url": "https://github.com/fb55/domutils?sponsor=1" - } - }, - "node_modules/renderkid/node_modules/entities": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", - "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==", - "dev": true, - "funding": { - "url": "https://github.com/fb55/entities?sponsor=1" - } - }, - "node_modules/renderkid/node_modules/htmlparser2": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-6.1.0.tgz", - "integrity": "sha512-gyyPk6rgonLFEDGoeRgQNaEUvdJ4ktTmmUh/h2t7s+M8oPpIPxgNACWa+6ESR57kXstwqPiCut0V8NRpcwgU7A==", - "dev": true, - "funding": [ - "https://github.com/fb55/htmlparser2?sponsor=1", - { - "type": "github", - "url": "https://github.com/sponsors/fb55" - } - ], - "dependencies": { - "domelementtype": "^2.0.1", - "domhandler": "^4.0.0", - "domutils": "^2.5.2", - "entities": "^2.0.0" - } - }, - "node_modules/require-directory": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/require-from-string": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", - "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/requireindex": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/requireindex/-/requireindex-1.2.0.tgz", - "integrity": "sha512-L9jEkOi3ASd9PYit2cwRfyppc9NoABujTP8/5gFcbERmo5jUoAKovIC3fsF17pkTnGsrByysqX+Kxd2OTNI1ww==", - "dev": true, - "engines": { - "node": ">=0.10.5" - } - }, - "node_modules/requires-port": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", - "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==", - "dev": true - }, - "node_modules/resolve": { - "version": "1.22.8", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", - "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==", - "dev": true, - "dependencies": { - "is-core-module": "^2.13.0", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" - }, - "bin": { - "resolve": "bin/resolve" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/resolve-from": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", - "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/resolve-url-loader": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/resolve-url-loader/-/resolve-url-loader-5.0.0.tgz", - "integrity": "sha512-uZtduh8/8srhBoMx//5bwqjQ+rfYOUq8zC9NrMUGtjBiGTtFJM42s58/36+hTqeqINcnYe08Nj3LkK9lW4N8Xg==", - "dev": true, - "dependencies": { - "adjust-sourcemap-loader": "^4.0.0", - "convert-source-map": "^1.7.0", - "loader-utils": "^2.0.0", - "postcss": "^8.2.14", - "source-map": "0.6.1" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/resolve-url-loader/node_modules/loader-utils": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.4.tgz", - "integrity": "sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw==", - "dev": true, - "dependencies": { - "big.js": "^5.2.2", - "emojis-list": "^3.0.0", - "json5": "^2.1.2" - }, - "engines": { - "node": ">=8.9.0" - } - }, - "node_modules/resolve-url-loader/node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/restore-cursor": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-5.1.0.tgz", - "integrity": "sha512-oMA2dcrw6u0YfxJQXm342bFKX/E4sG9rbTzO9ptUcR/e8A33cHuvStiYOwH7fszkZlZ1z/ta9AAoPk2F4qIOHA==", - "dev": true, - "dependencies": { - "onetime": "^7.0.0", - "signal-exit": "^4.1.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/retry": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz", - "integrity": "sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow==", - "dev": true, - "engines": { - "node": ">= 4" - } - }, - "node_modules/reusify": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", - "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", - "dev": true, - "engines": { - "iojs": ">=1.0.0", - "node": ">=0.10.0" - } - }, - "node_modules/rfdc": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.4.1.tgz", - "integrity": "sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA==", - "dev": true - }, - "node_modules/rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "deprecated": "Rimraf versions prior to v4 are no longer supported", - "dev": true, - "optional": true, - "peer": true, - "dependencies": { - "glob": "^7.1.3" - }, - "bin": { - "rimraf": "bin.js" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/rollup": { - "version": "4.20.0", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.20.0.tgz", - "integrity": "sha512-6rbWBChcnSGzIlXeIdNIZTopKYad8ZG8ajhl78lGRLsI2rX8IkaotQhVas2Ma+GPxJav19wrSzvRvuiv0YKzWw==", - "dev": true, - "dependencies": { - "@types/estree": "1.0.5" - }, - "bin": { - "rollup": "dist/bin/rollup" - }, - "engines": { - "node": ">=18.0.0", - "npm": ">=8.0.0" - }, - "optionalDependencies": { - "@rollup/rollup-android-arm-eabi": "4.20.0", - "@rollup/rollup-android-arm64": "4.20.0", - "@rollup/rollup-darwin-arm64": "4.20.0", - "@rollup/rollup-darwin-x64": "4.20.0", - "@rollup/rollup-linux-arm-gnueabihf": "4.20.0", - "@rollup/rollup-linux-arm-musleabihf": "4.20.0", - "@rollup/rollup-linux-arm64-gnu": "4.20.0", - "@rollup/rollup-linux-arm64-musl": "4.20.0", - "@rollup/rollup-linux-powerpc64le-gnu": "4.20.0", - "@rollup/rollup-linux-riscv64-gnu": "4.20.0", - "@rollup/rollup-linux-s390x-gnu": "4.20.0", - "@rollup/rollup-linux-x64-gnu": "4.20.0", - "@rollup/rollup-linux-x64-musl": "4.20.0", - "@rollup/rollup-win32-arm64-msvc": "4.20.0", - "@rollup/rollup-win32-ia32-msvc": "4.20.0", - "@rollup/rollup-win32-x64-msvc": "4.20.0", - "fsevents": "~2.3.2" - } - }, - "node_modules/rollup/node_modules/@types/estree": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.5.tgz", - "integrity": "sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==", - "dev": true - }, - "node_modules/rrweb-cssom": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/rrweb-cssom/-/rrweb-cssom-0.6.0.tgz", - "integrity": "sha512-APM0Gt1KoXBz0iIkkdB/kfvGOwC4UuJFeG/c+yV7wSc7q96cG/kJ0HiYCnzivD9SB53cLV1MlHFNfOuPaadYSw==", - "dev": true - }, - "node_modules/run-applescript": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/run-applescript/-/run-applescript-7.0.0.tgz", - "integrity": "sha512-9by4Ij99JUr/MCFBUkDKLWK3G9HVXmabKz9U5MlIAIuvuzkiOicRYs8XJLxX+xahD+mLiiCYDqF9dKAgtzKP1A==", - "dev": true, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/run-parallel": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", - "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "dependencies": { - "queue-microtask": "^1.2.2" - } - }, - "node_modules/rxjs": { - "version": "7.8.1", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.1.tgz", - "integrity": "sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==", - "dev": true, - "dependencies": { - "tslib": "^2.1.0" - } - }, - "node_modules/safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, - "node_modules/safer-buffer": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", - "dev": true - }, - "node_modules/sass": { - "version": "1.77.6", - "resolved": "https://registry.npmjs.org/sass/-/sass-1.77.6.tgz", - "integrity": "sha512-ByXE1oLD79GVq9Ht1PeHWCPMPB8XHpBuz1r85oByKHjZY6qV6rWnQovQzXJXuQ/XyE1Oj3iPk3lo28uzaRA2/Q==", - "dev": true, - "dependencies": { - "chokidar": ">=3.0.0 <4.0.0", - "immutable": "^4.0.0", - "source-map-js": ">=0.6.2 <2.0.0" - }, - "bin": { - "sass": "sass.js" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/sass-loader": { - "version": "16.0.0", - "resolved": "https://registry.npmjs.org/sass-loader/-/sass-loader-16.0.0.tgz", - "integrity": "sha512-n13Z+3rU9A177dk4888czcVFiC8CL9dii4qpXWUg3YIIgZEvi9TCFKjOQcbK0kJM7DJu9VucrZFddvNfYCPwtw==", - "dev": true, - "dependencies": { - "neo-async": "^2.6.2" - }, - "engines": { - "node": ">= 18.12.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "@rspack/core": "0.x || 1.x", - "node-sass": "^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0 || ^9.0.0", - "sass": "^1.3.0", - "sass-embedded": "*", - "webpack": "^5.0.0" - }, - "peerDependenciesMeta": { - "@rspack/core": { - "optional": true - }, - "node-sass": { - "optional": true - }, - "sass": { - "optional": true - }, - "sass-embedded": { - "optional": true - }, - "webpack": { - "optional": true - } - } - }, - "node_modules/sax": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/sax/-/sax-1.4.1.tgz", - "integrity": "sha512-+aWOz7yVScEGoKNd4PA10LZ8sk0A/z5+nXQG5giUO5rprX9jgYsTdov9qCchZiPIZezbZH+jRut8nPodFAX4Jg==", - "dev": true, - "optional": true - }, - "node_modules/saxes": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/saxes/-/saxes-6.0.0.tgz", - "integrity": "sha512-xAg7SOnEhrm5zI3puOOKyy1OMcMlIJZYNJY7xLBwSze0UjhPLnWfj2GF2EpT0jmzaJKIWKHLsaSSajf35bcYnA==", - "dev": true, - "dependencies": { - "xmlchars": "^2.2.0" - }, - "engines": { - "node": ">=v12.22.7" - } - }, - "node_modules/scheduler": { - "version": "0.23.2", - "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.2.tgz", - "integrity": "sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ==", - "dev": true, - "dependencies": { - "loose-envify": "^1.1.0" - } - }, - "node_modules/schema-utils": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.2.0.tgz", - "integrity": "sha512-L0jRsrPpjdckP3oPug3/VxNKt2trR8TcabrM6FOAAlvC/9Phcmm+cuAgTlxBqdBR1WJx7Naj9WHw+aOmheSVbw==", - "dev": true, - "dependencies": { - "@types/json-schema": "^7.0.9", - "ajv": "^8.9.0", - "ajv-formats": "^2.1.1", - "ajv-keywords": "^5.1.0" - }, - "engines": { - "node": ">= 12.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - } - }, - "node_modules/schema-utils/node_modules/ajv-formats": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.1.tgz", - "integrity": "sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==", - "dev": true, - "dependencies": { - "ajv": "^8.0.0" - }, - "peerDependencies": { - "ajv": "^8.0.0" - }, - "peerDependenciesMeta": { - "ajv": { - "optional": true - } - } - }, - "node_modules/select-hose": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/select-hose/-/select-hose-2.0.0.tgz", - "integrity": "sha512-mEugaLK+YfkijB4fx0e6kImuJdCIt2LxCRcbEYPqRGCs4F2ogyfZU5IAZRdjCP8JPq2AtdNoC/Dux63d9Kiryg==", - "dev": true - }, - "node_modules/selfsigned": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-2.4.1.tgz", - "integrity": "sha512-th5B4L2U+eGLq1TVh7zNRGBapioSORUeymIydxgFpwww9d2qyKvtuPU2jJuHvYAwwqi2Y596QBL3eEqcPEYL8Q==", - "dev": true, - "dependencies": { - "@types/node-forge": "^1.3.0", - "node-forge": "^1" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/semver": { - "version": "7.6.3", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", - "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", - "dev": true, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/send": { - "version": "0.19.0", - "resolved": "https://registry.npmjs.org/send/-/send-0.19.0.tgz", - "integrity": "sha512-dW41u5VfLXu8SJh5bwRmyYUbAoSB3c9uQh6L8h/KtsFREPWpbX1lrljJo186Jc4nmci/sGUZ9a0a0J2zgfq2hw==", - "dev": true, - "dependencies": { - "debug": "2.6.9", - "depd": "2.0.0", - "destroy": "1.2.0", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "etag": "~1.8.1", - "fresh": "0.5.2", - "http-errors": "2.0.0", - "mime": "1.6.0", - "ms": "2.1.3", - "on-finished": "2.4.1", - "range-parser": "~1.2.1", - "statuses": "2.0.1" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/send/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/send/node_modules/debug/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "dev": true - }, - "node_modules/send/node_modules/mime": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", - "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", - "dev": true, - "bin": { - "mime": "cli.js" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/send/node_modules/statuses": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", - "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", - "dev": true, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/serialize-javascript": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.2.tgz", - "integrity": "sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==", - "dev": true, - "dependencies": { - "randombytes": "^2.1.0" - } - }, - "node_modules/serve-index": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/serve-index/-/serve-index-1.9.1.tgz", - "integrity": "sha512-pXHfKNP4qujrtteMrSBb0rc8HJ9Ms/GrXwcUtUtD5s4ewDJI8bT3Cz2zTVRMKtri49pLx2e0Ya8ziP5Ya2pZZw==", - "dev": true, - "dependencies": { - "accepts": "~1.3.4", - "batch": "0.6.1", - "debug": "2.6.9", - "escape-html": "~1.0.3", - "http-errors": "~1.6.2", - "mime-types": "~2.1.17", - "parseurl": "~1.3.2" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/serve-index/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/serve-index/node_modules/depd": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", - "integrity": "sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==", - "dev": true, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/serve-index/node_modules/http-errors": { - "version": "1.6.3", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", - "integrity": "sha512-lks+lVC8dgGyh97jxvxeYTWQFvh4uw4yC12gVl63Cg30sjPX4wuGcdkICVXDAESr6OJGjqGA8Iz5mkeN6zlD7A==", - "dev": true, - "dependencies": { - "depd": "~1.1.2", - "inherits": "2.0.3", - "setprototypeof": "1.1.0", - "statuses": ">= 1.4.0 < 2" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/serve-index/node_modules/inherits": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw==", - "dev": true - }, - "node_modules/serve-index/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "dev": true - }, - "node_modules/serve-index/node_modules/setprototypeof": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", - "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==", - "dev": true - }, - "node_modules/serve-static": { - "version": "1.16.2", - "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.16.2.tgz", - "integrity": "sha512-VqpjJZKadQB/PEbEwvFdO43Ax5dFBZ2UECszz8bQ7pi7wt//PWe1P6MN7eCnjsatYtBT6EuiClbjSWP2WrIoTw==", - "dev": true, - "dependencies": { - "encodeurl": "~2.0.0", - "escape-html": "~1.0.3", - "parseurl": "~1.3.3", - "send": "0.19.0" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/serve-static/node_modules/encodeurl": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz", - "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==", - "dev": true, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/set-function-length": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", - "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==", - "dev": true, - "dependencies": { - "define-data-property": "^1.1.4", - "es-errors": "^1.3.0", - "function-bind": "^1.1.2", - "get-intrinsic": "^1.2.4", - "gopd": "^1.0.1", - "has-property-descriptors": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/setprototypeof": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", - "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", - "dev": true - }, - "node_modules/shallow-clone": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/shallow-clone/-/shallow-clone-3.0.1.tgz", - "integrity": "sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==", - "dev": true, - "dependencies": { - "kind-of": "^6.0.2" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/shebang-command": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", - "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", - "dev": true, - "dependencies": { - "shebang-regex": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/shebang-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/shell-quote": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.8.1.tgz", - "integrity": "sha512-6j1W9l1iAs/4xYBI1SYOVZyFcCis9b4KCLQ8fgAGG07QvzaRLVVRQvAy85yNmmZSjYjg4MWh4gNvlPujU/5LpA==", - "dev": true, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/side-channel": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.6.tgz", - "integrity": "sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.7", - "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.4", - "object-inspect": "^1.13.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/siginfo": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/siginfo/-/siginfo-2.0.0.tgz", - "integrity": "sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==", - "dev": true - }, - "node_modules/signal-exit": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", - "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", - "dev": true, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/sigstore": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/sigstore/-/sigstore-2.3.1.tgz", - "integrity": "sha512-8G+/XDU8wNsJOQS5ysDVO0Etg9/2uA5gR9l4ZwijjlwxBcrU6RPfwi2+jJmbP+Ap1Hlp/nVAaEO4Fj22/SL2gQ==", - "dev": true, - "dependencies": { - "@sigstore/bundle": "^2.3.2", - "@sigstore/core": "^1.0.0", - "@sigstore/protobuf-specs": "^0.3.2", - "@sigstore/sign": "^2.3.2", - "@sigstore/tuf": "^2.3.4", - "@sigstore/verify": "^1.2.1" - }, - "engines": { - "node": "^16.14.0 || >=18.0.0" - } - }, - "node_modules/slash": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-5.1.0.tgz", - "integrity": "sha512-ZA6oR3T/pEyuqwMgAKT0/hAv8oAXckzbkmR0UkUosQ+Mc4RxGoJkRmwHgHufaenlyAgE1Mxgpdcrf75y6XcnDg==", - "dev": true, - "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/slice-ansi": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-5.0.0.tgz", - "integrity": "sha512-FC+lgizVPfie0kkhqUScwRu1O/lF6NOgJmlCgK+/LYxDCTk8sGelYaHDhFcDN+Sn3Cv+3VSa4Byeo+IMCzpMgQ==", - "dev": true, - "dependencies": { - "ansi-styles": "^6.0.0", - "is-fullwidth-code-point": "^4.0.0" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/slice-ansi?sponsor=1" - } - }, - "node_modules/slice-ansi/node_modules/ansi-styles": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", - "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", - "dev": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/smart-buffer": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz", - "integrity": "sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==", - "dev": true, - "engines": { - "node": ">= 6.0.0", - "npm": ">= 3.0.0" - } - }, - "node_modules/socket.io": { - "version": "4.8.0", - "resolved": "https://registry.npmjs.org/socket.io/-/socket.io-4.8.0.tgz", - "integrity": "sha512-8U6BEgGjQOfGz3HHTYaC/L1GaxDCJ/KM0XTkJly0EhZ5U/du9uNEZy4ZgYzEzIqlx2CMm25CrCqr1ck899eLNA==", - "dev": true, - "optional": true, - "peer": true, - "dependencies": { - "accepts": "~1.3.4", - "base64id": "~2.0.0", - "cors": "~2.8.5", - "debug": "~4.3.2", - "engine.io": "~6.6.0", - "socket.io-adapter": "~2.5.2", - "socket.io-parser": "~4.2.4" - }, - "engines": { - "node": ">=10.2.0" - } - }, - "node_modules/socket.io-adapter": { - "version": "2.5.5", - "resolved": "https://registry.npmjs.org/socket.io-adapter/-/socket.io-adapter-2.5.5.tgz", - "integrity": "sha512-eLDQas5dzPgOWCk9GuuJC2lBqItuhKI4uxGgo9aIV7MYbk2h9Q6uULEh8WBzThoI7l+qU9Ast9fVUmkqPP9wYg==", - "dev": true, - "optional": true, - "peer": true, - "dependencies": { - "debug": "~4.3.4", - "ws": "~8.17.1" - } - }, - "node_modules/socket.io-parser": { - "version": "4.2.4", - "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-4.2.4.tgz", - "integrity": "sha512-/GbIKmo8ioc+NIWIhwdecY0ge+qVBSMdgxGygevmdHj24bsfgtCmcUUcQ5ZzcylGFHsN3k4HB4Cgkl96KVnuew==", - "dev": true, - "optional": true, - "peer": true, - "dependencies": { - "@socket.io/component-emitter": "~3.1.0", - "debug": "~4.3.1" - }, - "engines": { - "node": ">=10.0.0" - } - }, - "node_modules/sockjs": { - "version": "0.3.24", - "resolved": "https://registry.npmjs.org/sockjs/-/sockjs-0.3.24.tgz", - "integrity": "sha512-GJgLTZ7vYb/JtPSSZ10hsOYIvEYsjbNU+zPdIHcUaWVNUEPivzxku31865sSSud0Da0W4lEeOPlmw93zLQchuQ==", - "dev": true, - "dependencies": { - "faye-websocket": "^0.11.3", - "uuid": "^8.3.2", - "websocket-driver": "^0.7.4" - } - }, - "node_modules/socks": { - "version": "2.8.3", - "resolved": "https://registry.npmjs.org/socks/-/socks-2.8.3.tgz", - "integrity": "sha512-l5x7VUUWbjVFbafGLxPWkYsHIhEvmF85tbIeFZWc8ZPtoMyybuEhL7Jye/ooC4/d48FgOjSJXgsF/AJPYCW8Zw==", - "dev": true, - "dependencies": { - "ip-address": "^9.0.5", - "smart-buffer": "^4.2.0" - }, - "engines": { - "node": ">= 10.0.0", - "npm": ">= 3.0.0" - } - }, - "node_modules/socks-proxy-agent": { - "version": "8.0.4", - "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-8.0.4.tgz", - "integrity": "sha512-GNAq/eg8Udq2x0eNiFkr9gRg5bA7PXEWagQdeRX4cPSG+X/8V38v637gim9bjFptMk1QWsCTr0ttrJEiXbNnRw==", - "dev": true, - "dependencies": { - "agent-base": "^7.1.1", - "debug": "^4.3.4", - "socks": "^2.8.3" - }, - "engines": { - "node": ">= 14" - } - }, - "node_modules/source-map": { - "version": "0.7.4", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.4.tgz", - "integrity": "sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==", - "dev": true, - "engines": { - "node": ">= 8" - } - }, - "node_modules/source-map-js": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", - "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/source-map-loader": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/source-map-loader/-/source-map-loader-5.0.0.tgz", - "integrity": "sha512-k2Dur7CbSLcAH73sBcIkV5xjPV4SzqO1NJ7+XaQl8if3VODDUj3FNchNGpqgJSKbvUfJuhVdv8K2Eu8/TNl2eA==", - "dev": true, - "dependencies": { - "iconv-lite": "^0.6.3", - "source-map-js": "^1.0.2" - }, - "engines": { - "node": ">= 18.12.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "webpack": "^5.72.1" - } - }, - "node_modules/source-map-loader/node_modules/iconv-lite": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", - "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", - "dev": true, - "dependencies": { - "safer-buffer": ">= 2.1.2 < 3.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/source-map-support": { - "version": "0.5.21", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", - "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", - "dev": true, - "dependencies": { - "buffer-from": "^1.0.0", - "source-map": "^0.6.0" - } - }, - "node_modules/source-map-support/node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/space-separated-tokens": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/space-separated-tokens/-/space-separated-tokens-2.0.2.tgz", - "integrity": "sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q==", - "dev": true, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/spdx-correct": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.2.0.tgz", - "integrity": "sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==", - "dev": true, - "dependencies": { - "spdx-expression-parse": "^3.0.0", - "spdx-license-ids": "^3.0.0" - } - }, - "node_modules/spdx-exceptions": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.5.0.tgz", - "integrity": "sha512-PiU42r+xO4UbUS1buo3LPJkjlO7430Xn5SVAhdpzzsPHsjbYVflnnFdATgabnLude+Cqu25p6N+g2lw/PFsa4w==", - "dev": true - }, - "node_modules/spdx-expression-parse": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", - "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", - "dev": true, - "dependencies": { - "spdx-exceptions": "^2.1.0", - "spdx-license-ids": "^3.0.0" - } - }, - "node_modules/spdx-license-ids": { - "version": "3.0.20", - "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.20.tgz", - "integrity": "sha512-jg25NiDV/1fLtSgEgyvVyDunvaNHbuwF9lfNV17gSmPFAlYzdfNBlLtLzXTevwkPj7DhGbmN9VnmJIgLnhvaBw==", - "dev": true - }, - "node_modules/spdy": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/spdy/-/spdy-4.0.2.tgz", - "integrity": "sha512-r46gZQZQV+Kl9oItvl1JZZqJKGr+oEkB08A6BzkiR7593/7IbtuncXHd2YoYeTsG4157ZssMu9KYvUHLcjcDoA==", - "dev": true, - "dependencies": { - "debug": "^4.1.0", - "handle-thing": "^2.0.0", - "http-deceiver": "^1.2.7", - "select-hose": "^2.0.0", - "spdy-transport": "^3.0.0" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/spdy-transport": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/spdy-transport/-/spdy-transport-3.0.0.tgz", - "integrity": "sha512-hsLVFE5SjA6TCisWeJXFKniGGOpBgMLmerfO2aCyCU5s7nJ/rpAepqmFifv/GCbSbueEeAJJnmSQ2rKC/g8Fcw==", - "dev": true, - "dependencies": { - "debug": "^4.1.0", - "detect-node": "^2.0.4", - "hpack.js": "^2.1.6", - "obuf": "^1.1.2", - "readable-stream": "^3.0.6", - "wbuf": "^1.7.3" - } - }, - "node_modules/sprintf-js": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.1.3.tgz", - "integrity": "sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA==", - "dev": true - }, - "node_modules/ssri": { - "version": "10.0.6", - "resolved": "https://registry.npmjs.org/ssri/-/ssri-10.0.6.tgz", - "integrity": "sha512-MGrFH9Z4NP9Iyhqn16sDtBpRRNJ0Y2hNa6D65h736fVSaPCHr4DM4sWUNvVaSuC+0OBGhwsrydQwmgfg5LncqQ==", - "dev": true, - "dependencies": { - "minipass": "^7.0.3" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/stackback": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/stackback/-/stackback-0.0.2.tgz", - "integrity": "sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==", - "dev": true - }, - "node_modules/statuses": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", - "integrity": "sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==", - "dev": true, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/std-env": { - "version": "3.7.0", - "resolved": "https://registry.npmjs.org/std-env/-/std-env-3.7.0.tgz", - "integrity": "sha512-JPbdCEQLj1w5GilpiHAx3qJvFndqybBysA3qUOnznweH4QbNYUsW/ea8QzSrnh0vNsezMMw5bcVool8lM0gwzg==", - "dev": true - }, - "node_modules/storybook": { - "version": "8.3.2", - "resolved": "https://registry.npmjs.org/storybook/-/storybook-8.3.2.tgz", - "integrity": "sha512-jfDPtoPTtXcQ4O82u6+VE0V8q05hnj9NdmTVJvUxab796FoEbhk07xFLynOopfd9h9i0D/jc5Sf4C+iMe1bhmA==", - "dev": true, - "dependencies": { - "@storybook/core": "8.3.2" - }, - "bin": { - "getstorybook": "bin/index.cjs", - "sb": "bin/index.cjs", - "storybook": "bin/index.cjs" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/storybook" - } - }, - "node_modules/streamroller": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/streamroller/-/streamroller-3.1.5.tgz", - "integrity": "sha512-KFxaM7XT+irxvdqSP1LGLgNWbYN7ay5owZ3r/8t77p+EtSUAfUgtl7be3xtqtOmGUl9K9YPO2ca8133RlTjvKw==", - "dev": true, - "optional": true, - "peer": true, - "dependencies": { - "date-format": "^4.0.14", - "debug": "^4.3.4", - "fs-extra": "^8.1.0" - }, - "engines": { - "node": ">=8.0" - } - }, - "node_modules/string_decoder": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", - "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", - "dev": true, - "dependencies": { - "safe-buffer": "~5.2.0" - } - }, - "node_modules/string-width": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-7.2.0.tgz", - "integrity": "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==", - "dev": true, - "dependencies": { - "emoji-regex": "^10.3.0", - "get-east-asian-width": "^1.0.0", - "strip-ansi": "^7.1.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/string-width-cjs": { - "name": "string-width", - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dev": true, - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/string-width-cjs/node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true - }, - "node_modules/string-width-cjs/node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/string-width/node_modules/ansi-regex": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz", - "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==", - "dev": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" - } - }, - "node_modules/string-width/node_modules/strip-ansi": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", - "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", - "dev": true, - "dependencies": { - "ansi-regex": "^6.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/strip-ansi?sponsor=1" - } - }, - "node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/strip-ansi-cjs": { - "name": "strip-ansi", - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/strip-bom": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", - "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/strip-final-newline": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", - "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/strip-json-comments": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", - "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", - "dev": true, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/strip-literal": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/strip-literal/-/strip-literal-2.1.0.tgz", - "integrity": "sha512-Op+UycaUt/8FbN/Z2TWPBLge3jWrP3xj10f3fnYxf052bKuS3EKs1ZQcVGjnEMdsNVAM+plXRdmjrZ/KgG3Skw==", - "dev": true, - "dependencies": { - "js-tokens": "^9.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/antfu" - } - }, - "node_modules/strip-literal/node_modules/js-tokens": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-9.0.0.tgz", - "integrity": "sha512-WriZw1luRMlmV3LGJaR6QOJjWwgLUTf89OwT2lUOyjX2dJGBwgmIkbcz+7WFZjrZM635JOIR517++e/67CP9dQ==", - "dev": true - }, - "node_modules/style-loader": { - "version": "3.3.4", - "resolved": "https://registry.npmjs.org/style-loader/-/style-loader-3.3.4.tgz", - "integrity": "sha512-0WqXzrsMTyb8yjZJHDqwmnwRJvhALK9LfRtRc6B4UTWe8AijYLZYZ9thuJTZc2VfQWINADW/j+LiJnfy2RoC1w==", - "dev": true, - "engines": { - "node": ">= 12.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "webpack": "^5.0.0" - } - }, - "node_modules/supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/supports-preserve-symlinks-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", - "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", - "dev": true, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/symbol-observable": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/symbol-observable/-/symbol-observable-4.0.0.tgz", - "integrity": "sha512-b19dMThMV4HVFynSAM1++gBHAbk2Tc/osgLIBZMKsyqh34jb2e8Os7T6ZW/Bt3pJFdBTd2JwAnAAEQV7rSNvcQ==", - "dev": true, - "engines": { - "node": ">=0.10" - } - }, - "node_modules/symbol-tree": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz", - "integrity": "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==", - "dev": true - }, - "node_modules/synckit": { - "version": "0.9.1", - "resolved": "https://registry.npmjs.org/synckit/-/synckit-0.9.1.tgz", - "integrity": "sha512-7gr8p9TQP6RAHusBOSLs46F4564ZrjV8xFmw5zCmgmhGUcw2hxsShhJ6CEiHQMgPDwAQ1fWHPM0ypc4RMAig4A==", - "dev": true, - "dependencies": { - "@pkgr/core": "^0.1.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": "^14.18.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/unts" - } - }, - "node_modules/tapable": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz", - "integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/tar": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/tar/-/tar-6.2.1.tgz", - "integrity": "sha512-DZ4yORTwrbTj/7MZYq2w+/ZFdI6OZ/f9SFHR+71gIVUZhOQPHzVCLpvRnPgyaMpfWxxk/4ONva3GQSyNIKRv6A==", - "dev": true, - "dependencies": { - "chownr": "^2.0.0", - "fs-minipass": "^2.0.0", - "minipass": "^5.0.0", - "minizlib": "^2.1.1", - "mkdirp": "^1.0.3", - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/tar/node_modules/fs-minipass": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", - "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", - "dev": true, - "dependencies": { - "minipass": "^3.0.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/tar/node_modules/fs-minipass/node_modules/minipass": { - "version": "3.3.6", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", - "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", - "dev": true, - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/tar/node_modules/minipass": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz", - "integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/tar/node_modules/mkdirp": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", - "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", - "dev": true, - "bin": { - "mkdirp": "bin/cmd.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/tar/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - }, - "node_modules/telejson": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/telejson/-/telejson-7.2.0.tgz", - "integrity": "sha512-1QTEcJkJEhc8OnStBx/ILRu5J2p0GjvWsBx56bmZRqnrkdBMUe+nX92jxV+p3dB4CP6PZCdJMQJwCggkNBMzkQ==", - "dev": true, - "dependencies": { - "memoizerific": "^1.11.3" - } - }, - "node_modules/terser": { - "version": "5.31.6", - "resolved": "https://registry.npmjs.org/terser/-/terser-5.31.6.tgz", - "integrity": "sha512-PQ4DAriWzKj+qgehQ7LK5bQqCFNMmlhjR2PFFLuqGCpuCAauxemVBWwWOxo3UIwWQx8+Pr61Df++r76wDmkQBg==", - "dev": true, - "dependencies": { - "@jridgewell/source-map": "^0.3.3", - "acorn": "^8.8.2", - "commander": "^2.20.0", - "source-map-support": "~0.5.20" - }, - "bin": { - "terser": "bin/terser" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/terser-webpack-plugin": { - "version": "5.3.10", - "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.10.tgz", - "integrity": "sha512-BKFPWlPDndPs+NGGCr1U59t0XScL5317Y0UReNrHaw9/FwhPENlq6bfgs+4yPfyP51vqC1bQ4rp1EfXW5ZSH9w==", - "dev": true, - "dependencies": { - "@jridgewell/trace-mapping": "^0.3.20", - "jest-worker": "^27.4.5", - "schema-utils": "^3.1.1", - "serialize-javascript": "^6.0.1", - "terser": "^5.26.0" - }, - "engines": { - "node": ">= 10.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "webpack": "^5.1.0" - }, - "peerDependenciesMeta": { - "@swc/core": { - "optional": true - }, - "esbuild": { - "optional": true - }, - "uglify-js": { - "optional": true - } - } - }, - "node_modules/terser-webpack-plugin/node_modules/ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "dev": true, - "dependencies": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/terser-webpack-plugin/node_modules/ajv-keywords": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", - "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", - "dev": true, - "peerDependencies": { - "ajv": "^6.9.1" - } - }, - "node_modules/terser-webpack-plugin/node_modules/json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true - }, - "node_modules/terser-webpack-plugin/node_modules/schema-utils": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz", - "integrity": "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==", - "dev": true, - "dependencies": { - "@types/json-schema": "^7.0.8", - "ajv": "^6.12.5", - "ajv-keywords": "^3.5.2" - }, - "engines": { - "node": ">= 10.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - } - }, - "node_modules/terser/node_modules/commander": { - "version": "2.20.3", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", - "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", - "dev": true - }, - "node_modules/text-table": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", - "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", - "dev": true - }, - "node_modules/thingies": { - "version": "1.21.0", - "resolved": "https://registry.npmjs.org/thingies/-/thingies-1.21.0.tgz", - "integrity": "sha512-hsqsJsFMsV+aD4s3CWKk85ep/3I9XzYV/IXaSouJMYIoDlgyi11cBhsqYe9/geRfB0YIikBQg6raRaM+nIMP9g==", - "dev": true, - "engines": { - "node": ">=10.18" - }, - "peerDependencies": { - "tslib": "^2" - } - }, - "node_modules/thunky": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/thunky/-/thunky-1.1.0.tgz", - "integrity": "sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA==", - "dev": true - }, - "node_modules/tiny-invariant": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/tiny-invariant/-/tiny-invariant-1.3.3.tgz", - "integrity": "sha512-+FbBPE1o9QAYvviau/qC5SE3caw21q3xkvWKBtja5vgqOWIHHJ3ioaq1VPfn/Szqctz2bU/oYeKd9/z5BL+PVg==", - "dev": true - }, - "node_modules/tinybench": { - "version": "2.9.0", - "resolved": "https://registry.npmjs.org/tinybench/-/tinybench-2.9.0.tgz", - "integrity": "sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg==", - "dev": true - }, - "node_modules/tinypool": { - "version": "0.8.4", - "resolved": "https://registry.npmjs.org/tinypool/-/tinypool-0.8.4.tgz", - "integrity": "sha512-i11VH5gS6IFeLY3gMBQ00/MmLncVP7JLXOw1vlgkytLmJK7QnEr7NXf0LBdxfmNPAeyetukOk0bOYrJrFGjYJQ==", - "dev": true, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/tinyspy": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/tinyspy/-/tinyspy-2.2.1.tgz", - "integrity": "sha512-KYad6Vy5VDWV4GH3fjpseMQ/XU2BhIYP7Vzd0LG44qRWm/Yt2WCOTicFdvmgo6gWaqooMQCawTtILVQJupKu7A==", - "dev": true, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/tmp": { - "version": "0.0.33", - "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", - "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", - "dev": true, - "dependencies": { - "os-tmpdir": "~1.0.2" - }, - "engines": { - "node": ">=0.6.0" - } - }, - "node_modules/to-fast-properties": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", - "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "dev": true, - "dependencies": { - "is-number": "^7.0.0" - }, - "engines": { - "node": ">=8.0" - } - }, - "node_modules/toidentifier": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", - "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", - "dev": true, - "engines": { - "node": ">=0.6" - } - }, - "node_modules/tough-cookie": { - "version": "4.1.4", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.1.4.tgz", - "integrity": "sha512-Loo5UUvLD9ScZ6jh8beX1T6sO1w2/MpCRpEP7V280GKMVUQ0Jzar2U3UJPsrdbziLEMMhu3Ujnq//rhiFuIeag==", - "dev": true, - "dependencies": { - "psl": "^1.1.33", - "punycode": "^2.1.1", - "universalify": "^0.2.0", - "url-parse": "^1.5.3" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/tough-cookie/node_modules/punycode": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", - "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/tough-cookie/node_modules/universalify": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.2.0.tgz", - "integrity": "sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg==", - "dev": true, - "engines": { - "node": ">= 4.0.0" - } - }, - "node_modules/tr46": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-4.1.1.tgz", - "integrity": "sha512-2lv/66T7e5yNyhAAC4NaKe5nVavzuGJQVVtRYLyQ2OI8tsJ61PMLlelehb0wi2Hx6+hT/OJUWZcw8MjlSRnxvw==", - "dev": true, - "dependencies": { - "punycode": "^2.3.0" - }, - "engines": { - "node": ">=14" - } - }, - "node_modules/tr46/node_modules/punycode": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", - "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/tree-dump": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/tree-dump/-/tree-dump-1.0.2.tgz", - "integrity": "sha512-dpev9ABuLWdEubk+cIaI9cHwRNNDjkBBLXTwI4UCUFdQ5xXKqNXoK4FEciw/vxf+NQ7Cb7sGUyeUtORvHIdRXQ==", - "dev": true, - "engines": { - "node": ">=10.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/streamich" - }, - "peerDependencies": { - "tslib": "2" - } - }, - "node_modules/tree-kill": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/tree-kill/-/tree-kill-1.2.2.tgz", - "integrity": "sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==", - "dev": true, - "bin": { - "tree-kill": "cli.js" - } - }, - "node_modules/ts-api-utils": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.3.0.tgz", - "integrity": "sha512-UQMIo7pb8WRomKR1/+MFVLTroIvDVtMX3K6OUir8ynLyzB8Jeriont2bTAtmNPa1ekAgN7YPDyf6V+ygrdU+eQ==", - "dev": true, - "engines": { - "node": ">=16" - }, - "peerDependencies": { - "typescript": ">=4.2.0" - } - }, - "node_modules/ts-dedent": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/ts-dedent/-/ts-dedent-2.2.0.tgz", - "integrity": "sha512-q5W7tVM71e2xjHZTlgfTDoPF/SmqKG5hddq9SzR49CH2hayqRKJtQ4mtRlSxKaJlR/+9rEM+mnBHf7I2/BQcpQ==", - "dev": true, - "engines": { - "node": ">=6.10" - } - }, - "node_modules/ts-morph": { - "version": "21.0.1", - "resolved": "https://registry.npmjs.org/ts-morph/-/ts-morph-21.0.1.tgz", - "integrity": "sha512-dbDtVdEAncKctzrVZ+Nr7kHpHkv+0JDJb2MjjpBaj8bFeCkePU9rHfMklmhuLFnpeq/EJZk2IhStY6NzqgjOkg==", - "dev": true, - "dependencies": { - "@ts-morph/common": "~0.22.0", - "code-block-writer": "^12.0.0" - } - }, - "node_modules/tsafe": { - "version": "1.7.2", - "resolved": "https://registry.npmjs.org/tsafe/-/tsafe-1.7.2.tgz", - "integrity": "sha512-dAPfQLhCfCRre5qs+Z5Q2a7s2CV7RxffZUmvj7puGaePYjECzWREJFd3w4XSFe/T5tbxgowfItA/JSSZ6Ma3dA==", - "dev": true - }, - "node_modules/tsconfck": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/tsconfck/-/tsconfck-3.1.3.tgz", - "integrity": "sha512-ulNZP1SVpRDesxeMLON/LtWM8HIgAJEIVpVVhBM6gsmvQ8+Rh+ZG7FWGvHh7Ah3pRABwVJWklWCr/BTZSv0xnQ==", - "dev": true, - "bin": { - "tsconfck": "bin/tsconfck.js" - }, - "engines": { - "node": "^18 || >=20" - }, - "peerDependencies": { - "typescript": "^5.0.0" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/tsconfig-paths": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-4.2.0.tgz", - "integrity": "sha512-NoZ4roiN7LnbKn9QqE1amc9DJfzvZXxF4xDavcOWt1BPkdx+m+0gJuPM+S0vCe7zTJMYUP0R8pO2XMr+Y8oLIg==", - "dev": true, - "dependencies": { - "json5": "^2.2.2", - "minimist": "^1.2.6", - "strip-bom": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/tsconfig-paths-webpack-plugin": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/tsconfig-paths-webpack-plugin/-/tsconfig-paths-webpack-plugin-4.1.0.tgz", - "integrity": "sha512-xWFISjviPydmtmgeUAuXp4N1fky+VCtfhOkDUFIv5ea7p4wuTomI4QTrXvFBX2S4jZsmyTSrStQl+E+4w+RzxA==", - "dev": true, - "dependencies": { - "chalk": "^4.1.0", - "enhanced-resolve": "^5.7.0", - "tsconfig-paths": "^4.1.2" - }, - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/tsconfig-paths-webpack-plugin/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/tsconfig-paths-webpack-plugin/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/tsconfig-paths-webpack-plugin/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/tsconfig-paths-webpack-plugin/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "node_modules/tsconfig-paths-webpack-plugin/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/tsconfig-paths-webpack-plugin/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/tslib": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.7.0.tgz", - "integrity": "sha512-gLXCKdN1/j47AiHiOkJN69hJmcbGTHI0ImLmbYLHykhgeN0jVGola9yVjFgzCUklsZQMW55o+dW7IXv3RCXDzA==", - "dev": true - }, - "node_modules/tuf-js": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/tuf-js/-/tuf-js-2.2.1.tgz", - "integrity": "sha512-GwIJau9XaA8nLVbUXsN3IlFi7WmQ48gBUrl3FTkkL/XLu/POhBzfmX9hd33FNMX1qAsfl6ozO1iMmW9NC8YniA==", - "dev": true, - "dependencies": { - "@tufjs/models": "2.0.1", - "debug": "^4.3.4", - "make-fetch-happen": "^13.0.1" - }, - "engines": { - "node": "^16.14.0 || >=18.0.0" - } - }, - "node_modules/type-check": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", - "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", - "dev": true, - "dependencies": { - "prelude-ls": "^1.2.1" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/type-detect": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.1.0.tgz", - "integrity": "sha512-Acylog8/luQ8L7il+geoSxhEkazvkslg7PSNKOX59mbB9cOveP5aq9h74Y7YU8yDpJwetzQQrfIwtf4Wp4LKcw==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/type-fest": { - "version": "0.21.3", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", - "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/type-is": { - "version": "1.6.18", - "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", - "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", - "dev": true, - "dependencies": { - "media-typer": "0.3.0", - "mime-types": "~2.1.24" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/typed-assert": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/typed-assert/-/typed-assert-1.0.9.tgz", - "integrity": "sha512-KNNZtayBCtmnNmbo5mG47p1XsCyrx6iVqomjcZnec/1Y5GGARaxPs6r49RnSPeUP3YjNYiU9sQHAtY4BBvnZwg==", - "dev": true - }, - "node_modules/typescript": { - "version": "5.5.4", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.5.4.tgz", - "integrity": "sha512-Mtq29sKDAEYP7aljRgtPOpTvOfbwRWlS6dPRzwjdE+C0R4brX/GUyhHSecbHMFLNBLcJIPt9nl9yG5TZ1weH+Q==", - "dev": true, - "bin": { - "tsc": "bin/tsc", - "tsserver": "bin/tsserver" - }, - "engines": { - "node": ">=14.17" - } - }, - "node_modules/typescript-eslint": { - "version": "8.7.0", - "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.7.0.tgz", - "integrity": "sha512-nEHbEYJyHwsuf7c3V3RS7Saq+1+la3i0ieR3qP0yjqWSzVmh8Drp47uOl9LjbPANac4S7EFSqvcYIKXUUwIfIQ==", - "dev": true, - "dependencies": { - "@typescript-eslint/eslint-plugin": "8.7.0", - "@typescript-eslint/parser": "8.7.0", - "@typescript-eslint/utils": "8.7.0" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/ua-parser-js": { - "version": "0.7.39", - "resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-0.7.39.tgz", - "integrity": "sha512-IZ6acm6RhQHNibSt7+c09hhvsKy9WUr4DVbeq9U8o71qxyYtJpQeDxQnMrVqnIFMLcQjHO0I9wgfO2vIahht4w==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/ua-parser-js" - }, - { - "type": "paypal", - "url": "https://paypal.me/faisalman" - }, - { - "type": "github", - "url": "https://github.com/sponsors/faisalman" - } - ], - "optional": true, - "peer": true, - "bin": { - "ua-parser-js": "script/cli.js" - }, - "engines": { - "node": "*" - } - }, - "node_modules/ufo": { - "version": "1.5.4", - "resolved": "https://registry.npmjs.org/ufo/-/ufo-1.5.4.tgz", - "integrity": "sha512-UsUk3byDzKd04EyoZ7U4DOlxQaD14JUKQl6/P7wiX4FNvUfm3XL246n9W5AmqwW5RSFJ27NAuM0iLscAOYUiGQ==", - "dev": true - }, - "node_modules/undici-types": { - "version": "6.19.8", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.19.8.tgz", - "integrity": "sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==", - "dev": true - }, - "node_modules/unicode-canonical-property-names-ecmascript": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.1.tgz", - "integrity": "sha512-dA8WbNeb2a6oQzAQ55YlT5vQAWGV9WXOsi3SskE3bcCdM0P4SDd+24zS/OCacdRq5BkdsRj9q3Pg6YyQoxIGqg==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/unicode-match-property-ecmascript": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-2.0.0.tgz", - "integrity": "sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==", - "dev": true, - "dependencies": { - "unicode-canonical-property-names-ecmascript": "^2.0.0", - "unicode-property-aliases-ecmascript": "^2.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/unicode-match-property-value-ecmascript": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.2.0.tgz", - "integrity": "sha512-4IehN3V/+kkr5YeSSDDQG8QLqO26XpL2XP3GQtqwlT/QYSECAwFztxVHjlbh0+gjJ3XmNLS0zDsbgs9jWKExLg==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/unicode-property-aliases-ecmascript": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.1.0.tgz", - "integrity": "sha512-6t3foTQI9qne+OZoVQB/8x8rk2k1eVy1gRXhV3oFQ5T6R1dqQ1xtin3XqSlx3+ATBkliTaR/hHyJBm+LVPNM8w==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/unicorn-magic": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/unicorn-magic/-/unicorn-magic-0.1.0.tgz", - "integrity": "sha512-lRfVq8fE8gz6QMBuDM6a+LO3IAzTi05H6gCVaUpir2E1Rwpo4ZUog45KpNXKC/Mn3Yb9UDuHumeFTo9iV/D9FQ==", - "dev": true, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/unique-filename": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-3.0.0.tgz", - "integrity": "sha512-afXhuC55wkAmZ0P18QsVE6kp8JaxrEokN2HGIoIVv2ijHQd419H0+6EigAFcIzXeMIkcIkNBpB3L/DXB3cTS/g==", - "dev": true, - "dependencies": { - "unique-slug": "^4.0.0" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/unique-slug": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-4.0.0.tgz", - "integrity": "sha512-WrcA6AyEfqDX5bWige/4NQfPZMtASNVxdmWR76WESYQVAACSgWcR6e9i0mofqqBxYFtL4oAxPIptY73/0YE1DQ==", - "dev": true, - "dependencies": { - "imurmurhash": "^0.1.4" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/unist-util-is": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-6.0.0.tgz", - "integrity": "sha512-2qCTHimwdxLfz+YzdGfkqNlH0tLi9xjTnHddPmJwtIG9MGsdbutfTc4P+haPD7l7Cjxf/WZj+we5qfVPvvxfYw==", - "dev": true, - "dependencies": { - "@types/unist": "^3.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/unist-util-stringify-position": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-4.0.0.tgz", - "integrity": "sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==", - "dev": true, - "dependencies": { - "@types/unist": "^3.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/unist-util-visit": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-5.0.0.tgz", - "integrity": "sha512-MR04uvD+07cwl/yhVuVWAtw+3GOR/knlL55Nd/wAdblk27GCVt3lqpTivy/tkJcZoNPzTwS1Y+KMojlLDhoTzg==", - "dev": true, - "dependencies": { - "@types/unist": "^3.0.0", - "unist-util-is": "^6.0.0", - "unist-util-visit-parents": "^6.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/unist-util-visit-parents": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-6.0.1.tgz", - "integrity": "sha512-L/PqWzfTP9lzzEa6CKs0k2nARxTdZduw3zyh8d2NVBnsyvHjSX4TWse388YrrQKbvI8w20fGjGlhgT96WwKykw==", - "dev": true, - "dependencies": { - "@types/unist": "^3.0.0", - "unist-util-is": "^6.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/universalify": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", - "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", - "dev": true, - "optional": true, - "peer": true, - "engines": { - "node": ">= 4.0.0" - } - }, - "node_modules/unpipe": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", - "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", - "dev": true, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/unplugin": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/unplugin/-/unplugin-1.14.1.tgz", - "integrity": "sha512-lBlHbfSFPToDYp9pjXlUEFVxYLaue9f9T1HC+4OHlmj+HnMDdz9oZY+erXfoCe/5V/7gKUSY2jpXPb9S7f0f/w==", - "dev": true, - "dependencies": { - "acorn": "^8.12.1", - "webpack-virtual-modules": "^0.6.2" - }, - "engines": { - "node": ">=14.0.0" - }, - "peerDependencies": { - "webpack-sources": "^3" - }, - "peerDependenciesMeta": { - "webpack-sources": { - "optional": true - } - } - }, - "node_modules/update-browserslist-db": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.0.tgz", - "integrity": "sha512-EdRAaAyk2cUE1wOf2DkEhzxqOQvFOoRJFNS6NeyJ01Gp2beMRpBAINjM2iDXE3KCuKhwnvHIQCJm6ThL2Z+HzQ==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/browserslist" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "dependencies": { - "escalade": "^3.1.2", - "picocolors": "^1.0.1" - }, - "bin": { - "update-browserslist-db": "cli.js" - }, - "peerDependencies": { - "browserslist": ">= 4.21.0" - } - }, - "node_modules/uri-js": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", - "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", - "dev": true, - "dependencies": { - "punycode": "^2.1.0" - } - }, - "node_modules/uri-js/node_modules/punycode": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", - "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/url": { - "version": "0.11.4", - "resolved": "https://registry.npmjs.org/url/-/url-0.11.4.tgz", - "integrity": "sha512-oCwdVC7mTuWiPyjLUz/COz5TLk6wgp0RCsN+wHZ2Ekneac9w8uuV0njcbbie2ME+Vs+d6duwmYuR3HgQXs1fOg==", - "dev": true, - "dependencies": { - "punycode": "^1.4.1", - "qs": "^6.12.3" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/url-parse": { - "version": "1.5.10", - "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.5.10.tgz", - "integrity": "sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==", - "dev": true, - "dependencies": { - "querystringify": "^2.1.1", - "requires-port": "^1.0.0" - } - }, - "node_modules/util": { - "version": "0.12.5", - "resolved": "https://registry.npmjs.org/util/-/util-0.12.5.tgz", - "integrity": "sha512-kZf/K6hEIrWHI6XqOFUiiMa+79wE/D8Q+NCNAWclkyg3b4d2k7s0QGepNjiABc+aR3N1PAyHL7p6UcLY6LmrnA==", - "dev": true, - "dependencies": { - "inherits": "^2.0.3", - "is-arguments": "^1.0.4", - "is-generator-function": "^1.0.7", - "is-typed-array": "^1.1.3", - "which-typed-array": "^1.1.2" - } - }, - "node_modules/util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", - "dev": true - }, - "node_modules/utila": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/utila/-/utila-0.4.0.tgz", - "integrity": "sha512-Z0DbgELS9/L/75wZbro8xAnT50pBVFQZ+hUEueGDU5FN51YSCYM+jdxsfCiHjwNP/4LCDD0i/graKpeBnOXKRA==", - "dev": true - }, - "node_modules/utils-merge": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", - "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==", - "dev": true, - "engines": { - "node": ">= 0.4.0" - } - }, - "node_modules/uuid": { - "version": "8.3.2", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", - "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", - "dev": true, - "bin": { - "uuid": "dist/bin/uuid" - } - }, - "node_modules/validate-npm-package-license": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", - "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", - "dev": true, - "dependencies": { - "spdx-correct": "^3.0.0", - "spdx-expression-parse": "^3.0.0" - } - }, - "node_modules/validate-npm-package-name": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/validate-npm-package-name/-/validate-npm-package-name-5.0.1.tgz", - "integrity": "sha512-OljLrQ9SQdOUqTaQxqL5dEfZWrXExyyWsozYlAWFawPVNuD83igl7uJD2RTkNMbniIYgt8l81eCJGIdQF7avLQ==", - "dev": true, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/vary": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", - "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", - "dev": true, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/vfile": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/vfile/-/vfile-6.0.3.tgz", - "integrity": "sha512-KzIbH/9tXat2u30jf+smMwFCsno4wHVdNmzFyL+T/L3UGqqk6JKfVqOFOZEpZSHADH1k40ab6NUIXZq422ov3Q==", - "dev": true, - "dependencies": { - "@types/unist": "^3.0.0", - "vfile-message": "^4.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/vfile-message": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-4.0.2.tgz", - "integrity": "sha512-jRDZ1IMLttGj41KcZvlrYAaI3CfqpLpfpf+Mfig13viT6NKvRzWZ+lXz0Y5D60w6uJIBAOGq9mSHf0gktF0duw==", - "dev": true, - "dependencies": { - "@types/unist": "^3.0.0", - "unist-util-stringify-position": "^4.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/vite": { - "version": "5.4.6", - "resolved": "https://registry.npmjs.org/vite/-/vite-5.4.6.tgz", - "integrity": "sha512-IeL5f8OO5nylsgzd9tq4qD2QqI0k2CQLGrWD0rCN0EQJZpBK5vJAx0I+GDkMOXxQX/OfFHMuLIx6ddAxGX/k+Q==", - "dev": true, - "dependencies": { - "esbuild": "^0.21.3", - "postcss": "^8.4.43", - "rollup": "^4.20.0" - }, - "bin": { - "vite": "bin/vite.js" - }, - "engines": { - "node": "^18.0.0 || >=20.0.0" - }, - "funding": { - "url": "https://github.com/vitejs/vite?sponsor=1" - }, - "optionalDependencies": { - "fsevents": "~2.3.3" - }, - "peerDependencies": { - "@types/node": "^18.0.0 || >=20.0.0", - "less": "*", - "lightningcss": "^1.21.0", - "sass": "*", - "sass-embedded": "*", - "stylus": "*", - "sugarss": "*", - "terser": "^5.4.0" - }, - "peerDependenciesMeta": { - "@types/node": { - "optional": true - }, - "less": { - "optional": true - }, - "lightningcss": { - "optional": true - }, - "sass": { - "optional": true - }, - "sass-embedded": { - "optional": true - }, - "stylus": { - "optional": true - }, - "sugarss": { - "optional": true - }, - "terser": { - "optional": true - } - } - }, - "node_modules/vite-node": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/vite-node/-/vite-node-1.6.0.tgz", - "integrity": "sha512-de6HJgzC+TFzOu0NTC4RAIsyf/DY/ibWDYQUcuEA84EMHhcefTUGkjFHKKEJhQN4A+6I0u++kr3l36ZF2d7XRw==", - "dev": true, - "dependencies": { - "cac": "^6.7.14", - "debug": "^4.3.4", - "pathe": "^1.1.1", - "picocolors": "^1.0.0", - "vite": "^5.0.0" - }, - "bin": { - "vite-node": "vite-node.mjs" - }, - "engines": { - "node": "^18.0.0 || >=20.0.0" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "node_modules/vite-tsconfig-paths": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/vite-tsconfig-paths/-/vite-tsconfig-paths-4.3.2.tgz", - "integrity": "sha512-0Vd/a6po6Q+86rPlntHye7F31zA2URZMbH8M3saAZ/xR9QoGN/L21bxEGfXdWmFdNkqPpRdxFT7nmNe12e9/uA==", - "dev": true, - "dependencies": { - "debug": "^4.1.1", - "globrex": "^0.1.2", - "tsconfck": "^3.0.3" - }, - "peerDependencies": { - "vite": "*" - }, - "peerDependenciesMeta": { - "vite": { - "optional": true - } - } - }, - "node_modules/vite/node_modules/@esbuild/aix-ppc64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.21.5.tgz", - "integrity": "sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==", - "cpu": [ - "ppc64" - ], - "dev": true, - "optional": true, - "os": [ - "aix" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/android-arm": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.21.5.tgz", - "integrity": "sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==", - "cpu": [ - "arm" - ], - "dev": true, - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/android-arm64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.21.5.tgz", - "integrity": "sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/android-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.21.5.tgz", - "integrity": "sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/darwin-arm64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.21.5.tgz", - "integrity": "sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/darwin-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.21.5.tgz", - "integrity": "sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/freebsd-arm64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.21.5.tgz", - "integrity": "sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/freebsd-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.21.5.tgz", - "integrity": "sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/linux-arm": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.21.5.tgz", - "integrity": "sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==", - "cpu": [ - "arm" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/linux-arm64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.21.5.tgz", - "integrity": "sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/linux-ia32": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.21.5.tgz", - "integrity": "sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==", - "cpu": [ - "ia32" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/linux-loong64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.21.5.tgz", - "integrity": "sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==", - "cpu": [ - "loong64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/linux-mips64el": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.21.5.tgz", - "integrity": "sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==", - "cpu": [ - "mips64el" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/linux-ppc64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.21.5.tgz", - "integrity": "sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==", - "cpu": [ - "ppc64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/linux-riscv64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.21.5.tgz", - "integrity": "sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==", - "cpu": [ - "riscv64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/linux-s390x": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.21.5.tgz", - "integrity": "sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==", - "cpu": [ - "s390x" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/linux-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.21.5.tgz", - "integrity": "sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/netbsd-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.21.5.tgz", - "integrity": "sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "netbsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/openbsd-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.21.5.tgz", - "integrity": "sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "openbsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/sunos-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.21.5.tgz", - "integrity": "sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "sunos" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/win32-arm64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.21.5.tgz", - "integrity": "sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/win32-ia32": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.21.5.tgz", - "integrity": "sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==", - "cpu": [ - "ia32" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/win32-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.21.5.tgz", - "integrity": "sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/esbuild": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.21.5.tgz", - "integrity": "sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==", - "dev": true, - "hasInstallScript": true, - "bin": { - "esbuild": "bin/esbuild" - }, - "engines": { - "node": ">=12" - }, - "optionalDependencies": { - "@esbuild/aix-ppc64": "0.21.5", - "@esbuild/android-arm": "0.21.5", - "@esbuild/android-arm64": "0.21.5", - "@esbuild/android-x64": "0.21.5", - "@esbuild/darwin-arm64": "0.21.5", - "@esbuild/darwin-x64": "0.21.5", - "@esbuild/freebsd-arm64": "0.21.5", - "@esbuild/freebsd-x64": "0.21.5", - "@esbuild/linux-arm": "0.21.5", - "@esbuild/linux-arm64": "0.21.5", - "@esbuild/linux-ia32": "0.21.5", - "@esbuild/linux-loong64": "0.21.5", - "@esbuild/linux-mips64el": "0.21.5", - "@esbuild/linux-ppc64": "0.21.5", - "@esbuild/linux-riscv64": "0.21.5", - "@esbuild/linux-s390x": "0.21.5", - "@esbuild/linux-x64": "0.21.5", - "@esbuild/netbsd-x64": "0.21.5", - "@esbuild/openbsd-x64": "0.21.5", - "@esbuild/sunos-x64": "0.21.5", - "@esbuild/win32-arm64": "0.21.5", - "@esbuild/win32-ia32": "0.21.5", - "@esbuild/win32-x64": "0.21.5" - } - }, - "node_modules/vite/node_modules/postcss": { - "version": "8.4.47", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.47.tgz", - "integrity": "sha512-56rxCq7G/XfB4EkXq9Egn5GCqugWvDFjafDOThIdMBsI15iqPqR5r15TfSr1YPYeEI19YeaXMCbY6u88Y76GLQ==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/postcss" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "dependencies": { - "nanoid": "^3.3.7", - "picocolors": "^1.1.0", - "source-map-js": "^1.2.1" - }, - "engines": { - "node": "^10 || ^12 || >=14" - } - }, - "node_modules/vitest": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/vitest/-/vitest-1.6.0.tgz", - "integrity": "sha512-H5r/dN06swuFnzNFhq/dnz37bPXnq8xB2xB5JOVk8K09rUtoeNN+LHWkoQ0A/i3hvbUKKcCei9KpbxqHMLhLLA==", - "dev": true, - "dependencies": { - "@vitest/expect": "1.6.0", - "@vitest/runner": "1.6.0", - "@vitest/snapshot": "1.6.0", - "@vitest/spy": "1.6.0", - "@vitest/utils": "1.6.0", - "acorn-walk": "^8.3.2", - "chai": "^4.3.10", - "debug": "^4.3.4", - "execa": "^8.0.1", - "local-pkg": "^0.5.0", - "magic-string": "^0.30.5", - "pathe": "^1.1.1", - "picocolors": "^1.0.0", - "std-env": "^3.5.0", - "strip-literal": "^2.0.0", - "tinybench": "^2.5.1", - "tinypool": "^0.8.3", - "vite": "^5.0.0", - "vite-node": "1.6.0", - "why-is-node-running": "^2.2.2" - }, - "bin": { - "vitest": "vitest.mjs" - }, - "engines": { - "node": "^18.0.0 || >=20.0.0" - }, - "funding": { - "url": "https://opencollective.com/vitest" - }, - "peerDependencies": { - "@edge-runtime/vm": "*", - "@types/node": "^18.0.0 || >=20.0.0", - "@vitest/browser": "1.6.0", - "@vitest/ui": "1.6.0", - "happy-dom": "*", - "jsdom": "*" - }, - "peerDependenciesMeta": { - "@edge-runtime/vm": { - "optional": true - }, - "@types/node": { - "optional": true - }, - "@vitest/browser": { - "optional": true - }, - "@vitest/ui": { - "optional": true - }, - "happy-dom": { - "optional": true - }, - "jsdom": { - "optional": true - } - } - }, - "node_modules/vitest/node_modules/execa": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/execa/-/execa-8.0.1.tgz", - "integrity": "sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg==", - "dev": true, - "dependencies": { - "cross-spawn": "^7.0.3", - "get-stream": "^8.0.1", - "human-signals": "^5.0.0", - "is-stream": "^3.0.0", - "merge-stream": "^2.0.0", - "npm-run-path": "^5.1.0", - "onetime": "^6.0.0", - "signal-exit": "^4.1.0", - "strip-final-newline": "^3.0.0" - }, - "engines": { - "node": ">=16.17" - }, - "funding": { - "url": "https://github.com/sindresorhus/execa?sponsor=1" - } - }, - "node_modules/vitest/node_modules/get-stream": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-8.0.1.tgz", - "integrity": "sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA==", - "dev": true, - "engines": { - "node": ">=16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/vitest/node_modules/human-signals": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-5.0.0.tgz", - "integrity": "sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ==", - "dev": true, - "engines": { - "node": ">=16.17.0" - } - }, - "node_modules/vitest/node_modules/is-stream": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-3.0.0.tgz", - "integrity": "sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==", - "dev": true, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/vitest/node_modules/mimic-fn": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-4.0.0.tgz", - "integrity": "sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==", - "dev": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/vitest/node_modules/npm-run-path": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-5.3.0.tgz", - "integrity": "sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ==", - "dev": true, - "dependencies": { - "path-key": "^4.0.0" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/vitest/node_modules/onetime": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-6.0.0.tgz", - "integrity": "sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==", - "dev": true, - "dependencies": { - "mimic-fn": "^4.0.0" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/vitest/node_modules/path-key": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-4.0.0.tgz", - "integrity": "sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==", - "dev": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/vitest/node_modules/strip-final-newline": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-3.0.0.tgz", - "integrity": "sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==", - "dev": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/void-elements": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/void-elements/-/void-elements-2.0.1.tgz", - "integrity": "sha512-qZKX4RnBzH2ugr8Lxa7x+0V6XD9Sb/ouARtiasEQCHB1EVU4NXtmHsDDrx1dO4ne5fc3J6EW05BP1Dl0z0iung==", - "dev": true, - "optional": true, - "peer": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/w3c-xmlserializer": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-4.0.0.tgz", - "integrity": "sha512-d+BFHzbiCx6zGfz0HyQ6Rg69w9k19nviJspaj4yNscGjrHu94sVP+aRm75yEbCh+r2/yR+7q6hux9LVtbuTGBw==", - "dev": true, - "dependencies": { - "xml-name-validator": "^4.0.0" - }, - "engines": { - "node": ">=14" - } - }, - "node_modules/walk-up-path": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/walk-up-path/-/walk-up-path-3.0.1.tgz", - "integrity": "sha512-9YlCL/ynK3CTlrSRrDxZvUauLzAswPCrsaCgilqFevUYpeEW0/3ScEjaa3kbW/T0ghhkEr7mv+fpjqn1Y1YuTA==", - "dev": true - }, - "node_modules/watchpack": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.1.tgz", - "integrity": "sha512-8wrBCMtVhqcXP2Sup1ctSkga6uc2Bx0IIvKyT7yTFier5AXHooSI+QyQQAtTb7+E0IUCCKyTFmXqdqgum2XWGg==", - "dev": true, - "dependencies": { - "glob-to-regexp": "^0.4.1", - "graceful-fs": "^4.1.2" - }, - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/wbuf": { - "version": "1.7.3", - "resolved": "https://registry.npmjs.org/wbuf/-/wbuf-1.7.3.tgz", - "integrity": "sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA==", - "dev": true, - "dependencies": { - "minimalistic-assert": "^1.0.0" - } - }, - "node_modules/wcwidth": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/wcwidth/-/wcwidth-1.0.1.tgz", - "integrity": "sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==", - "dev": true, - "dependencies": { - "defaults": "^1.0.3" - } - }, - "node_modules/weak-lru-cache": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/weak-lru-cache/-/weak-lru-cache-1.2.2.tgz", - "integrity": "sha512-DEAoo25RfSYMuTGc9vPJzZcZullwIqRDSI9LOy+fkCJPi6hykCnfKaXTuPBDuXAUcqHXyOgFtHNp/kB2FjYHbw==", - "dev": true - }, - "node_modules/webidl-conversions": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-7.0.0.tgz", - "integrity": "sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==", - "dev": true, - "engines": { - "node": ">=12" - } - }, - "node_modules/webpack": { - "version": "5.94.0", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.94.0.tgz", - "integrity": "sha512-KcsGn50VT+06JH/iunZJedYGUJS5FGjow8wb9c0v5n1Om8O1g4L6LjtfxwlXIATopoQu+vOXXa7gYisWxCoPyg==", - "dev": true, - "dependencies": { - "@types/estree": "^1.0.5", - "@webassemblyjs/ast": "^1.12.1", - "@webassemblyjs/wasm-edit": "^1.12.1", - "@webassemblyjs/wasm-parser": "^1.12.1", - "acorn": "^8.7.1", - "acorn-import-attributes": "^1.9.5", - "browserslist": "^4.21.10", - "chrome-trace-event": "^1.0.2", - "enhanced-resolve": "^5.17.1", - "es-module-lexer": "^1.2.1", - "eslint-scope": "5.1.1", - "events": "^3.2.0", - "glob-to-regexp": "^0.4.1", - "graceful-fs": "^4.2.11", - "json-parse-even-better-errors": "^2.3.1", - "loader-runner": "^4.2.0", - "mime-types": "^2.1.27", - "neo-async": "^2.6.2", - "schema-utils": "^3.2.0", - "tapable": "^2.1.1", - "terser-webpack-plugin": "^5.3.10", - "watchpack": "^2.4.1", - "webpack-sources": "^3.2.3" - }, - "bin": { - "webpack": "bin/webpack.js" - }, - "engines": { - "node": ">=10.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependenciesMeta": { - "webpack-cli": { - "optional": true - } - } - }, - "node_modules/webpack-dev-middleware": { - "version": "7.4.2", - "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-7.4.2.tgz", - "integrity": "sha512-xOO8n6eggxnwYpy1NlzUKpvrjfJTvae5/D6WOK0S2LSo7vjmo5gCM1DbLUmFqrMTJP+W/0YZNctm7jasWvLuBA==", - "dev": true, - "dependencies": { - "colorette": "^2.0.10", - "memfs": "^4.6.0", - "mime-types": "^2.1.31", - "on-finished": "^2.4.1", - "range-parser": "^1.2.1", - "schema-utils": "^4.0.0" - }, - "engines": { - "node": ">= 18.12.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "webpack": "^5.0.0" - }, - "peerDependenciesMeta": { - "webpack": { - "optional": true - } - } - }, - "node_modules/webpack-dev-server": { - "version": "5.0.4", - "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-5.0.4.tgz", - "integrity": "sha512-dljXhUgx3HqKP2d8J/fUMvhxGhzjeNVarDLcbO/EWMSgRizDkxHQDZQaLFL5VJY9tRBj2Gz+rvCEYYvhbqPHNA==", - "dev": true, - "dependencies": { - "@types/bonjour": "^3.5.13", - "@types/connect-history-api-fallback": "^1.5.4", - "@types/express": "^4.17.21", - "@types/serve-index": "^1.9.4", - "@types/serve-static": "^1.15.5", - "@types/sockjs": "^0.3.36", - "@types/ws": "^8.5.10", - "ansi-html-community": "^0.0.8", - "bonjour-service": "^1.2.1", - "chokidar": "^3.6.0", - "colorette": "^2.0.10", - "compression": "^1.7.4", - "connect-history-api-fallback": "^2.0.0", - "default-gateway": "^6.0.3", - "express": "^4.17.3", - "graceful-fs": "^4.2.6", - "html-entities": "^2.4.0", - "http-proxy-middleware": "^2.0.3", - "ipaddr.js": "^2.1.0", - "launch-editor": "^2.6.1", - "open": "^10.0.3", - "p-retry": "^6.2.0", - "rimraf": "^5.0.5", - "schema-utils": "^4.2.0", - "selfsigned": "^2.4.1", - "serve-index": "^1.9.1", - "sockjs": "^0.3.24", - "spdy": "^4.0.2", - "webpack-dev-middleware": "^7.1.0", - "ws": "^8.16.0" - }, - "bin": { - "webpack-dev-server": "bin/webpack-dev-server.js" - }, - "engines": { - "node": ">= 18.12.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "webpack": "^5.0.0" - }, - "peerDependenciesMeta": { - "webpack": { - "optional": true - }, - "webpack-cli": { - "optional": true - } - } - }, - "node_modules/webpack-dev-server/node_modules/brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "dev": true, - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/webpack-dev-server/node_modules/glob": { - "version": "10.4.5", - "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz", - "integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==", - "dev": true, - "dependencies": { - "foreground-child": "^3.1.0", - "jackspeak": "^3.1.2", - "minimatch": "^9.0.4", - "minipass": "^7.1.2", - "package-json-from-dist": "^1.0.0", - "path-scurry": "^1.11.1" - }, - "bin": { - "glob": "dist/esm/bin.mjs" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/webpack-dev-server/node_modules/http-proxy-middleware": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-2.0.6.tgz", - "integrity": "sha512-ya/UeJ6HVBYxrgYotAZo1KvPWlgB48kUJLDePFeneHsVujFaW5WNj2NgWCAE//B1Dl02BIfYlpNgBy8Kf8Rjmw==", - "dev": true, - "dependencies": { - "@types/http-proxy": "^1.17.8", - "http-proxy": "^1.18.1", - "is-glob": "^4.0.1", - "is-plain-obj": "^3.0.0", - "micromatch": "^4.0.2" - }, - "engines": { - "node": ">=12.0.0" - }, - "peerDependencies": { - "@types/express": "^4.17.13" - }, - "peerDependenciesMeta": { - "@types/express": { - "optional": true - } - } - }, - "node_modules/webpack-dev-server/node_modules/minimatch": { - "version": "9.0.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", - "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", - "dev": true, - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/webpack-dev-server/node_modules/rimraf": { - "version": "5.0.10", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-5.0.10.tgz", - "integrity": "sha512-l0OE8wL34P4nJH/H2ffoaniAokM2qSmrtXHmlpvYr5AVVX8msAyW0l8NVJFDxlSK4u3Uh/f41cQheDVdnYijwQ==", - "dev": true, - "dependencies": { - "glob": "^10.3.7" - }, - "bin": { - "rimraf": "dist/esm/bin.mjs" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/webpack-hot-middleware": { - "version": "2.26.1", - "resolved": "https://registry.npmjs.org/webpack-hot-middleware/-/webpack-hot-middleware-2.26.1.tgz", - "integrity": "sha512-khZGfAeJx6I8K9zKohEWWYN6KDlVw2DHownoe+6Vtwj1LP9WFgegXnVMSkZ/dBEBtXFwrkkydsaPFlB7f8wU2A==", - "dev": true, - "dependencies": { - "ansi-html-community": "0.0.8", - "html-entities": "^2.1.0", - "strip-ansi": "^6.0.0" - } - }, - "node_modules/webpack-merge": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-6.0.1.tgz", - "integrity": "sha512-hXXvrjtx2PLYx4qruKl+kyRSLc52V+cCvMxRjmKwoA+CBbbF5GfIBtR6kCvl0fYGqTUPKB+1ktVmTHqMOzgCBg==", - "dev": true, - "dependencies": { - "clone-deep": "^4.0.1", - "flat": "^5.0.2", - "wildcard": "^2.0.1" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/webpack-sources": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.2.3.tgz", - "integrity": "sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==", - "dev": true, - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/webpack-subresource-integrity": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/webpack-subresource-integrity/-/webpack-subresource-integrity-5.1.0.tgz", - "integrity": "sha512-sacXoX+xd8r4WKsy9MvH/q/vBtEHr86cpImXwyg74pFIpERKt6FmB8cXpeuh0ZLgclOlHI4Wcll7+R5L02xk9Q==", - "dev": true, - "dependencies": { - "typed-assert": "^1.0.8" - }, - "engines": { - "node": ">= 12" - }, - "peerDependencies": { - "html-webpack-plugin": ">= 5.0.0-beta.1 < 6", - "webpack": "^5.12.0" - }, - "peerDependenciesMeta": { - "html-webpack-plugin": { - "optional": true - } - } - }, - "node_modules/webpack-virtual-modules": { - "version": "0.6.2", - "resolved": "https://registry.npmjs.org/webpack-virtual-modules/-/webpack-virtual-modules-0.6.2.tgz", - "integrity": "sha512-66/V2i5hQanC51vBQKPH4aI8NMAcBW59FVBs+rC7eGHupMyfn34q7rZIE+ETlJ+XTevqfUhVVBgSUNSW2flEUQ==", - "dev": true - }, - "node_modules/webpack/node_modules/ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "dev": true, - "dependencies": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/webpack/node_modules/ajv-keywords": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", - "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", - "dev": true, - "peerDependencies": { - "ajv": "^6.9.1" - } - }, - "node_modules/webpack/node_modules/json-parse-even-better-errors": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", - "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", - "dev": true - }, - "node_modules/webpack/node_modules/json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true - }, - "node_modules/webpack/node_modules/schema-utils": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz", - "integrity": "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==", - "dev": true, - "dependencies": { - "@types/json-schema": "^7.0.8", - "ajv": "^6.12.5", - "ajv-keywords": "^3.5.2" - }, - "engines": { - "node": ">= 10.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - } - }, - "node_modules/websocket-driver": { - "version": "0.7.4", - "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.4.tgz", - "integrity": "sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg==", - "dev": true, - "dependencies": { - "http-parser-js": ">=0.5.1", - "safe-buffer": ">=5.1.0", - "websocket-extensions": ">=0.1.1" - }, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/websocket-extensions": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.4.tgz", - "integrity": "sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg==", - "dev": true, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/whatwg-encoding": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-2.0.0.tgz", - "integrity": "sha512-p41ogyeMUrw3jWclHWTQg1k05DSVXPLcVxRTYsXUk+ZooOCZLcoYgPZ/HL/D/N+uQPOtcp1me1WhBEaX02mhWg==", - "dev": true, - "dependencies": { - "iconv-lite": "0.6.3" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/whatwg-encoding/node_modules/iconv-lite": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", - "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", - "dev": true, - "dependencies": { - "safer-buffer": ">= 2.1.2 < 3.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/whatwg-mimetype": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-3.0.0.tgz", - "integrity": "sha512-nt+N2dzIutVRxARx1nghPKGv1xHikU7HKdfafKkLNLindmPU/ch3U31NOCGGA/dmPcmb1VlofO0vnKAcsm0o/Q==", - "dev": true, - "engines": { - "node": ">=12" - } - }, - "node_modules/whatwg-url": { - "version": "12.0.1", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-12.0.1.tgz", - "integrity": "sha512-Ed/LrqB8EPlGxjS+TrsXcpUond1mhccS3pchLhzSgPCnTimUCKj3IZE75pAs5m6heB2U2TMerKFUXheyHY+VDQ==", - "dev": true, - "dependencies": { - "tr46": "^4.1.1", - "webidl-conversions": "^7.0.0" - }, - "engines": { - "node": ">=14" - } - }, - "node_modules/which-typed-array": { - "version": "1.1.15", - "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.15.tgz", - "integrity": "sha512-oV0jmFtUky6CXfkqehVvBP/LSWJ2sy4vWMioiENyJLePrBO/yKyV9OyJySfAKosh+RYkIl5zJCNZ8/4JncrpdA==", - "dev": true, - "dependencies": { - "available-typed-arrays": "^1.0.7", - "call-bind": "^1.0.7", - "for-each": "^0.3.3", - "gopd": "^1.0.1", - "has-tostringtag": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/why-is-node-running": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/why-is-node-running/-/why-is-node-running-2.3.0.tgz", - "integrity": "sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w==", - "dev": true, - "dependencies": { - "siginfo": "^2.0.0", - "stackback": "0.0.2" - }, - "bin": { - "why-is-node-running": "cli.js" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/wildcard": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/wildcard/-/wildcard-2.0.1.tgz", - "integrity": "sha512-CC1bOL87PIWSBhDcTrdeLo6eGT7mCFtrg0uIJtqJUFyK+eJnzl8A1niH56uu7KMa5XFrtiV+AQuHO3n7DsHnLQ==", - "dev": true - }, - "node_modules/word-wrap": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", - "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/wrap-ansi": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", - "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/wrap-ansi-cjs": { - "name": "wrap-ansi", - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - } - }, - "node_modules/wrap-ansi-cjs/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/wrap-ansi-cjs/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/wrap-ansi-cjs/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "node_modules/wrap-ansi-cjs/node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true - }, - "node_modules/wrap-ansi-cjs/node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/wrap-ansi-cjs/node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dev": true, - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/wrap-ansi/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/wrap-ansi/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/wrap-ansi/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "node_modules/wrap-ansi/node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true - }, - "node_modules/wrap-ansi/node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/wrap-ansi/node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dev": true, - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", - "dev": true, - "optional": true, - "peer": true - }, - "node_modules/ws": { - "version": "8.17.1", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.17.1.tgz", - "integrity": "sha512-6XQFvXTkbfUOZOKKILFG1PDK2NDQs4azKQl26T0YS5CxqWLgXajbPZ+h4gZekJyRqFU8pvnbAbbs/3TgRPy+GQ==", - "dev": true, - "engines": { - "node": ">=10.0.0" - }, - "peerDependencies": { - "bufferutil": "^4.0.1", - "utf-8-validate": ">=5.0.2" - }, - "peerDependenciesMeta": { - "bufferutil": { - "optional": true - }, - "utf-8-validate": { - "optional": true - } - } - }, - "node_modules/xml-name-validator": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-4.0.0.tgz", - "integrity": "sha512-ICP2e+jsHvAj2E2lIHxa5tjXRlKDJo4IdvPvCXbXQGdzSfmSpNVyIKMvoZHjDY9DP0zV17iI85o90vRFXNccRw==", - "dev": true, - "engines": { - "node": ">=12" - } - }, - "node_modules/xmlchars": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/xmlchars/-/xmlchars-2.2.0.tgz", - "integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==", - "dev": true - }, - "node_modules/y18n": { - "version": "5.0.8", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", - "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", - "dev": true, - "engines": { - "node": ">=10" - } - }, - "node_modules/yallist": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", - "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", - "dev": true - }, - "node_modules/yaml": { - "version": "1.10.2", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", - "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==", - "dev": true, - "engines": { - "node": ">= 6" - } - }, - "node_modules/yargs": { - "version": "17.7.2", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", - "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", - "dev": true, - "dependencies": { - "cliui": "^8.0.1", - "escalade": "^3.1.1", - "get-caller-file": "^2.0.5", - "require-directory": "^2.1.1", - "string-width": "^4.2.3", - "y18n": "^5.0.5", - "yargs-parser": "^21.1.1" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/yargs-parser": { - "version": "21.1.1", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", - "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", - "dev": true, - "engines": { - "node": ">=12" - } - }, - "node_modules/yargs/node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true - }, - "node_modules/yargs/node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/yargs/node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dev": true, - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/yocto-queue": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-1.1.1.tgz", - "integrity": "sha512-b4JR1PFR10y1mKjhHY9LaGo6tmrgjit7hxVIeAmyMw3jegXR4dhYqLaQF5zMXZxY7tLpMyJeLjr1C4rLmkVe8g==", - "dev": true, - "engines": { - "node": ">=12.20" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/yoctocolors-cjs": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/yoctocolors-cjs/-/yoctocolors-cjs-2.1.2.tgz", - "integrity": "sha512-cYVsTjKl8b+FrnidjibDWskAv7UKOfcwaVZdp/it9n1s9fU3IkgDbhdIRKCW4JDsAlECJY0ytoVPT3sK6kideA==", - "dev": true, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/zone.js": { - "version": "0.14.10", - "resolved": "https://registry.npmjs.org/zone.js/-/zone.js-0.14.10.tgz", - "integrity": "sha512-YGAhaO7J5ywOXW6InXNlLmfU194F8lVgu7bRntUF3TiG8Y3nBK0x1UJJuHUP/e8IyihkjCYqhCScpSwnlaSRkQ==", - "dev": true, - "peer": true - } - } -} diff --git a/package.json b/package.json index 9ea88cff..e66f8357 100644 --- a/package.json +++ b/package.json @@ -1,47 +1,53 @@ { - "name": "keycloakify-angular-workspace", - "version": "0.0.0", - "type": "module", - "scripts": { - "ng": "ng", - "build": "ng build", - "watch": "ng build --watch --configuration development", - "test": "ng test", - "lint": "ng lint --fix" - }, - "private": true, - "devDependencies": { - "@angular-devkit/build-angular": "^18.2.5", - "@angular/animations": "^18.2.0", - "@angular/cli": "^18.2.5", - "@angular/common": "^18.2.0", - "@angular/compiler": "^18.2.0", - "@angular/compiler-cli": "^18.2.0", - "@angular/core": "^18.2.0", - "@angular/forms": "^18.2.0", - "@angular/platform-browser": "^18.2.0", - "@angular/platform-browser-dynamic": "^18.2.0", - "@eslint/compat": "^1.1.1", - "@storybook/addon-essentials": "^8.3.0", - "@storybook/angular": "^8.3.0", - "@storybook/builder-vite": "^8.3.1", - "@types/node": "^20.0.0", - "@typescript-eslint/types": "^8.6.0", - "@typescript-eslint/utils": "^8.6.0", - "angular-eslint": "^18.3.1", - "eslint": "^9.9.1", - "eslint-plugin-prettier": "^5.2.1", - "eslint-plugin-storybook": "^0.8.0", - "keycloakify": "^11.0.0", - "ng-packagr": "^18.2.0", - "prettier": "^3.3.3", - "rxjs": "~7.8.0", - "storybook": "^8.3.0", - "tslib": "^2.3.0", - "typescript": "~5.5.2", - "typescript-eslint": "^8.2.0" - }, - "overrides": { - "@typescript-eslint/utils": "^8.6.0" - } + "name": "@keycloakify/angular", + "version": "0.0.1", + "description": "Angular components for Keycloakify", + "repository": { + "type": "git", + "url": "git://github.com/keycloakify/keycloakify-angular.git" + }, + "scripts": { + "build": "tsx scripts/build/main.ts", + "link-in-starter": "tsx scripts/link-in-starter.ts", + "_format": "prettier '**/*.{ts,tsx,json,md}'", + "format": "yarn _format --write", + "link-in-app": "tsx scripts/link-in-app.ts" + }, + "lint-staged": { + "*.{ts,tsx,json,md}": [ + "prettier --write" + ] + }, + "husky": { + "hooks": { + "pre-commit": "lint-staged -v" + } + }, + "author": "u/garronej", + "license": "MIT", + "files": [ + "dist/", + "!dist/tsconfig.tsbuildinfo" + ], + "keywords": [ + "keycloak", + "angular", + "keycloakify" + ], + "homepage": "https://www.keycloakify.dev", + "dependencies": { + "tsafe": "^1.6.6" + }, + "peerDependencies": { + "keycloakify": "^11.2.0" + }, + "devDependencies": { + "keycloakify": "^11.2.0", + "prettier": "^3.2.5", + "typescript": "^4.9.4", + "husky": "^4.3.8", + "lint-staged": "^11.0.0", + "tsc-alias": "^1.8.10", + "tsx": "^4.15.5" + } } diff --git a/prettier.config.js b/prettier.config.js deleted file mode 100644 index b3184cc0..00000000 --- a/prettier.config.js +++ /dev/null @@ -1,25 +0,0 @@ -/** - * @see https://prettier.io/docs/en/configuration.html - * @type {import("prettier").Config} - */ - const config = { - printWidth: 120, - singleQuote: true, - trailingComma: "all", - tabWidth: 2, - useTabs: false, - semi: true, - bracketSpacing: true, - arrowParens: "always", - singleAttributePerLine: true, - overrides: [ - { - files: "*.html", - options: { - parser: "angular" - } - } - ] -}; - -export default config; \ No newline at end of file diff --git a/projects/keycloakify-angular/README.md b/projects/keycloakify-angular/README.md deleted file mode 100644 index 08aca8e7..00000000 --- a/projects/keycloakify-angular/README.md +++ /dev/null @@ -1,24 +0,0 @@ -# MyLib - -This library was generated with [Angular CLI](https://github.com/angular/angular-cli) version 18.2.0. - -## Code scaffolding - -Run `ng generate component component-name --project keycloakify-angular` to generate a new component. You can also use `ng generate directive|pipe|service|class|guard|interface|enum|module --project keycloakify-angular`. -> Note: Don't forget to add `--project keycloakify-angular` or else it will be added to the default project in your `angular.json` file. - -## Build - -Run `ng build keycloakify-angular` to build the project. The build artifacts will be stored in the `dist/` directory. - -## Publishing - -After building your library with `ng build keycloakify-angular`, go to the dist folder `cd dist/keycloakify-angular` and run `npm publish`. - -## Running unit tests - -Run `ng test keycloakify-angular` to execute the unit tests via [Karma](https://karma-runner.github.io). - -## Further help - -To get more help on the Angular CLI use `ng help` or go check out the [Angular CLI Overview and Command Reference](https://angular.dev/tools/cli) page. diff --git a/projects/keycloakify-angular/account/index.ts b/projects/keycloakify-angular/account/index.ts deleted file mode 100644 index 7e1a213e..00000000 --- a/projects/keycloakify-angular/account/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from './public-api'; diff --git a/projects/keycloakify-angular/account/ng-package.json b/projects/keycloakify-angular/account/ng-package.json deleted file mode 100644 index 8ce4c798..00000000 --- a/projects/keycloakify-angular/account/ng-package.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "$schema": "../../../node_modules/ng-packagr/ng-package.schema.json", - "lib": { - "entryFile": "public-api.ts" - } -} \ No newline at end of file diff --git a/projects/keycloakify-angular/account/public-api.ts b/projects/keycloakify-angular/account/public-api.ts deleted file mode 100644 index 499b44e9..00000000 --- a/projects/keycloakify-angular/account/public-api.ts +++ /dev/null @@ -1,15 +0,0 @@ -/* - * Public API Surface of keycloakify-angular - */ -// DIRECTIVES -export * from './src/directives'; -// PIPES -export * from './src/pipes'; -// CLASSES -export { ComponentReference } from './src/classes/component-reference.class'; -// SERVICES -export * from './src/services'; -// DEFAULT PAGE -export { DefaultPage } from './src/DefaultPage'; -// TEMPLATE -export { TemplateComponent } from './src/containers/template.component'; diff --git a/projects/keycloakify-angular/account/src/DefaultPage.ts b/projects/keycloakify-angular/account/src/DefaultPage.ts deleted file mode 100644 index 8de6d1cf..00000000 --- a/projects/keycloakify-angular/account/src/DefaultPage.ts +++ /dev/null @@ -1,52 +0,0 @@ -import { Type } from '@angular/core'; -import { ClassKey } from 'keycloakify/account'; -import { KcContext } from 'keycloakify/account/KcContext'; - -const DefaultPage = async ( - pageId: KcContext['pageId'], - active = true, - doUseDefaultCss = true, - classes: { [key in ClassKey]?: string } = {}, -): Promise<{ - ComponentBootstrap: Type; - active: boolean; - doUseDefaultCss: boolean; - classes: { [key in ClassKey]?: string }; -}> => { - let ComponentBootstrapPromise; - switch (pageId) { - case 'password.ftl': - ComponentBootstrapPromise = import('./pages/password/password.component').then((c) => c.PasswordComponent); - break; - case 'account.ftl': - ComponentBootstrapPromise = import('./pages/account/account.component').then((c) => c.AccountComponent); - break; - case 'sessions.ftl': - ComponentBootstrapPromise = import('./pages/sessions/sessions.component').then((c) => c.SessionsComponent); - break; - case 'totp.ftl': - ComponentBootstrapPromise = import('./pages/totp/totp.component').then((c) => c.TotpComponent); - break; - case 'applications.ftl': - ComponentBootstrapPromise = import('./pages/applications/applications.component').then( - (c) => c.ApplicationsComponent, - ); - break; - case 'log.ftl': - ComponentBootstrapPromise = import('./pages/log/log.component').then((c) => c.LogComponent); - break; - case 'federatedIdentity.ftl': - ComponentBootstrapPromise = import('./pages/federatedIdentity/federatedIdentity.component').then( - (c) => c.FederatedIdentityComponent, - ); - break; - } - return ComponentBootstrapPromise?.then((ComponentBootstrap) => ({ - ComponentBootstrap, - active, - doUseDefaultCss, - classes, - })); -}; - -export { DefaultPage }; diff --git a/projects/keycloakify-angular/account/src/classes/component-reference.class.ts b/projects/keycloakify-angular/account/src/classes/component-reference.class.ts deleted file mode 100644 index e775835d..00000000 --- a/projects/keycloakify-angular/account/src/classes/component-reference.class.ts +++ /dev/null @@ -1,6 +0,0 @@ -import { ClassKey } from 'keycloakify/account'; -export abstract class ComponentReference { - doUseDefaultCss!: boolean | undefined; - classes!: Partial> | undefined; - additionalClasses!: Partial>; -} diff --git a/projects/keycloakify-angular/account/src/containers/template.component.html b/projects/keycloakify-angular/account/src/containers/template.component.html deleted file mode 100644 index 59657e2f..00000000 --- a/projects/keycloakify-angular/account/src/containers/template.component.html +++ /dev/null @@ -1,125 +0,0 @@ -@let enabledLanguages = i18n.enabledLanguages; -@let currentLanguage = i18n.currentLanguage; -@let url = kcContext.url; -@let features = kcContext.features; -@let realm = kcContext.realm; -@let message = kcContext.message; -@let referrer = kcContext.referrer; -@let activeLink = active(); -@let isReadyToRender = isReadyToRender$ | async; - -@if (isReadyToRender) { - - -
-
- -
- -
- @if (message) { -
- @switch (message.type) { - @case ('success') { - - } - @case ('error') { - - } - } - -
- } - -
-
-} diff --git a/projects/keycloakify-angular/account/src/containers/template.component.ts b/projects/keycloakify-angular/account/src/containers/template.component.ts deleted file mode 100644 index 2d8b4fe9..00000000 --- a/projects/keycloakify-angular/account/src/containers/template.component.ts +++ /dev/null @@ -1,71 +0,0 @@ -import { AsyncPipe, NgClass, NgTemplateOutlet } from '@angular/common'; -import { ChangeDetectionStrategy, Component, forwardRef, inject, input, OnInit, Renderer2 } from '@angular/core'; -import { Meta, Title } from '@angular/platform-browser'; -import { CLASSES, I18N, KC_CONTEXT, USE_DEFAULT_CSS } from 'keycloakify-angular'; -import { I18n } from 'keycloakify/account/i18n'; -import { KcContext } from 'keycloakify/account/KcContext'; -import { ClassKey, getKcClsx } from 'keycloakify/account/lib/kcClsx'; -import { Observable } from 'rxjs'; -import { ComponentReference } from '../classes/component-reference.class'; -import { KcClassDirective } from '../directives/kc-class.directive'; -import { KcSanitizePipe } from '../pipes/kc-sanitize.pipe'; -import { MsgStrPipe } from '../pipes/msg-str.pipe'; -import { AccountResourceInjectorService } from '../services/resource-injector.service'; - -@Component({ - selector: 'kc-account-template', - templateUrl: './template.component.html', - standalone: true, - imports: [AsyncPipe, KcSanitizePipe, NgTemplateOutlet, KcClassDirective, MsgStrPipe, NgClass], - changeDetection: ChangeDetectionStrategy.OnPush, - providers: [ - { - provide: ComponentReference, - useExisting: forwardRef(() => TemplateComponent), - }, - ], -}) -export class TemplateComponent extends ComponentReference implements OnInit { - i18n = inject(I18N); - renderer = inject(Renderer2); - meta = inject(Meta); - title = inject(Title); - kcContext = inject(KC_CONTEXT); - override doUseDefaultCss = inject(USE_DEFAULT_CSS); - override classes = inject>>(CLASSES); - accountResourceInjectorService = inject(AccountResourceInjectorService); - - active = input< - 'account' | 'password' | 'totp' | 'social' | 'sessions' | 'applications' | 'log' | 'authorization' | undefined - >(undefined); - - isReadyToRender$: Observable; - - constructor() { - super(); - this.title.setTitle(this.i18n.msgStr('accountManagementTitle')); - this.isReadyToRender$ = this.accountResourceInjectorService.injectResource(this.doUseDefaultCss); - } - - ngOnInit() { - this.applyKcIndexClasses(); - } - - private applyKcIndexClasses() { - const kcClsx = getKcClsx({ - doUseDefaultCss: this.doUseDefaultCss, - classes: this.classes, - }).kcClsx; - const kcBodyClass = kcClsx('kcBodyClass'); - const kcHtmlClass = kcClsx('kcHtmlClass'); - const kcBodyClasses = kcBodyClass.split(/\s+/); - const kcHtmlClasses = kcHtmlClass.split(/\s+/); - kcBodyClasses.push('admin-console', 'user'); - kcBodyClasses.forEach((klass) => { - this.renderer.addClass(document.body, klass); - }); - kcHtmlClasses.forEach((klass) => { - this.renderer.addClass(document.documentElement, klass); - }); - } -} diff --git a/projects/keycloakify-angular/account/src/directives/attributes.directive.ts b/projects/keycloakify-angular/account/src/directives/attributes.directive.ts deleted file mode 100644 index 807bd5b2..00000000 --- a/projects/keycloakify-angular/account/src/directives/attributes.directive.ts +++ /dev/null @@ -1,19 +0,0 @@ -import { Directive, effect, ElementRef, inject, input, Renderer2 } from '@angular/core'; - -@Directive({ selector: '[kcAttributes]', standalone: true }) -export class AttributesDirective { - kcAttributes = input>(); - readonly #el = inject>(ElementRef); - readonly #renderer = inject(Renderer2); - - constructor() { - effect(() => { - const attributes = this.kcAttributes(); - if (attributes) { - Object.entries(attributes).forEach(([key, value]) => { - this.#renderer.setAttribute(this.#el.nativeElement, `data-${key}`, value); - }); - } - }); - } -} diff --git a/projects/keycloakify-angular/account/src/directives/index.ts b/projects/keycloakify-angular/account/src/directives/index.ts deleted file mode 100644 index f9f8d151..00000000 --- a/projects/keycloakify-angular/account/src/directives/index.ts +++ /dev/null @@ -1,2 +0,0 @@ -export * from './attributes.directive'; -export * from './kc-class.directive'; diff --git a/projects/keycloakify-angular/account/src/directives/kc-class.directive.ts b/projects/keycloakify-angular/account/src/directives/kc-class.directive.ts deleted file mode 100644 index 20a803a4..00000000 --- a/projects/keycloakify-angular/account/src/directives/kc-class.directive.ts +++ /dev/null @@ -1,150 +0,0 @@ -/* eslint-disable @typescript-eslint/no-explicit-any */ -/* eslint-disable @typescript-eslint/consistent-indexed-object-style */ -import { - Directive, - DoCheck, - ElementRef, - inject, - Input, - isDevMode, - Renderer2, - ɵstringify as stringify, -} from '@angular/core'; -import { ClassKey } from 'keycloakify/account'; -import { getKcClsx } from 'keycloakify/account/lib/kcClsx'; -import { ComponentReference } from '../classes/component-reference.class'; - -interface CssClassState { - // PERF: could use a bit mask to represent state as all fields are boolean flags - enabled: boolean; - changed: boolean; - touched: boolean; -} - -type KcClassSupportedTypes = ClassKey[] | Set | Partial<{ [key in ClassKey]: any }> | null | undefined; - -type NgClassSupportedTypes = string[] | Set | { [key: string]: any } | null | undefined; - -@Directive({ selector: '[kcClass]', standalone: true }) -export class KcClassDirective implements DoCheck { - private initialClasses: string[] = []; - private rawClass: NgClassSupportedTypes; - private rawKcClass: KcClassSupportedTypes; - - private stateMap = new Map(); - readonly #renderer = inject(Renderer2); - readonly #el = inject(ElementRef); - readonly #host = inject(ComponentReference); - // eslint-disable-next-line @angular-eslint/no-input-rename - @Input('class') - set klass(value: string) { - this.initialClasses = value != null ? value.trim().split(/\s+/) : []; - } - - // eslint-disable-next-line @angular-eslint/no-input-rename - @Input('ngClass') - set ngClass(value: string | NgClassSupportedTypes) { - this.rawClass = typeof value === 'string' ? value.trim().split(/\s+/) : value; - } - - // eslint-disable-next-line @angular-eslint/no-input-rename - @Input('kcClass') - set kcClass(value: ClassKey | KcClassSupportedTypes) { - this.rawKcClass = typeof value === 'string' ? (value.trim().split(/\s+/) as ClassKey[]) : value; - } - - ngDoCheck(): void { - for (const klass of this.initialClasses) { - this._updateState(klass, true); - } - // classes from the [ngClass] binding - const rawClass = this.rawClass; - if (Array.isArray(rawClass) || rawClass instanceof Set) { - for (const klass of rawClass) { - this._updateState(klass, true); - } - } else if (rawClass != null) { - for (const klass of Object.keys(rawClass)) { - this._updateState(klass, Boolean(rawClass[klass])); - } - } - - // classes from the [kcClass] binding - const rawKcClass = this.rawKcClass; - if (Array.isArray(rawKcClass) || rawKcClass instanceof Set) { - for (const klass of rawKcClass) { - this._updateState(klass, true, true); - } - } else if (rawKcClass != null) { - for (const klass of Object.keys(rawKcClass)) { - this._updateState(klass, Boolean(rawKcClass[klass as ClassKey]), true); - } - } - - this._applyStateDiff(); - } - - private _updateState(klass: string | ClassKey, nextEnabled: boolean, kcClsxCheck = false) { - const state = this.stateMap.get(klass); - if (state !== undefined) { - if (state.enabled !== nextEnabled) { - state.changed = true; - state.enabled = nextEnabled; - } - state.touched = true; - } else { - let klassChecked = klass; - if (kcClsxCheck) { - const doUseDefaultCss = this.#host.doUseDefaultCss ?? true; - const classes = { ...(this.#host.classes ?? {}), ...(this.#host.additionalClasses ?? {}) }; - const kcClsx = getKcClsx({ doUseDefaultCss, classes }).kcClsx; - klassChecked = kcClsx(klass as ClassKey); - } - this.stateMap.set(klassChecked, { - enabled: nextEnabled, - changed: true, - touched: true, - }); - } - } - - private _applyStateDiff() { - for (const stateEntry of this.stateMap) { - const klass = stateEntry[0]; - const state = stateEntry[1]; - - if (state.changed) { - this._toggleClass(klass, state.enabled); - state.changed = false; - } else if (!state.touched) { - // A class that was previously active got removed from the new collection of classes - - // remove from the DOM as well. - if (state.enabled) { - this._toggleClass(klass, false); - } - this.stateMap.delete(klass); - } - - state.touched = false; - } - } - - private _toggleClass(klass: string, enabled: boolean): void { - if (isDevMode()) { - if (typeof klass !== 'string') { - throw new Error(`NgClass can only toggle CSS classes expressed as strings, got ${stringify(klass)}`); - } - } - - klass = klass.trim(); - if (klass.length > 0) { - klass.split(/\s+/).forEach((klass) => { - if (enabled) { - this.#renderer.addClass(this.#el.nativeElement, klass); - } else { - this.#renderer.removeClass(this.#el.nativeElement, klass); - } - }); - } - } -} diff --git a/projects/keycloakify-angular/account/src/pages/account/account.component.html b/projects/keycloakify-angular/account/src/pages/account/account.component.html deleted file mode 100644 index f9ae2a64..00000000 --- a/projects/keycloakify-angular/account/src/pages/account/account.component.html +++ /dev/null @@ -1,153 +0,0 @@ -@let url = kcContext.url; -@let realm = kcContext.realm; -@let messagesPerField = kcContext.messagesPerField; -@let stateChecker = kcContext.stateChecker; -@let account = kcContext.account; -@let referrer = kcContext.referrer; - - - -
-
-

{{ 'editAccountHtmlTitle' | msgStr }}

-
-
- * {{ 'requiredFields' | msgStr }} -
-
-
- - @if (!realm.registrationEmailAsUsername) { -
-
- - @if (realm.editUsernameAllowed) { - * - } -
- -
- -
-
- } - -
-
- - * -
- -
- -
-
- -
-
- - * -
- -
- -
-
- -
-
- - * -
- -
- -
-
- -
-
-
- @if (referrer) { - {{ 'backToApplication' | msgStr }} - } - - -
-
-
-
-
-
diff --git a/projects/keycloakify-angular/account/src/pages/account/account.component.ts b/projects/keycloakify-angular/account/src/pages/account/account.component.ts deleted file mode 100644 index 63f2131c..00000000 --- a/projects/keycloakify-angular/account/src/pages/account/account.component.ts +++ /dev/null @@ -1,30 +0,0 @@ -import { NgClass } from '@angular/common'; -import { Component, forwardRef, inject } from '@angular/core'; -import { CLASSES, KC_CONTEXT, USE_DEFAULT_CSS } from 'keycloakify-angular'; -import { ClassKey } from 'keycloakify/account'; -import { KcContext } from 'keycloakify/account/KcContext'; -import { ComponentReference } from '../../classes/component-reference.class'; -import { TemplateComponent } from '../../containers/template.component'; -import { KcClassDirective } from '../../directives'; -import { MsgStrPipe } from '../../pipes'; - -@Component({ - standalone: true, - imports: [KcClassDirective, TemplateComponent, MsgStrPipe, NgClass], - selector: 'kc-root', - templateUrl: 'account.component.html', - providers: [ - { - provide: ComponentReference, - useExisting: forwardRef(() => AccountComponent), - }, - ], -}) -export class AccountComponent extends ComponentReference { - kcContext = inject>(KC_CONTEXT); - override doUseDefaultCss = inject(USE_DEFAULT_CSS); - override classes = inject>>(CLASSES); - override additionalClasses: Partial> = { - kcBodyClass: `${this.classes?.kcBodyClass} user`, - }; -} diff --git a/projects/keycloakify-angular/account/src/pages/applications/applications.component.html b/projects/keycloakify-angular/account/src/pages/applications/applications.component.html deleted file mode 100644 index e15fb2ce..00000000 --- a/projects/keycloakify-angular/account/src/pages/applications/applications.component.html +++ /dev/null @@ -1,153 +0,0 @@ -@let url = kcContext.url; -@let stateChecker = kcContext.stateChecker; -@let applications = kcContext.applications?.applications; - - - -
-
-

{{ 'applicationsHtmlTitle' | msgStr }}

-
- -
- - - - - - - - - - - - - - - - @for (application of applications ?? []; track application) { - - - - - - - - - - - - } - -
{{ 'application' | msgStr }}{{ 'availableRoles' | msgStr }}{{ 'grantedPermissions' | msgStr }}{{ 'additionalGrants' | msgStr }}{{ 'action' | msgStr }}
- @if (application.effectiveUrl) { - - @if (application.client.name) { - {{ application.client.name | advancedMsgStr }} - } @else { - {{ application.client.clientId }} - } - - } @else { - @if (application.client.name) { - {{ application.client.name | advancedMsgStr }} - } @else { - {{ application.client.clientId }} - } - } - - @if (!(application.realmRolesAvailable | isArrayWithEmptyObject)) { - @for (role of application.realmRolesAvailable; track role; let last = $last) { - - @if (role.description) { - {{ role.description | advancedMsgStr }} - } @else { - {{ role.name | advancedMsgStr }} - } - @if (!last) { - ,  - } - - } - } - @if (application.resourceRolesAvailable) { - @for (resource of application.resourceRolesAvailable | keyvalue; track resource.key) { - - @if (!(application.realmRolesAvailable | isArrayWithEmptyObject)) { - ,  - } - @for ( - clientRole of application.resourceRolesAvailable[resource.key]; - track clientRole; - let roleLast = $last - ) { - - {{ - (clientRole.roleDescription ? clientRole.roleDescription : clientRole.roleName) - | advancedMsgStr - }} - {{ 'inResource' | msgStr }} - - {{ - clientRole.clientName ? (clientRole.clientName | advancedMsgStr) : clientRole.clientId - }} - @if (!roleLast) { - ,  - } - - } - - } - } - - @if (application.client.consentRequired) { - @for (claim of application.clientScopesGranted; track claim; let last = $last) { - {{ claim | advancedMsgStr }} - @if (!last) { - ,  - } - } - } @else { - {{ 'fullAccess' | msgStr }} - } - - @for (grant of application.additionalGrants; track grant; let last = $last) { - {{ grant | advancedMsgStr }} - @if (!last) { - ,  - } - } - - @if ( - (application.client.consentRequired && application.clientScopesGranted.length > 0) || - application.additionalGrants.length > 0 - ) { - - } -
-
-
-
-
diff --git a/projects/keycloakify-angular/account/src/pages/applications/applications.component.ts b/projects/keycloakify-angular/account/src/pages/applications/applications.component.ts deleted file mode 100644 index 54a0e481..00000000 --- a/projects/keycloakify-angular/account/src/pages/applications/applications.component.ts +++ /dev/null @@ -1,36 +0,0 @@ -import { KeyValuePipe, NgClass } from '@angular/common'; -import { Component, forwardRef, inject } from '@angular/core'; -import { CLASSES, KC_CONTEXT, USE_DEFAULT_CSS } from 'keycloakify-angular'; -import { ClassKey } from 'keycloakify/account'; -import { KcContext } from 'keycloakify/account/KcContext'; -import { ComponentReference } from '../../classes/component-reference.class'; -import { TemplateComponent } from '../../containers/template.component'; -import { KcClassDirective } from '../../directives'; -import { AdvancedMsgStrPipe, MsgStrPipe } from '../../pipes'; -import { IsArrayWithEmptyObjectPipe } from '../../pipes/is-array-with-empty-object.pipe'; - -@Component({ - standalone: true, - imports: [ - KcClassDirective, - TemplateComponent, - MsgStrPipe, - AdvancedMsgStrPipe, - NgClass, - KeyValuePipe, - IsArrayWithEmptyObjectPipe, - ], - selector: 'kc-root', - templateUrl: 'applications.component.html', - providers: [ - { - provide: ComponentReference, - useExisting: forwardRef(() => ApplicationsComponent), - }, - ], -}) -export class ApplicationsComponent extends ComponentReference { - kcContext = inject>(KC_CONTEXT); - override doUseDefaultCss = inject(USE_DEFAULT_CSS); - override classes = inject>>(CLASSES); -} diff --git a/projects/keycloakify-angular/account/src/pages/federatedIdentity/federatedIdentity.component.html b/projects/keycloakify-angular/account/src/pages/federatedIdentity/federatedIdentity.component.html deleted file mode 100644 index fd0b4d09..00000000 --- a/projects/keycloakify-angular/account/src/pages/federatedIdentity/federatedIdentity.component.html +++ /dev/null @@ -1,97 +0,0 @@ -@let url = kcContext.url; -@let federatedIdentity = kcContext.federatedIdentity; -@let stateChecker = kcContext.stateChecker; - - - - - - diff --git a/projects/keycloakify-angular/account/src/pages/federatedIdentity/federatedIdentity.component.ts b/projects/keycloakify-angular/account/src/pages/federatedIdentity/federatedIdentity.component.ts deleted file mode 100644 index cc4f7296..00000000 --- a/projects/keycloakify-angular/account/src/pages/federatedIdentity/federatedIdentity.component.ts +++ /dev/null @@ -1,27 +0,0 @@ -import { NgClass } from '@angular/common'; -import { Component, forwardRef, inject } from '@angular/core'; -import { CLASSES, KC_CONTEXT, USE_DEFAULT_CSS } from 'keycloakify-angular'; -import { ClassKey } from 'keycloakify/account'; -import { KcContext } from 'keycloakify/account/KcContext'; -import { ComponentReference } from '../../classes/component-reference.class'; -import { TemplateComponent } from '../../containers/template.component'; -import { KcClassDirective } from '../../directives'; -import { MsgStrPipe } from '../../pipes'; - -@Component({ - standalone: true, - imports: [KcClassDirective, TemplateComponent, MsgStrPipe, NgClass], - selector: 'kc-root', - templateUrl: 'federatedIdentity.component.html', - providers: [ - { - provide: ComponentReference, - useExisting: forwardRef(() => FederatedIdentityComponent), - }, - ], -}) -export class FederatedIdentityComponent extends ComponentReference { - kcContext = inject>(KC_CONTEXT); - override doUseDefaultCss = inject(USE_DEFAULT_CSS); - override classes = inject>>(CLASSES); -} diff --git a/projects/keycloakify-angular/account/src/pages/log/log.component.html b/projects/keycloakify-angular/account/src/pages/log/log.component.html deleted file mode 100644 index 9063882a..00000000 --- a/projects/keycloakify-angular/account/src/pages/log/log.component.html +++ /dev/null @@ -1,44 +0,0 @@ -@let log = kcContext.log; - - - -
-
-

{{ 'accountLogHtmlTitle' | msgStr }}

-
- - - - - - - - - - - - - - @for (event of log.events; track event) { - - - - - - - - } - -
{{ 'date' | msgStr }}{{ 'event' | msgStr }}{{ 'ip' | msgStr }}{{ 'client' | msgStr }}{{ 'details' | msgStr }}
{{ event.date ? (event.date | date) : '' }}{{ event.event }}{{ event.ipAddress }}{{ event.client || '' }} - @for (detail of event.details; track detail; let last = $last) { - - {{ detail.key }} = {{ detail.value }} - @if (!last) { - ,  - } - - } -
-
-
-
diff --git a/projects/keycloakify-angular/account/src/pages/log/log.component.ts b/projects/keycloakify-angular/account/src/pages/log/log.component.ts deleted file mode 100644 index a844e2cd..00000000 --- a/projects/keycloakify-angular/account/src/pages/log/log.component.ts +++ /dev/null @@ -1,27 +0,0 @@ -import { DatePipe, NgClass } from '@angular/common'; -import { Component, forwardRef, inject } from '@angular/core'; -import { CLASSES, KC_CONTEXT, USE_DEFAULT_CSS } from 'keycloakify-angular'; -import { ClassKey } from 'keycloakify/account'; -import { KcContext } from 'keycloakify/account/KcContext'; -import { ComponentReference } from '../../classes/component-reference.class'; -import { TemplateComponent } from '../../containers/template.component'; -import { KcClassDirective } from '../../directives'; -import { MsgStrPipe } from '../../pipes'; - -@Component({ - standalone: true, - imports: [KcClassDirective, TemplateComponent, MsgStrPipe, NgClass, DatePipe], - selector: 'kc-root', - templateUrl: 'log.component.html', - providers: [ - { - provide: ComponentReference, - useExisting: forwardRef(() => LogComponent), - }, - ], -}) -export class LogComponent extends ComponentReference { - kcContext = inject>(KC_CONTEXT); - override doUseDefaultCss = inject(USE_DEFAULT_CSS); - override classes = inject>>(CLASSES); -} diff --git a/projects/keycloakify-angular/account/src/pages/password/password.component.html b/projects/keycloakify-angular/account/src/pages/password/password.component.html deleted file mode 100644 index 02c8eb8a..00000000 --- a/projects/keycloakify-angular/account/src/pages/password/password.component.html +++ /dev/null @@ -1,131 +0,0 @@ -@let url = kcContext.url; -@let password = kcContext.password; -@let account = kcContext.account; -@let stateChecker = kcContext.stateChecker; - - - -
-
-

{{ 'changePasswordHtmlTitle' | msgStr }}

-
-
- {{ 'allFieldsRequired' | msgStr }} -
-
- -
- - - @if (password.passwordSet) { -
-
- -
-
- -
-
- } - - - -
-
- -
-
- -
-
- -
-
- -
- -
- -
-
- -
-
-
- -
-
-
-
-
-
diff --git a/projects/keycloakify-angular/account/src/pages/password/password.component.ts b/projects/keycloakify-angular/account/src/pages/password/password.component.ts deleted file mode 100644 index 848fc143..00000000 --- a/projects/keycloakify-angular/account/src/pages/password/password.component.ts +++ /dev/null @@ -1,105 +0,0 @@ -import { NgClass } from '@angular/common'; -import { Component, forwardRef, inject, signal } from '@angular/core'; -import { CLASSES, KC_CONTEXT, USE_DEFAULT_CSS } from 'keycloakify-angular'; -import { ClassKey } from 'keycloakify/account'; -import { KcContext } from 'keycloakify/account/KcContext'; -import { ComponentReference } from '../../classes/component-reference.class'; -import { TemplateComponent } from '../../containers/template.component'; -import { KcClassDirective } from '../../directives'; -import { MsgStrPipe } from '../../pipes'; - -@Component({ - standalone: true, - imports: [KcClassDirective, TemplateComponent, MsgStrPipe, NgClass], - selector: 'kc-root', - templateUrl: 'password.component.html', - providers: [ - { - provide: ComponentReference, - useExisting: forwardRef(() => PasswordComponent), - }, - ], -}) -export class PasswordComponent extends ComponentReference { - kcContext = inject>(KC_CONTEXT); - override doUseDefaultCss = inject(USE_DEFAULT_CSS); - override classes = inject>>(CLASSES); - override additionalClasses: Partial> = { - kcBodyClass: `${this.classes?.kcBodyClass} password`, - }; - - currentPassword = signal(''); - newPassword = signal(''); - newPasswordConfirm = signal(''); - newPasswordError = signal(''); - newPasswordConfirmError = signal(''); - hasNewPasswordBlurred = signal(false); - hasNewPasswordConfirmBlurred = signal(false); - - constructor() { - super(); - window.kcContext = { - ...this.kcContext, - message: (() => { - if (this.newPasswordError() !== '') { - return { - type: 'error', - summary: this.newPasswordError(), - }; - } - if (this.newPasswordConfirmError() !== '') { - return { - type: 'error', - summary: this.newPasswordConfirmError(), - }; - } - return this.kcContext.message; - })(), - }; - } - - checkNewPassword(newPassword: string) { - if (!this.kcContext.password.passwordSet) return; - if (newPassword === this.currentPassword()) { - this.newPasswordError.set('newPasswordSameAsOld'); - } else { - this.newPasswordError.set(''); - } - } - checkNewPasswordConfirm(newPasswordConfirm: string) { - if (newPasswordConfirm === '') return; - if (newPasswordConfirm !== this.newPassword()) { - this.newPasswordConfirmError.set('passwordConfirmNotMatch'); - } else { - this.newPasswordConfirmError.set(''); - } - } - - onNewPasswordChange(value: string) { - const newPassword = value; - - this.newPassword.set(newPassword); - if (this.hasNewPasswordBlurred()) { - this.checkNewPassword(newPassword); - } - } - - onNewPasswordBlur() { - this.hasNewPasswordBlurred.set(true); - this.checkNewPassword(this.newPassword()); - } - - onNewPasswordConfirmChange(value: string) { - const newPasswordConfirm = value; - - this.newPasswordConfirm.set(newPasswordConfirm); - if (this.hasNewPasswordConfirmBlurred()) { - this.checkNewPasswordConfirm(newPasswordConfirm); - } - } - - onNewPasswordConfirmBlur() { - this.hasNewPasswordConfirmBlurred.set(true); - this.checkNewPasswordConfirm(this.newPasswordConfirm()); - } -} diff --git a/projects/keycloakify-angular/account/src/pages/sessions/sessions.component.html b/projects/keycloakify-angular/account/src/pages/sessions/sessions.component.html deleted file mode 100644 index ee86189b..00000000 --- a/projects/keycloakify-angular/account/src/pages/sessions/sessions.component.html +++ /dev/null @@ -1,63 +0,0 @@ -@let url = kcContext.url; -@let sessions = kcContext.sessions; -@let stateChecker = kcContext.stateChecker; - - - -
-
-

{{ 'sessionsHtmlTitle' | msgStr }}

-
-
- - - - - - - - - - - - - - @for (session of sessions.sessions; track session) { - - - - - - - - } - -
{{ 'ip' | msgStr }}{{ 'started' | msgStr }}{{ 'lastAccess' | msgStr }}{{ 'expires' | msgStr }}{{ 'clients' | msgStr }}
{{ session.ipAddress }}{{ session?.started }}{{ session?.lastAccess }}{{ session?.expires }} - @for (client of session.clients; track client) { -
- {{ client }} -
-
- } -
- -
- - -
-
-
diff --git a/projects/keycloakify-angular/account/src/pages/sessions/sessions.component.ts b/projects/keycloakify-angular/account/src/pages/sessions/sessions.component.ts deleted file mode 100644 index 3b424c57..00000000 --- a/projects/keycloakify-angular/account/src/pages/sessions/sessions.component.ts +++ /dev/null @@ -1,27 +0,0 @@ -import { NgClass } from '@angular/common'; -import { Component, forwardRef, inject } from '@angular/core'; -import { CLASSES, KC_CONTEXT, USE_DEFAULT_CSS } from 'keycloakify-angular'; -import { ClassKey } from 'keycloakify/account'; -import { KcContext } from 'keycloakify/account/KcContext'; -import { ComponentReference } from '../../classes/component-reference.class'; -import { TemplateComponent } from '../../containers/template.component'; -import { KcClassDirective } from '../../directives'; -import { MsgStrPipe } from '../../pipes'; - -@Component({ - standalone: true, - imports: [KcClassDirective, TemplateComponent, MsgStrPipe, NgClass], - selector: 'kc-root', - templateUrl: 'sessions.component.html', - providers: [ - { - provide: ComponentReference, - useExisting: forwardRef(() => SessionsComponent), - }, - ], -}) -export class SessionsComponent extends ComponentReference { - kcContext = inject>(KC_CONTEXT); - override doUseDefaultCss = inject(USE_DEFAULT_CSS); - override classes = inject>>(CLASSES); -} diff --git a/projects/keycloakify-angular/account/src/pages/totp/totp.component.html b/projects/keycloakify-angular/account/src/pages/totp/totp.component.html deleted file mode 100644 index b5d48c92..00000000 --- a/projects/keycloakify-angular/account/src/pages/totp/totp.component.html +++ /dev/null @@ -1,258 +0,0 @@ -@let url = kcContext.url; -@let mode = kcContext.mode; -@let messagesPerField = kcContext.messagesPerField; -@let stateChecker = kcContext.stateChecker; -@let totp = kcContext.totp; - - - -
-
-

{{ 'authenticatorTitle' | msgStr }}

-
- @if (totp.otpCredentials.length) { -
- * - {{ 'requiredFields' | msgStr }} -
- } -
- @if (totp.enabled) { - - - @if (totp.otpCredentials.length > 1) { - - - - } @else { - - - - } - - - @for (credential of totp.otpCredentials; track credential; let index = $index) { - - - @if (totp.otpCredentials.length > 1) { - - } - - - - } - -
{{ 'configureAuthenticators' | msgStr }}
{{ 'configureAuthenticators' | msgStr }}
{{ 'mobile' | msgStr }}{{ credential.id }}{{ credential.userLabel || '' }} -
- - - - -
-
- } @else { -
-
-
    -
  1. -

    {{ 'totpStep1' | msgStr }}

    - -
      - @for (app of totp.supportedApplications; track app) { -
    • {{ app | advancedMsgStr }}
    • - } -
    -
  2. - @if (mode && mode === 'manual') { -
  3. -

    {{ 'totpManualStep2' | msgStr }}

    -

    - {{ totp.totpSecretEncoded }} -

    -

    - - {{ 'totpScanBarcode' | msgStr }} - -

    -
  4. -
  5. -

    {{ 'totpManualStep3' | msgStr }}

    -
      -
    • {{ 'totpType' | msgStr }}: {{ $any('totp.' + totp.policy.type) | msgStr }}
    • -
    • {{ 'totpAlgorithm' | msgStr }}: {{ totp.policy.getAlgorithmKey() }}
    • -
    • {{ 'totpDigits' | msgStr }}: {{ totp.policy.digits }}
    • - @if (totp.policy.type === 'totp') { -
    • {{ 'totpInterval' | msgStr }}: {{ totp.policy.period }}
    • - } @else { -
    • {{ 'totpCounter' | msgStr }}: {{ totp.policy.initialCounter }}
    • - } -
    -
  6. - } @else { -
  7. -

    {{ 'totpStep2' | msgStr }}

    -

    - Figure: Barcode -

    -

    - - {{ 'totpUnableToScan' | msgStr }} - -

    -
  8. - } -
  9. -

    {{ 'totpStep3' | msgStr }}

    -

    {{ 'totpStep3DeviceName' | msgStr }}

    -
  10. -
-
-
- -
-
- - * -
-
- - @if (messagesPerField.existsError('totp')) { - - } -
- - @if (mode) { - - } -
- -
-
- - @if (totp.otpCredentials.length >= 1) { - * - } -
-
- - @if (messagesPerField.existsError('userLabel')) { - - } -
-
- -
-
- - -
-
-
-
- } -
-
diff --git a/projects/keycloakify-angular/account/src/pages/totp/totp.component.ts b/projects/keycloakify-angular/account/src/pages/totp/totp.component.ts deleted file mode 100644 index 3ba3ed0a..00000000 --- a/projects/keycloakify-angular/account/src/pages/totp/totp.component.ts +++ /dev/null @@ -1,27 +0,0 @@ -import { NgClass } from '@angular/common'; -import { Component, forwardRef, inject } from '@angular/core'; -import { CLASSES, KC_CONTEXT, USE_DEFAULT_CSS } from 'keycloakify-angular'; -import { ClassKey } from 'keycloakify/account'; -import { KcContext } from 'keycloakify/account/KcContext'; -import { ComponentReference } from '../../classes/component-reference.class'; -import { TemplateComponent } from '../../containers/template.component'; -import { KcClassDirective } from '../../directives'; -import { AdvancedMsgStrPipe, KcSanitizePipe, MsgStrPipe } from '../../pipes'; - -@Component({ - standalone: true, - imports: [KcClassDirective, TemplateComponent, MsgStrPipe, AdvancedMsgStrPipe, KcSanitizePipe, NgClass], - selector: 'kc-root', - templateUrl: 'totp.component.html', - providers: [ - { - provide: ComponentReference, - useExisting: forwardRef(() => TotpComponent), - }, - ], -}) -export class TotpComponent extends ComponentReference { - kcContext = inject>(KC_CONTEXT); - override doUseDefaultCss = inject(USE_DEFAULT_CSS); - override classes = inject>>(CLASSES); -} diff --git a/projects/keycloakify-angular/account/src/pipes/advanced-msg-str.pipe.ts b/projects/keycloakify-angular/account/src/pipes/advanced-msg-str.pipe.ts deleted file mode 100644 index ae2f2e86..00000000 --- a/projects/keycloakify-angular/account/src/pipes/advanced-msg-str.pipe.ts +++ /dev/null @@ -1,13 +0,0 @@ -import { inject, Pipe, PipeTransform } from '@angular/core'; -import { I18N } from 'keycloakify-angular'; -import { I18n } from 'keycloakify/account/i18n'; -@Pipe({ - name: 'advancedMsgStr', - standalone: true, -}) -export class AdvancedMsgStrPipe implements PipeTransform { - readonly #i18n = inject(I18N); - transform(value: string, ...args: (string | undefined)[]): string { - return this.#i18n.advancedMsgStr(value, ...args); - } -} diff --git a/projects/keycloakify-angular/account/src/pipes/index.ts b/projects/keycloakify-angular/account/src/pipes/index.ts deleted file mode 100644 index 4474d498..00000000 --- a/projects/keycloakify-angular/account/src/pipes/index.ts +++ /dev/null @@ -1,7 +0,0 @@ -export * from './advanced-msg-str.pipe'; -export * from './input-type.pipe'; -export * from './kc-sanitize.pipe'; -export * from './msg-str.pipe'; -export * from './to-array.pipe'; -export * from './to-number.pipe'; -export * from './is-array-with-empty-object.pipe'; diff --git a/projects/keycloakify-angular/account/src/pipes/input-type.pipe.ts b/projects/keycloakify-angular/account/src/pipes/input-type.pipe.ts deleted file mode 100644 index 1fa09f09..00000000 --- a/projects/keycloakify-angular/account/src/pipes/input-type.pipe.ts +++ /dev/null @@ -1,15 +0,0 @@ -import { Pipe, PipeTransform } from '@angular/core'; - -@Pipe({ - name: 'inputType', - standalone: true, -}) -export class InputTypePipe implements PipeTransform { - transform(inputType?: string): string { - if (inputType?.startsWith('html5-')) { - return inputType.slice(6); - } - - return inputType ?? 'text'; - } -} diff --git a/projects/keycloakify-angular/account/src/pipes/is-array-with-empty-object.pipe.ts b/projects/keycloakify-angular/account/src/pipes/is-array-with-empty-object.pipe.ts deleted file mode 100644 index 9bd17bc5..00000000 --- a/projects/keycloakify-angular/account/src/pipes/is-array-with-empty-object.pipe.ts +++ /dev/null @@ -1,16 +0,0 @@ -import { Pipe, PipeTransform } from '@angular/core'; - -@Pipe({ - name: 'isArrayWithEmptyObject', - standalone: true, -}) -export class IsArrayWithEmptyObjectPipe implements PipeTransform { - transform(variable: unknown): boolean { - return ( - Array.isArray(variable) && - variable.length === 1 && - typeof variable[0] === 'object' && - Object.keys(variable[0]).length === 0 - ); - } -} diff --git a/projects/keycloakify-angular/account/src/pipes/kc-sanitize.pipe.ts b/projects/keycloakify-angular/account/src/pipes/kc-sanitize.pipe.ts deleted file mode 100644 index bf940b5f..00000000 --- a/projects/keycloakify-angular/account/src/pipes/kc-sanitize.pipe.ts +++ /dev/null @@ -1,29 +0,0 @@ -import { Pipe, PipeTransform } from '@angular/core'; -import { DomSanitizer, SafeHtml, SafeResourceUrl, SafeScript, SafeStyle, SafeUrl } from '@angular/platform-browser'; - -@Pipe({ name: 'kcSanitize', standalone: true }) -export class KcSanitizePipe implements PipeTransform { - constructor(private sanitizer: DomSanitizer) {} - // TODO: Fix typing - - transform( - // eslint-disable-next-line @typescript-eslint/no-explicit-any - value: any, - type: string, - ): SafeHtml | SafeStyle | SafeScript | SafeUrl | SafeResourceUrl { - switch (type) { - case 'html': - return this.sanitizer.bypassSecurityTrustHtml(value); - case 'style': - return this.sanitizer.bypassSecurityTrustStyle(value); - case 'script': - return this.sanitizer.bypassSecurityTrustScript(value); - case 'url': - return this.sanitizer.bypassSecurityTrustUrl(value); - case 'resourceUrl': - return this.sanitizer.bypassSecurityTrustResourceUrl(value); - default: - throw new Error(`Invalid safe type specified: ${type}`); - } - } -} diff --git a/projects/keycloakify-angular/account/src/pipes/msg-str.pipe.ts b/projects/keycloakify-angular/account/src/pipes/msg-str.pipe.ts deleted file mode 100644 index 49e1d7db..00000000 --- a/projects/keycloakify-angular/account/src/pipes/msg-str.pipe.ts +++ /dev/null @@ -1,14 +0,0 @@ -import { inject, Pipe, PipeTransform } from '@angular/core'; -import { I18N } from 'keycloakify-angular'; -import { I18n } from 'keycloakify/account/i18n'; -import { MessageKey } from 'keycloakify/account/i18n/messages_defaultSet/types'; -@Pipe({ - name: 'msgStr', - standalone: true, -}) -export class MsgStrPipe implements PipeTransform { - readonly #i18n = inject(I18N); - transform(value: MessageKey, ...args: (string | undefined)[]): string { - return this.#i18n.msgStr(value, ...args); - } -} diff --git a/projects/keycloakify-angular/account/src/pipes/to-array.pipe.ts b/projects/keycloakify-angular/account/src/pipes/to-array.pipe.ts deleted file mode 100644 index 76a28455..00000000 --- a/projects/keycloakify-angular/account/src/pipes/to-array.pipe.ts +++ /dev/null @@ -1,15 +0,0 @@ -import { Pipe, PipeTransform } from '@angular/core'; - -@Pipe({ - name: 'toArray', - standalone: true, -}) -export class ToArrayPipe implements PipeTransform { - transform(value: string | string[], emptyWhenString = false): string[] { - // if (!value) throw new Error('must pass a value'); - if (value instanceof Array) { - return value; - } - return emptyWhenString ? [] : [value]; - } -} diff --git a/projects/keycloakify-angular/account/src/pipes/to-number.pipe.ts b/projects/keycloakify-angular/account/src/pipes/to-number.pipe.ts deleted file mode 100644 index 8f6fd952..00000000 --- a/projects/keycloakify-angular/account/src/pipes/to-number.pipe.ts +++ /dev/null @@ -1,13 +0,0 @@ -import { Pipe, PipeTransform } from '@angular/core'; - -@Pipe({ - name: 'toNumber', - standalone: true, -}) -export class ToNumberPipe implements PipeTransform { - transform(value: string | number): number { - const number = parseInt(`${value}`); - if (isNaN(number)) throw new Error('number is NaN'); - return number; - } -} diff --git a/projects/keycloakify-angular/account/src/services/index.ts b/projects/keycloakify-angular/account/src/services/index.ts deleted file mode 100644 index a80d78c9..00000000 --- a/projects/keycloakify-angular/account/src/services/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from './resource-injector.service'; diff --git a/projects/keycloakify-angular/account/src/services/resource-injector.service.ts b/projects/keycloakify-angular/account/src/services/resource-injector.service.ts deleted file mode 100644 index cd336bb8..00000000 --- a/projects/keycloakify-angular/account/src/services/resource-injector.service.ts +++ /dev/null @@ -1,35 +0,0 @@ -import { inject, Injectable } from '@angular/core'; -import { KC_CONTEXT, ResourceInjectorService, Script } from 'keycloakify-angular'; -import { KcContext } from 'keycloakify/account/KcContext'; -import { catchError, forkJoin, of, switchMap } from 'rxjs'; - -@Injectable({ - providedIn: 'root', -}) -export class AccountResourceInjectorService { - private kcContext: KcContext = inject(KC_CONTEXT); - private resourceInjectorService: ResourceInjectorService = inject(ResourceInjectorService); - - injectResource(doUseDefaultCss = true) { - if (!doUseDefaultCss) { - return of(true); - } - const stylesheets = [ - `${this.kcContext.url.resourcesCommonPath}/node_modules/patternfly/dist/css/patternfly.min.css`, - `${this.kcContext.url.resourcesCommonPath}/node_modules/patternfly/dist/css/patternfly-additions.min.css`, - `${this.kcContext.url.resourcesPath}/css/account.css`, - ]; - - return forkJoin(stylesheets.map((url) => this.resourceInjectorService.createLink(url))).pipe( - switchMap(() => of(true)), - catchError((error) => { - console.error('Error loading styles:', error); - return of(false); - }), - ); - } - - insertAdditionalScripts(scripts: Script[]) { - scripts.map((script) => this.resourceInjectorService.createScript(script)); - } -} diff --git a/projects/keycloakify-angular/login/index.ts b/projects/keycloakify-angular/login/index.ts deleted file mode 100644 index 7e1a213e..00000000 --- a/projects/keycloakify-angular/login/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from './public-api'; diff --git a/projects/keycloakify-angular/login/ng-package.json b/projects/keycloakify-angular/login/ng-package.json deleted file mode 100644 index 206a0601..00000000 --- a/projects/keycloakify-angular/login/ng-package.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "$schema": "../../../node_modules/ng-packagr/ng-package.schema.json", - "lib": { - "entryFile": "./public-api.ts" - } -} \ No newline at end of file diff --git a/projects/keycloakify-angular/login/public-api.ts b/projects/keycloakify-angular/login/public-api.ts deleted file mode 100644 index 88a1da5b..00000000 --- a/projects/keycloakify-angular/login/public-api.ts +++ /dev/null @@ -1,17 +0,0 @@ -/* - * Public API Surface of keycloakify-angular - */ -// DIRECTIVES -export * from './src/directives'; -// PIPES -export * from './src/pipes'; -// CLASSES -export * from './src/classes/component-reference.class'; -// SERVICES -export * from './src/services'; -// DEFAULT PAGE -export * from './src/DefaultPage'; -// TEMPLATE -export { TemplateComponent } from './src/containers/template.component'; -// COMPONENTS -export * from './src/components'; diff --git a/projects/keycloakify-angular/login/src/DefaultPage.ts b/projects/keycloakify-angular/login/src/DefaultPage.ts deleted file mode 100644 index b646c8e4..00000000 --- a/projects/keycloakify-angular/login/src/DefaultPage.ts +++ /dev/null @@ -1,194 +0,0 @@ -import { Type } from '@angular/core'; -import { ClassKey } from 'keycloakify/login'; -import { KcContext } from 'keycloakify/login/KcContext'; - -const DefaultPage = async ( - pageId: KcContext['pageId'], - doMakeUserConfirmPassword = true, - doUseDefaultCss = true, - classes: { [key in ClassKey]?: string } = {}, -): Promise<{ - ComponentBootstrap: Type; - doMakeUserConfirmPassword: boolean; - doUseDefaultCss: boolean; - classes: { [key in ClassKey]?: string }; -}> => { - let ComponentBootstrapPromise; - switch (pageId) { - case 'login.ftl': - ComponentBootstrapPromise = import('./pages/login/login.component').then((c) => c.LoginComponent); - break; - case 'login-username.ftl': - ComponentBootstrapPromise = import('./pages/login-username/login-username.component').then( - (c) => c.LoginUsernameComponent, - ); - break; - case 'login-password.ftl': - ComponentBootstrapPromise = import('./pages/login-password/login-password.component').then( - (c) => c.LoginPasswordComponent, - ); - break; - case 'webauthn-authenticate.ftl': - ComponentBootstrapPromise = import('./pages/webauthn-authenticate/webauthn-authenticate.component').then( - (c) => c.WebauthnAuthenticateComponent, - ); - break; - case 'webauthn-register.ftl': - ComponentBootstrapPromise = import('./pages/webauthn-register/webauthn-register.component').then( - (c) => c.WebauthnRegisterComponent, - ); - break; - case 'register.ftl': - ComponentBootstrapPromise = import('./pages/register/register.component').then((c) => c.RegisterComponent); - break; - case 'info.ftl': - ComponentBootstrapPromise = import('./pages/info/info.component').then((c) => c.InfoComponent); - break; - case 'error.ftl': - ComponentBootstrapPromise = import('./pages/error/error.component').then((c) => c.ErrorComponent); - break; - case 'login-reset-password.ftl': - ComponentBootstrapPromise = import('./pages/login-reset-password/login-reset-password.component').then( - (c) => c.LoginResetPasswordComponent, - ); - break; - case 'login-verify-email.ftl': - ComponentBootstrapPromise = import('./pages/login-verify-email/login-verify-email.component').then( - (c) => c.LoginVerifyEmailComponent, - ); - break; - case 'terms.ftl': - ComponentBootstrapPromise = import('./pages/terms/terms.component').then((c) => c.TermsComponent); - break; - case 'login-oauth2-device-verify-user-code.ftl': - ComponentBootstrapPromise = import( - './pages/login-oauth2-device-verify-user-code/login-oauth2-device-verify-user-code.component' - ).then((c) => c.LoginOauth2DeviceVerifyUserCodeComponent); - break; - case 'login-oauth-grant.ftl': - ComponentBootstrapPromise = import('./pages/login-oauth-grant/login-oauth-grant.component').then( - (c) => c.LoginOauthGrantComponent, - ); - break; - case 'login-otp.ftl': - ComponentBootstrapPromise = import('./pages/login-otp/login-otp.component').then((c) => c.LoginOtpComponent); - - break; - case 'login-update-profile.ftl': - ComponentBootstrapPromise = import('./pages/login-update-profile/login-update-profile.component').then( - (c) => c.LoginUpdateProfileComponent, - ); - break; - case 'login-update-password.ftl': - ComponentBootstrapPromise = import('./pages/login-update-password/login-update-password.component').then( - (c) => c.LoginUpdatePasswordComponent, - ); - break; - case 'login-idp-link-confirm.ftl': - ComponentBootstrapPromise = import('./pages/login-idp-link-confirm/login-idp-link-confirm.component').then( - (c) => c.LoginIdpLinkConfirmComponent, - ); - break; - case 'login-idp-link-email.ftl': - ComponentBootstrapPromise = import('./pages/login-idp-link-email/login-idp-link-email.component').then( - (c) => c.LoginIdpLinkEmailComponent, - ); - break; - case 'login-page-expired.ftl': - ComponentBootstrapPromise = import('./pages/login-page-expired/login-page-expired.component').then( - (c) => c.LoginPageExpiredComponent, - ); - break; - case 'login-config-totp.ftl': - ComponentBootstrapPromise = import('./pages/login-config-totp/login-config-totp.component').then( - (c) => c.LoginConfigTotpComponent, - ); - break; - case 'logout-confirm.ftl': - ComponentBootstrapPromise = import('./pages/logout-confirm/logout-confirm.component').then( - (c) => c.LogoutConfirmComponent, - ); - break; - case 'idp-review-user-profile.ftl': - ComponentBootstrapPromise = import('./pages/idp-review-user-profile/idp-review-user-profile.component').then( - (c) => c.IdpReviewUserProfileComponent, - ); - break; - case 'update-email.ftl': - ComponentBootstrapPromise = import('./pages/update-email/update-email.component').then( - (c) => c.UpdateEmailComponent, - ); - break; - case 'select-authenticator.ftl': - ComponentBootstrapPromise = import('./pages/select-authenticator/select-authenticator.component').then( - (c) => c.SelectAuthenticatorComponent, - ); - break; - case 'saml-post-form.ftl': - ComponentBootstrapPromise = import('./pages/saml-post-form/saml-post-form.component').then( - (c) => c.SamlPostFormComponent, - ); - break; - case 'delete-credential.ftl': - ComponentBootstrapPromise = import('./pages/delete-credential/delete-credential.component').then( - (c) => c.DeleteCredentialComponent, - ); - break; - case 'code.ftl': - ComponentBootstrapPromise = import('./pages/code/code.component').then((c) => c.CodeComponent); - break; - case 'delete-account-confirm.ftl': - ComponentBootstrapPromise = import('./pages/delete-account-confirm/delete-account-confirm.component').then( - (c) => c.DeleteAccountConfirmComponent, - ); - break; - case 'frontchannel-logout.ftl': - ComponentBootstrapPromise = import('./pages/frontchannel-logout/frontchannel-logout.component').then( - (c) => c.FrontchannelLogoutComponent, - ); - break; - case 'login-recovery-authn-code-config.ftl': - ComponentBootstrapPromise = import( - './pages/login-recovery-authn-code-config/login-recovery-authn-code-config.component' - ).then((c) => c.LoginRecoveryAuthnCodeConfigComponent); - break; - case 'login-recovery-authn-code-input.ftl': - ComponentBootstrapPromise = import( - './pages/login-recovery-authn-code-input/login-recovery-authn-code-input.component' - ).then((c) => c.LoginRecoveryAuthnCodeInputComponent); - break; - case 'login-reset-otp.ftl': - ComponentBootstrapPromise = import('./pages/login-reset-otp/login-reset-otp.component').then( - (c) => c.LoginResetOtpComponent, - ); - break; - case 'login-x509-info.ftl': - ComponentBootstrapPromise = import('./pages/login-x509-info/login-x509-info.component').then( - (c) => c.LoginX509InfoComponent, - ); - break; - case 'webauthn-error.ftl': - ComponentBootstrapPromise = import('./pages/webauthn-error/webauthn-error.component').then( - (c) => c.WebauthnErrorComponent, - ); - break; - case 'login-passkeys-conditional-authenticate.ftl': - ComponentBootstrapPromise = import( - './pages/login-passkeys-conditional-authenticate/login-passkeys-conditional-authenticate.component' - ).then((c) => c.LoginPasskeysConditionalAuthenticateComponent); - break; - case 'login-idp-link-confirm-override.ftl': - ComponentBootstrapPromise = import( - './pages/login-idp-link-confirm-override/login-idp-link-confirm-override.component' - ).then((c) => c.LoginIdpLinkConfirmOverrideComponent); - break; - } - return ComponentBootstrapPromise?.then((ComponentBootstrap) => ({ - ComponentBootstrap, - doMakeUserConfirmPassword, - doUseDefaultCss, - classes, - })); -}; - -export { DefaultPage }; diff --git a/projects/keycloakify-angular/login/src/classes/component-reference.class.ts b/projects/keycloakify-angular/login/src/classes/component-reference.class.ts deleted file mode 100644 index b885dafd..00000000 --- a/projects/keycloakify-angular/login/src/classes/component-reference.class.ts +++ /dev/null @@ -1,5 +0,0 @@ -import { ClassKey } from 'keycloakify/login'; -export abstract class ComponentReference { - doUseDefaultCss: boolean | undefined; - classes: Partial> | undefined; -} diff --git a/projects/keycloakify-angular/login/src/components/add-remove-buttons-multi-valued-attribute/add-remove-buttons-multi-valued-attribute.component.html b/projects/keycloakify-angular/login/src/components/add-remove-buttons-multi-valued-attribute/add-remove-buttons-multi-valued-attribute.component.html deleted file mode 100644 index 46939891..00000000 --- a/projects/keycloakify-angular/login/src/components/add-remove-buttons-multi-valued-attribute/add-remove-buttons-multi-valued-attribute.component.html +++ /dev/null @@ -1,24 +0,0 @@ -@let idPostfix = attribute()?.name ?? '' + '-' + (fieldIndex() ?? 0 + 1); -@if (hasRemove()) { - - @if (hasAdd()) { -  |  - } -} -@if (hasAdd()) { - -} diff --git a/projects/keycloakify-angular/login/src/components/add-remove-buttons-multi-valued-attribute/add-remove-buttons-multi-valued-attribute.component.ts b/projects/keycloakify-angular/login/src/components/add-remove-buttons-multi-valued-attribute/add-remove-buttons-multi-valued-attribute.component.ts deleted file mode 100644 index 66d22e7d..00000000 --- a/projects/keycloakify-angular/login/src/components/add-remove-buttons-multi-valued-attribute/add-remove-buttons-multi-valued-attribute.component.ts +++ /dev/null @@ -1,138 +0,0 @@ -import { ChangeDetectionStrategy, Component, computed, input, output } from '@angular/core'; -import { Attribute } from 'keycloakify/login'; -import { MsgStrPipe } from '../../pipes/msg-str.pipe'; -import { FormAction } from '../../services/user-profile-form.service'; - -@Component({ - standalone: true, - styles: [ - ` - :host { - display: contents; - } - `, - ], - imports: [MsgStrPipe], - selector: 'kc-add-remove-buttons-multi-valued-attribute', - templateUrl: 'add-remove-buttons-multi-valued-attribute.component.html', - changeDetection: ChangeDetectionStrategy.OnPush, -}) -export class AddRemoveButtonsMultiValuedAttributeComponent { - attribute = input(); - values = input(); - fieldIndex = input(); - dispatchFormAction = output(); - - hasRemove = computed(() => { - const attribute = this.attribute(); - const values = this.values(); - const fieldIndex = this.fieldIndex(); - if (attribute && values && fieldIndex) { - return this.getButtonToDisplayForMultivaluedAttributeField({ - attribute, - values, - fieldIndex, - }).hasRemove; - } - return false; - }); - hasAdd = computed(() => { - const attribute = this.attribute(); - const values = this.values(); - const fieldIndex = this.fieldIndex(); - if (attribute && values && fieldIndex) { - return this.getButtonToDisplayForMultivaluedAttributeField({ - attribute, - values, - fieldIndex, - }).hasAdd; - } - return false; - }); - - onAdd() { - this.dispatchFormAction.emit({ - action: 'update', - name: this.attribute()?.name ?? '', - valueOrValues: [...(this.values() ?? []), ''], - }); - } - - onRemove() { - this.dispatchFormAction.emit({ - action: 'update', - name: this.attribute()?.name ?? '', - valueOrValues: (this.values() ?? []).filter((_, i) => i !== this.fieldIndex()), - }); - } - - private getButtonToDisplayForMultivaluedAttributeField(params: { - attribute: Attribute; - values: string[]; - fieldIndex: number; - }) { - const { attribute, values, fieldIndex } = params; - - const hasRemove = (() => { - if (values.length === 1) { - return false; - } - - const minCount = (() => { - const { multivalued } = attribute.validators; - - if (multivalued === undefined) { - return undefined; - } - - const minStr = multivalued.min; - - if (minStr === undefined) { - return undefined; - } - - return parseInt(`${minStr}`); - })(); - - if (minCount === undefined) { - return true; - } - - if (values.length === minCount) { - return false; - } - - return true; - })(); - - const hasAdd = (() => { - if (fieldIndex + 1 !== values.length) { - return false; - } - - const maxCount = (() => { - const { multivalued } = attribute.validators; - - if (multivalued === undefined) { - return undefined; - } - - const maxStr = multivalued.max; - - if (maxStr === undefined) { - return undefined; - } - - return parseInt(`${maxStr}`); - })(); - - if (maxCount === undefined) { - return true; - } - - return values.length !== maxCount; - })(); - - return { hasRemove, hasAdd }; - } -} diff --git a/projects/keycloakify-angular/login/src/components/field-errors/field-errors.component.html b/projects/keycloakify-angular/login/src/components/field-errors/field-errors.component.html deleted file mode 100644 index f16db076..00000000 --- a/projects/keycloakify-angular/login/src/components/field-errors/field-errors.component.html +++ /dev/null @@ -1,15 +0,0 @@ -@let index = fieldIndex(); - - @for (error of displayableErrors(); track error; let i = $index) { - @if (error.fieldIndex === index) { - - @if (displayableErrors()?.length ?? 0 - 1 !== i) { -
- } - } - } -
diff --git a/projects/keycloakify-angular/login/src/components/field-errors/field-errors.component.ts b/projects/keycloakify-angular/login/src/components/field-errors/field-errors.component.ts deleted file mode 100644 index ae6c5af2..00000000 --- a/projects/keycloakify-angular/login/src/components/field-errors/field-errors.component.ts +++ /dev/null @@ -1,29 +0,0 @@ -import { ChangeDetectionStrategy, Component, forwardRef, inject, input } from '@angular/core'; -import { CLASSES, USE_DEFAULT_CSS } from 'keycloakify-angular'; -import { Attribute, ClassKey } from 'keycloakify/login'; -import { ComponentReference } from '../../classes/component-reference.class'; -import { KcClassDirective } from '../../directives/kc-class.directive'; -import { FormFieldError } from '../../services/user-profile-form.service'; - -@Component({ - standalone: true, - styles: [ - ` - :host { - display: contents; - } - `, - ], - imports: [KcClassDirective], - selector: 'kc-field-errors', - templateUrl: 'field-errors.component.html', - changeDetection: ChangeDetectionStrategy.OnPush, - providers: [{ provide: ComponentReference, useExisting: forwardRef(() => FieldErrorsComponent) }], -}) -export class FieldErrorsComponent extends ComponentReference { - attribute = input(); - displayableErrors = input(); - fieldIndex = input(); - override doUseDefaultCss = inject(USE_DEFAULT_CSS); - override classes = inject>>(CLASSES); -} diff --git a/projects/keycloakify-angular/login/src/components/group-label/group-label.component.html b/projects/keycloakify-angular/login/src/components/group-label/group-label.component.html deleted file mode 100644 index fb94f89f..00000000 --- a/projects/keycloakify-angular/login/src/components/group-label/group-label.component.html +++ /dev/null @@ -1,30 +0,0 @@ -@let attr = attribute(); -@let groupName = groupNameRef(); -@if (attr && groupName !== '') { -
- @let groupDisplayHeader = attr.group?.displayHeader ?? ''; - @let groupHeaderText = groupDisplayHeader !== '' ? groupDisplayHeader : (attr.group?.name ?? ''); -
- -
- @let groupDisplayDescription = attr.group?.displayDescription ?? ''; - @if (groupDisplayDescription !== '') { -
- -
- } -
-} diff --git a/projects/keycloakify-angular/login/src/components/group-label/group-label.component.ts b/projects/keycloakify-angular/login/src/components/group-label/group-label.component.ts deleted file mode 100644 index 06a057f0..00000000 --- a/projects/keycloakify-angular/login/src/components/group-label/group-label.component.ts +++ /dev/null @@ -1,42 +0,0 @@ -import { ChangeDetectionStrategy, Component, computed, forwardRef, inject, input } from '@angular/core'; -import { CLASSES, USE_DEFAULT_CSS } from 'keycloakify-angular'; -import { Attribute, ClassKey } from 'keycloakify/login'; -import { ComponentReference } from '../../classes/component-reference.class'; -import { AttributesDirective } from '../../directives/attributes.directive'; -import { KcClassDirective } from '../../directives/kc-class.directive'; -import { AdvancedMsgStrPipe } from '../../pipes/advanced-msg-str.pipe'; - -@Component({ - standalone: true, - styles: [ - ` - :host { - display: contents; - } - `, - ], - imports: [KcClassDirective, AttributesDirective, AdvancedMsgStrPipe], - selector: 'kc-group-label', - templateUrl: 'group-label.component.html', - changeDetection: ChangeDetectionStrategy.OnPush, - providers: [ - { - provide: ComponentReference, - useExisting: forwardRef(() => GroupLabelComponent), - }, - ], -}) -export class GroupLabelComponent extends ComponentReference { - attribute = input(); - groupName = input(); - override doUseDefaultCss = inject(USE_DEFAULT_CSS); - override classes = inject>>(CLASSES); - groupNameRef = computed(() => { - const attribute = this.attribute(); - const groupName = this.groupName(); - if (attribute?.group?.name !== groupName) { - return attribute?.group?.name ?? ''; - } - return ''; - }); -} diff --git a/projects/keycloakify-angular/login/src/components/index.ts b/projects/keycloakify-angular/login/src/components/index.ts deleted file mode 100644 index 33bcf2b8..00000000 --- a/projects/keycloakify-angular/login/src/components/index.ts +++ /dev/null @@ -1,11 +0,0 @@ -export * from './add-remove-buttons-multi-valued-attribute/add-remove-buttons-multi-valued-attribute.component'; -export * from './field-errors/field-errors.component'; -export * from './group-label/group-label.component'; -export * from './input-field-by-type/input-field-by-type.component'; -export * from './input-tag/input-tag.component'; -export * from './input-tag-selects/input-tag-selects.component'; -export * from './logout-other-sessions/logout-other-sessions.component'; -export * from './password-wrapper/password-wrapper.component'; -export * from './select-tag/select-tag.component'; -export * from './textarea-tag/textarea-tag.component'; -export * from './user-profile-form-fields/user-profile-form-fields.component'; diff --git a/projects/keycloakify-angular/login/src/components/input-field-by-type/input-field-by-type.component.html b/projects/keycloakify-angular/login/src/components/input-field-by-type/input-field-by-type.component.html deleted file mode 100644 index 4fda53bc..00000000 --- a/projects/keycloakify-angular/login/src/components/input-field-by-type/input-field-by-type.component.html +++ /dev/null @@ -1,63 +0,0 @@ -@let attr = attribute(); -@if (attr) { - @let type = attr.annotations.inputType; - @switch (type) { - @case ('textarea') { - - } - @case (type === 'select' || type === 'multiselect' ? type : '') { - - } - @case (type === 'select-radiobuttons' || type === 'multiselect-checkboxes' ? type : '') { - - } - @default { - @let values = valueOrValues(); - - @if (values && (values | toArray: true).length) { - @for (value of values; track value; let i = $index) { - - } - } @else { - @if (attr.name === 'password' || attr.name === 'password-confirm') { - - - - } @else { - - } - } - } - } -} diff --git a/projects/keycloakify-angular/login/src/components/input-field-by-type/input-field-by-type.component.ts b/projects/keycloakify-angular/login/src/components/input-field-by-type/input-field-by-type.component.ts deleted file mode 100644 index 7722aeca..00000000 --- a/projects/keycloakify-angular/login/src/components/input-field-by-type/input-field-by-type.component.ts +++ /dev/null @@ -1,47 +0,0 @@ -import { ChangeDetectionStrategy, Component, computed, forwardRef, inject, input, output } from '@angular/core'; -import { CLASSES, USE_DEFAULT_CSS } from 'keycloakify-angular'; -import { Attribute, ClassKey } from 'keycloakify/login'; -import { ComponentReference } from '../../classes/component-reference.class'; -import { ToArrayPipe } from '../../pipes/to-array.pipe'; -import { FormAction, FormFieldError } from '../../services/user-profile-form.service'; -import { InputTagSelectsComponent } from '../input-tag-selects/input-tag-selects.component'; -import { InputTagComponent } from '../input-tag/input-tag.component'; -import { PasswordWrapperComponent } from '../password-wrapper/password-wrapper.component'; -import { SelectTagComponent } from '../select-tag/select-tag.component'; -import { TextareaTagComponent } from '../textarea-tag/textarea-tag.component'; - -@Component({ - standalone: true, - styles: [ - ` - :host { - display: contents; - } - `, - ], - imports: [ - ToArrayPipe, - TextareaTagComponent, - SelectTagComponent, - InputTagSelectsComponent, - InputTagComponent, - PasswordWrapperComponent, - ], - selector: 'kc-input-field-by-type', - templateUrl: 'input-field-by-type.component.html', - changeDetection: ChangeDetectionStrategy.OnPush, - providers: [{ provide: ComponentReference, useExisting: forwardRef(() => InputFieldByTypeComponent) }], -}) -export class InputFieldByTypeComponent extends ComponentReference { - attribute = input(); - valueOrValues = input(); - displayableErrors = input(); - dispatchFormAction = output(); - override doUseDefaultCss = inject(USE_DEFAULT_CSS); - override classes = inject>>(CLASSES); - - attributePassword = computed(() => { - const attribute: Attribute = this.attribute() ?? ({} as Attribute); - return { ...attribute, annotations: { ...(attribute.annotations ?? {}), inputType: 'password' } }; - }); -} diff --git a/projects/keycloakify-angular/login/src/components/input-tag-selects/input-tag-selects.component.html b/projects/keycloakify-angular/login/src/components/input-tag-selects/input-tag-selects.component.html deleted file mode 100644 index b993153d..00000000 --- a/projects/keycloakify-angular/login/src/components/input-tag-selects/input-tag-selects.component.html +++ /dev/null @@ -1,29 +0,0 @@ -@let inputType = context()?.inputType; -@let classInput = context()?.classInput; -@let classLabel = context()?.classLabel; -@let classDiv = context()?.classDiv; -@let attr = attribute(); -@if (attr) { - @for (option of options(); track option) { -
- - -
- } -} diff --git a/projects/keycloakify-angular/login/src/components/input-tag-selects/input-tag-selects.component.ts b/projects/keycloakify-angular/login/src/components/input-tag-selects/input-tag-selects.component.ts deleted file mode 100644 index 7d1b8525..00000000 --- a/projects/keycloakify-angular/login/src/components/input-tag-selects/input-tag-selects.component.ts +++ /dev/null @@ -1,137 +0,0 @@ -import { ChangeDetectionStrategy, Component, computed, forwardRef, inject, input, output, Signal } from '@angular/core'; -import { CLASSES, USE_DEFAULT_CSS } from 'keycloakify-angular'; -import { Attribute, ClassKey } from 'keycloakify/login'; -import { ComponentReference } from '../../classes/component-reference.class'; -import { KcClassDirective } from '../../directives/kc-class.directive'; -import { AdvancedMsgStrPipe } from '../../pipes/advanced-msg-str.pipe'; -import { FormAction, FormFieldError } from '../../services/user-profile-form.service'; - -@Component({ - standalone: true, - styles: [ - ` - :host { - display: contents; - } - `, - ], - imports: [KcClassDirective, AdvancedMsgStrPipe], - selector: 'kc-input-tag-selects', - templateUrl: 'input-tag-selects.component.html', - changeDetection: ChangeDetectionStrategy.OnPush, - providers: [ - { - provide: ComponentReference, - useExisting: forwardRef(() => InputTagSelectsComponent), - }, - ], -}) -export class InputTagSelectsComponent extends ComponentReference { - attribute = input(); - valueOrValues = input(); - dispatchFormAction = output(); - displayableErrors = input(); - override doUseDefaultCss = inject(USE_DEFAULT_CSS); - override classes = inject>>(CLASSES); - - context: Signal<{ - inputType: 'radio' | 'checkbox'; - classDiv: ClassKey; - classInput: ClassKey; - classLabel: ClassKey; - } | null> = computed(() => { - const attribute = this.attribute(); - if (attribute) { - const { inputType } = attribute.annotations; - switch (inputType) { - case 'select-radiobuttons': - return { - inputType: 'radio', - classDiv: 'kcInputClassRadio', - classInput: 'kcInputClassRadioInput', - classLabel: 'kcInputClassRadioLabel', - }; - case 'multiselect-checkboxes': - return { - inputType: 'checkbox', - classDiv: 'kcInputClassCheckbox', - classInput: 'kcInputClassCheckboxInput', - classLabel: 'kcInputClassCheckboxLabel', - }; - } - } - return null; - }); - - options = computed(() => { - const attribute = this.attribute(); - if (attribute) { - return (() => { - walk: { - const { inputOptionsFromValidation } = attribute.annotations; - - if (inputOptionsFromValidation === undefined) { - break walk; - } - - const validator = (attribute.validators as Record)[ - inputOptionsFromValidation - ]; - - if (validator === undefined) { - break walk; - } - - if (validator.options === undefined) { - break walk; - } - - return validator.options; - } - - return attribute.validators.options?.options ?? []; - })(); - } - return []; - }); - - checked(option: string) { - const valueOrValues = this.valueOrValues(); - if (valueOrValues instanceof Array) { - return valueOrValues.includes(option); - } - return valueOrValues === option; - } - - onChange(event: Event, option: string) { - const valueOrValues = this.valueOrValues(); - const isChecked = (event.target as HTMLInputElement).checked; - this.dispatchFormAction.emit({ - action: 'update', - name: this.attribute()?.name ?? '', - valueOrValues: (() => { - if (valueOrValues instanceof Array) { - const newValues = [...valueOrValues]; - - if (isChecked) { - newValues.push(option); - } else { - newValues.splice(newValues.indexOf(option), 1); - } - - return newValues; - } - - return (event.target as HTMLInputElement)?.checked ? option : ''; - })(), - }); - } - - onBlur() { - this.dispatchFormAction.emit({ - action: 'focus lost', - name: this.attribute()?.name ?? '', - fieldIndex: undefined, - }); - } -} diff --git a/projects/keycloakify-angular/login/src/components/input-tag/input-tag.component.html b/projects/keycloakify-angular/login/src/components/input-tag/input-tag.component.html deleted file mode 100644 index 011b7410..00000000 --- a/projects/keycloakify-angular/login/src/components/input-tag/input-tag.component.html +++ /dev/null @@ -1,49 +0,0 @@ -@let attr = attribute(); -@let index = fieldIndex(); -@if (attr) { - - @if (index !== undefined) { - @let values = valueOrValues() ?? [] | toArray; - - - } -} diff --git a/projects/keycloakify-angular/login/src/components/input-tag/input-tag.component.ts b/projects/keycloakify-angular/login/src/components/input-tag/input-tag.component.ts deleted file mode 100644 index 06eeb420..00000000 --- a/projects/keycloakify-angular/login/src/components/input-tag/input-tag.component.ts +++ /dev/null @@ -1,96 +0,0 @@ -import { ChangeDetectionStrategy, Component, computed, forwardRef, inject, input, output } from '@angular/core'; -import { CLASSES, USE_DEFAULT_CSS } from 'keycloakify-angular'; -import { Attribute, ClassKey } from 'keycloakify/login'; -import { ComponentReference } from '../../classes/component-reference.class'; -import { AttributesDirective } from '../../directives/attributes.directive'; -import { KcClassDirective } from '../../directives/kc-class.directive'; -import { AdvancedMsgStrPipe } from '../../pipes/advanced-msg-str.pipe'; -import { InputTypePipe } from '../../pipes/input-type.pipe'; -import { ToArrayPipe } from '../../pipes/to-array.pipe'; -import { ToNumberPipe } from '../../pipes/to-number.pipe'; -import { FormAction, FormFieldError } from '../../services/user-profile-form.service'; -import { AddRemoveButtonsMultiValuedAttributeComponent } from '../add-remove-buttons-multi-valued-attribute/add-remove-buttons-multi-valued-attribute.component'; -import { FieldErrorsComponent } from '../field-errors/field-errors.component'; - -@Component({ - standalone: true, - styles: [ - ` - :host { - display: contents; - } - `, - ], - imports: [ - InputTypePipe, - KcClassDirective, - ToNumberPipe, - AttributesDirective, - ToArrayPipe, - FieldErrorsComponent, - AddRemoveButtonsMultiValuedAttributeComponent, - AdvancedMsgStrPipe, - ], - selector: 'kc-input-tag', - templateUrl: 'input-tag.component.html', - changeDetection: ChangeDetectionStrategy.OnPush, - providers: [ - { - provide: ComponentReference, - useExisting: forwardRef(() => InputTagComponent), - }, - ], -}) -export class InputTagComponent extends ComponentReference { - attribute = input(); - valueOrValues = input(); - fieldIndex = input(undefined); - values = input(); - displayableErrors = input(); - dispatchFormAction = output(); - override doUseDefaultCss = inject(USE_DEFAULT_CSS); - override classes = inject>>(CLASSES); - - value = computed(() => { - const valueOrValues = this.valueOrValues(); - const index = this.fieldIndex(); - if (valueOrValues instanceof Array) { - if (index) { - return valueOrValues[index] ?? null; - } - return null; - } - return valueOrValues ?? null; - }); - - onChange(event: Event) { - const valueOrValues = this.valueOrValues(); - this.dispatchFormAction.emit({ - action: 'update', - name: this.attribute()?.name ?? '', - valueOrValues: (() => { - if (this.fieldIndex !== undefined) { - if (valueOrValues instanceof Array) { - return valueOrValues.map((value, i) => { - if (i === this.fieldIndex()) { - return (event.target as HTMLInputElement)?.value; - } - - return value; - }); - } - } - - return (event.target as HTMLInputElement)?.value; - })(), - }); - } - - onBlur() { - this.dispatchFormAction.emit({ - action: 'focus lost', - name: this.attribute()?.name ?? '', - fieldIndex: this.fieldIndex(), - }); - } -} diff --git a/projects/keycloakify-angular/login/src/components/logout-other-sessions/logout-other-sessions.component.html b/projects/keycloakify-angular/login/src/components/logout-other-sessions/logout-other-sessions.component.html deleted file mode 100644 index 788d35b0..00000000 --- a/projects/keycloakify-angular/login/src/components/logout-other-sessions/logout-other-sessions.component.html +++ /dev/null @@ -1,19 +0,0 @@ -
-
-
- -
-
-
diff --git a/projects/keycloakify-angular/login/src/components/logout-other-sessions/logout-other-sessions.component.ts b/projects/keycloakify-angular/login/src/components/logout-other-sessions/logout-other-sessions.component.ts deleted file mode 100644 index 41ecbc29..00000000 --- a/projects/keycloakify-angular/login/src/components/logout-other-sessions/logout-other-sessions.component.ts +++ /dev/null @@ -1,31 +0,0 @@ -import { ChangeDetectionStrategy, Component, forwardRef, inject } from '@angular/core'; -import { CLASSES, USE_DEFAULT_CSS } from 'keycloakify-angular'; -import { ClassKey } from 'keycloakify/login'; -import { ComponentReference } from '../../classes/component-reference.class'; -import { KcClassDirective } from '../../directives/kc-class.directive'; -import { MsgStrPipe } from '../../pipes/msg-str.pipe'; - -@Component({ - selector: 'kc-logout-other-sessions', - styles: [ - ` - :host { - display: contents; - } - `, - ], - standalone: true, - imports: [KcClassDirective, MsgStrPipe], - changeDetection: ChangeDetectionStrategy.OnPush, - templateUrl: './logout-other-sessions.component.html', - providers: [ - { - provide: ComponentReference, - useExisting: forwardRef(() => LogoutOtherSessionsComponent), - }, - ], -}) -export class LogoutOtherSessionsComponent extends ComponentReference { - override doUseDefaultCss = inject(USE_DEFAULT_CSS); - override classes = inject>>(CLASSES); -} diff --git a/projects/keycloakify-angular/login/src/components/password-wrapper/password-wrapper.component.html b/projects/keycloakify-angular/login/src/components/password-wrapper/password-wrapper.component.html deleted file mode 100644 index 1a4b0283..00000000 --- a/projects/keycloakify-angular/login/src/components/password-wrapper/password-wrapper.component.html +++ /dev/null @@ -1,15 +0,0 @@ -
- - -
diff --git a/projects/keycloakify-angular/login/src/components/password-wrapper/password-wrapper.component.ts b/projects/keycloakify-angular/login/src/components/password-wrapper/password-wrapper.component.ts deleted file mode 100644 index bf3829dc..00000000 --- a/projects/keycloakify-angular/login/src/components/password-wrapper/password-wrapper.component.ts +++ /dev/null @@ -1,57 +0,0 @@ -import { AsyncPipe } from '@angular/common'; -import { - ChangeDetectionStrategy, - Component, - forwardRef, - inject, - input, - Renderer2, - signal, - WritableSignal, -} from '@angular/core'; -import { CLASSES, USE_DEFAULT_CSS } from 'keycloakify-angular'; -import { ClassKey } from 'keycloakify/login'; -import { ComponentReference } from '../../classes/component-reference.class'; -import { KcClassDirective } from '../../directives/kc-class.directive'; -import { MsgStrPipe } from '../../pipes/msg-str.pipe'; - -@Component({ - selector: 'kc-password-wrapper', - styles: [ - ` - :host { - display: contents; - } - `, - ], - standalone: true, - changeDetection: ChangeDetectionStrategy.OnPush, - imports: [KcClassDirective, AsyncPipe, MsgStrPipe], - templateUrl: './password-wrapper.component.html', - providers: [ - { - provide: ComponentReference, - useExisting: forwardRef(() => PasswordWrapperComponent), - }, - ], -}) -export class PasswordWrapperComponent extends ComponentReference { - private renderer = inject(Renderer2); - passwordInputId = input.required(); - override doUseDefaultCss = inject(USE_DEFAULT_CSS); - override classes = inject>>(CLASSES); - - isPasswordRevealed: WritableSignal = signal(false); - - togglePasswordVisibility(): void { - this.isPasswordRevealed.update((revealed) => !revealed); - this.setPasswordInputType(); - } - - private setPasswordInputType(): void { - const input = document.getElementById(this.passwordInputId()); - if (input) { - this.renderer.setProperty(input, 'type', this.isPasswordRevealed() ? 'text' : 'password'); - } - } -} diff --git a/projects/keycloakify-angular/login/src/components/select-tag/select-tag.component.html b/projects/keycloakify-angular/login/src/components/select-tag/select-tag.component.html deleted file mode 100644 index ede6f1ec..00000000 --- a/projects/keycloakify-angular/login/src/components/select-tag/select-tag.component.html +++ /dev/null @@ -1,31 +0,0 @@ -@let attr = attribute(); -@let multiple = isMultiple(); -@if (attr) { - -} diff --git a/projects/keycloakify-angular/login/src/components/select-tag/select-tag.component.ts b/projects/keycloakify-angular/login/src/components/select-tag/select-tag.component.ts deleted file mode 100644 index 562aed21..00000000 --- a/projects/keycloakify-angular/login/src/components/select-tag/select-tag.component.ts +++ /dev/null @@ -1,95 +0,0 @@ -import { ChangeDetectionStrategy, Component, computed, forwardRef, inject, input, output } from '@angular/core'; -import { CLASSES, USE_DEFAULT_CSS } from 'keycloakify-angular'; -import { Attribute, ClassKey } from 'keycloakify/login'; -import { ComponentReference } from '../../classes/component-reference.class'; -import { KcClassDirective } from '../../directives/kc-class.directive'; -import { AdvancedMsgStrPipe } from '../../pipes/advanced-msg-str.pipe'; -import { ToNumberPipe } from '../../pipes/to-number.pipe'; -import { FormAction, FormFieldError } from '../../services/user-profile-form.service'; - -@Component({ - standalone: true, - styles: [ - ` - :host { - display: contents; - } - `, - ], - imports: [KcClassDirective, ToNumberPipe, AdvancedMsgStrPipe], - selector: 'kc-select-tag', - templateUrl: 'select-tag.component.html', - changeDetection: ChangeDetectionStrategy.OnPush, - providers: [ - { - provide: ComponentReference, - useExisting: forwardRef(() => SelectTagComponent), - }, - ], -}) -export class SelectTagComponent extends ComponentReference { - attribute = input(); - valueOrValues = input(); - displayableErrors = input(); - dispatchFormAction = output(); - override doUseDefaultCss = inject(USE_DEFAULT_CSS); - override classes = inject>>(CLASSES); - - isMultiple = computed(() => { - return this.attribute()?.annotations?.inputType === 'multiselect'; - }); - - options = computed(() => { - const attribute = this.attribute(); - if (attribute) { - return (() => { - walk: { - const { inputOptionsFromValidation } = attribute.annotations; - - if (inputOptionsFromValidation === undefined) { - break walk; - } - - const validator = (attribute.validators as Record)[ - inputOptionsFromValidation - ]; - - if (validator === undefined) { - break walk; - } - - if (validator.options === undefined) { - break walk; - } - - return validator.options; - } - - return attribute.validators.options?.options ?? []; - })(); - } - return []; - }); - - onChange(event: Event) { - this.dispatchFormAction.emit({ - action: 'update', - name: this.attribute()?.name ?? '', - valueOrValues: (() => { - if (this.isMultiple()) { - return Array.from((event.target as HTMLSelectElement).selectedOptions).map((option) => option.value); - } - - return (event.target as HTMLSelectElement).value; - })(), - }); - } - - onBlur() { - this.dispatchFormAction.emit({ - action: 'focus lost', - name: this.attribute()?.name ?? '', - fieldIndex: undefined, - }); - } -} diff --git a/projects/keycloakify-angular/login/src/components/textarea-tag/textarea-tag.component.html b/projects/keycloakify-angular/login/src/components/textarea-tag/textarea-tag.component.html deleted file mode 100644 index 2a10a52a..00000000 --- a/projects/keycloakify-angular/login/src/components/textarea-tag/textarea-tag.component.html +++ /dev/null @@ -1,18 +0,0 @@ -@let attr = attribute(); -@if (attr) { - -} diff --git a/projects/keycloakify-angular/login/src/components/textarea-tag/textarea-tag.component.ts b/projects/keycloakify-angular/login/src/components/textarea-tag/textarea-tag.component.ts deleted file mode 100644 index c688ef89..00000000 --- a/projects/keycloakify-angular/login/src/components/textarea-tag/textarea-tag.component.ts +++ /dev/null @@ -1,47 +0,0 @@ -import { ChangeDetectionStrategy, Component, forwardRef, inject, input, output } from '@angular/core'; -import { CLASSES, USE_DEFAULT_CSS } from 'keycloakify-angular'; -import { Attribute, ClassKey } from 'keycloakify/login'; -import { ComponentReference } from '../../classes/component-reference.class'; -import { KcClassDirective } from '../../directives/kc-class.directive'; -import { ToNumberPipe } from '../../pipes/to-number.pipe'; -import { FormAction, FormFieldError } from '../../services/user-profile-form.service'; - -@Component({ - standalone: true, - styles: [ - ` - :host { - display: contents; - } - `, - ], - imports: [KcClassDirective, ToNumberPipe], - selector: 'kc-textarea-tag', - templateUrl: 'textarea-tag.component.html', - changeDetection: ChangeDetectionStrategy.OnPush, - providers: [{ provide: ComponentReference, useExisting: forwardRef(() => TextareaTagComponent) }], -}) -export class TextareaTagComponent extends ComponentReference { - attribute = input(); - value = input(); - displayableErrors = input(); - dispatchFormAction = output(); - override doUseDefaultCss = inject(USE_DEFAULT_CSS); - override classes = inject>>(CLASSES); - - onChange(event: Event) { - this.dispatchFormAction.emit({ - action: 'update', - name: this.attribute()?.name ?? '', - valueOrValues: (event.target as HTMLTextAreaElement).value, - }); - } - - onBlur() { - this.dispatchFormAction.emit({ - action: 'focus lost', - name: this.attribute()?.name ?? '', - fieldIndex: undefined, - }); - } -} diff --git a/projects/keycloakify-angular/login/src/components/user-profile-form-fields/user-profile-form-fields.component.html b/projects/keycloakify-angular/login/src/components/user-profile-form-fields/user-profile-form-fields.component.html deleted file mode 100644 index 67da0e34..00000000 --- a/projects/keycloakify-angular/login/src/components/user-profile-form-fields/user-profile-form-fields.component.html +++ /dev/null @@ -1,85 +0,0 @@ -@let formFieldStates = formState().formFieldStates; - -@for (fieldState of formFieldStates; track fieldState.attribute) { - - - - @if (beforeField) { - - - } - -
-
- -
- -
- @if (fieldState.attribute.annotations.inputHelperTextBefore) { -
- {{ fieldState.attribute.annotations.inputHelperTextBefore | advancedMsgStr }} -
- } - - - - - - - @if (fieldState.attribute.annotations.inputHelperTextAfter) { -
- {{ fieldState.attribute.annotations.inputHelperTextAfter | advancedMsgStr }} -
- } - - @if (afterField) { - - - } - -
-
-} diff --git a/projects/keycloakify-angular/login/src/components/user-profile-form-fields/user-profile-form-fields.component.ts b/projects/keycloakify-angular/login/src/components/user-profile-form-fields/user-profile-form-fields.component.ts deleted file mode 100644 index bbd1c572..00000000 --- a/projects/keycloakify-angular/login/src/components/user-profile-form-fields/user-profile-form-fields.component.ts +++ /dev/null @@ -1,77 +0,0 @@ -import { NgTemplateOutlet } from '@angular/common'; -import { - ChangeDetectionStrategy, - Component, - ContentChild, - effect, - forwardRef, - inject, - output, - TemplateRef, -} from '@angular/core'; -import { DO_MAKE_USER_CONFIRM_PASSWORD, KC_CONTEXT } from 'keycloakify-angular'; -import { ClassKey } from 'keycloakify/login'; -import { KcContext } from 'keycloakify/login/KcContext'; -import { ComponentReference } from '../../classes/component-reference.class'; -import { KcClassDirective } from '../../directives/kc-class.directive'; -import { AdvancedMsgStrPipe } from '../../pipes/advanced-msg-str.pipe'; -import { FormAction, UserProfileFormService } from '../../services/user-profile-form.service'; -import { FieldErrorsComponent } from '../field-errors/field-errors.component'; -import { GroupLabelComponent } from '../group-label/group-label.component'; -import { InputFieldByTypeComponent } from '../input-field-by-type/input-field-by-type.component'; -import { CLASSES, USE_DEFAULT_CSS } from 'keycloakify-angular'; - -@Component({ - standalone: true, - styles: [ - ` - :host { - display: contents; - } - `, - ], - imports: [ - KcClassDirective, - FieldErrorsComponent, - InputFieldByTypeComponent, - GroupLabelComponent, - NgTemplateOutlet, - AdvancedMsgStrPipe, - ], - selector: 'kc-user-profile-form-fields', - templateUrl: 'user-profile-form-fields.component.html', - changeDetection: ChangeDetectionStrategy.OnPush, - providers: [ - UserProfileFormService, - { - provide: ComponentReference, - useExisting: forwardRef(() => UserProfileFormFieldsComponent), - }, - ], -}) -export class UserProfileFormFieldsComponent extends ComponentReference { - kcContext = inject(KC_CONTEXT); - userProfileFormService = inject(UserProfileFormService); - doMakeUserConfirmPassword = inject(DO_MAKE_USER_CONFIRM_PASSWORD); - override doUseDefaultCss = inject(USE_DEFAULT_CSS); - override classes = inject>>(CLASSES); - - onIsFormSubmittable = output(); - - formState = this.userProfileFormService.formState; - - @ContentChild('beforField') beforeField: TemplateRef | undefined; - @ContentChild('afterField') afterField: TemplateRef | undefined; - - constructor() { - super(); - effect(() => { - const isFormSubmittable = this.formState().isFormSubmittable; - this.onIsFormSubmittable.emit(isFormSubmittable); - }); - } - - onDispatch(formAction: FormAction) { - this.userProfileFormService.dispatchFormAction(formAction); - } -} diff --git a/projects/keycloakify-angular/login/src/containers/template.component.html b/projects/keycloakify-angular/login/src/containers/template.component.html deleted file mode 100644 index 6cb38d9d..00000000 --- a/projects/keycloakify-angular/login/src/containers/template.component.html +++ /dev/null @@ -1,203 +0,0 @@ -@let realm = kcContext.realm; -@let message = kcContext.message; -@let auth = kcContext.auth; -@let isAppInitiatedAction = kcContext.isAppInitiatedAction; -@let url = kcContext.url; -@let isReadyToRender = isReadyToRender$ | async; - -@if (isReadyToRender) { -
-
-
-
-
-
- -
-
- - @if (i18n.enabledLanguages.length > 1) { -
-
- -
-
- } - - - - @if (auth && !auth.showUsername && !auth.showResetCredentials) { -

- -

- } @else { -
- - - - -
- } -
- - @if (displayRequiredFields()) { -
-
- - * - {{ 'requiredFields' | msgStr }} - -
-
- -
-
- } @else { - - } -
- -
-
- - @if (displayMessage() && message && (message.type !== 'warning' || !isAppInitiatedAction)) { -
-
- @switch (message.type) { - @case ('success') { - - } - @case ('warning') { - - } - @case ('info') { - - } - @case ('error') { - - } - } -
- -
- } - - - @if (!!auth && auth?.showTryAnotherWayLink) { -
- -
- } - - - - @if (displayInfo()) { -
-
- -
-
- } -
-
-
-
-} diff --git a/projects/keycloakify-angular/login/src/containers/template.component.ts b/projects/keycloakify-angular/login/src/containers/template.component.ts deleted file mode 100644 index 51d44ee8..00000000 --- a/projects/keycloakify-angular/login/src/containers/template.component.ts +++ /dev/null @@ -1,76 +0,0 @@ -import { AsyncPipe, NgTemplateOutlet } from '@angular/common'; -import { ChangeDetectionStrategy, Component, forwardRef, inject, input, OnInit, Renderer2 } from '@angular/core'; -import { Meta, Title } from '@angular/platform-browser'; -import { CLASSES, I18N, KC_CONTEXT, USE_DEFAULT_CSS } from 'keycloakify-angular'; -import { I18n } from 'keycloakify/login/i18n'; -import { KcContext } from 'keycloakify/login/KcContext/KcContext'; -import { ClassKey, getKcClsx } from 'keycloakify/login/lib/kcClsx'; -import { Observable } from 'rxjs'; -import { ComponentReference } from '../classes/component-reference.class'; -import { KcClassDirective } from '../directives/kc-class.directive'; -import { KcSanitizePipe } from '../pipes'; -import { MsgStrPipe } from '../pipes/msg-str.pipe'; -import { LoginResourceInjectorService } from '../services/login-resource-injector.service'; - -@Component({ - selector: 'kc-login-template', - templateUrl: './template.component.html', - standalone: true, - imports: [AsyncPipe, KcSanitizePipe, NgTemplateOutlet, KcClassDirective, MsgStrPipe], - changeDetection: ChangeDetectionStrategy.OnPush, - providers: [ - { - provide: ComponentReference, - useExisting: forwardRef(() => TemplateComponent), - }, - ], -}) -export class TemplateComponent extends ComponentReference implements OnInit { - i18n = inject(I18N); - renderer = inject(Renderer2); - meta = inject(Meta); - title = inject(Title); - kcContext = inject(KC_CONTEXT); - override doUseDefaultCss = inject(USE_DEFAULT_CSS); - override classes = inject>>(CLASSES); - loginResourceInjectorService = inject(LoginResourceInjectorService); - - displayInfo = input(false); - displayMessage = input(true); - displayRequiredFields = input(false); - documentTitle = input(); - bodyClassName = input(); - - isReadyToRender$: Observable; - - constructor() { - super(); - this.title.setTitle(this.documentTitle() ?? this.i18n.msgStr('loginTitle', this.kcContext.realm.displayName)); - this.isReadyToRender$ = this.loginResourceInjectorService.injectResource(this.doUseDefaultCss); - } - - ngOnInit() { - this.applyKcIndexClasses(); - } - - private applyKcIndexClasses() { - const kcClsx = getKcClsx({ - doUseDefaultCss: this.doUseDefaultCss, - classes: this.classes, - }).kcClsx; - const kcBodyClass = this.bodyClassName() ?? kcClsx('kcBodyClass'); - const kcHtmlClass = kcClsx('kcHtmlClass'); - const kcBodyClasses = kcBodyClass.split(/\s+/); - const kcHtmlClasses = kcHtmlClass.split(/\s+/); - kcBodyClasses.forEach((klass) => { - this.renderer.addClass(document.body, klass); - }); - kcHtmlClasses.forEach((klass) => { - this.renderer.addClass(document.documentElement, klass); - }); - } - - tryAnotherWay() { - document.forms['kc-select-try-another-way-form' as never].submit(); - } -} diff --git a/projects/keycloakify-angular/login/src/directives/attributes.directive.ts b/projects/keycloakify-angular/login/src/directives/attributes.directive.ts deleted file mode 100644 index 807bd5b2..00000000 --- a/projects/keycloakify-angular/login/src/directives/attributes.directive.ts +++ /dev/null @@ -1,19 +0,0 @@ -import { Directive, effect, ElementRef, inject, input, Renderer2 } from '@angular/core'; - -@Directive({ selector: '[kcAttributes]', standalone: true }) -export class AttributesDirective { - kcAttributes = input>(); - readonly #el = inject>(ElementRef); - readonly #renderer = inject(Renderer2); - - constructor() { - effect(() => { - const attributes = this.kcAttributes(); - if (attributes) { - Object.entries(attributes).forEach(([key, value]) => { - this.#renderer.setAttribute(this.#el.nativeElement, `data-${key}`, value); - }); - } - }); - } -} diff --git a/projects/keycloakify-angular/login/src/directives/index.ts b/projects/keycloakify-angular/login/src/directives/index.ts deleted file mode 100644 index f9f8d151..00000000 --- a/projects/keycloakify-angular/login/src/directives/index.ts +++ /dev/null @@ -1,2 +0,0 @@ -export * from './attributes.directive'; -export * from './kc-class.directive'; diff --git a/projects/keycloakify-angular/login/src/directives/kc-class.directive.ts b/projects/keycloakify-angular/login/src/directives/kc-class.directive.ts deleted file mode 100644 index f781bb8b..00000000 --- a/projects/keycloakify-angular/login/src/directives/kc-class.directive.ts +++ /dev/null @@ -1,150 +0,0 @@ -/* eslint-disable @typescript-eslint/no-explicit-any */ -/* eslint-disable @typescript-eslint/consistent-indexed-object-style */ -import { - Directive, - DoCheck, - ElementRef, - inject, - Input, - isDevMode, - Renderer2, - ɵstringify as stringify, -} from '@angular/core'; -import { ClassKey } from 'keycloakify/login'; -import { getKcClsx } from 'keycloakify/login/lib/kcClsx'; -import { ComponentReference } from '../classes/component-reference.class'; - -interface CssClassState { - // PERF: could use a bit mask to represent state as all fields are boolean flags - enabled: boolean; - changed: boolean; - touched: boolean; -} - -type KcClassSupportedTypes = ClassKey[] | Set | Partial<{ [key in ClassKey]: any }> | null | undefined; - -type NgClassSupportedTypes = string[] | Set | { [key: string]: any } | null | undefined; - -@Directive({ selector: '[kcClass]', standalone: true }) -export class KcClassDirective implements DoCheck { - private initialClasses: string[] = []; - private rawClass: NgClassSupportedTypes; - private rawKcClass: KcClassSupportedTypes; - - private stateMap = new Map(); - readonly #renderer = inject(Renderer2); - readonly #el = inject(ElementRef); - readonly #host = inject(ComponentReference); - // eslint-disable-next-line @angular-eslint/no-input-rename - @Input('class') - set klass(value: string) { - this.initialClasses = value != null ? value.trim().split(/\s+/) : []; - } - - // eslint-disable-next-line @angular-eslint/no-input-rename - @Input('ngClass') - set ngClass(value: string | NgClassSupportedTypes) { - this.rawClass = typeof value === 'string' ? value.trim().split(/\s+/) : value; - } - - // eslint-disable-next-line @angular-eslint/no-input-rename - @Input('kcClass') - set kcClass(value: ClassKey | KcClassSupportedTypes) { - this.rawKcClass = typeof value === 'string' ? (value.trim().split(/\s+/) as ClassKey[]) : value; - } - - ngDoCheck(): void { - for (const klass of this.initialClasses) { - this._updateState(klass, true); - } - // classes from the [ngClass] binding - const rawClass = this.rawClass; - if (Array.isArray(rawClass) || rawClass instanceof Set) { - for (const klass of rawClass) { - this._updateState(klass, true); - } - } else if (rawClass != null) { - for (const klass of Object.keys(rawClass)) { - this._updateState(klass, Boolean(rawClass[klass])); - } - } - - // classes from the [kcClass] binding - const rawKcClass = this.rawKcClass; - if (Array.isArray(rawKcClass) || rawKcClass instanceof Set) { - for (const klass of rawKcClass) { - this._updateState(klass, true, true); - } - } else if (rawKcClass != null) { - for (const klass of Object.keys(rawKcClass)) { - this._updateState(klass, Boolean(rawKcClass[klass as ClassKey]), true); - } - } - - this._applyStateDiff(); - } - - private _updateState(klass: string | ClassKey, nextEnabled: boolean, kcClsxCheck = false) { - const state = this.stateMap.get(klass); - if (state !== undefined) { - if (state.enabled !== nextEnabled) { - state.changed = true; - state.enabled = nextEnabled; - } - state.touched = true; - } else { - let klassChecked = klass; - if (kcClsxCheck) { - const doUseDefaultCss = this.#host.doUseDefaultCss ?? true; - const classes = this.#host.classes; - const kcClsx = getKcClsx({ doUseDefaultCss, classes }).kcClsx; - klassChecked = kcClsx(klass as ClassKey); - } - this.stateMap.set(klassChecked, { - enabled: nextEnabled, - changed: true, - touched: true, - }); - } - } - - private _applyStateDiff() { - for (const stateEntry of this.stateMap) { - const klass = stateEntry[0]; - const state = stateEntry[1]; - - if (state.changed) { - this._toggleClass(klass, state.enabled); - state.changed = false; - } else if (!state.touched) { - // A class that was previously active got removed from the new collection of classes - - // remove from the DOM as well. - if (state.enabled) { - this._toggleClass(klass, false); - } - this.stateMap.delete(klass); - } - - state.touched = false; - } - } - - private _toggleClass(klass: string, enabled: boolean): void { - if (isDevMode()) { - if (typeof klass !== 'string') { - throw new Error(`NgClass can only toggle CSS classes expressed as strings, got ${stringify(klass)}`); - } - } - - klass = klass.trim(); - if (klass.length > 0) { - klass.split(/\s+/).forEach((klass) => { - if (enabled) { - this.#renderer.addClass(this.#el.nativeElement, klass); - } else { - this.#renderer.removeClass(this.#el.nativeElement, klass); - } - }); - } - } -} diff --git a/projects/keycloakify-angular/login/src/pages/code/code.component.html b/projects/keycloakify-angular/login/src/pages/code/code.component.html deleted file mode 100644 index 225d9ae9..00000000 --- a/projects/keycloakify-angular/login/src/pages/code/code.component.html +++ /dev/null @@ -1,26 +0,0 @@ -@let code = kcContext.code; - - - - @if (code.success) { - {{ 'codeSuccessTitle' | msgStr }} - } @else { - {{ 'codeErrorTitle' | msgStr: code.error }} - } - - - -
- @if (code.success) { -

{{ 'copyCodeInstruction' | msgStr }}

- - } @else { -

{{ code.error }}

- } -
-
-
diff --git a/projects/keycloakify-angular/login/src/pages/code/code.component.ts b/projects/keycloakify-angular/login/src/pages/code/code.component.ts deleted file mode 100644 index 783c9e2b..00000000 --- a/projects/keycloakify-angular/login/src/pages/code/code.component.ts +++ /dev/null @@ -1,27 +0,0 @@ -import { ChangeDetectionStrategy, Component, forwardRef, inject } from '@angular/core'; -import { CLASSES, KC_CONTEXT, USE_DEFAULT_CSS } from 'keycloakify-angular'; -import { ClassKey } from 'keycloakify/login'; -import { KcContext } from 'keycloakify/login/KcContext'; -import { ComponentReference } from '../../classes/component-reference.class'; -import { TemplateComponent } from '../../containers/template.component'; -import { KcClassDirective } from '../../directives/kc-class.directive'; -import { MsgStrPipe } from '../../pipes/msg-str.pipe'; - -@Component({ - standalone: true, - imports: [MsgStrPipe, TemplateComponent, KcClassDirective], - selector: 'kc-root', - templateUrl: 'code.component.html', - changeDetection: ChangeDetectionStrategy.OnPush, - providers: [ - { - provide: ComponentReference, - useExisting: forwardRef(() => CodeComponent), - }, - ], -}) -export class CodeComponent extends ComponentReference { - kcContext = inject>(KC_CONTEXT); - override doUseDefaultCss = inject(USE_DEFAULT_CSS); - override classes = inject>>(CLASSES); -} diff --git a/projects/keycloakify-angular/login/src/pages/delete-account-confirm/delete-account-confirm.component.html b/projects/keycloakify-angular/login/src/pages/delete-account-confirm/delete-account-confirm.component.html deleted file mode 100644 index 3cf3b017..00000000 --- a/projects/keycloakify-angular/login/src/pages/delete-account-confirm/delete-account-confirm.component.html +++ /dev/null @@ -1,46 +0,0 @@ -@let url = kcContext.url; -@let triggered_from_aia = kcContext.triggered_from_aia; - - - {{ 'deleteAccountConfirm' | msgStr }} - - -
-
- - {{ 'irreversibleAction' | msgStr }} -
-

{{ 'deletingImplies' | msgStr }}

-
    -
  • {{ 'loggingOutImmediately' | msgStr }}
  • -
  • {{ 'errasingData' | msgStr }}
  • -
- -
- - @if (triggered_from_aia) { - - } -
-
-
-
diff --git a/projects/keycloakify-angular/login/src/pages/delete-account-confirm/delete-account-confirm.component.ts b/projects/keycloakify-angular/login/src/pages/delete-account-confirm/delete-account-confirm.component.ts deleted file mode 100644 index fb3b3d58..00000000 --- a/projects/keycloakify-angular/login/src/pages/delete-account-confirm/delete-account-confirm.component.ts +++ /dev/null @@ -1,27 +0,0 @@ -import { ChangeDetectionStrategy, Component, forwardRef, inject } from '@angular/core'; -import { CLASSES, KC_CONTEXT, USE_DEFAULT_CSS } from 'keycloakify-angular'; -import { ClassKey } from 'keycloakify/login'; -import { KcContext } from 'keycloakify/login/KcContext'; -import { ComponentReference } from '../../classes/component-reference.class'; -import { TemplateComponent } from '../../containers/template.component'; -import { KcClassDirective } from '../../directives'; -import { MsgStrPipe } from '../../pipes/msg-str.pipe'; - -@Component({ - standalone: true, - imports: [TemplateComponent, MsgStrPipe, KcClassDirective], - selector: 'kc-root', - templateUrl: 'delete-account-confirm.component.html', - changeDetection: ChangeDetectionStrategy.OnPush, - providers: [ - { - provide: ComponentReference, - useExisting: forwardRef(() => DeleteAccountConfirmComponent), - }, - ], -}) -export class DeleteAccountConfirmComponent extends ComponentReference { - kcContext = inject>(KC_CONTEXT); - override doUseDefaultCss = inject(USE_DEFAULT_CSS); - override classes = inject>>(CLASSES); -} diff --git a/projects/keycloakify-angular/login/src/pages/delete-credential/delete-credential.component.html b/projects/keycloakify-angular/login/src/pages/delete-credential/delete-credential.component.html deleted file mode 100644 index 7e8c3a18..00000000 --- a/projects/keycloakify-angular/login/src/pages/delete-credential/delete-credential.component.html +++ /dev/null @@ -1,35 +0,0 @@ -@let url = kcContext.url; -@let credentialLabel = kcContext.credentialLabel; - - - {{ 'deleteCredentialTitle' | msgStr: credentialLabel }} - - -
- {{ 'deleteCredentialMessage' | msgStr: credentialLabel }} -
- -
- - - -
-
-
-
diff --git a/projects/keycloakify-angular/login/src/pages/delete-credential/delete-credential.component.ts b/projects/keycloakify-angular/login/src/pages/delete-credential/delete-credential.component.ts deleted file mode 100644 index 1e460444..00000000 --- a/projects/keycloakify-angular/login/src/pages/delete-credential/delete-credential.component.ts +++ /dev/null @@ -1,32 +0,0 @@ -import { ChangeDetectionStrategy, Component, forwardRef, inject, input } from '@angular/core'; -import { CLASSES, KC_CONTEXT, USE_DEFAULT_CSS } from 'keycloakify-angular'; -import { ClassKey } from 'keycloakify/login'; -import { KcContext } from 'keycloakify/login/KcContext'; -import { ComponentReference } from '../../classes/component-reference.class'; -import { TemplateComponent } from '../../containers/template.component'; -import { KcClassDirective } from '../../directives/kc-class.directive'; -import { MsgStrPipe } from '../../pipes/msg-str.pipe'; - -@Component({ - standalone: true, - imports: [MsgStrPipe, TemplateComponent, KcClassDirective], - selector: 'kc-root', - templateUrl: 'delete-credential.component.html', - changeDetection: ChangeDetectionStrategy.OnPush, - providers: [ - { - provide: ComponentReference, - useExisting: forwardRef(() => DeleteCredentialComponent), - }, - ], -}) -export class DeleteCredentialComponent extends ComponentReference { - kcContext = inject>(KC_CONTEXT); - override doUseDefaultCss = inject(USE_DEFAULT_CSS); - override classes = inject>>(CLASSES); - displayRequiredFields = input(false); - documentTitle = input(); - bodyClassName = input(); - displayInfo: boolean = false; - displayMessage: boolean = false; -} diff --git a/projects/keycloakify-angular/login/src/pages/error/error.component.html b/projects/keycloakify-angular/login/src/pages/error/error.component.html deleted file mode 100644 index 5a355180..00000000 --- a/projects/keycloakify-angular/login/src/pages/error/error.component.html +++ /dev/null @@ -1,25 +0,0 @@ -@let message = kcContext.message; -@let skipLink = kcContext.skipLink; -@let client = kcContext.client; - - - {{ 'errorTitle' | msgStr }} - - -
-

- @if (!skipLink && !!client?.baseUrl) { -

- -

- } -
-
-
diff --git a/projects/keycloakify-angular/login/src/pages/error/error.component.ts b/projects/keycloakify-angular/login/src/pages/error/error.component.ts deleted file mode 100644 index 69d636c6..00000000 --- a/projects/keycloakify-angular/login/src/pages/error/error.component.ts +++ /dev/null @@ -1,27 +0,0 @@ -import { ChangeDetectionStrategy, Component, forwardRef, inject } from '@angular/core'; -import { CLASSES, KC_CONTEXT, USE_DEFAULT_CSS } from 'keycloakify-angular'; -import { ClassKey } from 'keycloakify/login'; -import { KcContext } from 'keycloakify/login/KcContext'; -import { ComponentReference } from '../../classes/component-reference.class'; -import { TemplateComponent } from '../../containers/template.component'; -import { KcSanitizePipe } from '../../pipes/kc-sanitize.pipe'; -import { MsgStrPipe } from '../../pipes/msg-str.pipe'; - -@Component({ - standalone: true, - imports: [TemplateComponent, MsgStrPipe, KcSanitizePipe], - selector: 'kc-root', - templateUrl: 'error.component.html', - changeDetection: ChangeDetectionStrategy.OnPush, - providers: [ - { - provide: ComponentReference, - useExisting: forwardRef(() => ErrorComponent), - }, - ], -}) -export class ErrorComponent extends ComponentReference { - kcContext = inject>(KC_CONTEXT); - override doUseDefaultCss = inject(USE_DEFAULT_CSS); - override classes = inject>>(CLASSES); -} diff --git a/projects/keycloakify-angular/login/src/pages/frontchannel-logout/frontchannel-logout.component.html b/projects/keycloakify-angular/login/src/pages/frontchannel-logout/frontchannel-logout.component.html deleted file mode 100644 index 24864ede..00000000 --- a/projects/keycloakify-angular/login/src/pages/frontchannel-logout/frontchannel-logout.component.html +++ /dev/null @@ -1,35 +0,0 @@ -@let logout = kcContext.logout; - - - {{ 'frontchannel-logout.title' | msgStr }} - - -

{{ 'frontchannel-logout.message' | msgStr }}

-
    - @for (client of logout.clients; track client.name; let idx = $index) { -
  • - {{ client.name }} - -
  • - } -
- @if (logout.logoutRedirectUri) { - - {{ 'doContinue' | msgStr }} - - } -
-
diff --git a/projects/keycloakify-angular/login/src/pages/frontchannel-logout/frontchannel-logout.component.ts b/projects/keycloakify-angular/login/src/pages/frontchannel-logout/frontchannel-logout.component.ts deleted file mode 100644 index 734e8276..00000000 --- a/projects/keycloakify-angular/login/src/pages/frontchannel-logout/frontchannel-logout.component.ts +++ /dev/null @@ -1,37 +0,0 @@ -import { ChangeDetectionStrategy, Component, forwardRef, inject, input, OnInit } from '@angular/core'; -import { CLASSES, KC_CONTEXT, USE_DEFAULT_CSS } from 'keycloakify-angular'; -import { ClassKey } from 'keycloakify/login'; -import { KcContext } from 'keycloakify/login/KcContext'; -import { ComponentReference } from '../../classes/component-reference.class'; -import { TemplateComponent } from '../../containers/template.component'; -import { KcSanitizePipe } from '../../pipes/kc-sanitize.pipe'; -import { MsgStrPipe } from '../../pipes/msg-str.pipe'; - -@Component({ - standalone: true, - imports: [TemplateComponent, MsgStrPipe, KcSanitizePipe], - selector: 'kc-root', - templateUrl: 'frontchannel-logout.component.html', - changeDetection: ChangeDetectionStrategy.OnPush, - providers: [ - { - provide: ComponentReference, - useExisting: forwardRef(() => FrontchannelLogoutComponent), - }, - ], -}) -export class FrontchannelLogoutComponent extends ComponentReference implements OnInit { - kcContext = inject>(KC_CONTEXT); - override doUseDefaultCss = inject(USE_DEFAULT_CSS); - override classes = inject>>(CLASSES); - displayRequiredFields = input(false); - bodyClassName = input(); - displayInfo: boolean = false; - displayMessage: boolean = false; - - ngOnInit(): void { - if (this.kcContext.logout.logoutRedirectUri) { - window.location.replace(this.kcContext.logout.logoutRedirectUri); - } - } -} diff --git a/projects/keycloakify-angular/login/src/pages/idp-review-user-profile/idp-review-user-profile.component.html b/projects/keycloakify-angular/login/src/pages/idp-review-user-profile/idp-review-user-profile.component.html deleted file mode 100644 index 44e1c7b2..00000000 --- a/projects/keycloakify-angular/login/src/pages/idp-review-user-profile/idp-review-user-profile.component.html +++ /dev/null @@ -1,41 +0,0 @@ -@let url = kcContext.url; - - - {{ 'loginIdpReviewProfileTitle' | msgStr }} - - -
- -
-
-
-
-
- -
-
- -
-
diff --git a/projects/keycloakify-angular/login/src/pages/idp-review-user-profile/idp-review-user-profile.component.ts b/projects/keycloakify-angular/login/src/pages/idp-review-user-profile/idp-review-user-profile.component.ts deleted file mode 100644 index d51db3a5..00000000 --- a/projects/keycloakify-angular/login/src/pages/idp-review-user-profile/idp-review-user-profile.component.ts +++ /dev/null @@ -1,38 +0,0 @@ -import { ChangeDetectionStrategy, Component, forwardRef, inject, input, signal } from '@angular/core'; -import { CLASSES, KC_CONTEXT, USE_DEFAULT_CSS } from 'keycloakify-angular'; -import { ClassKey } from 'keycloakify/login'; -import { KcContext } from 'keycloakify/login/KcContext'; -import { ComponentReference } from '../../classes/component-reference.class'; -import { UserProfileFormFieldsComponent } from '../../components/user-profile-form-fields/user-profile-form-fields.component'; -import { TemplateComponent } from '../../containers/template.component'; -import { KcClassDirective } from '../../directives/kc-class.directive'; -import { MsgStrPipe } from '../../pipes/msg-str.pipe'; - -@Component({ - standalone: true, - imports: [TemplateComponent, MsgStrPipe, UserProfileFormFieldsComponent, KcClassDirective], - selector: 'kc-root', - templateUrl: 'idp-review-user-profile.component.html', - changeDetection: ChangeDetectionStrategy.OnPush, - providers: [ - { - provide: ComponentReference, - useExisting: forwardRef(() => IdpReviewUserProfileComponent), - }, - ], -}) -export class IdpReviewUserProfileComponent extends ComponentReference { - kcContext = inject>(KC_CONTEXT); - displayRequiredFields = input(true); - documentTitle = input(); - bodyClassName = input(); - override doUseDefaultCss = inject(USE_DEFAULT_CSS); - override classes = inject>>(CLASSES); - isFormSubmittable = signal(false); - displayInfo: boolean = false; - displayMessage: boolean = !this.kcContext?.messagesPerField?.existsError('global'); - - onCallback() { - (document.getElementById('kc-register-form') as HTMLFormElement).submit(); - } -} diff --git a/projects/keycloakify-angular/login/src/pages/info/info.component.html b/projects/keycloakify-angular/login/src/pages/info/info.component.html deleted file mode 100644 index e5a73a73..00000000 --- a/projects/keycloakify-angular/login/src/pages/info/info.component.html +++ /dev/null @@ -1,54 +0,0 @@ -@let skipLink = kcContext.skipLink; -@let actionUri = kcContext.actionUri; -@let pageRedirectUri = kcContext.pageRedirectUri; -@let client = kcContext.client; -@let messageHeader = kcContext.messageHeader; -@let message = kcContext.message; - - - - - -
-

- @if (!skipLink) { - @if (pageRedirectUri) { -

- - -

- } - @if (actionUri) { -

- - -

- } - @if (client.baseUrl) { -

- - -

- } - } -
-
-
diff --git a/projects/keycloakify-angular/login/src/pages/info/info.component.ts b/projects/keycloakify-angular/login/src/pages/info/info.component.ts deleted file mode 100644 index 06bfb83d..00000000 --- a/projects/keycloakify-angular/login/src/pages/info/info.component.ts +++ /dev/null @@ -1,53 +0,0 @@ -import { ChangeDetectionStrategy, Component, forwardRef, inject, input } from '@angular/core'; -import { CLASSES, KC_CONTEXT, USE_DEFAULT_CSS } from 'keycloakify-angular'; -import { ClassKey } from 'keycloakify/login'; -import { KcContext } from 'keycloakify/login/KcContext'; -import { ComponentReference } from '../../classes/component-reference.class'; -import { TemplateComponent } from '../../containers/template.component'; -import { AdvancedMsgStrPipe } from '../../pipes/advanced-msg-str.pipe'; -import { KcSanitizePipe } from '../../pipes/kc-sanitize.pipe'; -import { MsgStrPipe } from '../../pipes/msg-str.pipe'; - -@Component({ - standalone: true, - imports: [TemplateComponent, MsgStrPipe, KcSanitizePipe, AdvancedMsgStrPipe], - selector: 'kc-root', - templateUrl: 'info.component.html', - changeDetection: ChangeDetectionStrategy.OnPush, - providers: [ - AdvancedMsgStrPipe, - MsgStrPipe, - KcSanitizePipe, - { - provide: ComponentReference, - useExisting: forwardRef(() => InfoComponent), - }, - ], -}) -export class InfoComponent extends ComponentReference { - kcContext = inject>(KC_CONTEXT); - advancedMsgStr = inject(AdvancedMsgStrPipe); - kcSanitize = inject(KcSanitizePipe); - msgStr = inject(MsgStrPipe); - override doUseDefaultCss = inject(USE_DEFAULT_CSS); - override classes = inject>>(CLASSES); - displayRequiredFields = input(false); - documentTitle = input(); - bodyClassName = input(); - displayInfo: boolean = false; - displayMessage: boolean = false; - - get infoMessage() { - let html = this.kcContext.message.summary; - if (this.kcContext.requiredActions) { - html += ''; - - html += this.kcContext.requiredActions - .map((requiredAction) => this.advancedMsgStr.transform(`requiredAction.${requiredAction}`)) - .join(', '); - - html += ''; - } - return html; - } -} diff --git a/projects/keycloakify-angular/login/src/pages/login-config-totp/login-config-totp.component.html b/projects/keycloakify-angular/login/src/pages/login-config-totp/login-config-totp.component.html deleted file mode 100644 index 56310e7e..00000000 --- a/projects/keycloakify-angular/login/src/pages/login-config-totp/login-config-totp.component.html +++ /dev/null @@ -1,190 +0,0 @@ -@let totp = kcContext.totp; -@let url = kcContext.url; -@let messagesPerField = kcContext.messagesPerField; -@let mode = kcContext.mode; -@let isAppInitiatedAction = kcContext.isAppInitiatedAction; - - - {{ 'loginTotpStep1' | msgStr }} - - -
    -
  1. -

    {{ 'loginTotpStep1' | msgStr }}

    -
      - @for (app of totp.supportedApplications; track app) { -
    • {{ app | advancedMsgStr }}
    • - } -
    -
  2. - @if (kcContext.mode === 'manual') { -
  3. -

    {{ 'loginTotpManualStep2' | msgStr }}

    -

    - {{ totp.totpSecretEncoded }} -

    -

    - - {{ 'loginTotpScanBarcode' | msgStr }} - -

    -
  4. -
  5. -

    {{ 'loginTotpManualStep3' | msgStr }}

    -

    -
      -
    • - {{ 'loginTotpType' | msgStr }}: {{ 'loginTotp.' + totp.policy.type | advancedMsgStr }} -
    • -
    • {{ 'loginTotpAlgorithm' | msgStr }}: {{ totp.policy.getAlgorithmKey() }}
    • -
    • {{ 'loginTotpDigits' | msgStr }}: {{ totp.policy.digits }}
    • - @if (totp.policy.type === 'totp') { -
    • {{ 'loginTotpInterval' | msgStr }}: {{ totp.policy.period }}
    • - } @else { -
    • {{ 'loginTotpCounter' | msgStr }}: {{ totp.policy.initialCounter }}
    • - } -
    -
  6. - } @else { -
  7. -

    {{ 'loginTotpStep2' | msgStr }}

    - Figure: Barcode -
    -

    - - {{ 'loginTotpUnableToScan' | msgStr }} - -

    -
  8. - } -
  9. -

    {{ 'loginTotpStep3' | msgStr }}

    -

    {{ 'loginTotpStep3DeviceName' | msgStr }}

    -
  10. -
-
-
-
- - * -
-
- - @if (messagesPerField.existsError('totp')) { - - } -
- - @if (mode) { - - } -
-
-
- - @if (totp.otpCredentials.length >= 1) { - * - } -
-
- - @if (messagesPerField.existsError('userLabel')) { - - } -
-
-
- -
- - @if (isAppInitiatedAction) { - - - } @else { - - } -
-> diff --git a/projects/keycloakify-angular/login/src/pages/login-config-totp/login-config-totp.component.ts b/projects/keycloakify-angular/login/src/pages/login-config-totp/login-config-totp.component.ts deleted file mode 100644 index bcc6a913..00000000 --- a/projects/keycloakify-angular/login/src/pages/login-config-totp/login-config-totp.component.ts +++ /dev/null @@ -1,43 +0,0 @@ -import { ChangeDetectionStrategy, Component, forwardRef, inject, input } from '@angular/core'; -import { CLASSES, KC_CONTEXT, USE_DEFAULT_CSS } from 'keycloakify-angular'; -import { ClassKey } from 'keycloakify/login'; -import { KcContext } from 'keycloakify/login/KcContext'; -import { ComponentReference } from '../../classes/component-reference.class'; -import { LogoutOtherSessionsComponent } from '../../components/logout-other-sessions/logout-other-sessions.component'; -import { TemplateComponent } from '../../containers/template.component'; -import { KcClassDirective } from '../../directives/kc-class.directive'; -import { AdvancedMsgStrPipe } from '../../pipes/advanced-msg-str.pipe'; -import { KcSanitizePipe } from '../../pipes/kc-sanitize.pipe'; -import { MsgStrPipe } from '../../pipes/msg-str.pipe'; - -@Component({ - standalone: true, - imports: [ - TemplateComponent, - MsgStrPipe, - AdvancedMsgStrPipe, - KcClassDirective, - KcSanitizePipe, - LogoutOtherSessionsComponent, - ], - selector: 'kc-root', - templateUrl: 'login-config-totp.component.html', - changeDetection: ChangeDetectionStrategy.OnPush, - providers: [ - { - provide: ComponentReference, - useExisting: forwardRef(() => LoginConfigTotpComponent), - }, - ], -}) -export class LoginConfigTotpComponent extends ComponentReference { - kcContext = inject>(KC_CONTEXT); - - override doUseDefaultCss = inject(USE_DEFAULT_CSS); - override classes = inject>>(CLASSES); - displayRequiredFields = input(false); - documentTitle = input(); - bodyClassName = input(); - displayInfo: boolean = false; - displayMessage: boolean = this.kcContext.messagesPerField.existsError('totp', 'userLabel'); -} diff --git a/projects/keycloakify-angular/login/src/pages/login-idp-link-confirm-override/login-idp-link-confirm-override.component.html b/projects/keycloakify-angular/login/src/pages/login-idp-link-confirm-override/login-idp-link-confirm-override.component.html deleted file mode 100644 index 9e934f96..00000000 --- a/projects/keycloakify-angular/login/src/pages/login-idp-link-confirm-override/login-idp-link-confirm-override.component.html +++ /dev/null @@ -1,40 +0,0 @@ -@let url = kcContext.url; -@let idpDisplayName = kcContext.idpDisplayName; - - - - {{ 'confirmOverrideIdpTitle' | msgStr }} - - -
- {{ 'pageExpiredMsg1' | msgStr }} - - {{ 'doClickHere' | msgStr }} - -
-
- -
-
-
diff --git a/projects/keycloakify-angular/login/src/pages/login-idp-link-confirm-override/login-idp-link-confirm-override.component.ts b/projects/keycloakify-angular/login/src/pages/login-idp-link-confirm-override/login-idp-link-confirm-override.component.ts deleted file mode 100644 index 7c5559a9..00000000 --- a/projects/keycloakify-angular/login/src/pages/login-idp-link-confirm-override/login-idp-link-confirm-override.component.ts +++ /dev/null @@ -1,32 +0,0 @@ -import { ChangeDetectionStrategy, Component, forwardRef, inject, input } from '@angular/core'; -import { CLASSES, KC_CONTEXT, USE_DEFAULT_CSS } from 'keycloakify-angular'; -import { ClassKey } from 'keycloakify/login'; -import { KcContext } from 'keycloakify/login/KcContext'; -import { ComponentReference } from '../../classes/component-reference.class'; -import { TemplateComponent } from '../../containers/template.component'; -import { KcClassDirective } from '../../directives/kc-class.directive'; -import { MsgStrPipe } from '../../pipes/msg-str.pipe'; - -@Component({ - standalone: true, - imports: [KcClassDirective, TemplateComponent, MsgStrPipe], - selector: 'kc-root', - templateUrl: 'login-idp-link-confirm-override.component.html', - changeDetection: ChangeDetectionStrategy.OnPush, - providers: [ - { - provide: ComponentReference, - useExisting: forwardRef(() => LoginIdpLinkConfirmOverrideComponent), - }, - ], -}) -export class LoginIdpLinkConfirmOverrideComponent extends ComponentReference { - kcContext = inject>(KC_CONTEXT); - override doUseDefaultCss = inject(USE_DEFAULT_CSS); - override classes = inject>>(CLASSES); - displayRequiredFields = input(false); - documentTitle = input(); - bodyClassName = input(); - displayInfo: boolean = false; - displayMessage: boolean = false; -} diff --git a/projects/keycloakify-angular/login/src/pages/login-idp-link-confirm/login-idp-link-confirm.component.html b/projects/keycloakify-angular/login/src/pages/login-idp-link-confirm/login-idp-link-confirm.component.html deleted file mode 100644 index e5152bd9..00000000 --- a/projects/keycloakify-angular/login/src/pages/login-idp-link-confirm/login-idp-link-confirm.component.html +++ /dev/null @@ -1,41 +0,0 @@ -@let url = kcContext.url; -@let idpAlias = kcContext.idpAlias; - - - {{ 'confirmLinkIdpTitle' | msgStr }} - - -
-
- - -
-
-
-
diff --git a/projects/keycloakify-angular/login/src/pages/login-idp-link-confirm/login-idp-link-confirm.component.ts b/projects/keycloakify-angular/login/src/pages/login-idp-link-confirm/login-idp-link-confirm.component.ts deleted file mode 100644 index 82e31793..00000000 --- a/projects/keycloakify-angular/login/src/pages/login-idp-link-confirm/login-idp-link-confirm.component.ts +++ /dev/null @@ -1,32 +0,0 @@ -import { ChangeDetectionStrategy, Component, forwardRef, inject, input } from '@angular/core'; -import { CLASSES, KC_CONTEXT, USE_DEFAULT_CSS } from 'keycloakify-angular'; -import { ClassKey } from 'keycloakify/login'; -import { KcContext } from 'keycloakify/login/KcContext'; -import { ComponentReference } from '../../classes/component-reference.class'; -import { TemplateComponent } from '../../containers/template.component'; -import { KcClassDirective } from '../../directives/kc-class.directive'; -import { MsgStrPipe } from '../../pipes/msg-str.pipe'; - -@Component({ - standalone: true, - imports: [TemplateComponent, MsgStrPipe, KcClassDirective], - selector: 'kc-root', - templateUrl: 'login-idp-link-confirm.component.html', - changeDetection: ChangeDetectionStrategy.OnPush, - providers: [ - { - provide: ComponentReference, - useExisting: forwardRef(() => LoginIdpLinkConfirmComponent), - }, - ], -}) -export class LoginIdpLinkConfirmComponent extends ComponentReference { - kcContext = inject>(KC_CONTEXT); - override doUseDefaultCss = inject(USE_DEFAULT_CSS); - override classes = inject>>(CLASSES); - displayRequiredFields = input(false); - documentTitle = input(); - bodyClassName = input(); - displayInfo: boolean = false; - displayMessage: boolean = false; -} diff --git a/projects/keycloakify-angular/login/src/pages/login-idp-link-email/login-idp-link-email.component.html b/projects/keycloakify-angular/login/src/pages/login-idp-link-email/login-idp-link-email.component.html deleted file mode 100644 index 72f1f890..00000000 --- a/projects/keycloakify-angular/login/src/pages/login-idp-link-email/login-idp-link-email.component.html +++ /dev/null @@ -1,37 +0,0 @@ -@let idpAlias = kcContext.idpAlias; -@let brokerContext = kcContext.brokerContext; -@let realm = kcContext.realm; -@let url = kcContext.url; - - - {{ 'emailLinkIdpTitle' | msgStr: idpAlias }} - - -

- {{ 'emailLinkIdp1' | msgStr: idpAlias : brokerContext.username : realm.displayName }} -

-

- {{ 'emailLinkIdp2' | msgStr }} {{ 'doClickHere' | msgStr }} - {{ 'emailLinkIdp3' | msgStr }} -

-

- {{ 'emailLinkIdp4' | msgStr }} {{ 'doClickHere' | msgStr }} - {{ 'emailLinkIdp5' | msgStr }} -

-
diff --git a/projects/keycloakify-angular/login/src/pages/login-idp-link-email/login-idp-link-email.component.ts b/projects/keycloakify-angular/login/src/pages/login-idp-link-email/login-idp-link-email.component.ts deleted file mode 100644 index 0aa1e3ac..00000000 --- a/projects/keycloakify-angular/login/src/pages/login-idp-link-email/login-idp-link-email.component.ts +++ /dev/null @@ -1,27 +0,0 @@ -import { ChangeDetectionStrategy, Component, forwardRef, inject, input } from '@angular/core'; -import { CLASSES, KC_CONTEXT, USE_DEFAULT_CSS } from 'keycloakify-angular'; -import { ClassKey } from 'keycloakify/login'; -import { KcContext } from 'keycloakify/login/KcContext'; -import { ComponentReference } from '../../classes/component-reference.class'; -import { TemplateComponent } from '../../containers/template.component'; -import { KcClassDirective } from '../../directives/kc-class.directive'; -import { MsgStrPipe } from '../../pipes/msg-str.pipe'; - -@Component({ - standalone: true, - imports: [TemplateComponent, MsgStrPipe, KcClassDirective], - selector: 'kc-root', - templateUrl: 'login-idp-link-email.component.html', - changeDetection: ChangeDetectionStrategy.OnPush, - providers: [{ provide: ComponentReference, useExisting: forwardRef(() => LoginIdpLinkEmailComponent) }], -}) -export class LoginIdpLinkEmailComponent extends ComponentReference { - kcContext = inject>(KC_CONTEXT); - override doUseDefaultCss = inject(USE_DEFAULT_CSS); - override classes = inject>>(CLASSES); - displayRequiredFields = input(false); - documentTitle = input(); - bodyClassName = input(); - displayInfo: boolean = false; - displayMessage: boolean = false; -} diff --git a/projects/keycloakify-angular/login/src/pages/login-oauth-grant/login-oauth-grant.component.html b/projects/keycloakify-angular/login/src/pages/login-oauth-grant/login-oauth-grant.component.html deleted file mode 100644 index f6333894..00000000 --- a/projects/keycloakify-angular/login/src/pages/login-oauth-grant/login-oauth-grant.component.html +++ /dev/null @@ -1,92 +0,0 @@ -@let client = kcContext.client; -@let oauth = kcContext.oauth; -@let url = kcContext.url; - - - @if (client.attributes['logoUri']) { - - } -

{{ 'oauthGrantTitle' | msgStr: (client.name ? (client.name | advancedMsgStr) : client.clientId) }}

-
- - -
-

{{ 'oauthGrantRequest' | msgStr }}

-
    - @for (clientScope of oauth.clientScopesRequested; track clientScope) { -
  • - - {{ clientScope.consentScreenText | advancedMsgStr }} - @if (clientScope.dynamicScopeParameter) { - : {{ clientScope.dynamicScopeParameter }} - } - -
  • - } -
- - @if (client.attributes['policyUri'] || client.attributes['tosUri']) { -

- @if (client.name) { - {{ 'oauthGrantInformation' | msgStr: (client.name | advancedMsgStr) }} - } @else { - {{ 'oauthGrantInformation' | msgStr: client.clientId }} - } - @if (client.attributes['policyUri']) { - {{ 'oauthGrantReview' | msgStr }} - - {{ 'oauthGrantPolicy' | msgStr }} - - } -

- } -
- -
-
-
-
- -
-
- - -
-
-
-
-
-
-
-
diff --git a/projects/keycloakify-angular/login/src/pages/login-oauth-grant/login-oauth-grant.component.ts b/projects/keycloakify-angular/login/src/pages/login-oauth-grant/login-oauth-grant.component.ts deleted file mode 100644 index 82785ef9..00000000 --- a/projects/keycloakify-angular/login/src/pages/login-oauth-grant/login-oauth-grant.component.ts +++ /dev/null @@ -1,28 +0,0 @@ -import { ChangeDetectionStrategy, Component, forwardRef, inject, input } from '@angular/core'; -import { CLASSES, KC_CONTEXT, USE_DEFAULT_CSS } from 'keycloakify-angular'; -import { ClassKey } from 'keycloakify/login'; -import { KcContext } from 'keycloakify/login/KcContext'; -import { ComponentReference } from '../../classes/component-reference.class'; -import { TemplateComponent } from '../../containers/template.component'; -import { KcClassDirective } from '../../directives/kc-class.directive'; -import { AdvancedMsgStrPipe } from '../../pipes/advanced-msg-str.pipe'; -import { MsgStrPipe } from '../../pipes/msg-str.pipe'; - -@Component({ - standalone: true, - imports: [KcClassDirective, TemplateComponent, MsgStrPipe, AdvancedMsgStrPipe], - selector: 'kc-root', - templateUrl: 'login-oauth-grant.component.html', - changeDetection: ChangeDetectionStrategy.OnPush, - providers: [{ provide: ComponentReference, useExisting: forwardRef(() => LoginOauthGrantComponent) }], -}) -export class LoginOauthGrantComponent extends ComponentReference { - kcContext = inject>(KC_CONTEXT); - override doUseDefaultCss = inject(USE_DEFAULT_CSS); - override classes = inject>>(CLASSES); - displayRequiredFields = input(false); - documentTitle = input(); - bodyClassName = input('oauth'); - displayInfo: boolean = false; - displayMessage: boolean = false; -} diff --git a/projects/keycloakify-angular/login/src/pages/login-oauth2-device-verify-user-code/login-oauth2-device-verify-user-code.component.html b/projects/keycloakify-angular/login/src/pages/login-oauth2-device-verify-user-code/login-oauth2-device-verify-user-code.component.html deleted file mode 100644 index 4b59d2b9..00000000 --- a/projects/keycloakify-angular/login/src/pages/login-oauth2-device-verify-user-code/login-oauth2-device-verify-user-code.component.html +++ /dev/null @@ -1,63 +0,0 @@ -@let url = kcContext.url; - - - {{ 'oauth2DeviceVerificationTitle' | msgStr }} - - -
-
-
- -
- -
- -
-
-
-
-
-
- -
-
- -
-
-
-
-
-
diff --git a/projects/keycloakify-angular/login/src/pages/login-oauth2-device-verify-user-code/login-oauth2-device-verify-user-code.component.ts b/projects/keycloakify-angular/login/src/pages/login-oauth2-device-verify-user-code/login-oauth2-device-verify-user-code.component.ts deleted file mode 100644 index a4c15ee2..00000000 --- a/projects/keycloakify-angular/login/src/pages/login-oauth2-device-verify-user-code/login-oauth2-device-verify-user-code.component.ts +++ /dev/null @@ -1,27 +0,0 @@ -import { ChangeDetectionStrategy, Component, forwardRef, inject, input } from '@angular/core'; -import { CLASSES, KC_CONTEXT, USE_DEFAULT_CSS } from 'keycloakify-angular'; -import { ClassKey } from 'keycloakify/login'; -import { KcContext } from 'keycloakify/login/KcContext'; -import { ComponentReference } from '../../classes/component-reference.class'; -import { TemplateComponent } from '../../containers/template.component'; -import { KcClassDirective } from '../../directives/kc-class.directive'; -import { MsgStrPipe } from '../../pipes/msg-str.pipe'; - -@Component({ - standalone: true, - imports: [TemplateComponent, MsgStrPipe, KcClassDirective], - selector: 'kc-root', - templateUrl: 'login-oauth2-device-verify-user-code.component.html', - changeDetection: ChangeDetectionStrategy.OnPush, - providers: [{ provide: ComponentReference, useExisting: forwardRef(() => LoginOauth2DeviceVerifyUserCodeComponent) }], -}) -export class LoginOauth2DeviceVerifyUserCodeComponent extends ComponentReference { - kcContext = inject>(KC_CONTEXT); - override doUseDefaultCss = inject(USE_DEFAULT_CSS); - override classes = inject>>(CLASSES); - displayRequiredFields = input(false); - documentTitle = input(); - bodyClassName = input(); - displayInfo: boolean = false; - displayMessage: boolean = false; -} diff --git a/projects/keycloakify-angular/login/src/pages/login-otp/login-otp.component.html b/projects/keycloakify-angular/login/src/pages/login-otp/login-otp.component.html deleted file mode 100644 index 86de6b67..00000000 --- a/projects/keycloakify-angular/login/src/pages/login-otp/login-otp.component.html +++ /dev/null @@ -1,103 +0,0 @@ -@let url = kcContext.url; -@let otpLogin = kcContext.otpLogin; -@let messagesPerField = kcContext.messagesPerField; - - - {{ 'doLogIn' | msgStr }} - - -
- @if (otpLogin.userOtpCredentials.length > 1) { -
-
- @for (otpCredential of otpLogin.userOtpCredentials; track otpCredential; let i = $index) { - - - - - } -
-
- } -
-
- -
-
- - @if (messagesPerField.existsError('totp')) { - - } -
-
-
-
-
- -
-
-
-
-
diff --git a/projects/keycloakify-angular/login/src/pages/login-otp/login-otp.component.ts b/projects/keycloakify-angular/login/src/pages/login-otp/login-otp.component.ts deleted file mode 100644 index 15e91645..00000000 --- a/projects/keycloakify-angular/login/src/pages/login-otp/login-otp.component.ts +++ /dev/null @@ -1,33 +0,0 @@ -import { ChangeDetectionStrategy, Component, forwardRef, inject, input } from '@angular/core'; -import { CLASSES, KC_CONTEXT, USE_DEFAULT_CSS } from 'keycloakify-angular'; -import { ClassKey } from 'keycloakify/login'; -import { KcContext } from 'keycloakify/login/KcContext'; -import { ComponentReference } from '../../classes/component-reference.class'; -import { TemplateComponent } from '../../containers/template.component'; -import { KcClassDirective } from '../../directives/kc-class.directive'; -import { KcSanitizePipe } from '../../pipes/kc-sanitize.pipe'; -import { MsgStrPipe } from '../../pipes/msg-str.pipe'; - -@Component({ - standalone: true, - imports: [TemplateComponent, KcClassDirective, MsgStrPipe, KcSanitizePipe], - selector: 'kc-root', - templateUrl: 'login-otp.component.html', - changeDetection: ChangeDetectionStrategy.OnPush, - providers: [ - { - provide: ComponentReference, - useExisting: forwardRef(() => LoginOtpComponent), - }, - ], -}) -export class LoginOtpComponent extends ComponentReference { - kcContext = inject>(KC_CONTEXT); - override doUseDefaultCss = inject(USE_DEFAULT_CSS); - override classes = inject>>(CLASSES); - displayRequiredFields = input(false); - documentTitle = input(); - bodyClassName = input(); - displayInfo: boolean = false; - displayMessage: boolean = this.kcContext.messagesPerField.existsError('totp'); -} diff --git a/projects/keycloakify-angular/login/src/pages/login-page-expired/login-page-expired.component.html b/projects/keycloakify-angular/login/src/pages/login-page-expired/login-page-expired.component.html deleted file mode 100644 index 19e83434..00000000 --- a/projects/keycloakify-angular/login/src/pages/login-page-expired/login-page-expired.component.html +++ /dev/null @@ -1,35 +0,0 @@ -@let url = kcContext.url; - - - {{ 'pageExpiredTitle' | msgStr }} - - -

- {{ 'pageExpiredMsg1' | msgStr }} - - {{ 'doClickHere' | msgStr }} - - .
- {{ 'pageExpiredMsg2' | msgStr }} - - {{ 'doClickHere' | msgStr }} - - . -

-
-
diff --git a/projects/keycloakify-angular/login/src/pages/login-page-expired/login-page-expired.component.ts b/projects/keycloakify-angular/login/src/pages/login-page-expired/login-page-expired.component.ts deleted file mode 100644 index 809a66a8..00000000 --- a/projects/keycloakify-angular/login/src/pages/login-page-expired/login-page-expired.component.ts +++ /dev/null @@ -1,26 +0,0 @@ -import { ChangeDetectionStrategy, Component, forwardRef, inject, input } from '@angular/core'; -import { CLASSES, KC_CONTEXT, USE_DEFAULT_CSS } from 'keycloakify-angular'; -import { ClassKey } from 'keycloakify/login'; -import { KcContext } from 'keycloakify/login/KcContext'; -import { ComponentReference } from '../../classes/component-reference.class'; -import { TemplateComponent } from '../../containers/template.component'; -import { MsgStrPipe } from '../../pipes/msg-str.pipe'; - -@Component({ - standalone: true, - imports: [TemplateComponent, MsgStrPipe], - selector: 'kc-root', - templateUrl: 'login-page-expired.component.html', - changeDetection: ChangeDetectionStrategy.OnPush, - providers: [{ provide: ComponentReference, useExisting: forwardRef(() => LoginPageExpiredComponent) }], -}) -export class LoginPageExpiredComponent extends ComponentReference { - kcContext = inject>(KC_CONTEXT); - override doUseDefaultCss = inject(USE_DEFAULT_CSS); - override classes = inject>>(CLASSES); - displayRequiredFields = input(false); - documentTitle = input(); - bodyClassName = input(); - displayInfo: boolean = false; - displayMessage: boolean = false; -} diff --git a/projects/keycloakify-angular/login/src/pages/login-passkeys-conditional-authenticate/login-passkeys-conditional-authenticate.component.html b/projects/keycloakify-angular/login/src/pages/login-passkeys-conditional-authenticate/login-passkeys-conditional-authenticate.component.html deleted file mode 100644 index 4fb01732..00000000 --- a/projects/keycloakify-angular/login/src/pages/login-passkeys-conditional-authenticate/login-passkeys-conditional-authenticate.component.html +++ /dev/null @@ -1,203 +0,0 @@ -@let authenticators = kcContext.authenticators; -@let realm = kcContext.realm; -@let url = kcContext.url; -@let shouldDisplayAuthenticators = kcContext.shouldDisplayAuthenticators; -@let login = kcContext.login; -@let messagesPerField = kcContext.messagesPerField; -@let usernameHidden = kcContext.usernameHidden; -@let registrationDisabled = kcContext.registrationDisabled; - - - {{ 'passkey-login-title' | msgStr }} - - - @if (realm.registrationAllowed && !registrationDisabled) { -
- - {{ 'noAccount' | msgStr }} - - {{ 'doRegister' | msgStr }} - - -
- } -
- - -
- - - - - - -
-
- @if (authenticators !== undefined && authenticators.authenticators.length !== 0) { -
- @for (authenticator of authenticators.authenticators; track authenticator; let i = $index) { - - } -
- - @if (shouldDisplayAuthenticators) { - @if (authenticators.authenticators.length > 1) { -

- {{ 'passkey-available-authenticators' | msgStr }} -

- } - -
- @for (authenticator of authenticators.authenticators; track authenticator; let i = $index) { -
- -
-
- {{ authenticator.label | advancedMsgStr }} -
- @if ( - authenticator.transports !== undefined && - authenticator.transports.displayNameProperties !== undefined && - authenticator.transports.displayNameProperties.length !== 0 - ) { -
- @for ( - nameProperty of authenticator.transports.displayNameProperties; - track nameProperty; - let i = $index - ) { - {{ nameProperty | advancedMsgStr }} - @if (i !== authenticator.transports.displayNameProperties.length - 1) { - , - } - } -
-
- - {{ 'passkey-createdAt-label' | msgStr }} - - - {{ authenticator.createdAt }} - -
-
- } -
-
- } -
- } - } -
- @if (realm.password) { - - - } -
-
-
-
diff --git a/projects/keycloakify-angular/login/src/pages/login-passkeys-conditional-authenticate/login-passkeys-conditional-authenticate.component.ts b/projects/keycloakify-angular/login/src/pages/login-passkeys-conditional-authenticate/login-passkeys-conditional-authenticate.component.ts deleted file mode 100644 index 6f9b0192..00000000 --- a/projects/keycloakify-angular/login/src/pages/login-passkeys-conditional-authenticate/login-passkeys-conditional-authenticate.component.ts +++ /dev/null @@ -1,90 +0,0 @@ -import { ChangeDetectionStrategy, Component, forwardRef, inject } from '@angular/core'; -import { CLASSES, KC_CONTEXT, Script, USE_DEFAULT_CSS } from 'keycloakify-angular'; -import { ClassKey } from 'keycloakify/login'; -import { KcContext } from 'keycloakify/login/KcContext'; -import { getKcClsx } from 'keycloakify/login/lib/kcClsx'; -import { ComponentReference } from '../../classes/component-reference.class'; -import { TemplateComponent } from '../../containers/template.component'; -import { KcClassDirective } from '../../directives/kc-class.directive'; -import { AdvancedMsgStrPipe } from '../../pipes/advanced-msg-str.pipe'; -import { MsgStrPipe } from '../../pipes/msg-str.pipe'; -import { LoginResourceInjectorService } from '../../services'; - -@Component({ - standalone: true, - imports: [TemplateComponent, MsgStrPipe, KcClassDirective, AdvancedMsgStrPipe], - selector: 'kc-root', - templateUrl: 'login-passkeys-conditional-authenticate.component.html', - changeDetection: ChangeDetectionStrategy.OnPush, - providers: [ - MsgStrPipe, - { - provide: ComponentReference, - useExisting: forwardRef(() => LoginPasskeysConditionalAuthenticateComponent), - }, - ], -}) -export class LoginPasskeysConditionalAuthenticateComponent extends ComponentReference { - kcContext = inject>(KC_CONTEXT); - loginResourceInjectorService = inject(LoginResourceInjectorService); - msgStr = inject(MsgStrPipe); - override doUseDefaultCss = inject(USE_DEFAULT_CSS); - override classes = inject>>(CLASSES); - displayInfo: boolean = true; - - authButtonId = 'authenticateWebAuthnButton'; - - constructor() { - super(); - const { - url, - challenge, - rpId, - userVerification, - isUserIdentified, - - createTimeout, - } = this.kcContext; - const scripts: Script[] = [ - { - type: 'module', - id: 'LoginRecoveryAuthnCodeConfig', - textContent: ` - import { authenticateByWebAuthn } from "${url.resourcesPath}/js/webauthnAuthenticate.js"; - import { initAuthenticate } from "${url.resourcesPath}/js/passkeysConditionalAuth.js"; - - const authButton = document.getElementById("${this.authButtonId}"); - const input = { - isUserIdentified : ${isUserIdentified}, - challenge : ${JSON.stringify(challenge)}, - userVerification : ${JSON.stringify(userVerification)}, - rpId : ${JSON.stringify(rpId)}, - createTimeout : ${createTimeout} - }; - authButton.addEventListener("click", () => { - authenticateByWebAuthn({ - ...input, - errmsg : ${JSON.stringify(this.msgStr.transform('webauthn-unsupported-browser-text'))} - }); - }); - - initAuthenticate({ - ...input, - errmsg : ${JSON.stringify(this.msgStr.transform('passkey-unsupported-browser-text'))} - }); - `, - }, - ]; - this.loginResourceInjectorService.insertAdditionalScripts(scripts); - } - - selectAuthListItemIconClass(iconClass: string) { - const kcClsx = getKcClsx({ doUseDefaultCss: this.doUseDefaultCss ?? true, classes: this.classes }).kcClsx; - // eslint-disable-next-line @typescript-eslint/no-explicit-any - const className = kcClsx(iconClass as any); - if (className === iconClass) { - return kcClsx('kcWebAuthnDefaultIcon'); - } - return className; - } -} diff --git a/projects/keycloakify-angular/login/src/pages/login-password/login-password.component.html b/projects/keycloakify-angular/login/src/pages/login-password/login-password.component.html deleted file mode 100644 index 437d3950..00000000 --- a/projects/keycloakify-angular/login/src/pages/login-password/login-password.component.html +++ /dev/null @@ -1,90 +0,0 @@ -@let url = kcContext.url; -@let messagesPerField = kcContext.messagesPerField; -@let realm = kcContext.realm; - - - {{ 'doLogIn' | msgStr }} - - -
-
-
-
-
- - - - - - @if (messagesPerField.existsError('password')) { - - - } -
-
-
-
- @if (realm.resetPasswordAllowed) { - - - {{ 'doForgotPassword' | msgStr }} - - - } -
-
-
- -
-
-
-
-
-
diff --git a/projects/keycloakify-angular/login/src/pages/login-password/login-password.component.ts b/projects/keycloakify-angular/login/src/pages/login-password/login-password.component.ts deleted file mode 100644 index c6643c6a..00000000 --- a/projects/keycloakify-angular/login/src/pages/login-password/login-password.component.ts +++ /dev/null @@ -1,36 +0,0 @@ -import { ChangeDetectionStrategy, Component, forwardRef, inject, input, signal } from '@angular/core'; -import { CLASSES, KC_CONTEXT, USE_DEFAULT_CSS } from 'keycloakify-angular'; -import { ClassKey } from 'keycloakify/login'; -import { KcContext } from 'keycloakify/login/KcContext'; -import { ComponentReference } from '../../classes/component-reference.class'; -import { PasswordWrapperComponent } from '../../components/password-wrapper/password-wrapper.component'; -import { TemplateComponent } from '../../containers/template.component'; -import { KcClassDirective } from '../../directives/kc-class.directive'; -import { KcSanitizePipe } from '../../pipes/kc-sanitize.pipe'; -import { MsgStrPipe } from '../../pipes/msg-str.pipe'; - -@Component({ - standalone: true, - imports: [TemplateComponent, MsgStrPipe, KcClassDirective, PasswordWrapperComponent, KcSanitizePipe], - selector: 'kc-root', - templateUrl: 'login-password.component.html', - changeDetection: ChangeDetectionStrategy.OnPush, - providers: [ - { - provide: ComponentReference, - useExisting: forwardRef(() => LoginPasswordComponent), - }, - ], -}) -export class LoginPasswordComponent extends ComponentReference { - kcContext = inject>(KC_CONTEXT); - override doUseDefaultCss = inject(USE_DEFAULT_CSS); - override classes = inject>>(CLASSES); - displayRequiredFields = input(false); - documentTitle = input(); - bodyClassName = input(); - displayInfo = false; - displayMessage = this.kcContext.messagesPerField.existsError('password'); - - isLoginButtonDisabled = signal(false); -} diff --git a/projects/keycloakify-angular/login/src/pages/login-recovery-authn-code-config/login-recovery-authn-code-config.component.html b/projects/keycloakify-angular/login/src/pages/login-recovery-authn-code-config/login-recovery-authn-code-config.component.html deleted file mode 100644 index 78b178e3..00000000 --- a/projects/keycloakify-angular/login/src/pages/login-recovery-authn-code-config/login-recovery-authn-code-config.component.html +++ /dev/null @@ -1,155 +0,0 @@ -@let recoveryAuthnCodesConfigBean = kcContext.recoveryAuthnCodesConfigBean; -@let isAppInitiatedAction = kcContext.isAppInitiatedAction; - - - {{ 'recovery-code-config-header' | msgStr }} - - - -
-
- -
-

- Warning alert: - {{ 'recovery-code-config-warning-title' | msgStr }} -

-
-

{{ 'recovery-code-config-warning-message' | msgStr }}

-
-
- -
    - @for (code of recoveryAuthnCodesConfigBean.generatedRecoveryAuthnCodesList; track code; let i = $index) { -
  1. - {{ i + 1 }}: {{ code.slice(0, 4) }}-{{ code.slice(4, 8) }}-{{ code.slice(8) }} -
  2. - } -
- - -
- - - -
- - - -
- -
- -
- - - - - - - @if (isAppInitiatedAction) { - - - } @else { - - } -
-
-
diff --git a/projects/keycloakify-angular/login/src/pages/login-recovery-authn-code-config/login-recovery-authn-code-config.component.ts b/projects/keycloakify-angular/login/src/pages/login-recovery-authn-code-config/login-recovery-authn-code-config.component.ts deleted file mode 100644 index 2c722791..00000000 --- a/projects/keycloakify-angular/login/src/pages/login-recovery-authn-code-config/login-recovery-authn-code-config.component.ts +++ /dev/null @@ -1,36 +0,0 @@ -import { ChangeDetectionStrategy, Component, forwardRef, inject, input, signal } from '@angular/core'; -import { CLASSES, KC_CONTEXT, USE_DEFAULT_CSS } from 'keycloakify-angular'; -import { ClassKey } from 'keycloakify/login'; -import { KcContext } from 'keycloakify/login/KcContext'; -import { ComponentReference } from '../../classes/component-reference.class'; -import { LogoutOtherSessionsComponent } from '../../components/logout-other-sessions/logout-other-sessions.component'; -import { TemplateComponent } from '../../containers/template.component'; -import { KcClassDirective } from '../../directives'; -import { MsgStrPipe } from '../../pipes/msg-str.pipe'; - -@Component({ - standalone: true, - imports: [MsgStrPipe, TemplateComponent, KcClassDirective, LogoutOtherSessionsComponent], - selector: 'kc-root', - templateUrl: 'login-recovery-authn-code-config.component.html', - changeDetection: ChangeDetectionStrategy.OnPush, - providers: [ - { - provide: ComponentReference, - useExisting: forwardRef(() => LoginRecoveryAuthnCodeConfigComponent), - }, - ], -}) -export class LoginRecoveryAuthnCodeConfigComponent extends ComponentReference { - kcContext = inject>(KC_CONTEXT); - override doUseDefaultCss = inject(USE_DEFAULT_CSS); - override classes = inject>>(CLASSES); - displayRequiredFields = input(false); - documentTitle = input(); - bodyClassName = input(); - displayInfo: boolean = false; - displayMessage: boolean = false; - toggleRecoveryCodesConfirmation = signal(false); - - olRecoveryCodesListId = 'kc-recovery-codes-list'; -} diff --git a/projects/keycloakify-angular/login/src/pages/login-recovery-authn-code-input/login-recovery-authn-code-input.component.html b/projects/keycloakify-angular/login/src/pages/login-recovery-authn-code-input/login-recovery-authn-code-input.component.html deleted file mode 100644 index 4eb895d7..00000000 --- a/projects/keycloakify-angular/login/src/pages/login-recovery-authn-code-input/login-recovery-authn-code-input.component.html +++ /dev/null @@ -1,76 +0,0 @@ -@let url = kcContext.url; -@let recoveryAuthnCodesInputBean = kcContext.recoveryAuthnCodesInputBean; -@let messagesPerField = kcContext.messagesPerField; - - - - {{ 'auth-recovery-code-header' | msgStr }} - - - -
-
-
- -
-
- - @if (messagesPerField.existsError('recoveryCodeInput')) { - - } -
-
- -
-
-
-
-
- -
-
-
-
-
diff --git a/projects/keycloakify-angular/login/src/pages/login-recovery-authn-code-input/login-recovery-authn-code-input.component.ts b/projects/keycloakify-angular/login/src/pages/login-recovery-authn-code-input/login-recovery-authn-code-input.component.ts deleted file mode 100644 index 3948cbea..00000000 --- a/projects/keycloakify-angular/login/src/pages/login-recovery-authn-code-input/login-recovery-authn-code-input.component.ts +++ /dev/null @@ -1,33 +0,0 @@ -import { ChangeDetectionStrategy, Component, forwardRef, inject, input } from '@angular/core'; -import { CLASSES, KC_CONTEXT, USE_DEFAULT_CSS } from 'keycloakify-angular'; -import { ClassKey } from 'keycloakify/login'; -import { KcContext } from 'keycloakify/login/KcContext'; -import { ComponentReference } from '../../classes/component-reference.class'; -import { TemplateComponent } from '../../containers/template.component'; -import { KcClassDirective } from '../../directives'; -import { KcSanitizePipe } from '../../pipes/kc-sanitize.pipe'; -import { MsgStrPipe } from '../../pipes/msg-str.pipe'; - -@Component({ - standalone: true, - imports: [TemplateComponent, MsgStrPipe, KcClassDirective, KcSanitizePipe], - selector: 'kc-root', - templateUrl: 'login-recovery-authn-code-input.component.html', - changeDetection: ChangeDetectionStrategy.OnPush, - providers: [ - { - provide: ComponentReference, - useExisting: forwardRef(() => LoginRecoveryAuthnCodeInputComponent), - }, - ], -}) -export class LoginRecoveryAuthnCodeInputComponent extends ComponentReference { - kcContext = inject>(KC_CONTEXT); - override doUseDefaultCss = inject(USE_DEFAULT_CSS); - override classes = inject>>(CLASSES); - displayRequiredFields = input(false); - documentTitle = input(); - bodyClassName = input(); - displayInfo: boolean = false; - displayMessage: boolean = this.kcContext.messagesPerField.existsError('recoveryCodeInput'); -} diff --git a/projects/keycloakify-angular/login/src/pages/login-reset-otp/login-reset-otp.component.html b/projects/keycloakify-angular/login/src/pages/login-reset-otp/login-reset-otp.component.html deleted file mode 100644 index 1745af4d..00000000 --- a/projects/keycloakify-angular/login/src/pages/login-reset-otp/login-reset-otp.component.html +++ /dev/null @@ -1,65 +0,0 @@ -@let url = kcContext.url; -@let configuredOtpCredentials = kcContext.configuredOtpCredentials; - - - {{ 'doLogIn' | msgStr }} - - -
-
-
-

{{ 'otp-reset-description' | msgStr }}

- @for (otpCredential of configuredOtpCredentials.userOtpCredentials; track otpCredential; let i = $index) { - - - } -
-
- -
-
-
-
-
-
-
diff --git a/projects/keycloakify-angular/login/src/pages/login-reset-otp/login-reset-otp.component.ts b/projects/keycloakify-angular/login/src/pages/login-reset-otp/login-reset-otp.component.ts deleted file mode 100644 index 962e5610..00000000 --- a/projects/keycloakify-angular/login/src/pages/login-reset-otp/login-reset-otp.component.ts +++ /dev/null @@ -1,32 +0,0 @@ -import { ChangeDetectionStrategy, Component, forwardRef, inject, input } from '@angular/core'; -import { CLASSES, KC_CONTEXT, USE_DEFAULT_CSS } from 'keycloakify-angular'; -import { ClassKey } from 'keycloakify/login'; -import { KcContext } from 'keycloakify/login/KcContext'; -import { ComponentReference } from '../../classes/component-reference.class'; -import { TemplateComponent } from '../../containers/template.component'; -import { KcClassDirective } from '../../directives'; -import { MsgStrPipe } from '../../pipes/msg-str.pipe'; - -@Component({ - standalone: true, - imports: [KcClassDirective, MsgStrPipe, TemplateComponent], - selector: 'kc-root', - templateUrl: 'login-reset-otp.component.html', - changeDetection: ChangeDetectionStrategy.OnPush, - providers: [ - { - provide: ComponentReference, - useExisting: forwardRef(() => LoginResetOtpComponent), - }, - ], -}) -export class LoginResetOtpComponent extends ComponentReference { - kcContext = inject>(KC_CONTEXT); - override doUseDefaultCss = inject(USE_DEFAULT_CSS); - override classes = inject>>(CLASSES); - displayRequiredFields = input(false); - documentTitle = input(); - bodyClassName = input(); - displayInfo: boolean = false; - displayMessage: boolean = this.kcContext.messagesPerField.existsError('totp'); -} diff --git a/projects/keycloakify-angular/login/src/pages/login-reset-password/login-reset-password.component.html b/projects/keycloakify-angular/login/src/pages/login-reset-password/login-reset-password.component.html deleted file mode 100644 index be2c9f48..00000000 --- a/projects/keycloakify-angular/login/src/pages/login-reset-password/login-reset-password.component.html +++ /dev/null @@ -1,95 +0,0 @@ -@let url = kcContext.url; -@let messagesPerField = kcContext.messagesPerField; -@let realm = kcContext.realm; -@let auth = kcContext.auth; - - - {{ 'emailForgotTitle' | msgStr }} - - - @if (realm.duplicateEmailsAllowed) { - {{ 'emailInstructionUsername' | msgStr }} - } @else { - {{ 'emailInstruction' | msgStr }} - } - - - -
-
-
- -
- -
- - - @if (messagesPerField.existsError('username')) { - - } -
-
- -
-
-
- - - -
-
-
- -
-
-
-
-
diff --git a/projects/keycloakify-angular/login/src/pages/login-reset-password/login-reset-password.component.ts b/projects/keycloakify-angular/login/src/pages/login-reset-password/login-reset-password.component.ts deleted file mode 100644 index bdb0ec8d..00000000 --- a/projects/keycloakify-angular/login/src/pages/login-reset-password/login-reset-password.component.ts +++ /dev/null @@ -1,33 +0,0 @@ -import { ChangeDetectionStrategy, Component, forwardRef, inject, input } from '@angular/core'; -import { CLASSES, KC_CONTEXT, USE_DEFAULT_CSS } from 'keycloakify-angular'; -import { ClassKey } from 'keycloakify/login'; -import { KcContext } from 'keycloakify/login/KcContext'; -import { ComponentReference } from '../../classes/component-reference.class'; -import { TemplateComponent } from '../../containers/template.component'; -import { KcClassDirective } from '../../directives'; -import { KcSanitizePipe } from '../../pipes/kc-sanitize.pipe'; -import { MsgStrPipe } from '../../pipes/msg-str.pipe'; - -@Component({ - standalone: true, - imports: [TemplateComponent, MsgStrPipe, KcClassDirective, KcSanitizePipe], - selector: 'kc-root', - templateUrl: 'login-reset-password.component.html', - changeDetection: ChangeDetectionStrategy.OnPush, - providers: [ - { - provide: ComponentReference, - useExisting: forwardRef(() => LoginResetPasswordComponent), - }, - ], -}) -export class LoginResetPasswordComponent extends ComponentReference { - kcContext = inject>(KC_CONTEXT); - override doUseDefaultCss = inject(USE_DEFAULT_CSS); - override classes = inject>>(CLASSES); - displayRequiredFields = input(false); - documentTitle = input(); - bodyClassName = input(); - displayInfo: boolean = false; - displayMessage: boolean = this.kcContext.messagesPerField.existsError('username'); -} diff --git a/projects/keycloakify-angular/login/src/pages/login-update-password/login-update-password.component.html b/projects/keycloakify-angular/login/src/pages/login-update-password/login-update-password.component.html deleted file mode 100644 index 70d9d52e..00000000 --- a/projects/keycloakify-angular/login/src/pages/login-update-password/login-update-password.component.html +++ /dev/null @@ -1,116 +0,0 @@ -@let url = kcContext.url; -@let messagesPerField = kcContext.messagesPerField; -@let isAppInitiatedAction = kcContext.isAppInitiatedAction; - - - - {{ 'updatePasswordTitle' | msgStr }} - - -
-
-
- -
-
- - - - - @if (messagesPerField.existsError('password')) { - - } -
-
- -
-
- -
-
- - - - @if (messagesPerField.existsError('password-confirm')) { - - } -
-
-
- -
- - @if (isAppInitiatedAction) { - - } -
-
-
-
-
diff --git a/projects/keycloakify-angular/login/src/pages/login-update-password/login-update-password.component.ts b/projects/keycloakify-angular/login/src/pages/login-update-password/login-update-password.component.ts deleted file mode 100644 index eea95eaf..00000000 --- a/projects/keycloakify-angular/login/src/pages/login-update-password/login-update-password.component.ts +++ /dev/null @@ -1,42 +0,0 @@ -import { ChangeDetectionStrategy, Component, forwardRef, inject, input } from '@angular/core'; -import { CLASSES, KC_CONTEXT, USE_DEFAULT_CSS } from 'keycloakify-angular'; -import { ClassKey } from 'keycloakify/login'; -import { KcContext } from 'keycloakify/login/KcContext'; -import { ComponentReference } from '../../classes/component-reference.class'; -import { LogoutOtherSessionsComponent } from '../../components/logout-other-sessions/logout-other-sessions.component'; -import { PasswordWrapperComponent } from '../../components/password-wrapper/password-wrapper.component'; -import { TemplateComponent } from '../../containers/template.component'; -import { KcClassDirective } from '../../directives'; -import { KcSanitizePipe } from '../../pipes/kc-sanitize.pipe'; -import { MsgStrPipe } from '../../pipes/msg-str.pipe'; - -@Component({ - standalone: true, - imports: [ - TemplateComponent, - MsgStrPipe, - KcClassDirective, - PasswordWrapperComponent, - KcSanitizePipe, - LogoutOtherSessionsComponent, - ], - selector: 'kc-root', - templateUrl: 'login-update-password.component.html', - changeDetection: ChangeDetectionStrategy.OnPush, - providers: [ - { - provide: ComponentReference, - useExisting: forwardRef(() => LoginUpdatePasswordComponent), - }, - ], -}) -export class LoginUpdatePasswordComponent extends ComponentReference { - kcContext = inject>(KC_CONTEXT); - override doUseDefaultCss = inject(USE_DEFAULT_CSS); - override classes = inject>>(CLASSES); - displayRequiredFields = input(false); - documentTitle = input(); - bodyClassName = input(); - displayInfo = false; - displayMessage = !this.kcContext.messagesPerField.existsError('password', 'password-confirm'); -} diff --git a/projects/keycloakify-angular/login/src/pages/login-update-profile/login-update-profile.component.html b/projects/keycloakify-angular/login/src/pages/login-update-profile/login-update-profile.component.html deleted file mode 100644 index 07275d5d..00000000 --- a/projects/keycloakify-angular/login/src/pages/login-update-profile/login-update-profile.component.html +++ /dev/null @@ -1,59 +0,0 @@ -@let url = kcContext.url; -@let isAppInitiatedAction = kcContext.isAppInitiatedAction; - - - {{ 'loginProfileTitle' | msgStr }} - - -
- - -
-
-
-
-
- - @if (isAppInitiatedAction) { - - } -
-
-
-
-
diff --git a/projects/keycloakify-angular/login/src/pages/login-update-profile/login-update-profile.component.ts b/projects/keycloakify-angular/login/src/pages/login-update-profile/login-update-profile.component.ts deleted file mode 100644 index 565e02cf..00000000 --- a/projects/keycloakify-angular/login/src/pages/login-update-profile/login-update-profile.component.ts +++ /dev/null @@ -1,35 +0,0 @@ -import { ChangeDetectionStrategy, Component, forwardRef, inject, input, signal } from '@angular/core'; -import { CLASSES, KC_CONTEXT, USE_DEFAULT_CSS } from 'keycloakify-angular'; -import { ClassKey } from 'keycloakify/login'; -import { KcContext } from 'keycloakify/login/KcContext'; -import { ComponentReference } from '../../classes/component-reference.class'; -import { UserProfileFormFieldsComponent } from '../../components/user-profile-form-fields/user-profile-form-fields.component'; -import { TemplateComponent } from '../../containers/template.component'; -import { KcClassDirective } from '../../directives'; -import { MsgStrPipe } from '../../pipes/msg-str.pipe'; - -@Component({ - standalone: true, - imports: [TemplateComponent, KcClassDirective, MsgStrPipe, UserProfileFormFieldsComponent], - selector: 'kc-root', - templateUrl: 'login-update-profile.component.html', - changeDetection: ChangeDetectionStrategy.OnPush, - providers: [ - { - provide: ComponentReference, - useExisting: forwardRef(() => LoginUpdateProfileComponent), - }, - ], -}) -export class LoginUpdateProfileComponent extends ComponentReference { - kcContext = inject>(KC_CONTEXT); - override doUseDefaultCss = inject(USE_DEFAULT_CSS); - override classes = inject>>(CLASSES); - displayRequiredFields = input(true); - documentTitle = input(); - bodyClassName = input(); - displayInfo: boolean = false; - displayMessage: boolean = this.kcContext.messagesPerField.exists('global'); - - isFormSubmittable = signal(false); -} diff --git a/projects/keycloakify-angular/login/src/pages/login-username/login-username.component.html b/projects/keycloakify-angular/login/src/pages/login-username/login-username.component.html deleted file mode 100644 index fa96f6c9..00000000 --- a/projects/keycloakify-angular/login/src/pages/login-username/login-username.component.html +++ /dev/null @@ -1,161 +0,0 @@ -@let realm = kcContext.realm; -@let social = kcContext.social; -@let usernameHidden = kcContext.usernameHidden; -@let messagesPerField = kcContext.messagesPerField; -@let url = kcContext.url; -@let login = kcContext.login; - - - - {{ 'doLogIn' | msgStr }} - - -
- - {{ 'noAccount' | msgStr }} - - {{ 'doRegister' | msgStr }} - - -
-
- - @if (!!realm?.password && !!social?.providers?.length) { -
-
-

{{ 'identity-provider-login-label' | msgStr }}

- -
- } -
- -
-
- @if (realm.password) { -
- @if (!usernameHidden) { -
- - - @if (messagesPerField?.existsError('username')) { - - - } - -
- } - -
-
- @if (realm.rememberMe && !usernameHidden) { -
- -
- } -
-
-
- -
-
- } -
-
-
-
diff --git a/projects/keycloakify-angular/login/src/pages/login-username/login-username.component.ts b/projects/keycloakify-angular/login/src/pages/login-username/login-username.component.ts deleted file mode 100644 index b036cdde..00000000 --- a/projects/keycloakify-angular/login/src/pages/login-username/login-username.component.ts +++ /dev/null @@ -1,38 +0,0 @@ -import { AsyncPipe, NgClass } from '@angular/common'; -import { ChangeDetectionStrategy, Component, forwardRef, inject, input, signal } from '@angular/core'; -import { CLASSES, KC_CONTEXT, USE_DEFAULT_CSS } from 'keycloakify-angular'; -import { ClassKey } from 'keycloakify/login'; -import { KcContext } from 'keycloakify/login/KcContext'; -import { ComponentReference } from '../../classes/component-reference.class'; -import { TemplateComponent } from '../../containers/template.component'; -import { KcClassDirective } from '../../directives/kc-class.directive'; -import { KcSanitizePipe } from '../../pipes/kc-sanitize.pipe'; -import { MsgStrPipe } from '../../pipes/msg-str.pipe'; - -@Component({ - selector: 'kc-root', - templateUrl: './login-username.component.html', - standalone: true, - changeDetection: ChangeDetectionStrategy.OnPush, - imports: [KcClassDirective, AsyncPipe, KcSanitizePipe, NgClass, TemplateComponent, MsgStrPipe], - providers: [ - { - provide: ComponentReference, - useExisting: forwardRef(() => LoginUsernameComponent), - }, - ], -}) -export class LoginUsernameComponent extends ComponentReference { - kcContext = inject>(KC_CONTEXT); - displayRequiredFields = input(false); - documentTitle = input(); - bodyClassName = input(); - override doUseDefaultCss = inject(USE_DEFAULT_CSS); - override classes = inject>>(CLASSES); - isLoginButtonDisabled = signal(false); - displayInfo: boolean = - !!this.kcContext?.realm?.password && - !!this.kcContext?.realm?.registrationAllowed && - !this.kcContext?.registrationDisabled; - displayMessage: boolean = !this.kcContext?.messagesPerField?.existsError('username'); -} diff --git a/projects/keycloakify-angular/login/src/pages/login-verify-email/login-verify-email.component.html b/projects/keycloakify-angular/login/src/pages/login-verify-email/login-verify-email.component.html deleted file mode 100644 index f8a9763a..00000000 --- a/projects/keycloakify-angular/login/src/pages/login-verify-email/login-verify-email.component.html +++ /dev/null @@ -1,27 +0,0 @@ -@let url = kcContext.url; -@let user = kcContext.user; - - - {{ 'emailVerifyTitle' | msgStr }} - - -

- {{ 'emailVerifyInstruction2' | msgStr }} -
- {{ 'doClickHere' | msgStr }} -   - {{ 'emailVerifyInstruction3' | msgStr }} -

-
- -

- {{ 'emailVerifyInstruction1' | msgStr: user?.email ?? '' }} -

-
diff --git a/projects/keycloakify-angular/login/src/pages/login-verify-email/login-verify-email.component.ts b/projects/keycloakify-angular/login/src/pages/login-verify-email/login-verify-email.component.ts deleted file mode 100644 index 2bef7420..00000000 --- a/projects/keycloakify-angular/login/src/pages/login-verify-email/login-verify-email.component.ts +++ /dev/null @@ -1,32 +0,0 @@ -import { ChangeDetectionStrategy, Component, forwardRef, inject, input } from '@angular/core'; -import { CLASSES, KC_CONTEXT, USE_DEFAULT_CSS } from 'keycloakify-angular'; -import { ClassKey } from 'keycloakify/login'; -import { KcContext } from 'keycloakify/login/KcContext'; -import { ComponentReference } from '../../classes/component-reference.class'; -import { TemplateComponent } from '../../containers/template.component'; -import { KcClassDirective } from '../../directives'; -import { MsgStrPipe } from '../../pipes/msg-str.pipe'; - -@Component({ - standalone: true, - imports: [KcClassDirective, TemplateComponent, MsgStrPipe], - selector: 'kc-root', - templateUrl: 'login-verify-email.component.html', - changeDetection: ChangeDetectionStrategy.OnPush, - providers: [ - { - provide: ComponentReference, - useExisting: forwardRef(() => LoginVerifyEmailComponent), - }, - ], -}) -export class LoginVerifyEmailComponent extends ComponentReference { - kcContext = inject>(KC_CONTEXT); - override doUseDefaultCss = inject(USE_DEFAULT_CSS); - override classes = inject>>(CLASSES); - displayRequiredFields = input(false); - documentTitle = input(); - bodyClassName = input(); - displayInfo: boolean = true; - displayMessage: boolean = true; -} diff --git a/projects/keycloakify-angular/login/src/pages/login-x509-info/login-x509-info.component.html b/projects/keycloakify-angular/login/src/pages/login-x509-info/login-x509-info.component.html deleted file mode 100644 index d55a6b98..00000000 --- a/projects/keycloakify-angular/login/src/pages/login-x509-info/login-x509-info.component.html +++ /dev/null @@ -1,102 +0,0 @@ -@let url = kcContext.url; -@let x509 = kcContext.x509; - - - {{ 'doLogIn' | msgStr }} - - -
-
-
- -
- @if (x509.formData.subjectDN) { -
- -
- } @else { -
- -
- } -
-
- @if (x509.formData.isUserEnabled) { -
- -
-
- -
- } -
-
-
-
-
-
-
- - @if (x509.formData.isUserEnabled) { - - } -
-
-
-
-
-
diff --git a/projects/keycloakify-angular/login/src/pages/login-x509-info/login-x509-info.component.ts b/projects/keycloakify-angular/login/src/pages/login-x509-info/login-x509-info.component.ts deleted file mode 100644 index 833b8ffc..00000000 --- a/projects/keycloakify-angular/login/src/pages/login-x509-info/login-x509-info.component.ts +++ /dev/null @@ -1,32 +0,0 @@ -import { ChangeDetectionStrategy, Component, forwardRef, inject, input } from '@angular/core'; -import { CLASSES, KC_CONTEXT, USE_DEFAULT_CSS } from 'keycloakify-angular'; -import { ClassKey } from 'keycloakify/login'; -import { KcContext } from 'keycloakify/login/KcContext'; -import { ComponentReference } from '../../classes/component-reference.class'; -import { TemplateComponent } from '../../containers/template.component'; -import { KcClassDirective } from '../../directives'; -import { MsgStrPipe } from '../../pipes/msg-str.pipe'; - -@Component({ - standalone: true, - imports: [TemplateComponent, MsgStrPipe, KcClassDirective], - selector: 'kc-root', - templateUrl: 'login-x509-info.component.html', - changeDetection: ChangeDetectionStrategy.OnPush, - providers: [ - { - provide: ComponentReference, - useExisting: forwardRef(() => LoginX509InfoComponent), - }, - ], -}) -export class LoginX509InfoComponent extends ComponentReference { - kcContext = inject>(KC_CONTEXT); - override doUseDefaultCss = inject(USE_DEFAULT_CSS); - override classes = inject>>(CLASSES); - displayRequiredFields = input(false); - documentTitle = input(); - bodyClassName = input(); - displayInfo: boolean = false; - displayMessage: boolean = false; -} diff --git a/projects/keycloakify-angular/login/src/pages/login/login.component.html b/projects/keycloakify-angular/login/src/pages/login/login.component.html deleted file mode 100644 index 8e2b439b..00000000 --- a/projects/keycloakify-angular/login/src/pages/login/login.component.html +++ /dev/null @@ -1,212 +0,0 @@ -@let realm = kcContext.realm; -@let social = kcContext.social; -@let usernameHidden = kcContext.usernameHidden; -@let auth = kcContext.auth; -@let messagesPerField = kcContext.messagesPerField; -@let url = kcContext.url; -@let login = kcContext.login; - - - - {{ 'loginAccountTitle' | msgStr }} - - -
-
- - {{ 'noAccount' | msgStr }} - - {{ 'doRegister' | msgStr }} - - -
-
-
- - @if (!!realm?.password && !!social?.providers?.length) { -
-
-

{{ 'identity-provider-login-label' | msgStr }}

- -
- } -
- -
-
- - @if (realm?.password) { -
- @if (!usernameHidden) { -
- - - @if (messagesPerField?.existsError('username', 'password')) { - - - } -
- } - -
- - - - - - @if (usernameHidden && messagesPerField?.existsError('username', 'password')) { - - - } -
- -
-
- @if (realm?.rememberMe && !usernameHidden) { -
- -
- } -
- -
- @if (realm?.resetPasswordAllowed) { - - {{ 'doForgotPassword' | msgStr }} - - } -
-
-
- - -
-
- } -
-
-
-
diff --git a/projects/keycloakify-angular/login/src/pages/login/login.component.ts b/projects/keycloakify-angular/login/src/pages/login/login.component.ts deleted file mode 100644 index 6b615d5e..00000000 --- a/projects/keycloakify-angular/login/src/pages/login/login.component.ts +++ /dev/null @@ -1,47 +0,0 @@ -import { AsyncPipe, NgClass } from '@angular/common'; -import { ChangeDetectionStrategy, Component, forwardRef, inject, input, signal } from '@angular/core'; -import { CLASSES, KC_CONTEXT, USE_DEFAULT_CSS } from 'keycloakify-angular'; -import { ClassKey } from 'keycloakify/login'; -import { KcContext } from 'keycloakify/login/KcContext'; -import { ComponentReference } from '../../classes/component-reference.class'; -import { PasswordWrapperComponent } from '../../components/password-wrapper/password-wrapper.component'; -import { TemplateComponent } from '../../containers/template.component'; -import { KcClassDirective } from '../../directives/kc-class.directive'; -import { KcSanitizePipe } from '../../pipes/kc-sanitize.pipe'; -import { MsgStrPipe } from '../../pipes/msg-str.pipe'; - -@Component({ - selector: 'kc-root', - templateUrl: './login.component.html', - standalone: true, - changeDetection: ChangeDetectionStrategy.OnPush, - imports: [ - KcClassDirective, - AsyncPipe, - KcSanitizePipe, - PasswordWrapperComponent, - NgClass, - TemplateComponent, - MsgStrPipe, - ], - providers: [ - { - provide: ComponentReference, - useExisting: forwardRef(() => LoginComponent), - }, - ], -}) -export class LoginComponent extends ComponentReference { - kcContext = inject>(KC_CONTEXT); - displayRequiredFields = input(false); - documentTitle = input(); - bodyClassName = input(); - override doUseDefaultCss = inject(USE_DEFAULT_CSS); - override classes = inject>>(CLASSES); - isLoginButtonDisabled = signal(false); - displayInfo: boolean = - !!this.kcContext?.realm?.password && - !!this.kcContext?.realm?.registrationAllowed && - !this.kcContext?.registrationDisabled; - displayMessage: boolean = !this.kcContext?.messagesPerField?.existsError('username', 'password'); -} diff --git a/projects/keycloakify-angular/login/src/pages/logout-confirm/logout-confirm.component.html b/projects/keycloakify-angular/login/src/pages/logout-confirm/logout-confirm.component.html deleted file mode 100644 index 19342a42..00000000 --- a/projects/keycloakify-angular/login/src/pages/logout-confirm/logout-confirm.component.html +++ /dev/null @@ -1,59 +0,0 @@ -@let url = kcContext.url; -@let logoutConfirm = kcContext.logoutConfirm; -@let client = kcContext.client; - - - - {{ 'logoutConfirmTitle' | msgStr }} - - -
-

{{ 'logoutConfirmHeader' | msgStr }}

-
- -
-
-
-
-
- -
-
-
-
- @if (!logoutConfirm.skipLink && client.baseUrl) { -

- {{ 'backToApplication' | msgStr }} -

- } -
-
-
-
diff --git a/projects/keycloakify-angular/login/src/pages/logout-confirm/logout-confirm.component.ts b/projects/keycloakify-angular/login/src/pages/logout-confirm/logout-confirm.component.ts deleted file mode 100644 index 80a28232..00000000 --- a/projects/keycloakify-angular/login/src/pages/logout-confirm/logout-confirm.component.ts +++ /dev/null @@ -1,32 +0,0 @@ -import { ChangeDetectionStrategy, Component, forwardRef, inject, input } from '@angular/core'; -import { CLASSES, KC_CONTEXT, USE_DEFAULT_CSS } from 'keycloakify-angular'; -import { ClassKey } from 'keycloakify/login'; -import { KcContext } from 'keycloakify/login/KcContext'; -import { ComponentReference } from '../../classes/component-reference.class'; -import { TemplateComponent } from '../../containers/template.component'; -import { KcClassDirective } from '../../directives'; -import { MsgStrPipe } from '../../pipes/msg-str.pipe'; - -@Component({ - standalone: true, - imports: [MsgStrPipe, TemplateComponent, KcClassDirective], - selector: 'kc-root', - templateUrl: 'logout-confirm.component.html', - changeDetection: ChangeDetectionStrategy.OnPush, - providers: [ - { - provide: ComponentReference, - useExisting: forwardRef(() => LogoutConfirmComponent), - }, - ], -}) -export class LogoutConfirmComponent extends ComponentReference { - kcContext = inject>(KC_CONTEXT); - override doUseDefaultCss = inject(USE_DEFAULT_CSS); - override classes = inject>>(CLASSES); - displayRequiredFields = input(false); - documentTitle = input(); - bodyClassName = input(); - displayInfo: boolean = false; - displayMessage: boolean = true; -} diff --git a/projects/keycloakify-angular/login/src/pages/register/register.component.html b/projects/keycloakify-angular/login/src/pages/register/register.component.html deleted file mode 100644 index b2d88674..00000000 --- a/projects/keycloakify-angular/login/src/pages/register/register.component.html +++ /dev/null @@ -1,126 +0,0 @@ -@let messageHeader = kcContext.messageHeader; -@let url = kcContext.url; -@let messagesPerField = kcContext.messagesPerField; -@let recaptchaRequired = kcContext.recaptchaRequired; -@let recaptchaVisible = kcContext.recaptchaVisible; -@let recaptchaSiteKey = kcContext.recaptchaSiteKey; -@let recaptchaAction = kcContext.recaptchaAction; -@let termsAcceptanceRequired = kcContext.termsAcceptanceRequired; - - - - {{ messageHeader ?? 'registerTitle' | advancedMsgStr }} - - -
- - @if (termsAcceptanceRequired) { -
-
- {{ 'termsTitle' | msgStr }} -
- {{ 'termsText' | msgStr }} -
-
-
-
-
- - -
- @if (messagesPerField.existsError('termsAccepted')) { -
- -
- } -
- } - @if (recaptchaRequired && (recaptchaVisible || recaptchaAction === undefined)) { -
-
-
-
-
- } - -
-
-
- - - -
-
- @if (recaptchaRequired && !recaptchaVisible && recaptchaAction !== undefined) { -
- -
- } @else { -
- -
- } -
-
-
-
diff --git a/projects/keycloakify-angular/login/src/pages/register/register.component.ts b/projects/keycloakify-angular/login/src/pages/register/register.component.ts deleted file mode 100644 index 1575fe5a..00000000 --- a/projects/keycloakify-angular/login/src/pages/register/register.component.ts +++ /dev/null @@ -1,51 +0,0 @@ -import { AsyncPipe, NgClass } from '@angular/common'; -import { ChangeDetectionStrategy, Component, forwardRef, inject, input, signal } from '@angular/core'; -import { CLASSES, KC_CONTEXT, USE_DEFAULT_CSS } from 'keycloakify-angular'; -import { ClassKey } from 'keycloakify/login'; -import { KcContext } from 'keycloakify/login/KcContext'; -import { ComponentReference } from '../../classes/component-reference.class'; -import { UserProfileFormFieldsComponent } from '../../components/user-profile-form-fields/user-profile-form-fields.component'; -import { TemplateComponent } from '../../containers/template.component'; -import { KcClassDirective } from '../../directives/kc-class.directive'; -import { AdvancedMsgStrPipe } from '../../pipes/advanced-msg-str.pipe'; -import { KcSanitizePipe } from '../../pipes/kc-sanitize.pipe'; -import { MsgStrPipe } from '../../pipes/msg-str.pipe'; - -@Component({ - selector: 'kc-root', - templateUrl: './register.component.html', - standalone: true, - changeDetection: ChangeDetectionStrategy.OnPush, - imports: [ - KcClassDirective, - AsyncPipe, - KcSanitizePipe, - NgClass, - TemplateComponent, - UserProfileFormFieldsComponent, - MsgStrPipe, - AdvancedMsgStrPipe, - ], - providers: [ - { - provide: ComponentReference, - useExisting: forwardRef(() => RegisterComponent), - }, - ], -}) -export class RegisterComponent extends ComponentReference { - kcContext = inject>(KC_CONTEXT); - displayRequiredFields = input(false); - documentTitle = input(); - bodyClassName = input(); - override doUseDefaultCss = inject(USE_DEFAULT_CSS); - override classes = inject>>(CLASSES); - isFormSubmittable = signal(false); - areTermsAccepted = signal(false); - displayInfo: boolean = false; - displayMessage: boolean = !this.kcContext?.messagesPerField?.existsError('global'); - - onCallback() { - (document.getElementById('kc-register-form') as HTMLFormElement).submit(); - } -} diff --git a/projects/keycloakify-angular/login/src/pages/saml-post-form/saml-post-form.component.html b/projects/keycloakify-angular/login/src/pages/saml-post-form/saml-post-form.component.html deleted file mode 100644 index 6657158d..00000000 --- a/projects/keycloakify-angular/login/src/pages/saml-post-form/saml-post-form.component.html +++ /dev/null @@ -1,51 +0,0 @@ -@let samlPost = kcContext.samlPost; - - - {{ 'saml.post-form.title' | msgStr }} - - -

{{ 'saml.post-form.message' | msgStr }}

-
- @if (!!samlPost.SAMLRequest) { - - } - @if (!!samlPost.SAMLResponse) { - - } - @if (!!samlPost.relayState) { - - } - -
-
- >
diff --git a/projects/keycloakify-angular/login/src/pages/saml-post-form/saml-post-form.component.ts b/projects/keycloakify-angular/login/src/pages/saml-post-form/saml-post-form.component.ts deleted file mode 100644 index c6710939..00000000 --- a/projects/keycloakify-angular/login/src/pages/saml-post-form/saml-post-form.component.ts +++ /dev/null @@ -1,46 +0,0 @@ -import { AfterViewInit, ChangeDetectionStrategy, Component, forwardRef, inject, input, ViewChild } from '@angular/core'; -import { CLASSES, KC_CONTEXT, USE_DEFAULT_CSS } from 'keycloakify-angular'; -import { ClassKey } from 'keycloakify/login'; -import { KcContext } from 'keycloakify/login/KcContext'; -import { ComponentReference } from '../../classes/component-reference.class'; -import { TemplateComponent } from '../../containers/template.component'; -import { MsgStrPipe } from '../../pipes/msg-str.pipe'; - -@Component({ - standalone: true, - imports: [TemplateComponent, MsgStrPipe], - selector: 'kc-root', - templateUrl: 'saml-post-form.component.html', - changeDetection: ChangeDetectionStrategy.OnPush, - providers: [ - { - provide: ComponentReference, - useExisting: forwardRef(() => SamlPostFormComponent), - }, - ], -}) -export class SamlPostFormComponent extends ComponentReference implements AfterViewInit { - kcContext = inject>(KC_CONTEXT); - override doUseDefaultCss = inject(USE_DEFAULT_CSS); - override classes = inject>>(CLASSES); - displayRequiredFields = input(false); - documentTitle = input(); - bodyClassName = input(); - displayInfo: boolean = false; - displayMessage: boolean = true; - @ViewChild('setHtmlFormElement') - htmlFormElement!: HTMLFormElement; - - ngAfterViewInit(): void { - if (this.htmlFormElement === null) { - return; - } - - if (this.kcContext.samlPost.url === '#') { - alert('In a real Keycloak the user would be redirected immediately'); - return; - } - - this.htmlFormElement.submit(); - } -} diff --git a/projects/keycloakify-angular/login/src/pages/select-authenticator/select-authenticator.component.html b/projects/keycloakify-angular/login/src/pages/select-authenticator/select-authenticator.component.html deleted file mode 100644 index bd622be4..00000000 --- a/projects/keycloakify-angular/login/src/pages/select-authenticator/select-authenticator.component.html +++ /dev/null @@ -1,49 +0,0 @@ -@let url = kcContext.url; -@let auth = kcContext.auth; - - - {{ 'loginChooseAuthenticator' | msgStr }} - - -
-
- @for (authenticationSelection of auth.authenticationSelections; track authenticationSelection; let i = $index) { - - } -
-
-
- >
diff --git a/projects/keycloakify-angular/login/src/pages/select-authenticator/select-authenticator.component.ts b/projects/keycloakify-angular/login/src/pages/select-authenticator/select-authenticator.component.ts deleted file mode 100644 index 43f9b596..00000000 --- a/projects/keycloakify-angular/login/src/pages/select-authenticator/select-authenticator.component.ts +++ /dev/null @@ -1,34 +0,0 @@ -import { NgClass } from '@angular/common'; -import { ChangeDetectionStrategy, Component, forwardRef, inject, input } from '@angular/core'; -import { CLASSES, KC_CONTEXT, USE_DEFAULT_CSS } from 'keycloakify-angular'; -import { ClassKey } from 'keycloakify/login'; -import { KcContext } from 'keycloakify/login/KcContext'; -import { ComponentReference } from '../../classes/component-reference.class'; -import { TemplateComponent } from '../../containers/template.component'; -import { KcClassDirective } from '../../directives'; -import { AdvancedMsgStrPipe } from '../../pipes'; -import { MsgStrPipe } from '../../pipes/msg-str.pipe'; - -@Component({ - standalone: true, - imports: [TemplateComponent, MsgStrPipe, AdvancedMsgStrPipe, KcClassDirective, NgClass], - selector: 'kc-root', - templateUrl: 'select-authenticator.component.html', - changeDetection: ChangeDetectionStrategy.OnPush, - providers: [ - { - provide: ComponentReference, - useExisting: forwardRef(() => SelectAuthenticatorComponent), - }, - ], -}) -export class SelectAuthenticatorComponent extends ComponentReference { - kcContext = inject>(KC_CONTEXT); - override doUseDefaultCss = inject(USE_DEFAULT_CSS); - override classes = inject>>(CLASSES); - displayRequiredFields = input(false); - documentTitle = input(); - bodyClassName = input(); - displayInfo: boolean = false; - displayMessage: boolean = false; -} diff --git a/projects/keycloakify-angular/login/src/pages/terms/terms.component.html b/projects/keycloakify-angular/login/src/pages/terms/terms.component.html deleted file mode 100644 index 8aa1d517..00000000 --- a/projects/keycloakify-angular/login/src/pages/terms/terms.component.html +++ /dev/null @@ -1,36 +0,0 @@ -@let url = kcContext.url; - - - {{ 'termsTitle' | msgStr }} - - -
{{ 'termsText' | msgStr }}
-
- - -
-
-
-
diff --git a/projects/keycloakify-angular/login/src/pages/terms/terms.component.ts b/projects/keycloakify-angular/login/src/pages/terms/terms.component.ts deleted file mode 100644 index 9bb82a1c..00000000 --- a/projects/keycloakify-angular/login/src/pages/terms/terms.component.ts +++ /dev/null @@ -1,32 +0,0 @@ -import { ChangeDetectionStrategy, Component, forwardRef, inject, input } from '@angular/core'; -import { CLASSES, KC_CONTEXT, USE_DEFAULT_CSS } from 'keycloakify-angular'; -import { ClassKey } from 'keycloakify/login'; -import { KcContext } from 'keycloakify/login/KcContext'; -import { ComponentReference } from '../../classes/component-reference.class'; -import { TemplateComponent } from '../../containers/template.component'; -import { KcClassDirective } from '../../directives'; -import { MsgStrPipe } from '../../pipes/msg-str.pipe'; - -@Component({ - standalone: true, - imports: [MsgStrPipe, TemplateComponent, KcClassDirective], - selector: 'kc-root', - templateUrl: 'terms.component.html', - changeDetection: ChangeDetectionStrategy.OnPush, - providers: [ - { - provide: ComponentReference, - useExisting: forwardRef(() => TermsComponent), - }, - ], -}) -export class TermsComponent extends ComponentReference { - kcContext = inject>(KC_CONTEXT); - override doUseDefaultCss = inject(USE_DEFAULT_CSS); - override classes = inject>>(CLASSES); - displayRequiredFields = input(false); - documentTitle = input(); - bodyClassName = input(); - displayInfo: boolean = false; - displayMessage: boolean = false; -} diff --git a/projects/keycloakify-angular/login/src/pages/update-email/update-email.component.html b/projects/keycloakify-angular/login/src/pages/update-email/update-email.component.html deleted file mode 100644 index 56526c75..00000000 --- a/projects/keycloakify-angular/login/src/pages/update-email/update-email.component.html +++ /dev/null @@ -1,58 +0,0 @@ -@let url = kcContext.url; -@let isAppInitiatedAction = kcContext.isAppInitiatedAction; - - - {{ 'updateEmailTitle' | msgStr }} - - -
- -
-
-
-
- -
- - @if (isAppInitiatedAction) { - - } -
-
-
-
-
diff --git a/projects/keycloakify-angular/login/src/pages/update-email/update-email.component.ts b/projects/keycloakify-angular/login/src/pages/update-email/update-email.component.ts deleted file mode 100644 index 9a79fa7f..00000000 --- a/projects/keycloakify-angular/login/src/pages/update-email/update-email.component.ts +++ /dev/null @@ -1,41 +0,0 @@ -import { ChangeDetectionStrategy, Component, forwardRef, inject, input, signal } from '@angular/core'; -import { CLASSES, KC_CONTEXT, USE_DEFAULT_CSS } from 'keycloakify-angular'; -import { ClassKey } from 'keycloakify/login'; -import { KcContext } from 'keycloakify/login/KcContext'; -import { ComponentReference } from '../../classes/component-reference.class'; -import { LogoutOtherSessionsComponent } from '../../components/logout-other-sessions/logout-other-sessions.component'; -import { UserProfileFormFieldsComponent } from '../../components/user-profile-form-fields/user-profile-form-fields.component'; -import { TemplateComponent } from '../../containers/template.component'; -import { KcClassDirective } from '../../directives'; -import { MsgStrPipe } from '../../pipes/msg-str.pipe'; - -@Component({ - standalone: true, - imports: [ - TemplateComponent, - MsgStrPipe, - KcClassDirective, - UserProfileFormFieldsComponent, - LogoutOtherSessionsComponent, - ], - selector: 'kc-root', - templateUrl: 'update-email.component.html', - changeDetection: ChangeDetectionStrategy.OnPush, - providers: [ - { - provide: ComponentReference, - useExisting: forwardRef(() => UpdateEmailComponent), - }, - ], -}) -export class UpdateEmailComponent extends ComponentReference { - kcContext = inject>(KC_CONTEXT); - override doUseDefaultCss = inject(USE_DEFAULT_CSS); - override classes = inject>>(CLASSES); - displayRequiredFields = input(true); - documentTitle = input(); - bodyClassName = input(); - displayInfo: boolean = false; - displayMessage: boolean = this.kcContext.messagesPerField.exists('global'); - isFormSubmittable = signal(false); -} diff --git a/projects/keycloakify-angular/login/src/pages/webauthn-authenticate/webauthn-authenticate.component.html b/projects/keycloakify-angular/login/src/pages/webauthn-authenticate/webauthn-authenticate.component.html deleted file mode 100644 index d21f5b33..00000000 --- a/projects/keycloakify-angular/login/src/pages/webauthn-authenticate/webauthn-authenticate.component.html +++ /dev/null @@ -1,162 +0,0 @@ -@let url = kcContext.url; -@let authenticators = kcContext.authenticators; -@let shouldDisplayAuthenticators = kcContext.shouldDisplayAuthenticators; - - - - {{ 'webauthn-login-title' | msgStr }} - - -
- - {{ 'noAccount' | msgStr }} - - {{ 'doRegister' | msgStr }} - - -
-
- -
-
- - - - - - -
- -
- @if (authenticators) { -
- @for (authenticator of authenticators.authenticators; track authenticator.credentialId) { - - } - @if (shouldDisplayAuthenticators) { - @if (authenticators.authenticators.length > 1) { -

{{ 'webauthn-available-authenticators' | msgStr }}

- } -
- @for ( - authenticator of authenticators.authenticators; - track authenticator.credentialId; - let i = $index - ) { -
-
- -
-
- {{ authenticator.label | advancedMsgStr }} -
- @if (authenticator.transports.displayNameProperties?.length) { -
- @for ( - displayNameProperty of authenticator.transports.displayNameProperties; - track displayNameProperty; - let last = $last - ) { - {{ displayNameProperty | advancedMsgStr }} - @if (!last) { - , - } - } -
-
- - {{ 'webauthn-createdAt-label' | msgStr }} - - {{ authenticator.createdAt }} -
-
- } -
-
-
- } -
- } -
- } - -
- -
-
-
-
-
diff --git a/projects/keycloakify-angular/login/src/pages/webauthn-authenticate/webauthn-authenticate.component.ts b/projects/keycloakify-angular/login/src/pages/webauthn-authenticate/webauthn-authenticate.component.ts deleted file mode 100644 index 8ba9a4f0..00000000 --- a/projects/keycloakify-angular/login/src/pages/webauthn-authenticate/webauthn-authenticate.component.ts +++ /dev/null @@ -1,78 +0,0 @@ -import { ChangeDetectionStrategy, Component, forwardRef, inject, input } from '@angular/core'; -import { CLASSES, KC_CONTEXT, Script, USE_DEFAULT_CSS } from 'keycloakify-angular'; -import { ClassKey } from 'keycloakify/login'; -import { KcContext } from 'keycloakify/login/KcContext'; -import { getKcClsx } from 'keycloakify/login/lib/kcClsx'; -import { ComponentReference } from '../../classes/component-reference.class'; -import { LogoutOtherSessionsComponent } from '../../components/logout-other-sessions/logout-other-sessions.component'; -import { TemplateComponent } from '../../containers/template.component'; -import { KcClassDirective } from '../../directives'; -import { AdvancedMsgStrPipe } from '../../pipes/advanced-msg-str.pipe'; -import { MsgStrPipe } from '../../pipes/msg-str.pipe'; -import { LoginResourceInjectorService } from '../../services'; - -@Component({ - standalone: true, - imports: [TemplateComponent, MsgStrPipe, AdvancedMsgStrPipe, KcClassDirective, LogoutOtherSessionsComponent], - selector: 'kc-root', - templateUrl: 'webauthn-authenticate.component.html', - changeDetection: ChangeDetectionStrategy.OnPush, - providers: [ - MsgStrPipe, - { - provide: ComponentReference, - useExisting: forwardRef(() => WebauthnAuthenticateComponent), - }, - ], -}) -export class WebauthnAuthenticateComponent extends ComponentReference { - kcContext = inject>(KC_CONTEXT); - loginResourceInjectorService = inject(LoginResourceInjectorService); - msgStr = inject(MsgStrPipe); - override doUseDefaultCss = inject(USE_DEFAULT_CSS); - override classes = inject>>(CLASSES); - displayRequiredFields = input(false); - documentTitle = input(); - bodyClassName = input(); - displayInfo: boolean = false; - displayMessage: boolean = true; - - authButtonId = 'authenticateWebAuthnButton'; - - constructor() { - super(); - const { url, isUserIdentified, challenge, userVerification, rpId, createTimeout } = this.kcContext; - const scripts: Script[] = [ - { - type: 'module', - id: 'WebAuthnAuthenticateScript', - textContent: ` - import { authenticateByWebAuthn } from "${url.resourcesPath}/js/webauthnAuthenticate.js"; - const authButton = document.getElementById('${this.authButtonId}'); - authButton.addEventListener("click", function() { - const input = { - isUserIdentified : ${isUserIdentified}, - challenge : '${challenge}', - userVerification : '${userVerification}', - rpId : '${rpId}', - createTimeout : ${createTimeout}, - errmsg : ${JSON.stringify(this.msgStr.transform('webauthn-unsupported-browser-text'))} - }; - authenticateByWebAuthn(input); - }); - `, - }, - ]; - this.loginResourceInjectorService.insertAdditionalScripts(scripts); - } - - selectAuthListItemIconClass(iconClass: string) { - const kcClsx = getKcClsx({ doUseDefaultCss: this.doUseDefaultCss ?? true, classes: this.classes }).kcClsx; - // eslint-disable-next-line @typescript-eslint/no-explicit-any - const className = kcClsx(iconClass as any); - if (className === iconClass) { - return kcClsx('kcWebAuthnDefaultIcon'); - } - return className; - } -} diff --git a/projects/keycloakify-angular/login/src/pages/webauthn-error/webauthn-error.component.html b/projects/keycloakify-angular/login/src/pages/webauthn-error/webauthn-error.component.html deleted file mode 100644 index 720404d6..00000000 --- a/projects/keycloakify-angular/login/src/pages/webauthn-error/webauthn-error.component.html +++ /dev/null @@ -1,60 +0,0 @@ -@let url = kcContext.url; -@let isAppInitiatedAction = kcContext.isAppInitiatedAction; - - - - {{ 'webauthn-error-title' | msgStr }} - - -
- - -
- - @if (isAppInitiatedAction) { -
- -
- } -
-
diff --git a/projects/keycloakify-angular/login/src/pages/webauthn-error/webauthn-error.component.ts b/projects/keycloakify-angular/login/src/pages/webauthn-error/webauthn-error.component.ts deleted file mode 100644 index 6a05ab5f..00000000 --- a/projects/keycloakify-angular/login/src/pages/webauthn-error/webauthn-error.component.ts +++ /dev/null @@ -1,42 +0,0 @@ -import { ChangeDetectionStrategy, Component, forwardRef, inject, input } from '@angular/core'; -import { CLASSES, KC_CONTEXT, USE_DEFAULT_CSS } from 'keycloakify-angular'; -import { ClassKey } from 'keycloakify/login'; -import { KcContext } from 'keycloakify/login/KcContext'; -import { ComponentReference } from '../../classes/component-reference.class'; -import { LogoutOtherSessionsComponent } from '../../components/logout-other-sessions/logout-other-sessions.component'; -import { TemplateComponent } from '../../containers/template.component'; -import { KcClassDirective } from '../../directives'; -import { MsgStrPipe } from '../../pipes/msg-str.pipe'; - -@Component({ - standalone: true, - imports: [TemplateComponent, MsgStrPipe, KcClassDirective, LogoutOtherSessionsComponent], - selector: 'kc-root', - templateUrl: 'webauthn-error.component.html', - changeDetection: ChangeDetectionStrategy.OnPush, - providers: [ - { - provide: ComponentReference, - useExisting: forwardRef(() => WebauthnErrorComponent), - }, - ], -}) -export class WebauthnErrorComponent extends ComponentReference { - kcContext = inject>(KC_CONTEXT); - override doUseDefaultCss = inject(USE_DEFAULT_CSS); - override classes = inject>>(CLASSES); - displayRequiredFields = input(false); - documentTitle = input(); - bodyClassName = input(); - displayInfo: boolean = false; - displayMessage: boolean = true; - - onClick() { - // @ts-expect-error: Trusted Keycloak's code - document.getElementById('isSetRetry').value = 'retry'; - // @ts-expect-error: Trusted Keycloak's code - document.getElementById('executionValue').value = '${execution}'; - // @ts-expect-error: Trusted Keycloak's code - document.getElementById('kc-error-credential-form').submit(); - } -} diff --git a/projects/keycloakify-angular/login/src/pages/webauthn-register/webauthn-register.component.html b/projects/keycloakify-angular/login/src/pages/webauthn-register/webauthn-register.component.html deleted file mode 100644 index 78193623..00000000 --- a/projects/keycloakify-angular/login/src/pages/webauthn-register/webauthn-register.component.html +++ /dev/null @@ -1,82 +0,0 @@ -@let url = kcContext.url; -@let isSetRetry = kcContext.isSetRetry; -@let isAppInitiatedAction = kcContext.isAppInitiatedAction; - - - - - {{ 'webauthn-registration-title' | msgStr }} - - -
-
- - - - - - - -
-
- - @if (!isSetRetry && isAppInitiatedAction) { -
- -
- } -
-
diff --git a/projects/keycloakify-angular/login/src/pages/webauthn-register/webauthn-register.component.ts b/projects/keycloakify-angular/login/src/pages/webauthn-register/webauthn-register.component.ts deleted file mode 100644 index c7bc25cd..00000000 --- a/projects/keycloakify-angular/login/src/pages/webauthn-register/webauthn-register.component.ts +++ /dev/null @@ -1,89 +0,0 @@ -import { ChangeDetectionStrategy, Component, forwardRef, inject, input } from '@angular/core'; -import { CLASSES, KC_CONTEXT, Script, USE_DEFAULT_CSS } from 'keycloakify-angular'; -import { ClassKey } from 'keycloakify/login'; -import { KcContext } from 'keycloakify/login/KcContext'; -import { ComponentReference } from '../../classes/component-reference.class'; -import { LogoutOtherSessionsComponent } from '../../components/logout-other-sessions/logout-other-sessions.component'; -import { TemplateComponent } from '../../containers/template.component'; -import { KcClassDirective } from '../../directives'; -import { MsgStrPipe } from '../../pipes/msg-str.pipe'; -import { LoginResourceInjectorService } from '../../services'; - -@Component({ - standalone: true, - imports: [TemplateComponent, MsgStrPipe, KcClassDirective, LogoutOtherSessionsComponent], - selector: 'kc-root', - templateUrl: 'webauthn-register.component.html', - changeDetection: ChangeDetectionStrategy.OnPush, - providers: [ - MsgStrPipe, - { - provide: ComponentReference, - useExisting: forwardRef(() => WebauthnRegisterComponent), - }, - ], -}) -export class WebauthnRegisterComponent extends ComponentReference { - kcContext = inject>(KC_CONTEXT); - loginResourceInjectorService = inject(LoginResourceInjectorService); - msgStr = inject(MsgStrPipe); - override doUseDefaultCss = inject(USE_DEFAULT_CSS); - override classes = inject>>(CLASSES); - displayRequiredFields = input(false); - documentTitle = input(); - bodyClassName = input(); - displayInfo: boolean = false; - displayMessage: boolean = true; - - authButtonId = 'authenticateWebAuthnButton'; - - constructor() { - super(); - const { - url, - challenge, - userid, - username, - signatureAlgorithms, - rpEntityName, - rpId, - attestationConveyancePreference, - authenticatorAttachment, - requireResidentKey, - userVerificationRequirement, - createTimeout, - excludeCredentialIds, - } = this.kcContext; - const scripts: Script[] = [ - { - type: 'module', - id: 'WebAuthnRegisterScript', - textContent: ` - import { registerByWebAuthn } from "${url.resourcesPath}/js/webauthnRegister.js"; - const registerButton = document.getElementById('${this.authButtonId}'); - registerButton.addEventListener("click", function() { - const input = { - challenge : '${challenge}', - userid : '${userid}', - username : '${username}', - signatureAlgorithms : ${JSON.stringify(signatureAlgorithms)}, - rpEntityName : ${JSON.stringify(rpEntityName)}, - rpId : ${JSON.stringify(rpId)}, - attestationConveyancePreference : ${JSON.stringify(attestationConveyancePreference)}, - authenticatorAttachment : ${JSON.stringify(authenticatorAttachment)}, - requireResidentKey : ${JSON.stringify(requireResidentKey)}, - userVerificationRequirement : ${JSON.stringify(userVerificationRequirement)}, - createTimeout : ${createTimeout}, - excludeCredentialIds : ${JSON.stringify(excludeCredentialIds)}, - initLabel : ${JSON.stringify(this.msgStr.transform('webauthn-registration-init-label'))}, - initLabelPrompt : ${JSON.stringify(this.msgStr.transform('webauthn-registration-init-label-prompt'))}, - errmsg : ${JSON.stringify(this.msgStr.transform('webauthn-unsupported-browser-text'))} - }; - registerByWebAuthn(input); - }); - `, - }, - ]; - this.loginResourceInjectorService.insertAdditionalScripts(scripts); - } -} diff --git a/projects/keycloakify-angular/login/src/pipes/advanced-msg-str.pipe.ts b/projects/keycloakify-angular/login/src/pipes/advanced-msg-str.pipe.ts deleted file mode 100644 index ae0a4d0a..00000000 --- a/projects/keycloakify-angular/login/src/pipes/advanced-msg-str.pipe.ts +++ /dev/null @@ -1,13 +0,0 @@ -import { inject, Pipe, PipeTransform } from '@angular/core'; -import { I18N } from 'keycloakify-angular'; -import { I18n } from 'keycloakify/login/i18n'; -@Pipe({ - name: 'advancedMsgStr', - standalone: true, -}) -export class AdvancedMsgStrPipe implements PipeTransform { - readonly #i18n = inject(I18N); - transform(value: string, ...args: (string | undefined)[]): string { - return this.#i18n.advancedMsgStr(value, ...args); - } -} diff --git a/projects/keycloakify-angular/login/src/pipes/index.ts b/projects/keycloakify-angular/login/src/pipes/index.ts deleted file mode 100644 index e5a9aa7f..00000000 --- a/projects/keycloakify-angular/login/src/pipes/index.ts +++ /dev/null @@ -1,6 +0,0 @@ -export * from './advanced-msg-str.pipe'; -export * from './input-type.pipe'; -export * from './kc-sanitize.pipe'; -export * from './msg-str.pipe'; -export * from './to-array.pipe'; -export * from './to-number.pipe'; diff --git a/projects/keycloakify-angular/login/src/pipes/input-type.pipe.ts b/projects/keycloakify-angular/login/src/pipes/input-type.pipe.ts deleted file mode 100644 index 1fa09f09..00000000 --- a/projects/keycloakify-angular/login/src/pipes/input-type.pipe.ts +++ /dev/null @@ -1,15 +0,0 @@ -import { Pipe, PipeTransform } from '@angular/core'; - -@Pipe({ - name: 'inputType', - standalone: true, -}) -export class InputTypePipe implements PipeTransform { - transform(inputType?: string): string { - if (inputType?.startsWith('html5-')) { - return inputType.slice(6); - } - - return inputType ?? 'text'; - } -} diff --git a/projects/keycloakify-angular/login/src/pipes/kc-sanitize.pipe.ts b/projects/keycloakify-angular/login/src/pipes/kc-sanitize.pipe.ts deleted file mode 100644 index bf940b5f..00000000 --- a/projects/keycloakify-angular/login/src/pipes/kc-sanitize.pipe.ts +++ /dev/null @@ -1,29 +0,0 @@ -import { Pipe, PipeTransform } from '@angular/core'; -import { DomSanitizer, SafeHtml, SafeResourceUrl, SafeScript, SafeStyle, SafeUrl } from '@angular/platform-browser'; - -@Pipe({ name: 'kcSanitize', standalone: true }) -export class KcSanitizePipe implements PipeTransform { - constructor(private sanitizer: DomSanitizer) {} - // TODO: Fix typing - - transform( - // eslint-disable-next-line @typescript-eslint/no-explicit-any - value: any, - type: string, - ): SafeHtml | SafeStyle | SafeScript | SafeUrl | SafeResourceUrl { - switch (type) { - case 'html': - return this.sanitizer.bypassSecurityTrustHtml(value); - case 'style': - return this.sanitizer.bypassSecurityTrustStyle(value); - case 'script': - return this.sanitizer.bypassSecurityTrustScript(value); - case 'url': - return this.sanitizer.bypassSecurityTrustUrl(value); - case 'resourceUrl': - return this.sanitizer.bypassSecurityTrustResourceUrl(value); - default: - throw new Error(`Invalid safe type specified: ${type}`); - } - } -} diff --git a/projects/keycloakify-angular/login/src/pipes/msg-str.pipe.ts b/projects/keycloakify-angular/login/src/pipes/msg-str.pipe.ts deleted file mode 100644 index 04d9e3b6..00000000 --- a/projects/keycloakify-angular/login/src/pipes/msg-str.pipe.ts +++ /dev/null @@ -1,14 +0,0 @@ -import { inject, Pipe, PipeTransform } from '@angular/core'; -import { I18N } from 'keycloakify-angular'; -import { I18n } from 'keycloakify/login/i18n'; -import { MessageKey } from 'keycloakify/login/i18n/messages_defaultSet/types'; -@Pipe({ - name: 'msgStr', - standalone: true, -}) -export class MsgStrPipe implements PipeTransform { - readonly #i18n = inject(I18N); - transform(value: MessageKey, ...args: (string | undefined)[]): string { - return this.#i18n.msgStr(value, ...args); - } -} diff --git a/projects/keycloakify-angular/login/src/pipes/to-array.pipe.ts b/projects/keycloakify-angular/login/src/pipes/to-array.pipe.ts deleted file mode 100644 index 76a28455..00000000 --- a/projects/keycloakify-angular/login/src/pipes/to-array.pipe.ts +++ /dev/null @@ -1,15 +0,0 @@ -import { Pipe, PipeTransform } from '@angular/core'; - -@Pipe({ - name: 'toArray', - standalone: true, -}) -export class ToArrayPipe implements PipeTransform { - transform(value: string | string[], emptyWhenString = false): string[] { - // if (!value) throw new Error('must pass a value'); - if (value instanceof Array) { - return value; - } - return emptyWhenString ? [] : [value]; - } -} diff --git a/projects/keycloakify-angular/login/src/pipes/to-number.pipe.ts b/projects/keycloakify-angular/login/src/pipes/to-number.pipe.ts deleted file mode 100644 index 8f6fd952..00000000 --- a/projects/keycloakify-angular/login/src/pipes/to-number.pipe.ts +++ /dev/null @@ -1,13 +0,0 @@ -import { Pipe, PipeTransform } from '@angular/core'; - -@Pipe({ - name: 'toNumber', - standalone: true, -}) -export class ToNumberPipe implements PipeTransform { - transform(value: string | number): number { - const number = parseInt(`${value}`); - if (isNaN(number)) throw new Error('number is NaN'); - return number; - } -} diff --git a/projects/keycloakify-angular/login/src/services/index.ts b/projects/keycloakify-angular/login/src/services/index.ts deleted file mode 100644 index 0f434f6c..00000000 --- a/projects/keycloakify-angular/login/src/services/index.ts +++ /dev/null @@ -1,2 +0,0 @@ -export * from './login-resource-injector.service'; -export * from './user-profile-form.service'; diff --git a/projects/keycloakify-angular/login/src/services/login-resource-injector.service.ts b/projects/keycloakify-angular/login/src/services/login-resource-injector.service.ts deleted file mode 100644 index 3b027a80..00000000 --- a/projects/keycloakify-angular/login/src/services/login-resource-injector.service.ts +++ /dev/null @@ -1,67 +0,0 @@ -import { inject, Injectable } from '@angular/core'; -import { KC_CONTEXT, ResourceInjectorService, Script } from 'keycloakify-angular'; -import { KcContext } from 'keycloakify/login/KcContext'; -import { catchError, forkJoin, of, switchMap } from 'rxjs'; - -@Injectable({ - providedIn: 'root', -}) -export class LoginResourceInjectorService { - private kcContext: KcContext = inject(KC_CONTEXT); - private resourceInjectorService: ResourceInjectorService = inject(ResourceInjectorService); - - injectResource(doUseDefaultCss = true) { - if (!doUseDefaultCss) { - this.injectScripts(); - return of(true); - } - const stylesheets = [ - `${this.kcContext.url.resourcesCommonPath}/node_modules/@patternfly/patternfly/patternfly.min.css`, - `${this.kcContext.url.resourcesCommonPath}/node_modules/patternfly/dist/css/patternfly.min.css`, - `${this.kcContext.url.resourcesCommonPath}/node_modules/patternfly/dist/css/patternfly-additions.min.css`, - `${this.kcContext.url.resourcesCommonPath}/lib/pficon/pficon.css`, - `${this.kcContext.url.resourcesPath}/css/login.css`, - ]; - - return forkJoin(stylesheets.map((url) => this.resourceInjectorService.createLink(url))).pipe( - switchMap(() => { - this.injectScripts(); - return of(true); - }), - catchError((error) => { - console.error('Error loading styles:', error); - return of(false); - }), - ); - } - - insertAdditionalScripts(scripts: Script[]) { - scripts.map((script) => this.resourceInjectorService.createScript(script)); - } - - private injectScripts() { - const scripts: Script[] = [ - { - type: 'module', - id: `${this.kcContext.url.resourcesPath}/js/menu-button-links.js`, - src: `${this.kcContext.url.resourcesPath}/js/menu-button-links.js`, - }, - ...this.kcContext.scripts.map((script) => ({ - type: 'text/javascript', - src: script, - id: script, - })), - { - type: 'module', - id: 'authenticationSession', - textContent: ` - import { checkCookiesAndSetTimer } from "${this.kcContext.url.resourcesPath}/js/authChecker.js"; - - checkCookiesAndSetTimer( - "${this.kcContext.url.ssoLoginInOtherTabsUrl}" - );`, - }, - ]; - this.insertAdditionalScripts(scripts); - } -} diff --git a/projects/keycloakify-angular/login/src/services/user-profile-form.service.ts b/projects/keycloakify-angular/login/src/services/user-profile-form.service.ts deleted file mode 100644 index 4eac7193..00000000 --- a/projects/keycloakify-angular/login/src/services/user-profile-form.service.ts +++ /dev/null @@ -1,1361 +0,0 @@ -/* eslint-disable @typescript-eslint/no-explicit-any */ -/* eslint-disable @typescript-eslint/ban-ts-comment */ - -import { computed, inject, Injectable, signal, Signal, WritableSignal } from '@angular/core'; -import { DomSanitizer, SafeHtml } from '@angular/platform-browser'; -import { DO_MAKE_USER_CONFIRM_PASSWORD, I18N, KC_CONTEXT } from 'keycloakify-angular'; -import { Attribute, KcContext, PasswordPolicies, Validators } from 'keycloakify/login/KcContext'; -import type { I18n, KcContextLike as KcContextLike_i18n, MessageKey_defaultSet } from 'keycloakify/login/i18n'; -import { emailRegexp } from 'keycloakify/tools/emailRegExp'; -import { formatNumber } from 'keycloakify/tools/formatNumber'; -import { structuredCloneButFunctions } from 'keycloakify/tools/structuredCloneButFunctions'; -import { assert, id } from 'tsafe'; -import { LoginResourceInjectorService } from './login-resource-injector.service'; - -type KcContextLike_useGetErrors = KcContextLike_i18n & { - messagesPerField: Pick; - passwordPolicies?: PasswordPolicies; -}; -export namespace FormFieldError { - export type Source = Source.Validator | Source.PasswordPolicy | Source.Server | Source.Other; - - export namespace Source { - export type Validator = { - type: 'validator'; - name: keyof Validators; - }; - export type PasswordPolicy = { - type: 'passwordPolicy'; - name: keyof PasswordPolicies; - }; - export type Server = { - type: 'server'; - }; - - export type Other = { - type: 'other'; - rule: 'passwordConfirmMatchesPassword' | 'requiredField'; - }; - } -} - -export type KcContextLike = KcContextLike_i18n & - KcContextLike_useGetErrors & { - profile: { - attributesByName: Record; - html5DataAnnotations?: Record; - }; - passwordRequired?: boolean; - realm: { registrationEmailAsUsername: boolean }; - url: { - resourcesPath: string; - }; - }; -export type FormFieldError = { - errorMessage: SafeHtml; // this was jsx, be carefull - errorMessageStr: string; - source: FormFieldError.Source; - fieldIndex: number | undefined; -}; -namespace internal { - export type FormFieldState = { - attribute: Attribute; - errors: FormFieldError[]; - hasLostFocusAtLeastOnce: boolean | boolean[]; - valueOrValues: string | string[]; - }; - - export type State = { - formFieldStates: FormFieldState[]; - }; -} -type FormFieldState = { - attribute: Attribute; - displayableErrors: FormFieldError[]; - valueOrValues: string | string[]; -}; -type FormState = { - isFormSubmittable: boolean; - formFieldStates: FormFieldState[]; -}; -export type FormAction = - | { - action: 'update'; - name: string; - valueOrValues: string | string[]; - /** Default false */ - displayErrorsImmediately?: boolean; - } - | { - action: 'focus lost'; - name: string; - fieldIndex: number | undefined; - }; - -@Injectable({ providedIn: 'root' }) -export class UserProfileFormService { - private kcContext: KcContextLike = inject>(KC_CONTEXT); - private i18n = inject(I18N); - private doMakeUserConfirmPassword = inject(DO_MAKE_USER_CONFIRM_PASSWORD); - private loginResourceInjectorService = inject(LoginResourceInjectorService); - private sanitizer: DomSanitizer = inject(DomSanitizer); - private initialState: internal.State = (() => { - const attributes: Attribute[] = (() => { - mock_user_profile_attributes_for_older_keycloak_versions: { - if ( - 'profile' in this.kcContext && - 'attributesByName' in this.kcContext.profile && - Object.keys(this.kcContext.profile.attributesByName).length !== 0 - ) { - break mock_user_profile_attributes_for_older_keycloak_versions; - } - - if ( - 'register' in this.kcContext && - this.kcContext.register instanceof Object && - 'formData' in this.kcContext.register - ) { - //NOTE: Handle legacy register.ftl page - return (['firstName', 'lastName', 'email', 'username'] as const) - .filter((name) => (name !== 'username' ? true : !this.kcContext.realm.registrationEmailAsUsername)) - .map((name) => - id({ - name: name, - displayName: id<`\${${MessageKey_defaultSet}}`>(`\${${name}}`), - required: true, - value: (this.kcContext as any).register.formData[name] ?? '', - html5DataAnnotations: {}, - readOnly: false, - validators: {}, - annotations: {}, - autocomplete: (() => { - switch (name) { - case 'email': - return 'email'; - case 'username': - return 'username'; - default: - return undefined; - } - })(), - }), - ); - } - - if ('user' in this.kcContext && this.kcContext.user instanceof Object) { - //NOTE: Handle legacy login-update-profile.ftl - return (['username', 'email', 'firstName', 'lastName'] as const) - .filter((name) => (name !== 'username' ? true : (this.kcContext as any).user.editUsernameAllowed)) - .map((name) => - id({ - name: name, - displayName: id<`\${${MessageKey_defaultSet}}`>(`\${${name}}`), - required: true, - value: (this.kcContext as any).user[name] ?? '', - html5DataAnnotations: {}, - readOnly: false, - validators: {}, - annotations: {}, - autocomplete: (() => { - switch (name) { - case 'email': - return 'email'; - case 'username': - return 'username'; - default: - return undefined; - } - })(), - }), - ); - } - - if ('email' in this.kcContext && this.kcContext.email instanceof Object) { - //NOTE: Handle legacy update-email.ftl - return [ - id({ - name: 'email', - displayName: id<`\${${MessageKey_defaultSet}}`>(`\${email}`), - required: true, - value: (this.kcContext.email as any).value ?? '', - html5DataAnnotations: {}, - readOnly: false, - validators: {}, - annotations: {}, - autocomplete: 'email', - }), - ]; - } - - assert(false, 'Unable to mock user profile from the current kcContext'); - } - - return Object.values(this.kcContext.profile.attributesByName).map(structuredCloneButFunctions); - })(); - // Retro-compatibility and consistency patches - attributes.forEach((attribute) => { - patch_legacy_group: { - if (typeof attribute.group !== 'string') { - break patch_legacy_group; - } - - const { group, groupDisplayHeader, groupDisplayDescription, groupAnnotations } = attribute as Attribute & { - group: string; - groupDisplayHeader?: string; - groupDisplayDescription?: string; - groupAnnotations: Record; - }; - - delete attribute.group; - // @ts-expect-error - delete attribute.groupDisplayHeader; - // @ts-expect-error - delete attribute.groupDisplayDescription; - // @ts-expect-error - delete attribute.groupAnnotations; - - if (group === '') { - break patch_legacy_group; - } - - attribute.group = { - name: group, - displayHeader: groupDisplayHeader, - displayDescription: groupDisplayDescription, - annotations: groupAnnotations, - html5DataAnnotations: {}, - }; - } - - // Attributes with options rendered by default as select inputs - if (attribute.validators.options !== undefined && attribute.annotations.inputType === undefined) { - attribute.annotations.inputType = 'select'; - } - - // Consistency patch on values/value property - { - if (this.getIsMultivaluedSingleField({ attribute })) { - attribute.multivalued = true; - } - - if (attribute.multivalued) { - attribute.values ??= attribute.value !== undefined ? [attribute.value] : []; - delete attribute.value; - } else { - attribute.value ??= attribute.values?.[0]; - delete attribute.values; - } - } - }); - add_password_and_password_confirm: { - if (!this.kcContext.passwordRequired) { - break add_password_and_password_confirm; - } - - attributes.forEach((attribute, i) => { - if (attribute.name !== (this.kcContext.realm.registrationEmailAsUsername ? 'email' : 'username')) { - // NOTE: We want to add password and password-confirm after the field that identifies the user. - // It's either email or username. - return; - } - - attributes.splice( - i + 1, - 0, - { - name: 'password', - displayName: id<`\${${MessageKey_defaultSet}}`>('${password}'), - required: true, - readOnly: false, - validators: {}, - annotations: {}, - autocomplete: 'new-password', - html5DataAnnotations: {}, - }, - { - name: 'password-confirm', - displayName: id<`\${${MessageKey_defaultSet}}`>('${passwordConfirm}'), - required: true, - readOnly: false, - validators: {}, - annotations: {}, - html5DataAnnotations: {}, - autocomplete: 'new-password', - }, - ); - }); - } - const initialFormFieldState: { - attribute: Attribute; - valueOrValues: string | string[]; - }[] = []; - - for (const attribute of attributes) { - handle_multi_valued_attribute: { - if (!attribute.multivalued) { - break handle_multi_valued_attribute; - } - - const values = attribute.values?.length ? attribute.values : ['']; - - apply_validator_min_range: { - if (this.getIsMultivaluedSingleField({ attribute })) { - break apply_validator_min_range; - } - - const validator = attribute.validators.multivalued; - - if (validator === undefined) { - break apply_validator_min_range; - } - - const { min: minStr } = validator; - - if (!minStr) { - break apply_validator_min_range; - } - - const min = parseInt(`${minStr}`); - - for (let index = values.length; index < min; index++) { - values.push(''); - } - } - - initialFormFieldState.push({ - attribute, - valueOrValues: values, - }); - - continue; - } - - initialFormFieldState.push({ - attribute, - valueOrValues: attribute.value ?? '', - }); - } - - const initialState: internal.State = { - formFieldStates: initialFormFieldState.map(({ attribute, valueOrValues }) => ({ - attribute, - errors: this.getErrors({ - attributeName: attribute.name, - formFieldStates: initialFormFieldState, - }), - hasLostFocusAtLeastOnce: - valueOrValues instanceof Array && !this.getIsMultivaluedSingleField({ attribute }) - ? valueOrValues.map(() => false) - : false, - valueOrValues: valueOrValues, - })), - }; - return initialState; - })(); - - private state: WritableSignal = signal(this.initialState); - - formState: Signal = computed(() => { - const state: internal.State = this.state(); - return { - formFieldStates: state.formFieldStates.map( - ({ errors, hasLostFocusAtLeastOnce: hasLostFocusAtLeastOnceOrArr, attribute, ...valueOrValuesWrap }) => ({ - displayableErrors: errors.filter((error) => { - const hasLostFocusAtLeastOnce = - typeof hasLostFocusAtLeastOnceOrArr === 'boolean' - ? hasLostFocusAtLeastOnceOrArr - : error.fieldIndex !== undefined - ? hasLostFocusAtLeastOnceOrArr[error.fieldIndex] - : hasLostFocusAtLeastOnceOrArr[hasLostFocusAtLeastOnceOrArr.length - 1]; - let value = false; - switch (error.source.type) { - case 'server': - value = true; - break; - case 'other': - switch (error.source.rule) { - case 'requiredField': - value = hasLostFocusAtLeastOnce; - break; - case 'passwordConfirmMatchesPassword': - value = hasLostFocusAtLeastOnce; - break; - } - // assert>(false); - break; - case 'passwordPolicy': - switch (error.source.name) { - case 'length': - value = hasLostFocusAtLeastOnce; - break; - case 'digits': - value = hasLostFocusAtLeastOnce; - break; - case 'lowerCase': - value = hasLostFocusAtLeastOnce; - break; - case 'upperCase': - value = hasLostFocusAtLeastOnce; - break; - case 'specialChars': - value = hasLostFocusAtLeastOnce; - break; - case 'notUsername': - value = true; - break; - case 'notEmail': - value = true; - break; - } - // assert>(false); - break; - case 'validator': - switch (error.source.name) { - case 'length': - value = hasLostFocusAtLeastOnce; - break; - case 'pattern': - value = hasLostFocusAtLeastOnce; - break; - case 'email': - value = hasLostFocusAtLeastOnce; - break; - case 'integer': - value = hasLostFocusAtLeastOnce; - break; - case 'multivalued': - value = hasLostFocusAtLeastOnce; - break; - case 'options': - value = hasLostFocusAtLeastOnce; - break; - } - // assert>(false); - break; - } - return value; - }), - attribute, - ...valueOrValuesWrap, - }), - ), - isFormSubmittable: state.formFieldStates.every(({ errors }) => errors.length === 0), - }; - }); - - constructor() { - this.loginResourceInjectorService.insertAdditionalScripts( - Object.keys(this.kcContext.profile?.html5DataAnnotations ?? {}) - .filter((key) => key !== 'kcMultivalued' && key !== 'kcNumberFormat') // NOTE: Keycloakify handles it. - .map((key) => ({ - type: 'module', - src: `${this.kcContext.url.resourcesPath}/js/${key}.js`, - id: `${this.kcContext.url.resourcesPath}/js/${key}.js`, - })), - ); - } - - public dispatchFormAction(formAction: FormAction) { - if (!formAction) return; - const state = this.state(); - const formFieldState = state.formFieldStates.find(({ attribute }) => attribute.name === formAction.name); - assert(formFieldState !== undefined); - switch (formAction.action) { - case 'update': - formFieldState.valueOrValues = formAction.valueOrValues; - - apply_formatters: { - const { attribute } = formFieldState; - - const { kcNumberFormat } = attribute.html5DataAnnotations ?? {}; - - if (!kcNumberFormat) { - break apply_formatters; - } - - if (formFieldState.valueOrValues instanceof Array) { - formFieldState.valueOrValues = formFieldState.valueOrValues.map((value) => - formatNumber(value, kcNumberFormat), - ); - } else { - formFieldState.valueOrValues = formatNumber(formFieldState.valueOrValues, kcNumberFormat); - } - } - - formFieldState.errors = this.getErrors({ - attributeName: formAction.name, - formFieldStates: state.formFieldStates, - }); - - simulate_focus_lost: { - const { displayErrorsImmediately = false } = formAction; - - if (!displayErrorsImmediately) { - break simulate_focus_lost; - } - - for (const fieldIndex of formAction.valueOrValues instanceof Array - ? formAction.valueOrValues.map((...[, index]) => index) - : [undefined]) { - this.dispatchFormAction({ - action: 'focus lost', - name: formAction.name, - fieldIndex, - }); - } - } - - update_password_confirm: { - if (this.doMakeUserConfirmPassword) { - break update_password_confirm; - } - - if (formAction.name !== 'password') { - break update_password_confirm; - } - - this.dispatchFormAction({ - action: 'update', - name: 'password-confirm', - valueOrValues: formAction.valueOrValues, - displayErrorsImmediately: formAction.displayErrorsImmediately, - }); - } - - trigger_password_confirm_validation_on_password_change: { - if (!this.doMakeUserConfirmPassword) { - break trigger_password_confirm_validation_on_password_change; - } - - if (formAction.name !== 'password') { - break trigger_password_confirm_validation_on_password_change; - } - - this.dispatchFormAction({ - action: 'update', - name: 'password-confirm', - valueOrValues: (() => { - const formFieldState = state.formFieldStates.find( - ({ attribute }) => attribute.name === 'password-confirm', - ); - - assert(formFieldState !== undefined); - - return formFieldState.valueOrValues; - })(), - displayErrorsImmediately: formAction.displayErrorsImmediately, - }); - } - - break; - case 'focus lost': - if (formFieldState.hasLostFocusAtLeastOnce instanceof Array) { - const { fieldIndex } = formAction; - assert(fieldIndex !== undefined); - formFieldState.hasLostFocusAtLeastOnce[fieldIndex] = true; - break; - } - - formFieldState.hasLostFocusAtLeastOnce = true; - break; - } - this.state.update((state) => ({ - ...state, - formFieldStates: state.formFieldStates.map((f) => { - if (f.attribute === formFieldState.attribute) return formFieldState; - return f; - }), - })); - } - - private getIsMultivaluedSingleField(params: { attribute: Attribute }) { - const { attribute } = params; - - return attribute.annotations.inputType?.startsWith('multiselect') ?? false; - } - - private getErrors(params: { - attributeName: string; - formFieldStates: { - attribute: Attribute; - valueOrValues: string | string[]; - }[]; - }): FormFieldError[] { - const { messagesPerField, passwordPolicies } = this.kcContext; - - const { msgStr, advancedMsgStr } = this.i18n; - const { attributeName, formFieldStates } = params; - - const formFieldState = formFieldStates.find(({ attribute }) => attribute.name === attributeName); - - assert(formFieldState !== undefined); - - const { attribute } = formFieldState; - - const valueOrValues = (() => { - let { valueOrValues } = formFieldState; - - unFormat_number: { - const { kcNumberUnFormat } = attribute.html5DataAnnotations ?? {}; - - if (!kcNumberUnFormat) { - break unFormat_number; - } - - if (valueOrValues instanceof Array) { - valueOrValues = valueOrValues.map((value) => formatNumber(value, kcNumberUnFormat)); - } else { - valueOrValues = formatNumber(valueOrValues, kcNumberUnFormat); - } - } - - return valueOrValues; - })(); - - assert(attribute !== undefined); - - server_side_error: { - if (attribute.multivalued) { - const defaultValues = attribute.values?.length ? attribute.values : ['']; - - assert(valueOrValues instanceof Array); - - const values = valueOrValues; - - if (JSON.stringify(defaultValues) !== JSON.stringify(values.slice(0, defaultValues.length))) { - break server_side_error; - } - } else { - const defaultValue = attribute.value ?? ''; - - assert(typeof valueOrValues === 'string'); - - const value = valueOrValues; - - if (defaultValue !== value) { - break server_side_error; - } - } - - let doesErrorExist: boolean; - - try { - doesErrorExist = messagesPerField.existsError(attributeName); - } catch { - break server_side_error; - } - - if (!doesErrorExist) { - break server_side_error; - } - - const errorMessageStr = messagesPerField.get(attributeName); - - return [ - { - errorMessageStr, - errorMessage: this.sanitizer.bypassSecurityTrustHtml(`${errorMessageStr}`), - fieldIndex: undefined, - source: { - type: 'server', - }, - }, - ]; - } - - handle_multi_valued_multi_fields: { - if (!attribute.multivalued) { - break handle_multi_valued_multi_fields; - } - - if (this.getIsMultivaluedSingleField({ attribute })) { - break handle_multi_valued_multi_fields; - } - - assert(valueOrValues instanceof Array); - - const values = valueOrValues; - - const errors = values - .map((...[, index]) => { - const specificValueErrors = this.getErrors({ - attributeName, - formFieldStates: formFieldStates.map((formFieldState) => { - if (formFieldState.attribute.name === attributeName) { - assert(formFieldState.valueOrValues instanceof Array); - return { - attribute: { - ...attribute, - annotations: { - ...attribute.annotations, - inputType: undefined, - }, - multivalued: false, - }, - valueOrValues: formFieldState.valueOrValues[index], - }; - } - - return formFieldState; - }), - }); - - return specificValueErrors - .filter((error) => { - if (error.source.type === 'other' && error.source.rule === 'requiredField') { - return false; - } - - return true; - }) - .map( - (error): FormFieldError => ({ - ...error, - fieldIndex: index, - }), - ); - }) - .reduce((acc, errors) => [...acc, ...errors], []); - - required_field: { - if (!attribute.required) { - break required_field; - } - - if (values.every((value) => value !== '')) { - break required_field; - } - - const msgArgs = ['error-user-attribute-required'] as const; - - errors.push({ - errorMessage: this.sanitizer.bypassSecurityTrustHtml( - `${msgStr(...msgArgs)}`, - ), - errorMessageStr: msgStr(...msgArgs), - fieldIndex: undefined, - source: { - type: 'other', - rule: 'requiredField', - }, - }); - } - - return errors; - } - - handle_multi_valued_single_field: { - if (!attribute.multivalued) { - break handle_multi_valued_single_field; - } - - if (!this.getIsMultivaluedSingleField({ attribute })) { - break handle_multi_valued_single_field; - } - - const validatorName = 'multivalued'; - - const validator = attribute.validators[validatorName]; - - if (validator === undefined) { - return []; - } - - const { min: minStr } = validator; - - const min = minStr ? parseInt(`${minStr}`) : attribute.required ? 1 : 0; - - assert(!isNaN(min)); - - const { max: maxStr } = validator; - - const max = !maxStr ? Infinity : parseInt(`${maxStr}`); - - assert(!isNaN(max)); - - assert(valueOrValues instanceof Array); - - const values = valueOrValues; - - if (min <= values.length && values.length <= max) { - return []; - } - - const msgArgs = ['error-invalid-multivalued-size', `${min}`, `${max}`] as const; - - return [ - { - errorMessage: this.sanitizer.bypassSecurityTrustHtml(`${msgStr(...msgArgs)}`), - errorMessageStr: msgStr(...msgArgs), - fieldIndex: undefined, - source: { - type: 'validator', - name: validatorName, - }, - }, - ]; - } - - assert(typeof valueOrValues === 'string'); - - const value = valueOrValues; - - const errors: FormFieldError[] = []; - - check_password_policies: { - if (attributeName !== 'password') { - break check_password_policies; - } - - if (passwordPolicies === undefined) { - break check_password_policies; - } - - check_password_policy_x: { - const policyName = 'length'; - - const policy = passwordPolicies[policyName]; - - if (!policy) { - break check_password_policy_x; - } - - const minLength = policy; - - if (value.length >= minLength) { - break check_password_policy_x; - } - - const msgArgs = ['invalidPasswordMinLengthMessage', `${minLength}`] as const; - - errors.push({ - errorMessage: this.sanitizer.bypassSecurityTrustHtml( - `${msgStr(...msgArgs)}`, - ), - errorMessageStr: msgStr(...msgArgs), - fieldIndex: undefined, - source: { - type: 'passwordPolicy', - name: policyName, - }, - }); - } - - check_password_policy_x: { - const policyName = 'digits'; - - const policy = passwordPolicies[policyName]; - - if (!policy) { - break check_password_policy_x; - } - - const minNumberOfDigits = policy; - - if (value.split('').filter((char) => !isNaN(parseInt(char))).length >= minNumberOfDigits) { - break check_password_policy_x; - } - - const msgArgs = ['invalidPasswordMinDigitsMessage', `${minNumberOfDigits}`] as const; - - errors.push({ - errorMessage: this.sanitizer.bypassSecurityTrustHtml( - `${msgStr(...msgArgs)}`, - ), - errorMessageStr: msgStr(...msgArgs), - fieldIndex: undefined, - source: { - type: 'passwordPolicy', - name: policyName, - }, - }); - } - - check_password_policy_x: { - const policyName = 'lowerCase'; - - const policy = passwordPolicies[policyName]; - - if (!policy) { - break check_password_policy_x; - } - - const minNumberOfLowerCaseChar = policy; - - if ( - value.split('').filter((char) => char === char.toLowerCase() && char !== char.toUpperCase()).length >= - minNumberOfLowerCaseChar - ) { - break check_password_policy_x; - } - - const msgArgs = ['invalidPasswordMinLowerCaseCharsMessage', `${minNumberOfLowerCaseChar}`] as const; - - errors.push({ - errorMessage: this.sanitizer.bypassSecurityTrustHtml( - `${msgStr(...msgArgs)}`, - ), - errorMessageStr: msgStr(...msgArgs), - fieldIndex: undefined, - source: { - type: 'passwordPolicy', - name: policyName, - }, - }); - } - - check_password_policy_x: { - const policyName = 'upperCase'; - - const policy = passwordPolicies[policyName]; - - if (!policy) { - break check_password_policy_x; - } - - const minNumberOfUpperCaseChar = policy; - - if ( - value.split('').filter((char) => char === char.toUpperCase() && char !== char.toLowerCase()).length >= - minNumberOfUpperCaseChar - ) { - break check_password_policy_x; - } - - const msgArgs = ['invalidPasswordMinUpperCaseCharsMessage', `${minNumberOfUpperCaseChar}`] as const; - - errors.push({ - errorMessage: this.sanitizer.bypassSecurityTrustHtml( - `${msgStr(...msgArgs)}`, - ), - errorMessageStr: msgStr(...msgArgs), - fieldIndex: undefined, - source: { - type: 'passwordPolicy', - name: policyName, - }, - }); - } - - check_password_policy_x: { - const policyName = 'specialChars'; - - const policy = passwordPolicies[policyName]; - - if (!policy) { - break check_password_policy_x; - } - - const minNumberOfSpecialChar = policy; - - if (value.split('').filter((char) => !char.match(/[a-zA-Z0-9]/)).length >= minNumberOfSpecialChar) { - break check_password_policy_x; - } - - const msgArgs = ['invalidPasswordMinSpecialCharsMessage', `${minNumberOfSpecialChar}`] as const; - - errors.push({ - errorMessage: this.sanitizer.bypassSecurityTrustHtml( - `${msgStr(...msgArgs)}`, - ), - errorMessageStr: msgStr(...msgArgs), - fieldIndex: undefined, - source: { - type: 'passwordPolicy', - name: policyName, - }, - }); - } - - check_password_policy_x: { - const policyName = 'notUsername'; - - const notUsername = passwordPolicies[policyName]; - - if (!notUsername) { - break check_password_policy_x; - } - - const usernameFormFieldState = formFieldStates.find( - (formFieldState) => formFieldState.attribute.name === 'username', - ); - - if (!usernameFormFieldState) { - break check_password_policy_x; - } - - const usernameValue = (() => { - let { valueOrValues } = usernameFormFieldState; - - assert(typeof valueOrValues === 'string'); - - unFormat_number: { - const { kcNumberUnFormat } = attribute.html5DataAnnotations ?? {}; - - if (!kcNumberUnFormat) { - break unFormat_number; - } - - valueOrValues = formatNumber(valueOrValues, kcNumberUnFormat); - } - - return valueOrValues; - })(); - - if (usernameValue === '') { - break check_password_policy_x; - } - - if (value !== usernameValue) { - break check_password_policy_x; - } - - const msgArgs = ['invalidPasswordNotUsernameMessage'] as const; - - errors.push({ - errorMessage: this.sanitizer.bypassSecurityTrustHtml( - `${msgStr(...msgArgs)}`, - ), - errorMessageStr: msgStr(...msgArgs), - fieldIndex: undefined, - source: { - type: 'passwordPolicy', - name: policyName, - }, - }); - } - - check_password_policy_x: { - const policyName = 'notEmail'; - - const notEmail = passwordPolicies[policyName]; - - if (!notEmail) { - break check_password_policy_x; - } - - const emailFormFieldState = formFieldStates.find((formFieldState) => formFieldState.attribute.name === 'email'); - - if (!emailFormFieldState) { - break check_password_policy_x; - } - - assert(typeof emailFormFieldState.valueOrValues === 'string'); - - { - const emailValue = emailFormFieldState.valueOrValues; - - if (emailValue === '') { - break check_password_policy_x; - } - - if (value !== emailValue) { - break check_password_policy_x; - } - } - - const msgArgs = ['invalidPasswordNotEmailMessage'] as const; - - errors.push({ - errorMessage: this.sanitizer.bypassSecurityTrustHtml( - `${msgStr(...msgArgs)}`, - ), - errorMessageStr: msgStr(...msgArgs), - fieldIndex: undefined, - source: { - type: 'passwordPolicy', - name: policyName, - }, - }); - } - } - - password_confirm_matches_password: { - if (attributeName !== 'password-confirm') { - break password_confirm_matches_password; - } - - const passwordFormFieldState = formFieldStates.find( - (formFieldState) => formFieldState.attribute.name === 'password', - ); - - assert(passwordFormFieldState !== undefined); - - assert(typeof passwordFormFieldState.valueOrValues === 'string'); - - { - const passwordValue = passwordFormFieldState.valueOrValues; - - if (value === passwordValue) { - break password_confirm_matches_password; - } - } - - const msgArgs = ['invalidPasswordConfirmMessage'] as const; - - errors.push({ - errorMessage: this.sanitizer.bypassSecurityTrustHtml( - `${msgStr(...msgArgs)}`, - ), - errorMessageStr: msgStr(...msgArgs), - fieldIndex: undefined, - source: { - type: 'other', - rule: 'passwordConfirmMatchesPassword', - }, - }); - } - - const { validators } = attribute; - - required_field: { - if (!attribute.required) { - break required_field; - } - - if (value !== '') { - break required_field; - } - - const msgArgs = ['error-user-attribute-required'] as const; - - errors.push({ - errorMessage: this.sanitizer.bypassSecurityTrustHtml( - `${msgStr(...msgArgs)}`, - ), - errorMessageStr: msgStr(...msgArgs), - fieldIndex: undefined, - source: { - type: 'other', - rule: 'requiredField', - }, - }); - } - - validator_x: { - const validatorName = 'length'; - - const validator = validators[validatorName]; - - if (!validator) { - break validator_x; - } - - const { 'ignore.empty.value': ignoreEmptyValue = false, max, min } = validator; - - if (ignoreEmptyValue && value === '') { - break validator_x; - } - - const source: FormFieldError.Source = { - type: 'validator', - name: validatorName, - }; - - if (max && value.length > parseInt(`${max}`)) { - const msgArgs = ['error-invalid-length-too-long', `${max}`] as const; - - errors.push({ - errorMessage: this.sanitizer.bypassSecurityTrustHtml( - `${msgStr(...msgArgs)}`, - ), - errorMessageStr: msgStr(...msgArgs), - fieldIndex: undefined, - source, - }); - } - - if (min && value.length < parseInt(`${min}`)) { - const msgArgs = ['error-invalid-length-too-short', `${min}`] as const; - - errors.push({ - errorMessage: this.sanitizer.bypassSecurityTrustHtml( - `${msgStr(...msgArgs)}`, - ), - errorMessageStr: msgStr(...msgArgs), - fieldIndex: undefined, - source, - }); - } - } - - validator_x: { - const validatorName = 'pattern'; - - const validator = validators[validatorName]; - - if (validator === undefined) { - break validator_x; - } - - const { 'ignore.empty.value': ignoreEmptyValue = false, pattern, 'error-message': errorMessageKey } = validator; - - if (ignoreEmptyValue && value === '') { - break validator_x; - } - - if (new RegExp(pattern).test(value)) { - break validator_x; - } - - const msgArgs = [errorMessageKey ?? id('shouldMatchPattern'), pattern] as const; - - errors.push({ - errorMessage: this.sanitizer.bypassSecurityTrustHtml( - `${advancedMsgStr(...msgArgs)}`, - ), - errorMessageStr: advancedMsgStr(...msgArgs), - fieldIndex: undefined, - source: { - type: 'validator', - name: validatorName, - }, - }); - } - - validator_x: { - { - const lastError = errors[errors.length - 1]; - if (lastError !== undefined && lastError.source.type === 'validator' && lastError.source.name === 'pattern') { - break validator_x; - } - } - - const validatorName = 'email'; - - const validator = validators[validatorName]; - - if (validator === undefined) { - break validator_x; - } - - const { 'ignore.empty.value': ignoreEmptyValue = false } = validator; - - if (ignoreEmptyValue && value === '') { - break validator_x; - } - - if (emailRegexp.test(value)) { - break validator_x; - } - - const msgArgs = [id('invalidEmailMessage')] as const; - - errors.push({ - errorMessage: this.sanitizer.bypassSecurityTrustHtml( - `${msgStr(...msgArgs)}`, - ), - errorMessageStr: msgStr(...msgArgs), - fieldIndex: undefined, - source: { - type: 'validator', - name: validatorName, - }, - }); - } - - validator_x: { - const validatorName = 'integer'; - - const validator = validators[validatorName]; - - if (validator === undefined) { - break validator_x; - } - - const { 'ignore.empty.value': ignoreEmptyValue = false, max, min } = validator; - - if (ignoreEmptyValue && value === '') { - break validator_x; - } - - const intValue = parseInt(value); - - const source: FormFieldError.Source = { - type: 'validator', - name: validatorName, - }; - - if (isNaN(intValue)) { - const msgArgs = ['mustBeAnInteger'] as const; - - errors.push({ - errorMessage: this.sanitizer.bypassSecurityTrustHtml( - `${msgStr(...msgArgs)}`, - ), - errorMessageStr: msgStr(...msgArgs), - fieldIndex: undefined, - source, - }); - - break validator_x; - } - - if (max && intValue > parseInt(`${max}`)) { - const msgArgs = ['error-number-out-of-range-too-big', `${max}`] as const; - - errors.push({ - errorMessage: this.sanitizer.bypassSecurityTrustHtml( - `${msgStr(...msgArgs)}`, - ), - errorMessageStr: msgStr(...msgArgs), - fieldIndex: undefined, - source, - }); - - break validator_x; - } - - if (min && intValue < parseInt(`${min}`)) { - const msgArgs = ['error-number-out-of-range-too-small', `${min}`] as const; - - errors.push({ - errorMessage: this.sanitizer.bypassSecurityTrustHtml( - `${msgStr(...msgArgs)}`, - ), - errorMessageStr: msgStr(...msgArgs), - fieldIndex: undefined, - source, - }); - - break validator_x; - } - } - - validator_x: { - const validatorName = 'options'; - - const validator = validators[validatorName]; - - if (validator === undefined) { - break validator_x; - } - - if (value === '') { - break validator_x; - } - - if (validator.options.indexOf(value) >= 0) { - break validator_x; - } - - const msgArgs = [id('notAValidOption')] as const; - - errors.push({ - errorMessage: this.sanitizer.bypassSecurityTrustHtml( - `${msgStr(...msgArgs)}`, - ), - errorMessageStr: msgStr(...msgArgs), - fieldIndex: undefined, - source: { - type: 'validator', - name: validatorName, - }, - }); - } - - //TODO: Implement missing validators. See Validators type definition. - - return errors; - } -} diff --git a/projects/keycloakify-angular/ng-package.json b/projects/keycloakify-angular/ng-package.json deleted file mode 100644 index 9c18a141..00000000 --- a/projects/keycloakify-angular/ng-package.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "$schema": "../../node_modules/ng-packagr/ng-package.schema.json", - "dest": "../../dist/keycloakify-angular", - "lib": { - "entryFile": "src/public-api.ts" - } -} \ No newline at end of file diff --git a/projects/keycloakify-angular/package.json b/projects/keycloakify-angular/package.json deleted file mode 100644 index 2d55bfcb..00000000 --- a/projects/keycloakify-angular/package.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "name": "keycloakify-angular", - "version": "0.0.1", - "type": "module", - "peerDependencies": { - "@angular/common": "^18.2.6", - "@angular/core": "^18.2.6", - "keycloakify": "^11.0.0", - "tsafe": "^1.7.2" - }, - "dependencies": { - "tslib": "^2.7.0" - }, - "sideEffects": false -} diff --git a/projects/keycloakify-angular/src/i18n.ts b/projects/keycloakify-angular/src/i18n.ts deleted file mode 100644 index bdac5c77..00000000 --- a/projects/keycloakify-angular/src/i18n.ts +++ /dev/null @@ -1,9 +0,0 @@ -/* eslint-disable @typescript-eslint/no-unused-vars */ - -import { i18nBuilder as accountI18nBuilder } from 'keycloakify/account/i18n/noJsx'; -import { i18nBuilder as loginI18nBuilder } from 'keycloakify/login/i18n/noJsx'; - -const { ofTypeI18n: I18nlogin } = loginI18nBuilder.build(); -const { ofTypeI18n: I18nAccount } = accountI18nBuilder.build(); -type I18n = typeof I18nAccount | typeof I18nlogin; -export { type I18n }; diff --git a/projects/keycloakify-angular/src/models/index.ts b/projects/keycloakify-angular/src/models/index.ts deleted file mode 100644 index 462e4dc1..00000000 --- a/projects/keycloakify-angular/src/models/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from './script.model'; diff --git a/projects/keycloakify-angular/src/models/script.model.ts b/projects/keycloakify-angular/src/models/script.model.ts deleted file mode 100644 index 025bc2f8..00000000 --- a/projects/keycloakify-angular/src/models/script.model.ts +++ /dev/null @@ -1,6 +0,0 @@ -export type Script = { - type: string; - id: string; - src?: string; - textContent?: string; -}; diff --git a/projects/keycloakify-angular/src/providers/keycloakify-angular.providers.ts b/projects/keycloakify-angular/src/providers/keycloakify-angular.providers.ts deleted file mode 100644 index de83ff0a..00000000 --- a/projects/keycloakify-angular/src/providers/keycloakify-angular.providers.ts +++ /dev/null @@ -1,73 +0,0 @@ -import { DOCUMENT } from '@angular/common'; -import { APP_INITIALIZER, InjectionToken, LOCALE_ID, makeEnvironmentProviders } from '@angular/core'; -import { I18n } from '../i18n'; -import { I18nService } from '../services'; - -export const I18N = new InjectionToken('i18n'); -export const KC_CONTEXT = new InjectionToken('keycloak context'); -export const USE_DEFAULT_CSS = new InjectionToken('use default css'); -export const CLASSES = new InjectionToken<{ [key in ClassKey]?: string }>('classes'); -export const DO_MAKE_USER_CONFIRM_PASSWORD = new InjectionToken('doMakeUserConfirmPassword'); - -type ClassKey = import('keycloakify/login').ClassKey | import('keycloakify/account').ClassKey; -type KcContextLike = import('keycloakify/login/i18n').KcContextLike | import('keycloakify/account/i18n').KcContextLike; -type KcContext = import('keycloakify/login/KcContext').KcContext | import('keycloakify/account/KcContext').KcContext; - -export type KeycloakifyAngularConfig = { - doMakeUserConfirmPassword?: boolean; - doUseDefaultCss?: boolean; - classes?: { [key in ClassKey]?: string }; - getI18n: (params: { kcContext: KcContextLike }) => { - i18n: unknown; - prI18n_currentLanguage: Promise | undefined; - }; -}; - -export const provideKeycloakifyAngular = (config: KeycloakifyAngularConfig) => - makeEnvironmentProviders([ - { - provide: KC_CONTEXT, - useValue: window.kcContext, - }, - { - provide: DO_MAKE_USER_CONFIRM_PASSWORD, - useValue: config?.doMakeUserConfirmPassword ?? true, - }, - { - provide: LOCALE_ID, - useFactory: (document: Document) => { - return document.documentElement.lang ?? 'en'; - }, - deps: [DOCUMENT], - }, - { - provide: APP_INITIALIZER, - multi: true, - useFactory: - (i18nService: I18nService['i18n']>, kcContext: KcContext) => async () => { - const getI18n = config.getI18n; - - const { i18n, prI18n_currentLanguage } = getI18n({ - kcContext, - }); - let i18nPromise = new Promise((resolve) => resolve(i18n)); - if (prI18n_currentLanguage) { - i18nPromise = prI18n_currentLanguage; - } - return i18nPromise.then((i18n) => { - i18nService.i18n = i18n; - return true; - }); - }, - deps: [I18nService, KC_CONTEXT], - }, - { provide: USE_DEFAULT_CSS, useValue: config?.doUseDefaultCss ?? true }, - { provide: CLASSES, useValue: config?.classes ?? {} }, - { - provide: I18N, - useFactory: (i18nService: I18nService['i18n']>) => { - return i18nService.i18n; - }, - deps: [I18nService], - }, - ]); diff --git a/projects/keycloakify-angular/src/public-api.ts b/projects/keycloakify-angular/src/public-api.ts deleted file mode 100644 index a5b849ff..00000000 --- a/projects/keycloakify-angular/src/public-api.ts +++ /dev/null @@ -1,12 +0,0 @@ -import { KcContext as KcAccountContext } from 'keycloakify/account/KcContext'; -import { KcContext as KcLoginContext } from 'keycloakify/login/KcContext'; - -declare global { - interface Window { - kcContext?: KcLoginContext | KcAccountContext; - } -} - -export * from './models'; -export * from './providers/keycloakify-angular.providers'; -export * from './services'; diff --git a/projects/keycloakify-angular/src/services/i18n.service.ts b/projects/keycloakify-angular/src/services/i18n.service.ts deleted file mode 100644 index 976d8251..00000000 --- a/projects/keycloakify-angular/src/services/i18n.service.ts +++ /dev/null @@ -1,5 +0,0 @@ -import { Injectable } from '@angular/core'; -@Injectable({ providedIn: 'root' }) -export class I18nService { - i18n!: T; -} diff --git a/projects/keycloakify-angular/src/services/index.ts b/projects/keycloakify-angular/src/services/index.ts deleted file mode 100644 index 4e7b77e0..00000000 --- a/projects/keycloakify-angular/src/services/index.ts +++ /dev/null @@ -1,2 +0,0 @@ -export * from './resource-injector.service'; -export * from './i18n.service'; diff --git a/projects/keycloakify-angular/src/services/resource-injector.service.ts b/projects/keycloakify-angular/src/services/resource-injector.service.ts deleted file mode 100644 index 4d954b84..00000000 --- a/projects/keycloakify-angular/src/services/resource-injector.service.ts +++ /dev/null @@ -1,50 +0,0 @@ -import { inject, Injectable, Renderer2, RendererFactory2 } from '@angular/core'; -import { Observable } from 'rxjs'; -import { Script } from '../models/script.model'; - -@Injectable({ - providedIn: 'root', -}) -export class ResourceInjectorService { - private renderer: Renderer2 = inject(RendererFactory2).createRenderer(null, null); - - createLink(url: string): Observable { - return new Observable((observer) => { - // check if the style is already injected - if (Array.from(document.styleSheets).some((s) => s.href?.includes(url))) { - observer.next(); - observer.complete(); - console.debug(`stylesheet: ${url} already loaded`); - return; - } - const link = document.createElement('link'); - link.rel = 'stylesheet'; - link.href = url; - - link.onload = () => { - observer.next(); - observer.complete(); - }; - - link.onerror = () => { - observer.error(new Error(`Failed to load stylesheet: ${url}`)); - }; - - this.renderer.appendChild(document.head, link); - }); - } - createScript({ type, id, src, textContent }: Script): void { - // check if the script is already injected - if (Array.from(document.scripts).some((s) => s.id?.includes(id))) { - console.debug(`script: ${src} already injected`); - return; - } - const script = document.createElement('script'); - script.type = type; - if (src) script.src = src; - if (textContent) script.textContent = textContent; - script.id = id; - - this.renderer.appendChild(document.head, script); - } -} diff --git a/projects/keycloakify-angular/tsconfig.lib.json b/projects/keycloakify-angular/tsconfig.lib.json deleted file mode 100644 index f378df09..00000000 --- a/projects/keycloakify-angular/tsconfig.lib.json +++ /dev/null @@ -1,13 +0,0 @@ -/* To learn more about Typescript configuration file: https://www.typescriptlang.org/docs/handbook/tsconfig-json.html. */ -/* To learn more about Angular compiler options: https://angular.dev/reference/configs/angular-compiler-options. */ -{ - "extends": "../../tsconfig.json", - "compilerOptions": { - "outDir": "../../out-tsc/lib", - "declaration": true, - "declarationMap": true, - "inlineSources": true, - "types": [], - }, - "exclude": ["**/*.spec.ts"] -} \ No newline at end of file diff --git a/projects/keycloakify-angular/tsconfig.lib.prod.json b/projects/keycloakify-angular/tsconfig.lib.prod.json deleted file mode 100644 index 9215caac..00000000 --- a/projects/keycloakify-angular/tsconfig.lib.prod.json +++ /dev/null @@ -1,11 +0,0 @@ -/* To learn more about Typescript configuration file: https://www.typescriptlang.org/docs/handbook/tsconfig-json.html. */ -/* To learn more about Angular compiler options: https://angular.dev/reference/configs/angular-compiler-options. */ -{ - "extends": "./tsconfig.lib.json", - "compilerOptions": { - "declarationMap": false - }, - "angularCompilerOptions": { - "compilationMode": "partial" - } -} diff --git a/projects/keycloakify-angular/tsconfig.spec.json b/projects/keycloakify-angular/tsconfig.spec.json deleted file mode 100644 index 254686d5..00000000 --- a/projects/keycloakify-angular/tsconfig.spec.json +++ /dev/null @@ -1,15 +0,0 @@ -/* To learn more about Typescript configuration file: https://www.typescriptlang.org/docs/handbook/tsconfig-json.html. */ -/* To learn more about Angular compiler options: https://angular.dev/reference/configs/angular-compiler-options. */ -{ - "extends": "../../tsconfig.json", - "compilerOptions": { - "outDir": "../../out-tsc/spec", - "types": [ - "jasmine" - ] - }, - "include": [ - "**/*.spec.ts", - "**/*.d.ts" - ] -} diff --git a/scripts/build.ts b/scripts/build.ts new file mode 100644 index 00000000..027e80d8 --- /dev/null +++ b/scripts/build.ts @@ -0,0 +1,182 @@ +import * as fs from "fs"; +import { join } from "path"; +import { assert } from "tsafe/assert"; +import { transformCodebase } from "../../src/bin/tools/transformCodebase"; +import { createPublicKeycloakifyDevResourcesDir } from "./createPublicKeycloakifyDevResourcesDir"; +import { createAccountV1Dir } from "./createAccountV1Dir"; +import chalk from "chalk"; +import { run } from "../shared/run"; +import { vendorFrontendDependencies } from "./vendorFrontendDependencies"; + +(async () => { + console.log(chalk.cyan("Building Keycloakify...")); + + const startTime = Date.now(); + + if (fs.existsSync(join("dist", "bin", "main.original.js"))) { + fs.renameSync( + join("dist", "bin", "main.original.js"), + join("dist", "bin", "main.js") + ); + + fs.readdirSync(join("dist", "bin")).forEach(fileBasename => { + if (/[0-9]\.index.js/.test(fileBasename) || fileBasename.endsWith(".node")) { + fs.rmSync(join("dist", "bin", fileBasename)); + } + }); + } + + run(`npx tsc -p ${join("src", "bin", "tsconfig.json")}`); + + if ( + !fs + .readFileSync(join("dist", "bin", "main.js")) + .toString("utf8") + .includes("__nccwpck_require__") + ) { + fs.cpSync( + join("dist", "bin", "main.js"), + join("dist", "bin", "main.original.js") + ); + } + + run(`npx ncc build ${join("dist", "bin", "main.js")} -o ${join("dist", "ncc_out")}`); + + transformCodebase({ + srcDirPath: join("dist", "ncc_out"), + destDirPath: join("dist", "bin"), + transformSourceCode: ({ fileRelativePath, sourceCode }) => { + if (fileRelativePath === "index.js") { + return { + newFileName: "main.js", + modifiedSourceCode: sourceCode + }; + } + + return { modifiedSourceCode: sourceCode }; + } + }); + + fs.rmSync(join("dist", "ncc_out"), { recursive: true }); + + { + let hasBeenPatched = false; + + fs.readdirSync(join("dist", "bin")).forEach(fileBasename => { + if (fileBasename !== "main.js" && !fileBasename.endsWith(".index.js")) { + return; + } + + const { hasBeenPatched: hasBeenPatched_i } = patchDeprecatedBufferApiUsage( + join("dist", "bin", fileBasename) + ); + + if (hasBeenPatched_i) { + hasBeenPatched = true; + } + }); + + assert(hasBeenPatched); + } + + fs.chmodSync( + join("dist", "bin", "main.js"), + fs.statSync(join("dist", "bin", "main.js")).mode | + fs.constants.S_IXUSR | + fs.constants.S_IXGRP | + fs.constants.S_IXOTH + ); + + run(`npx tsc -p ${join("src", "tsconfig.json")}`); + run(`npx tsc-alias -p ${join("src", "tsconfig.json")}`); + vendorFrontendDependencies({ distDirPath: join(process.cwd(), "dist") }); + + if (fs.existsSync(join("dist", "vite-plugin", "index.original.js"))) { + fs.renameSync( + join("dist", "vite-plugin", "index.original.js"), + join("dist", "vite-plugin", "index.js") + ); + } + + run(`npx tsc -p ${join("src", "vite-plugin", "tsconfig.json")}`); + + if ( + !fs + .readFileSync(join("dist", "vite-plugin", "index.js")) + .toString("utf8") + .includes("__nccwpck_require__") + ) { + fs.cpSync( + join("dist", "vite-plugin", "index.js"), + join("dist", "vite-plugin", "index.original.js") + ); + } + + run( + `npx ncc build ${join("dist", "vite-plugin", "index.js")} -o ${join( + "dist", + "ncc_out" + )}` + ); + + fs.readdirSync(join("dist", "ncc_out")).forEach(fileBasename => { + assert(!fileBasename.endsWith(".index.js")); + assert(!fileBasename.endsWith(".node")); + }); + + transformCodebase({ + srcDirPath: join("dist", "ncc_out"), + destDirPath: join("dist", "vite-plugin"), + transformSourceCode: ({ fileRelativePath, sourceCode }) => { + assert(fileRelativePath === "index.js"); + + return { modifiedSourceCode: sourceCode }; + } + }); + + fs.rmSync(join("dist", "ncc_out"), { recursive: true }); + + { + const dirBasename = "src"; + + const destDirPath = join("dist", dirBasename); + + fs.rmSync(destDirPath, { recursive: true, force: true }); + + fs.cpSync(dirBasename, destDirPath, { recursive: true }); + } + + await createPublicKeycloakifyDevResourcesDir(); + await createAccountV1Dir(); + + transformCodebase({ + srcDirPath: join("stories"), + destDirPath: join("dist", "stories"), + transformSourceCode: ({ fileRelativePath, sourceCode }) => { + if (!fileRelativePath.endsWith(".stories.tsx")) { + return undefined; + } + + return { modifiedSourceCode: sourceCode }; + } + }); + + console.log( + chalk.green(`✓ built in ${((Date.now() - startTime) / 1000).toFixed(2)}s`) + ); +})(); + +function patchDeprecatedBufferApiUsage(filePath: string) { + const before = fs.readFileSync(filePath).toString("utf8"); + + const after = before.replace( + `var buffer = new Buffer(toRead);`, + `var buffer = Buffer.allocUnsafe ? Buffer.allocUnsafe(toRead) : new Buffer(toRead);` + ); + + fs.writeFileSync(filePath, Buffer.from(after, "utf8")); + + const hasBeenPatched = after !== before; + + return { hasBeenPatched }; +} diff --git a/scripts/link-in-app.ts b/scripts/link-in-app.ts new file mode 100644 index 00000000..da7661fc --- /dev/null +++ b/scripts/link-in-app.ts @@ -0,0 +1,158 @@ +import { execSync } from "child_process"; +import { join as pathJoin, relative as pathRelative } from "path"; +import { getThisCodebaseRootDirPath } from "../src/bin/tools/getThisCodebaseRootDirPath"; +import * as fs from "fs"; +import * as os from "os"; + +const singletonDependencies: string[] = ["react", "@types/react"]; + +// For example [ "@emotion" ] it's more convenient than +// having to list every sub emotion packages (@emotion/css @emotion/utils ...) +// in singletonDependencies +const namespaceSingletonDependencies: string[] = []; + +const rootDirPath = getThisCodebaseRootDirPath(); + +const commonThirdPartyDeps = [ + ...namespaceSingletonDependencies + .map(namespaceModuleName => + fs + .readdirSync(pathJoin(rootDirPath, "node_modules", namespaceModuleName)) + .map(submoduleName => `${namespaceModuleName}/${submoduleName}`) + ) + .reduce((prev, curr) => [...prev, ...curr], []), + ...singletonDependencies +]; + +//NOTE: This is only required because of: https://github.com/garronej/ts-ci/blob/c0e207b9677523d4ec97fe672ddd72ccbb3c1cc4/README.md?plain=1#L54-L58 +{ + let modifiedPackageJsonContent = fs + .readFileSync(pathJoin(rootDirPath, "package.json")) + .toString("utf8"); + + modifiedPackageJsonContent = (() => { + const o = JSON.parse(modifiedPackageJsonContent); + + delete o.files; + + return JSON.stringify(o, null, 2); + })(); + + modifiedPackageJsonContent = modifiedPackageJsonContent + .replace(/"dist\//g, '"') + .replace(/"\.\/dist\//g, '"./') + .replace(/"!dist\//g, '"!') + .replace(/"!\.\/dist\//g, '"!./'); + + modifiedPackageJsonContent = JSON.stringify( + { ...JSON.parse(modifiedPackageJsonContent), version: "0.0.0" }, + null, + 4 + ); + + fs.writeFileSync( + pathJoin(rootDirPath, "dist", "package.json"), + Buffer.from(modifiedPackageJsonContent, "utf8") + ); +} + +const yarnGlobalDirPath = pathJoin(rootDirPath, ".yarn_home"); + +fs.rmSync(yarnGlobalDirPath, { recursive: true, force: true }); +fs.mkdirSync(yarnGlobalDirPath); + +const execYarnLink = (params: { targetModuleName?: string; cwd: string }) => { + const { targetModuleName, cwd } = params; + + const cmd = [ + "yarn", + "link", + ...(targetModuleName !== undefined ? [targetModuleName] : ["--no-bin-links"]) + ].join(" "); + + console.log(`$ cd ${pathRelative(rootDirPath, cwd) || "."} && ${cmd}`); + + execSync(cmd, { + cwd, + env: { + ...process.env, + ...(os.platform() === "win32" + ? { USERPROFILE: yarnGlobalDirPath } + : { HOME: yarnGlobalDirPath }) + } + }); +}; + +const testAppPaths = (() => { + const [, , ...testAppNames] = process.argv; + + return testAppNames + .map(testAppName => { + const testAppPath = pathJoin(rootDirPath, "..", testAppName); + + if (fs.existsSync(testAppPath)) { + return testAppPath; + } + + console.warn( + `Skipping ${testAppName} since it cant be found here: ${testAppPath}` + ); + + return undefined; + }) + .filter((path): path is string => path !== undefined); +})(); + +if (testAppPaths.length === 0) { + console.error("No test app to link into!"); + process.exit(-1); +} + +testAppPaths.forEach(testAppPath => execSync("yarn install", { cwd: testAppPath })); + +console.log("=== Linking common dependencies ==="); + +const total = commonThirdPartyDeps.length; +let current = 0; + +commonThirdPartyDeps.forEach(commonThirdPartyDep => { + current++; + + console.log(`${current}/${total} ${commonThirdPartyDep}`); + + const localInstallPath = pathJoin( + ...[ + rootDirPath, + "node_modules", + ...(commonThirdPartyDep.startsWith("@") + ? commonThirdPartyDep.split("/") + : [commonThirdPartyDep]) + ] + ); + + execYarnLink({ cwd: localInstallPath }); +}); + +commonThirdPartyDeps.forEach(commonThirdPartyDep => + testAppPaths.forEach(testAppPath => + execYarnLink({ + cwd: testAppPath, + targetModuleName: commonThirdPartyDep + }) + ) +); + +console.log("=== Linking in house dependencies ==="); + +execYarnLink({ cwd: pathJoin(rootDirPath, "dist") }); + +testAppPaths.forEach(testAppPath => + execYarnLink({ + cwd: testAppPath, + targetModuleName: JSON.parse( + fs.readFileSync(pathJoin(rootDirPath, "package.json")).toString("utf8") + )["name"] + }) +); + +export {}; diff --git a/scripts/link-in-starter.ts b/scripts/link-in-starter.ts new file mode 100644 index 00000000..4b41e14d --- /dev/null +++ b/scripts/link-in-starter.ts @@ -0,0 +1,49 @@ +import * as fs from "fs"; +import { join } from "path"; +import { startRebuildOnSrcChange } from "./shared/startRebuildOnSrcChange"; +import { crawl } from "../src/bin/tools/crawl"; +import { run } from "./shared/run"; + +{ + const dirPath = "node_modules"; + + try { + fs.rmSync(dirPath, { recursive: true, force: true }); + } catch { + // NOTE: This is a workaround for windows + // we can't remove locked executables. + + crawl({ + dirPath, + returnedPathsType: "absolute" + }).forEach(filePath => { + try { + fs.rmSync(filePath, { force: true }); + } catch (error) { + if (filePath.endsWith(".exe")) { + return; + } + throw error; + } + }); + } +} + +fs.rmSync("dist", { recursive: true, force: true }); +fs.rmSync(".yarn_home", { recursive: true, force: true }); + +run("yarn install"); +run("yarn build"); + +const starterName = "keycloakify-starter"; + +fs.rmSync(join("..", starterName, "node_modules"), { + recursive: true, + force: true +}); + +run("yarn install", { cwd: join("..", starterName) }); + +run(`npx tsx ${join("scripts", "link-in-app.ts")} ${starterName}`); + +startRebuildOnSrcChange(); diff --git a/scripts/shared/cacheDirPath.ts b/scripts/shared/cacheDirPath.ts new file mode 100644 index 00000000..cf7b0af7 --- /dev/null +++ b/scripts/shared/cacheDirPath.ts @@ -0,0 +1,9 @@ +import { join as pathJoin } from "path"; +import { getThisCodebaseRootDirPath } from "../../src/bin/tools/getThisCodebaseRootDirPath"; + +export const cacheDirPath = pathJoin( + getThisCodebaseRootDirPath(), + "node_modules", + ".cache", + "scripts" +); diff --git a/scripts/shared/run.ts b/scripts/shared/run.ts new file mode 100644 index 00000000..6276a150 --- /dev/null +++ b/scripts/shared/run.ts @@ -0,0 +1,8 @@ +import * as child_process from "child_process"; +import chalk from "chalk"; + +export function run(command: string, options?: { cwd: string }) { + console.log(chalk.grey(`$ ${command}`)); + + child_process.execSync(command, { stdio: "inherit", ...options }); +} diff --git a/scripts/shared/startRebuildOnSrcChange.ts b/scripts/shared/startRebuildOnSrcChange.ts new file mode 100644 index 00000000..e630664f --- /dev/null +++ b/scripts/shared/startRebuildOnSrcChange.ts @@ -0,0 +1,40 @@ +import * as child_process from "child_process"; +import { waitForDebounceFactory } from "powerhooks/tools/waitForDebounce"; +import chokidar from "chokidar"; +import * as runExclusive from "run-exclusive"; +import { Deferred } from "evt/tools/Deferred"; +import chalk from "chalk"; + +export function startRebuildOnSrcChange() { + const { waitForDebounce } = waitForDebounceFactory({ delay: 400 }); + + const runYarnBuild = runExclusive.build(async () => { + console.log(chalk.green("Running `yarn build`")); + + const dCompleted = new Deferred(); + + const child = child_process.spawn("yarn", ["build"], { shell: true }); + + child.stdout.on("data", data => process.stdout.write(data)); + + child.stderr.on("data", data => process.stderr.write(data)); + + child.on("exit", () => dCompleted.resolve()); + + await dCompleted.pr; + + console.log("\n\n"); + }); + + console.log(chalk.green("Watching for changes in src/")); + + chokidar + .watch(["src", "stories"], { ignoreInitial: true }) + .on("all", async (event, path) => { + console.log(chalk.bold(`${event}: ${path}`)); + + await waitForDebounce(); + + runYarnBuild(); + }); +} diff --git a/src/login/KcContext.ts b/src/login/KcContext.ts new file mode 100644 index 00000000..d8e0aefa --- /dev/null +++ b/src/login/KcContext.ts @@ -0,0 +1 @@ +export type { KcContext } from "keycloakify/login/KcContext"; diff --git a/src/login/i18n.ts b/src/login/i18n.ts new file mode 100644 index 00000000..c088260b --- /dev/null +++ b/src/login/i18n.ts @@ -0,0 +1,4 @@ +import type { GenericI18n_noJsx } from "keycloakify/login/i18n/noJsx/GenericI18n_noJsx"; +import { MessageKey as MessageKey_defaultSet } from "keycloakify/login/i18n/messages_defaultSet/types"; +/** INTERNAL: DO NOT IMPORT THIS */ +export type I18n = GenericI18n_noJsx; diff --git a/src/tsconfig.json b/src/tsconfig.json new file mode 100644 index 00000000..9faced4b --- /dev/null +++ b/src/tsconfig.json @@ -0,0 +1,17 @@ +{ + "extends": "../tsproject.json", + "compilerOptions": { + "outDir": "../dist", + "rootDir": ".", + "module": "ES2020", + "target": "ES2017", + "lib": ["es2015", "DOM", "ES2019.Object"], + "moduleResolution": "node", + "baseUrl": ".", + "paths": { + "@keycloakify/angular/*": ["./*"] + }, + "jsx": "react-jsx", + "allowSyntheticDefaultImports": true + } +} diff --git a/tsconfig.json b/tsconfig.json deleted file mode 100644 index 0bc80547..00000000 --- a/tsconfig.json +++ /dev/null @@ -1,38 +0,0 @@ -/* To learn more about Typescript configuration file: https://www.typescriptlang.org/docs/handbook/tsconfig-json.html. */ -/* To learn more about Angular compiler options: https://angular.dev/reference/configs/angular-compiler-options. */ -{ - "compileOnSave": false, - "compilerOptions": { - "outDir": "./dist/out-tsc", - "baseUrl": ".", - "skipLibCheck": true, - "isolatedModules": true, - "paths": { - "keycloakify-angular/*": ["dist/keycloakify-angular/*"], - "keycloakify-angular": ["dist/keycloakify-angular"] - }, - "esModuleInterop": true, - "sourceMap": true, - "declaration": false, - "experimentalDecorators": true, - "moduleResolution": "bundler", - "importHelpers": true, - "target": "ES2022", - "module": "ES2022", - "lib": ["ES2022", "dom"], - /* Linting */ - "strict": true, - "forceConsistentCasingInFileNames": true, - "useDefineForClassFields": false, - "noImplicitOverride": true, - "noPropertyAccessFromIndexSignature": true, - "noImplicitReturns": true, - "noFallthroughCasesInSwitch": true, - }, - "angularCompilerOptions": { - "enableI18nLegacyMessageIdFormat": false, - "strictInjectionParameters": true, - "strictInputAccessModifiers": true, - "strictTemplates": true - } -} diff --git a/tsproject.json b/tsproject.json new file mode 100644 index 00000000..f497ae4a --- /dev/null +++ b/tsproject.json @@ -0,0 +1,15 @@ +{ + "compilerOptions": { + "declaration": true, + "sourceMap": true, + "newLine": "LF", + "noUnusedLocals": true, + "noUnusedParameters": true, + "incremental": true, + "strict": true, + "downlevelIteration": true, + "noFallthroughCasesInSwitch": true, + "composite": true, + "outDir": "./dist" + } +} diff --git a/yarn.lock b/yarn.lock new file mode 100644 index 00000000..06dfb7bc --- /dev/null +++ b/yarn.lock @@ -0,0 +1,1118 @@ +# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. +# yarn lockfile v1 + + +"@babel/code-frame@^7.0.0": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.24.7.tgz#882fd9e09e8ee324e496bd040401c6f046ef4465" + integrity sha512-BcYH1CVJBO9tvyIZ2jVeXgSIMvGZ2FDRvDdOIVQyuklNKSsx+eppDEBq/g47Ayw+RqNFE+URvOShmf+f/qwAlA== + dependencies: + "@babel/highlight" "^7.24.7" + picocolors "^1.0.0" + +"@babel/helper-validator-identifier@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.24.7.tgz#75b889cfaf9e35c2aaf42cf0d72c8e91719251db" + integrity sha512-rR+PBcQ1SMQDDyF6X0wxtG8QyLCgUB0eRAGguqRLfkCA87l7yAP7ehq8SNj96OOGTO8OBV70KhuFYcIkHXOg0w== + +"@babel/highlight@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.24.7.tgz#a05ab1df134b286558aae0ed41e6c5f731bf409d" + integrity sha512-EStJpq4OuY8xYfhGVXngigBJRWxftKX9ksiGDnmlY3o7B/V7KIAc9X4oiK87uPJSc/vs5L869bem5fhZa8caZw== + dependencies: + "@babel/helper-validator-identifier" "^7.24.7" + chalk "^2.4.2" + js-tokens "^4.0.0" + picocolors "^1.0.0" + +"@esbuild/aix-ppc64@0.23.1": + version "0.23.1" + resolved "https://registry.yarnpkg.com/@esbuild/aix-ppc64/-/aix-ppc64-0.23.1.tgz#51299374de171dbd80bb7d838e1cfce9af36f353" + integrity sha512-6VhYk1diRqrhBAqpJEdjASR/+WVRtfjpqKuNw11cLiaWpAT/Uu+nokB+UJnevzy/P9C/ty6AOe0dwueMrGh/iQ== + +"@esbuild/android-arm64@0.23.1": + version "0.23.1" + resolved "https://registry.yarnpkg.com/@esbuild/android-arm64/-/android-arm64-0.23.1.tgz#58565291a1fe548638adb9c584237449e5e14018" + integrity sha512-xw50ipykXcLstLeWH7WRdQuysJqejuAGPd30vd1i5zSyKK3WE+ijzHmLKxdiCMtH1pHz78rOg0BKSYOSB/2Khw== + +"@esbuild/android-arm@0.23.1": + version "0.23.1" + resolved "https://registry.yarnpkg.com/@esbuild/android-arm/-/android-arm-0.23.1.tgz#5eb8c652d4c82a2421e3395b808e6d9c42c862ee" + integrity sha512-uz6/tEy2IFm9RYOyvKl88zdzZfwEfKZmnX9Cj1BHjeSGNuGLuMD1kR8y5bteYmwqKm1tj8m4cb/aKEorr6fHWQ== + +"@esbuild/android-x64@0.23.1": + version "0.23.1" + resolved "https://registry.yarnpkg.com/@esbuild/android-x64/-/android-x64-0.23.1.tgz#ae19d665d2f06f0f48a6ac9a224b3f672e65d517" + integrity sha512-nlN9B69St9BwUoB+jkyU090bru8L0NA3yFvAd7k8dNsVH8bi9a8cUAUSEcEEgTp2z3dbEDGJGfP6VUnkQnlReg== + +"@esbuild/darwin-arm64@0.23.1": + version "0.23.1" + resolved "https://registry.yarnpkg.com/@esbuild/darwin-arm64/-/darwin-arm64-0.23.1.tgz#05b17f91a87e557b468a9c75e9d85ab10c121b16" + integrity sha512-YsS2e3Wtgnw7Wq53XXBLcV6JhRsEq8hkfg91ESVadIrzr9wO6jJDMZnCQbHm1Guc5t/CdDiFSSfWP58FNuvT3Q== + +"@esbuild/darwin-x64@0.23.1": + version "0.23.1" + resolved "https://registry.yarnpkg.com/@esbuild/darwin-x64/-/darwin-x64-0.23.1.tgz#c58353b982f4e04f0d022284b8ba2733f5ff0931" + integrity sha512-aClqdgTDVPSEGgoCS8QDG37Gu8yc9lTHNAQlsztQ6ENetKEO//b8y31MMu2ZaPbn4kVsIABzVLXYLhCGekGDqw== + +"@esbuild/freebsd-arm64@0.23.1": + version "0.23.1" + resolved "https://registry.yarnpkg.com/@esbuild/freebsd-arm64/-/freebsd-arm64-0.23.1.tgz#f9220dc65f80f03635e1ef96cfad5da1f446f3bc" + integrity sha512-h1k6yS8/pN/NHlMl5+v4XPfikhJulk4G+tKGFIOwURBSFzE8bixw1ebjluLOjfwtLqY0kewfjLSrO6tN2MgIhA== + +"@esbuild/freebsd-x64@0.23.1": + version "0.23.1" + resolved "https://registry.yarnpkg.com/@esbuild/freebsd-x64/-/freebsd-x64-0.23.1.tgz#69bd8511fa013b59f0226d1609ac43f7ce489730" + integrity sha512-lK1eJeyk1ZX8UklqFd/3A60UuZ/6UVfGT2LuGo3Wp4/z7eRTRYY+0xOu2kpClP+vMTi9wKOfXi2vjUpO1Ro76g== + +"@esbuild/linux-arm64@0.23.1": + version "0.23.1" + resolved "https://registry.yarnpkg.com/@esbuild/linux-arm64/-/linux-arm64-0.23.1.tgz#8050af6d51ddb388c75653ef9871f5ccd8f12383" + integrity sha512-/93bf2yxencYDnItMYV/v116zff6UyTjo4EtEQjUBeGiVpMmffDNUyD9UN2zV+V3LRV3/on4xdZ26NKzn6754g== + +"@esbuild/linux-arm@0.23.1": + version "0.23.1" + resolved "https://registry.yarnpkg.com/@esbuild/linux-arm/-/linux-arm-0.23.1.tgz#ecaabd1c23b701070484990db9a82f382f99e771" + integrity sha512-CXXkzgn+dXAPs3WBwE+Kvnrf4WECwBdfjfeYHpMeVxWE0EceB6vhWGShs6wi0IYEqMSIzdOF1XjQ/Mkm5d7ZdQ== + +"@esbuild/linux-ia32@0.23.1": + version "0.23.1" + resolved "https://registry.yarnpkg.com/@esbuild/linux-ia32/-/linux-ia32-0.23.1.tgz#3ed2273214178109741c09bd0687098a0243b333" + integrity sha512-VTN4EuOHwXEkXzX5nTvVY4s7E/Krz7COC8xkftbbKRYAl96vPiUssGkeMELQMOnLOJ8k3BY1+ZY52tttZnHcXQ== + +"@esbuild/linux-loong64@0.23.1": + version "0.23.1" + resolved "https://registry.yarnpkg.com/@esbuild/linux-loong64/-/linux-loong64-0.23.1.tgz#a0fdf440b5485c81b0fbb316b08933d217f5d3ac" + integrity sha512-Vx09LzEoBa5zDnieH8LSMRToj7ir/Jeq0Gu6qJ/1GcBq9GkfoEAoXvLiW1U9J1qE/Y/Oyaq33w5p2ZWrNNHNEw== + +"@esbuild/linux-mips64el@0.23.1": + version "0.23.1" + resolved "https://registry.yarnpkg.com/@esbuild/linux-mips64el/-/linux-mips64el-0.23.1.tgz#e11a2806346db8375b18f5e104c5a9d4e81807f6" + integrity sha512-nrFzzMQ7W4WRLNUOU5dlWAqa6yVeI0P78WKGUo7lg2HShq/yx+UYkeNSE0SSfSure0SqgnsxPvmAUu/vu0E+3Q== + +"@esbuild/linux-ppc64@0.23.1": + version "0.23.1" + resolved "https://registry.yarnpkg.com/@esbuild/linux-ppc64/-/linux-ppc64-0.23.1.tgz#06a2744c5eaf562b1a90937855b4d6cf7c75ec96" + integrity sha512-dKN8fgVqd0vUIjxuJI6P/9SSSe/mB9rvA98CSH2sJnlZ/OCZWO1DJvxj8jvKTfYUdGfcq2dDxoKaC6bHuTlgcw== + +"@esbuild/linux-riscv64@0.23.1": + version "0.23.1" + resolved "https://registry.yarnpkg.com/@esbuild/linux-riscv64/-/linux-riscv64-0.23.1.tgz#65b46a2892fc0d1af4ba342af3fe0fa4a8fe08e7" + integrity sha512-5AV4Pzp80fhHL83JM6LoA6pTQVWgB1HovMBsLQ9OZWLDqVY8MVobBXNSmAJi//Csh6tcY7e7Lny2Hg1tElMjIA== + +"@esbuild/linux-s390x@0.23.1": + version "0.23.1" + resolved "https://registry.yarnpkg.com/@esbuild/linux-s390x/-/linux-s390x-0.23.1.tgz#e71ea18c70c3f604e241d16e4e5ab193a9785d6f" + integrity sha512-9ygs73tuFCe6f6m/Tb+9LtYxWR4c9yg7zjt2cYkjDbDpV/xVn+68cQxMXCjUpYwEkze2RcU/rMnfIXNRFmSoDw== + +"@esbuild/linux-x64@0.23.1": + version "0.23.1" + resolved "https://registry.yarnpkg.com/@esbuild/linux-x64/-/linux-x64-0.23.1.tgz#d47f97391e80690d4dfe811a2e7d6927ad9eed24" + integrity sha512-EV6+ovTsEXCPAp58g2dD68LxoP/wK5pRvgy0J/HxPGB009omFPv3Yet0HiaqvrIrgPTBuC6wCH1LTOY91EO5hQ== + +"@esbuild/netbsd-x64@0.23.1": + version "0.23.1" + resolved "https://registry.yarnpkg.com/@esbuild/netbsd-x64/-/netbsd-x64-0.23.1.tgz#44e743c9778d57a8ace4b72f3c6b839a3b74a653" + integrity sha512-aevEkCNu7KlPRpYLjwmdcuNz6bDFiE7Z8XC4CPqExjTvrHugh28QzUXVOZtiYghciKUacNktqxdpymplil1beA== + +"@esbuild/openbsd-arm64@0.23.1": + version "0.23.1" + resolved "https://registry.yarnpkg.com/@esbuild/openbsd-arm64/-/openbsd-arm64-0.23.1.tgz#05c5a1faf67b9881834758c69f3e51b7dee015d7" + integrity sha512-3x37szhLexNA4bXhLrCC/LImN/YtWis6WXr1VESlfVtVeoFJBRINPJ3f0a/6LV8zpikqoUg4hyXw0sFBt5Cr+Q== + +"@esbuild/openbsd-x64@0.23.1": + version "0.23.1" + resolved "https://registry.yarnpkg.com/@esbuild/openbsd-x64/-/openbsd-x64-0.23.1.tgz#2e58ae511bacf67d19f9f2dcd9e8c5a93f00c273" + integrity sha512-aY2gMmKmPhxfU+0EdnN+XNtGbjfQgwZj43k8G3fyrDM/UdZww6xrWxmDkuz2eCZchqVeABjV5BpildOrUbBTqA== + +"@esbuild/sunos-x64@0.23.1": + version "0.23.1" + resolved "https://registry.yarnpkg.com/@esbuild/sunos-x64/-/sunos-x64-0.23.1.tgz#adb022b959d18d3389ac70769cef5a03d3abd403" + integrity sha512-RBRT2gqEl0IKQABT4XTj78tpk9v7ehp+mazn2HbUeZl1YMdaGAQqhapjGTCe7uw7y0frDi4gS0uHzhvpFuI1sA== + +"@esbuild/win32-arm64@0.23.1": + version "0.23.1" + resolved "https://registry.yarnpkg.com/@esbuild/win32-arm64/-/win32-arm64-0.23.1.tgz#84906f50c212b72ec360f48461d43202f4c8b9a2" + integrity sha512-4O+gPR5rEBe2FpKOVyiJ7wNDPA8nGzDuJ6gN4okSA1gEOYZ67N8JPk58tkWtdtPeLz7lBnY6I5L3jdsr3S+A6A== + +"@esbuild/win32-ia32@0.23.1": + version "0.23.1" + resolved "https://registry.yarnpkg.com/@esbuild/win32-ia32/-/win32-ia32-0.23.1.tgz#5e3eacc515820ff729e90d0cb463183128e82fac" + integrity sha512-BcaL0Vn6QwCwre3Y717nVHZbAa4UBEigzFm6VdsVdT/MbZ38xoj1X9HPkZhbmaBGUD1W8vxAfffbDe8bA6AKnQ== + +"@esbuild/win32-x64@0.23.1": + version "0.23.1" + resolved "https://registry.yarnpkg.com/@esbuild/win32-x64/-/win32-x64-0.23.1.tgz#81fd50d11e2c32b2d6241470e3185b70c7b30699" + integrity sha512-BHpFFeslkWrXWyUPnbKm+xYYVYruCinGcftSBaa8zoF9hZO4BcSCFUvHVTtzpIY6YzUnYtuEhZ+C9iEXjxnasg== + +"@nodelib/fs.scandir@2.1.5": + version "2.1.5" + resolved "https://registry.yarnpkg.com/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz#7619c2eb21b25483f6d167548b4cfd5a7488c3d5" + integrity sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g== + dependencies: + "@nodelib/fs.stat" "2.0.5" + run-parallel "^1.1.9" + +"@nodelib/fs.stat@2.0.5", "@nodelib/fs.stat@^2.0.2": + version "2.0.5" + resolved "https://registry.yarnpkg.com/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz#5bd262af94e9d25bd1e71b05deed44876a222e8b" + integrity sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A== + +"@nodelib/fs.walk@^1.2.3": + version "1.2.8" + resolved "https://registry.yarnpkg.com/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz#e95737e8bb6746ddedf69c556953494f196fe69a" + integrity sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg== + dependencies: + "@nodelib/fs.scandir" "2.1.5" + fastq "^1.6.0" + +"@types/parse-json@^4.0.0": + version "4.0.2" + resolved "https://registry.yarnpkg.com/@types/parse-json/-/parse-json-4.0.2.tgz#5950e50960793055845e956c427fc2b0d70c5239" + integrity sha512-dISoDXWWQwUquiKsyZ4Ng+HX2KsPL7LyHKHQwgGFEA3IaKac4Obd+h2a/a6waisAoepJlBcx9paWqjA8/HVjCw== + +aggregate-error@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/aggregate-error/-/aggregate-error-3.1.0.tgz#92670ff50f5359bdb7a3e0d40d0ec30c5737687a" + integrity sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA== + dependencies: + clean-stack "^2.0.0" + indent-string "^4.0.0" + +ansi-colors@^4.1.1: + version "4.1.3" + resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-4.1.3.tgz#37611340eb2243e70cc604cad35d63270d48781b" + integrity sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw== + +ansi-escapes@^4.3.0: + version "4.3.2" + resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-4.3.2.tgz#6b2291d1db7d98b6521d5f1efa42d0f3a9feb65e" + integrity sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ== + dependencies: + type-fest "^0.21.3" + +ansi-regex@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304" + integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ== + +ansi-styles@^3.2.1: + version "3.2.1" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" + integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA== + dependencies: + color-convert "^1.9.0" + +ansi-styles@^4.0.0, ansi-styles@^4.1.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937" + integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== + dependencies: + color-convert "^2.0.1" + +anymatch@~3.1.2: + version "3.1.3" + resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.3.tgz#790c58b19ba1720a84205b57c618d5ad8524973e" + integrity sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw== + dependencies: + normalize-path "^3.0.0" + picomatch "^2.0.4" + +array-union@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/array-union/-/array-union-2.1.0.tgz#b798420adbeb1de828d84acd8a2e23d3efe85e8d" + integrity sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw== + +astral-regex@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/astral-regex/-/astral-regex-2.0.0.tgz#483143c567aeed4785759c0865786dc77d7d2e31" + integrity sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ== + +binary-extensions@^2.0.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.3.0.tgz#f6e14a97858d327252200242d4ccfe522c445522" + integrity sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw== + +braces@^3.0.3, braces@~3.0.2: + version "3.0.3" + resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.3.tgz#490332f40919452272d55a8480adc0c441358789" + integrity sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA== + dependencies: + fill-range "^7.1.1" + +callsites@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/callsites/-/callsites-3.1.0.tgz#b3630abd8943432f54b3f0519238e33cd7df2f73" + integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ== + +chalk@^2.4.2: + version "2.4.2" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" + integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== + dependencies: + ansi-styles "^3.2.1" + escape-string-regexp "^1.0.5" + supports-color "^5.3.0" + +chalk@^4.0.0: + version "4.1.2" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01" + integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== + dependencies: + ansi-styles "^4.1.0" + supports-color "^7.1.0" + +chokidar@^3.5.3: + version "3.6.0" + resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.6.0.tgz#197c6cc669ef2a8dc5e7b4d97ee4e092c3eb0d5b" + integrity sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw== + dependencies: + anymatch "~3.1.2" + braces "~3.0.2" + glob-parent "~5.1.2" + is-binary-path "~2.1.0" + is-glob "~4.0.1" + normalize-path "~3.0.0" + readdirp "~3.6.0" + optionalDependencies: + fsevents "~2.3.2" + +ci-info@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-2.0.0.tgz#67a9e964be31a51e15e5010d58e6f12834002f46" + integrity sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ== + +clean-stack@^2.0.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/clean-stack/-/clean-stack-2.2.0.tgz#ee8472dbb129e727b31e8a10a427dee9dfe4008b" + integrity sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A== + +cli-cursor@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-3.1.0.tgz#264305a7ae490d1d03bf0c9ba7c925d1753af307" + integrity sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw== + dependencies: + restore-cursor "^3.1.0" + +cli-truncate@2.1.0, cli-truncate@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/cli-truncate/-/cli-truncate-2.1.0.tgz#c39e28bf05edcde5be3b98992a22deed5a2b93c7" + integrity sha512-n8fOixwDD6b/ObinzTrp1ZKFzbgvKZvuz/TvejnLn1aQfC6r52XEx85FmuC+3HI+JM7coBRXUvNqEU2PHVrHpg== + dependencies: + slice-ansi "^3.0.0" + string-width "^4.2.0" + +color-convert@^1.9.0: + version "1.9.3" + resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8" + integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg== + dependencies: + color-name "1.1.3" + +color-convert@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3" + integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ== + dependencies: + color-name "~1.1.4" + +color-name@1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" + integrity sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw== + +color-name@~1.1.4: + version "1.1.4" + resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" + integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== + +colorette@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/colorette/-/colorette-1.4.0.tgz#5190fbb87276259a86ad700bff2c6d6faa3fca40" + integrity sha512-Y2oEozpomLn7Q3HFP7dpww7AtMJplbM9lGZP6RDfHqmbeRjiwRg4n6VM6j4KLmRke85uWEI7JqF17f3pqdRA0g== + +colorette@^2.0.16: + version "2.0.20" + resolved "https://registry.yarnpkg.com/colorette/-/colorette-2.0.20.tgz#9eb793e6833067f7235902fcd3b09917a000a95a" + integrity sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w== + +commander@^8.2.0: + version "8.3.0" + resolved "https://registry.yarnpkg.com/commander/-/commander-8.3.0.tgz#4837ea1b2da67b9c616a67afbb0fafee567bca66" + integrity sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww== + +commander@^9.0.0: + version "9.5.0" + resolved "https://registry.yarnpkg.com/commander/-/commander-9.5.0.tgz#bc08d1eb5cedf7ccb797a96199d41c7bc3e60d30" + integrity sha512-KRs7WVDKg86PWiuAqhDrAQnTXZKraVcCc6vFdL14qrZ/DcWwuRo7VoiYXalXO7S5GKpqYiVEwCbgFDfxNHKJBQ== + +compare-versions@^3.6.0: + version "3.6.0" + resolved "https://registry.yarnpkg.com/compare-versions/-/compare-versions-3.6.0.tgz#1a5689913685e5a87637b8d3ffca75514ec41d62" + integrity sha512-W6Af2Iw1z4CB7q4uU4hv646dW9GQuBM+YpC0UvUCWSD8w90SJjp+ujJuXaEMtAXBtSqGfMPuFOVn4/+FlaqfBA== + +cosmiconfig@^7.0.0, cosmiconfig@^7.0.1: + version "7.1.0" + resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-7.1.0.tgz#1443b9afa596b670082ea46cbd8f6a62b84635f6" + integrity sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA== + dependencies: + "@types/parse-json" "^4.0.0" + import-fresh "^3.2.1" + parse-json "^5.0.0" + path-type "^4.0.0" + yaml "^1.10.0" + +cross-spawn@^7.0.3: + version "7.0.3" + resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6" + integrity sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w== + dependencies: + path-key "^3.1.0" + shebang-command "^2.0.0" + which "^2.0.1" + +debug@^4.3.2: + version "4.3.7" + resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.7.tgz#87945b4151a011d76d95a198d7111c865c360a52" + integrity sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ== + dependencies: + ms "^2.1.3" + +dir-glob@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/dir-glob/-/dir-glob-3.0.1.tgz#56dbf73d992a4a93ba1584f4534063fd2e41717f" + integrity sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA== + dependencies: + path-type "^4.0.0" + +emoji-regex@^8.0.0: + version "8.0.0" + resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37" + integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== + +enquirer@^2.3.6: + version "2.4.1" + resolved "https://registry.yarnpkg.com/enquirer/-/enquirer-2.4.1.tgz#93334b3fbd74fc7097b224ab4a8fb7e40bf4ae56" + integrity sha512-rRqJg/6gd538VHvR3PSrdRBb/1Vy2YfzHqzvbhGIQpDRKIa4FgV/54b5Q1xYSxOOwKvjXweS26E0Q+nAMwp2pQ== + dependencies: + ansi-colors "^4.1.1" + strip-ansi "^6.0.1" + +error-ex@^1.3.1: + version "1.3.2" + resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.2.tgz#b4ac40648107fdcdcfae242f428bea8a14d4f1bf" + integrity sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g== + dependencies: + is-arrayish "^0.2.1" + +esbuild@~0.23.0: + version "0.23.1" + resolved "https://registry.yarnpkg.com/esbuild/-/esbuild-0.23.1.tgz#40fdc3f9265ec0beae6f59824ade1bd3d3d2dab8" + integrity sha512-VVNz/9Sa0bs5SELtn3f7qhJCDPCF5oMEl5cO9/SSinpE9hbPVvxbd572HH5AKiP7WD8INO53GgfDDhRjkylHEg== + optionalDependencies: + "@esbuild/aix-ppc64" "0.23.1" + "@esbuild/android-arm" "0.23.1" + "@esbuild/android-arm64" "0.23.1" + "@esbuild/android-x64" "0.23.1" + "@esbuild/darwin-arm64" "0.23.1" + "@esbuild/darwin-x64" "0.23.1" + "@esbuild/freebsd-arm64" "0.23.1" + "@esbuild/freebsd-x64" "0.23.1" + "@esbuild/linux-arm" "0.23.1" + "@esbuild/linux-arm64" "0.23.1" + "@esbuild/linux-ia32" "0.23.1" + "@esbuild/linux-loong64" "0.23.1" + "@esbuild/linux-mips64el" "0.23.1" + "@esbuild/linux-ppc64" "0.23.1" + "@esbuild/linux-riscv64" "0.23.1" + "@esbuild/linux-s390x" "0.23.1" + "@esbuild/linux-x64" "0.23.1" + "@esbuild/netbsd-x64" "0.23.1" + "@esbuild/openbsd-arm64" "0.23.1" + "@esbuild/openbsd-x64" "0.23.1" + "@esbuild/sunos-x64" "0.23.1" + "@esbuild/win32-arm64" "0.23.1" + "@esbuild/win32-ia32" "0.23.1" + "@esbuild/win32-x64" "0.23.1" + +escape-string-regexp@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" + integrity sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg== + +execa@^5.1.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/execa/-/execa-5.1.1.tgz#f80ad9cbf4298f7bd1d4c9555c21e93741c411dd" + integrity sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg== + dependencies: + cross-spawn "^7.0.3" + get-stream "^6.0.0" + human-signals "^2.1.0" + is-stream "^2.0.0" + merge-stream "^2.0.0" + npm-run-path "^4.0.1" + onetime "^5.1.2" + signal-exit "^3.0.3" + strip-final-newline "^2.0.0" + +fast-glob@^3.2.9: + version "3.3.2" + resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.3.2.tgz#a904501e57cfdd2ffcded45e99a54fef55e46129" + integrity sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow== + dependencies: + "@nodelib/fs.stat" "^2.0.2" + "@nodelib/fs.walk" "^1.2.3" + glob-parent "^5.1.2" + merge2 "^1.3.0" + micromatch "^4.0.4" + +fastq@^1.6.0: + version "1.17.1" + resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.17.1.tgz#2a523f07a4e7b1e81a42b91b8bf2254107753b47" + integrity sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w== + dependencies: + reusify "^1.0.4" + +fill-range@^7.1.1: + version "7.1.1" + resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.1.1.tgz#44265d3cac07e3ea7dc247516380643754a05292" + integrity sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg== + dependencies: + to-regex-range "^5.0.1" + +find-up@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/find-up/-/find-up-5.0.0.tgz#4c92819ecb7083561e4f4a240a86be5198f536fc" + integrity sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng== + dependencies: + locate-path "^6.0.0" + path-exists "^4.0.0" + +find-versions@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/find-versions/-/find-versions-4.0.0.tgz#3c57e573bf97769b8cb8df16934b627915da4965" + integrity sha512-wgpWy002tA+wgmO27buH/9KzyEOQnKsG/R0yrcjPT9BOFm0zRBVQbZ95nRGXWMywS8YR5knRbpohio0bcJABxQ== + dependencies: + semver-regex "^3.1.2" + +fsevents@~2.3.2, fsevents@~2.3.3: + version "2.3.3" + resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.3.tgz#cac6407785d03675a2a5e1a5305c697b347d90d6" + integrity sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw== + +get-own-enumerable-property-symbols@^3.0.0: + version "3.0.2" + resolved "https://registry.yarnpkg.com/get-own-enumerable-property-symbols/-/get-own-enumerable-property-symbols-3.0.2.tgz#b5fde77f22cbe35f390b4e089922c50bce6ef664" + integrity sha512-I0UBV/XOz1XkIJHEUDMZAbzCThU/H8DxmSfmdGcKPnVhu2VfFqr34jr9777IyaTYvxjedWhqVIilEDsCdP5G6g== + +get-stream@^6.0.0: + version "6.0.1" + resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-6.0.1.tgz#a262d8eef67aced57c2852ad6167526a43cbf7b7" + integrity sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg== + +get-tsconfig@^4.7.5: + version "4.8.1" + resolved "https://registry.yarnpkg.com/get-tsconfig/-/get-tsconfig-4.8.1.tgz#8995eb391ae6e1638d251118c7b56de7eb425471" + integrity sha512-k9PN+cFBmaLWtVz29SkUoqU5O0slLuHJXt/2P+tMVFT+phsSGXGkp9t3rQIqdz0e+06EHNGs3oM6ZX1s2zHxRg== + dependencies: + resolve-pkg-maps "^1.0.0" + +glob-parent@^5.1.2, glob-parent@~5.1.2: + version "5.1.2" + resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4" + integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== + dependencies: + is-glob "^4.0.1" + +globby@^11.0.4: + version "11.1.0" + resolved "https://registry.yarnpkg.com/globby/-/globby-11.1.0.tgz#bd4be98bb042f83d796f7e3811991fbe82a0d34b" + integrity sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g== + dependencies: + array-union "^2.1.0" + dir-glob "^3.0.1" + fast-glob "^3.2.9" + ignore "^5.2.0" + merge2 "^1.4.1" + slash "^3.0.0" + +has-flag@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" + integrity sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw== + +has-flag@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" + integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== + +human-signals@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-2.1.0.tgz#dc91fcba42e4d06e4abaed33b3e7a3c02f514ea0" + integrity sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw== + +husky@^4.3.8: + version "4.3.8" + resolved "https://registry.yarnpkg.com/husky/-/husky-4.3.8.tgz#31144060be963fd6850e5cc8f019a1dfe194296d" + integrity sha512-LCqqsB0PzJQ/AlCgfrfzRe3e3+NvmefAdKQhRYpxS4u6clblBoDdzzvHi8fmxKRzvMxPY/1WZWzomPZww0Anow== + dependencies: + chalk "^4.0.0" + ci-info "^2.0.0" + compare-versions "^3.6.0" + cosmiconfig "^7.0.0" + find-versions "^4.0.0" + opencollective-postinstall "^2.0.2" + pkg-dir "^5.0.0" + please-upgrade-node "^3.2.0" + slash "^3.0.0" + which-pm-runs "^1.0.0" + +ignore@^5.2.0: + version "5.3.2" + resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.3.2.tgz#3cd40e729f3643fd87cb04e50bf0eb722bc596f5" + integrity sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g== + +import-fresh@^3.2.1: + version "3.3.0" + resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.3.0.tgz#37162c25fcb9ebaa2e6e53d5b4d88ce17d9e0c2b" + integrity sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw== + dependencies: + parent-module "^1.0.0" + resolve-from "^4.0.0" + +indent-string@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-4.0.0.tgz#624f8f4497d619b2d9768531d58f4122854d7251" + integrity sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg== + +is-arrayish@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" + integrity sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg== + +is-binary-path@~2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-2.1.0.tgz#ea1f7f3b80f064236e83470f86c09c254fb45b09" + integrity sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw== + dependencies: + binary-extensions "^2.0.0" + +is-extglob@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" + integrity sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ== + +is-fullwidth-code-point@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d" + integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== + +is-glob@^4.0.1, is-glob@~4.0.1: + version "4.0.3" + resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.3.tgz#64f61e42cbbb2eec2071a9dac0b28ba1e65d5084" + integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg== + dependencies: + is-extglob "^2.1.1" + +is-number@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" + integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== + +is-obj@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-obj/-/is-obj-1.0.1.tgz#3e4729ac1f5fde025cd7d83a896dab9f4f67db0f" + integrity sha512-l4RyHgRqGN4Y3+9JHVrNqO+tN0rV5My76uW5/nuO4K1b6vw5G8d/cmFjP9tRfEsdhZNt0IFdZuK/c2Vr4Nb+Qg== + +is-regexp@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-regexp/-/is-regexp-1.0.0.tgz#fd2d883545c46bac5a633e7b9a09e87fa2cb5069" + integrity sha512-7zjFAPO4/gwyQAAgRRmqeEeyIICSdmCqa3tsVHMdBzaXXRiqopZL4Cyghg/XulGWrtABTpbnYYzzIRffLkP4oA== + +is-stream@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-2.0.1.tgz#fac1e3d53b97ad5a9d0ae9cef2389f5810a5c077" + integrity sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg== + +isexe@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" + integrity sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw== + +js-tokens@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" + integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== + +json-parse-even-better-errors@^2.3.0: + version "2.3.1" + resolved "https://registry.yarnpkg.com/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz#7c47805a94319928e05777405dc12e1f7a4ee02d" + integrity sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w== + +keycloakify@^11.2.0: + version "11.2.0" + resolved "https://registry.yarnpkg.com/keycloakify/-/keycloakify-11.2.0.tgz#8f00bb1240d18d09202c8d4bff5a1e92d7bfb049" + integrity sha512-8DnU5F6DmtCUKXOhApAm1/5E0ewGYCn3YNy5TKP6zHBpCEIlHNZ6i0lrGQj10rlmwwaOwPEDVNpOZTKZDsHp7Q== + dependencies: + tsafe "^1.6.6" + +lines-and-columns@^1.1.6: + version "1.2.4" + resolved "https://registry.yarnpkg.com/lines-and-columns/-/lines-and-columns-1.2.4.tgz#eca284f75d2965079309dc0ad9255abb2ebc1632" + integrity sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg== + +lint-staged@^11.0.0: + version "11.2.6" + resolved "https://registry.yarnpkg.com/lint-staged/-/lint-staged-11.2.6.tgz#f477b1af0294db054e5937f171679df63baa4c43" + integrity sha512-Vti55pUnpvPE0J9936lKl0ngVeTdSZpEdTNhASbkaWX7J5R9OEifo1INBGQuGW4zmy6OG+TcWPJ3m5yuy5Q8Tg== + dependencies: + cli-truncate "2.1.0" + colorette "^1.4.0" + commander "^8.2.0" + cosmiconfig "^7.0.1" + debug "^4.3.2" + enquirer "^2.3.6" + execa "^5.1.1" + listr2 "^3.12.2" + micromatch "^4.0.4" + normalize-path "^3.0.0" + please-upgrade-node "^3.2.0" + string-argv "0.3.1" + stringify-object "3.3.0" + supports-color "8.1.1" + +listr2@^3.12.2: + version "3.14.0" + resolved "https://registry.yarnpkg.com/listr2/-/listr2-3.14.0.tgz#23101cc62e1375fd5836b248276d1d2b51fdbe9e" + integrity sha512-TyWI8G99GX9GjE54cJ+RrNMcIFBfwMPxc3XTFiAYGN4s10hWROGtOg7+O6u6LE3mNkyld7RSLE6nrKBvTfcs3g== + dependencies: + cli-truncate "^2.1.0" + colorette "^2.0.16" + log-update "^4.0.0" + p-map "^4.0.0" + rfdc "^1.3.0" + rxjs "^7.5.1" + through "^2.3.8" + wrap-ansi "^7.0.0" + +locate-path@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-6.0.0.tgz#55321eb309febbc59c4801d931a72452a681d286" + integrity sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw== + dependencies: + p-locate "^5.0.0" + +log-update@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/log-update/-/log-update-4.0.0.tgz#589ecd352471f2a1c0c570287543a64dfd20e0a1" + integrity sha512-9fkkDevMefjg0mmzWFBW8YkFP91OrizzkW3diF7CpG+S2EYdy4+TVfGwz1zeF8x7hCx1ovSPTOE9Ngib74qqUg== + dependencies: + ansi-escapes "^4.3.0" + cli-cursor "^3.1.0" + slice-ansi "^4.0.0" + wrap-ansi "^6.2.0" + +merge-stream@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/merge-stream/-/merge-stream-2.0.0.tgz#52823629a14dd00c9770fb6ad47dc6310f2c1f60" + integrity sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w== + +merge2@^1.3.0, merge2@^1.4.1: + version "1.4.1" + resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.4.1.tgz#4368892f885e907455a6fd7dc55c0c9d404990ae" + integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg== + +micromatch@^4.0.4: + version "4.0.8" + resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.8.tgz#d66fa18f3a47076789320b9b1af32bd86d9fa202" + integrity sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA== + dependencies: + braces "^3.0.3" + picomatch "^2.3.1" + +mimic-fn@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b" + integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg== + +ms@^2.1.3: + version "2.1.3" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" + integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== + +mylas@^2.1.9: + version "2.1.13" + resolved "https://registry.yarnpkg.com/mylas/-/mylas-2.1.13.tgz#1e23b37d58fdcc76e15d8a5ed23f9ae9fc0cbdf4" + integrity sha512-+MrqnJRtxdF+xngFfUUkIMQrUUL0KsxbADUkn23Z/4ibGg192Q+z+CQyiYwvWTsYjJygmMR8+w3ZDa98Zh6ESg== + +normalize-path@^3.0.0, normalize-path@~3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" + integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== + +npm-run-path@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-4.0.1.tgz#b7ecd1e5ed53da8e37a55e1c2269e0b97ed748ea" + integrity sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw== + dependencies: + path-key "^3.0.0" + +onetime@^5.1.0, onetime@^5.1.2: + version "5.1.2" + resolved "https://registry.yarnpkg.com/onetime/-/onetime-5.1.2.tgz#d0e96ebb56b07476df1dd9c4806e5237985ca45e" + integrity sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg== + dependencies: + mimic-fn "^2.1.0" + +opencollective-postinstall@^2.0.2: + version "2.0.3" + resolved "https://registry.yarnpkg.com/opencollective-postinstall/-/opencollective-postinstall-2.0.3.tgz#7a0fff978f6dbfa4d006238fbac98ed4198c3259" + integrity sha512-8AV/sCtuzUeTo8gQK5qDZzARrulB3egtLzFgteqB2tcT4Mw7B8Kt7JcDHmltjz6FOAHsvTevk70gZEbhM4ZS9Q== + +p-limit@^3.0.2: + version "3.1.0" + resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-3.1.0.tgz#e1daccbe78d0d1388ca18c64fea38e3e57e3706b" + integrity sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ== + dependencies: + yocto-queue "^0.1.0" + +p-locate@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-5.0.0.tgz#83c8315c6785005e3bd021839411c9e110e6d834" + integrity sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw== + dependencies: + p-limit "^3.0.2" + +p-map@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/p-map/-/p-map-4.0.0.tgz#bb2f95a5eda2ec168ec9274e06a747c3e2904d2b" + integrity sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ== + dependencies: + aggregate-error "^3.0.0" + +parent-module@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/parent-module/-/parent-module-1.0.1.tgz#691d2709e78c79fae3a156622452d00762caaaa2" + integrity sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g== + dependencies: + callsites "^3.0.0" + +parse-json@^5.0.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-5.2.0.tgz#c76fc66dee54231c962b22bcc8a72cf2f99753cd" + integrity sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg== + dependencies: + "@babel/code-frame" "^7.0.0" + error-ex "^1.3.1" + json-parse-even-better-errors "^2.3.0" + lines-and-columns "^1.1.6" + +path-exists@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-4.0.0.tgz#513bdbe2d3b95d7762e8c1137efa195c6c61b5b3" + integrity sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w== + +path-key@^3.0.0, path-key@^3.1.0: + version "3.1.1" + resolved "https://registry.yarnpkg.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375" + integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== + +path-type@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/path-type/-/path-type-4.0.0.tgz#84ed01c0a7ba380afe09d90a8c180dcd9d03043b" + integrity sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw== + +picocolors@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.1.0.tgz#5358b76a78cde483ba5cef6a9dc9671440b27d59" + integrity sha512-TQ92mBOW0l3LeMeyLV6mzy/kWr8lkd/hp3mTg7wYK7zJhuBStmGMBG0BdeDZS/dZx1IukaX6Bk11zcln25o1Aw== + +picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.3.1: + version "2.3.1" + resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42" + integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== + +pkg-dir@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-5.0.0.tgz#a02d6aebe6ba133a928f74aec20bafdfe6b8e760" + integrity sha512-NPE8TDbzl/3YQYY7CSS228s3g2ollTFnc+Qi3tqmqJp9Vg2ovUpixcJEo2HJScN2Ez+kEaal6y70c0ehqJBJeA== + dependencies: + find-up "^5.0.0" + +please-upgrade-node@^3.2.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/please-upgrade-node/-/please-upgrade-node-3.2.0.tgz#aeddd3f994c933e4ad98b99d9a556efa0e2fe942" + integrity sha512-gQR3WpIgNIKwBMVLkpMUeR3e1/E1y42bqDQZfql+kDeXd8COYfM8PQA4X6y7a8u9Ua9FHmsrrmirW2vHs45hWg== + dependencies: + semver-compare "^1.0.0" + +plimit-lit@^1.2.6: + version "1.6.1" + resolved "https://registry.yarnpkg.com/plimit-lit/-/plimit-lit-1.6.1.tgz#a34594671b31ee8e93c72d505dfb6852eb72374a" + integrity sha512-B7+VDyb8Tl6oMJT9oSO2CW8XC/T4UcJGrwOVoNGwOQsQYhlpfajmrMj5xeejqaASq3V/EqThyOeATEOMuSEXiA== + dependencies: + queue-lit "^1.5.1" + +prettier@^3.2.5: + version "3.3.3" + resolved "https://registry.yarnpkg.com/prettier/-/prettier-3.3.3.tgz#30c54fe0be0d8d12e6ae61dbb10109ea00d53105" + integrity sha512-i2tDNA0O5IrMO757lfrdQZCc2jPNDVntV0m/+4whiDfWaTKfMNgR7Qz0NAeGz/nRqF4m5/6CLzbP4/liHt12Ew== + +queue-lit@^1.5.1: + version "1.5.2" + resolved "https://registry.yarnpkg.com/queue-lit/-/queue-lit-1.5.2.tgz#83c24d4f4764802377b05a6e5c73017caf3f8747" + integrity sha512-tLc36IOPeMAubu8BkW8YDBV+WyIgKlYU7zUNs0J5Vk9skSZ4JfGlPOqplP0aHdfv7HL0B2Pg6nwiq60Qc6M2Hw== + +queue-microtask@^1.2.2: + version "1.2.3" + resolved "https://registry.yarnpkg.com/queue-microtask/-/queue-microtask-1.2.3.tgz#4929228bbc724dfac43e0efb058caf7b6cfb6243" + integrity sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A== + +readdirp@~3.6.0: + version "3.6.0" + resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.6.0.tgz#74a370bd857116e245b29cc97340cd431a02a6c7" + integrity sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA== + dependencies: + picomatch "^2.2.1" + +resolve-from@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-4.0.0.tgz#4abcd852ad32dd7baabfe9b40e00a36db5f392e6" + integrity sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g== + +resolve-pkg-maps@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/resolve-pkg-maps/-/resolve-pkg-maps-1.0.0.tgz#616b3dc2c57056b5588c31cdf4b3d64db133720f" + integrity sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw== + +restore-cursor@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-3.1.0.tgz#39f67c54b3a7a58cea5236d95cf0034239631f7e" + integrity sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA== + dependencies: + onetime "^5.1.0" + signal-exit "^3.0.2" + +reusify@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/reusify/-/reusify-1.0.4.tgz#90da382b1e126efc02146e90845a88db12925d76" + integrity sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw== + +rfdc@^1.3.0: + version "1.4.1" + resolved "https://registry.yarnpkg.com/rfdc/-/rfdc-1.4.1.tgz#778f76c4fb731d93414e8f925fbecf64cce7f6ca" + integrity sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA== + +run-parallel@^1.1.9: + version "1.2.0" + resolved "https://registry.yarnpkg.com/run-parallel/-/run-parallel-1.2.0.tgz#66d1368da7bdf921eb9d95bd1a9229e7f21a43ee" + integrity sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA== + dependencies: + queue-microtask "^1.2.2" + +rxjs@^7.5.1: + version "7.8.1" + resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-7.8.1.tgz#6f6f3d99ea8044291efd92e7c7fcf562c4057543" + integrity sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg== + dependencies: + tslib "^2.1.0" + +semver-compare@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/semver-compare/-/semver-compare-1.0.0.tgz#0dee216a1c941ab37e9efb1788f6afc5ff5537fc" + integrity sha512-YM3/ITh2MJ5MtzaM429anh+x2jiLVjqILF4m4oyQB18W7Ggea7BfqdH/wGMK7dDiMghv/6WG7znWMwUDzJiXow== + +semver-regex@^3.1.2: + version "3.1.4" + resolved "https://registry.yarnpkg.com/semver-regex/-/semver-regex-3.1.4.tgz#13053c0d4aa11d070a2f2872b6b1e3ae1e1971b4" + integrity sha512-6IiqeZNgq01qGf0TId0t3NvKzSvUsjcpdEO3AQNeIjR6A2+ckTnQlDpl4qu1bjRv0RzN3FP9hzFmws3lKqRWkA== + +shebang-command@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-2.0.0.tgz#ccd0af4f8835fbdc265b82461aaf0c36663f34ea" + integrity sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA== + dependencies: + shebang-regex "^3.0.0" + +shebang-regex@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172" + integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== + +signal-exit@^3.0.2, signal-exit@^3.0.3: + version "3.0.7" + resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.7.tgz#a9a1767f8af84155114eaabd73f99273c8f59ad9" + integrity sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ== + +slash@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/slash/-/slash-3.0.0.tgz#6539be870c165adbd5240220dbe361f1bc4d4634" + integrity sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q== + +slice-ansi@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-3.0.0.tgz#31ddc10930a1b7e0b67b08c96c2f49b77a789787" + integrity sha512-pSyv7bSTC7ig9Dcgbw9AuRNUb5k5V6oDudjZoMBSr13qpLBG7tB+zgCkARjq7xIUgdz5P1Qe8u+rSGdouOOIyQ== + dependencies: + ansi-styles "^4.0.0" + astral-regex "^2.0.0" + is-fullwidth-code-point "^3.0.0" + +slice-ansi@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-4.0.0.tgz#500e8dd0fd55b05815086255b3195adf2a45fe6b" + integrity sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ== + dependencies: + ansi-styles "^4.0.0" + astral-regex "^2.0.0" + is-fullwidth-code-point "^3.0.0" + +string-argv@0.3.1: + version "0.3.1" + resolved "https://registry.yarnpkg.com/string-argv/-/string-argv-0.3.1.tgz#95e2fbec0427ae19184935f816d74aaa4c5c19da" + integrity sha512-a1uQGz7IyVy9YwhqjZIZu1c8JO8dNIe20xBmSS6qu9kv++k3JGzCVmprbNN5Kn+BgzD5E7YYwg1CcjuJMRNsvg== + +string-width@^4.1.0, string-width@^4.2.0: + version "4.2.3" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" + integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== + dependencies: + emoji-regex "^8.0.0" + is-fullwidth-code-point "^3.0.0" + strip-ansi "^6.0.1" + +stringify-object@3.3.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/stringify-object/-/stringify-object-3.3.0.tgz#703065aefca19300d3ce88af4f5b3956d7556629" + integrity sha512-rHqiFh1elqCQ9WPLIC8I0Q/g/wj5J1eMkyoiD6eoQApWHP0FtlK7rqnhmabL5VUY9JQCcqwwvlOaSuutekgyrw== + dependencies: + get-own-enumerable-property-symbols "^3.0.0" + is-obj "^1.0.1" + is-regexp "^1.0.0" + +strip-ansi@^6.0.0, strip-ansi@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" + integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== + dependencies: + ansi-regex "^5.0.1" + +strip-final-newline@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/strip-final-newline/-/strip-final-newline-2.0.0.tgz#89b852fb2fcbe936f6f4b3187afb0a12c1ab58ad" + integrity sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA== + +supports-color@8.1.1: + version "8.1.1" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-8.1.1.tgz#cd6fc17e28500cff56c1b86c0a7fd4a54a73005c" + integrity sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q== + dependencies: + has-flag "^4.0.0" + +supports-color@^5.3.0: + version "5.5.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" + integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow== + dependencies: + has-flag "^3.0.0" + +supports-color@^7.1.0: + version "7.2.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.2.0.tgz#1b7dcdcb32b8138801b3e478ba6a51caa89648da" + integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw== + dependencies: + has-flag "^4.0.0" + +through@^2.3.8: + version "2.3.8" + resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" + integrity sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg== + +to-regex-range@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4" + integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ== + dependencies: + is-number "^7.0.0" + +tsafe@^1.6.6: + version "1.6.6" + resolved "https://registry.yarnpkg.com/tsafe/-/tsafe-1.6.6.tgz#fd93e64d6eb13ef83ed1650669cc24bad4f5df9f" + integrity sha512-gzkapsdbMNwBnTIjgO758GujLCj031IgHK/PKr2mrmkCSJMhSOR5FeOuSxKLMUoYc0vAA4RGEYYbjt/v6afD3g== + +tsc-alias@^1.8.10: + version "1.8.10" + resolved "https://registry.yarnpkg.com/tsc-alias/-/tsc-alias-1.8.10.tgz#279f9bf0dd8bc10fb27820393d4881db5a303938" + integrity sha512-Ibv4KAWfFkFdKJxnWfVtdOmB0Zi1RJVxcbPGiCDsFpCQSsmpWyuzHG3rQyI5YkobWwxFPEyQfu1hdo4qLG2zPw== + dependencies: + chokidar "^3.5.3" + commander "^9.0.0" + globby "^11.0.4" + mylas "^2.1.9" + normalize-path "^3.0.0" + plimit-lit "^1.2.6" + +tslib@^2.1.0: + version "2.7.0" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.7.0.tgz#d9b40c5c40ab59e8738f297df3087bf1a2690c01" + integrity sha512-gLXCKdN1/j47AiHiOkJN69hJmcbGTHI0ImLmbYLHykhgeN0jVGola9yVjFgzCUklsZQMW55o+dW7IXv3RCXDzA== + +tsx@^4.15.5: + version "4.19.1" + resolved "https://registry.yarnpkg.com/tsx/-/tsx-4.19.1.tgz#b7bffdf4b565813e4dea14b90872af279cd0090b" + integrity sha512-0flMz1lh74BR4wOvBjuh9olbnwqCPc35OOlfyzHba0Dc+QNUeWX/Gq2YTbnwcWPO3BMd8fkzRVrHcsR+a7z7rA== + dependencies: + esbuild "~0.23.0" + get-tsconfig "^4.7.5" + optionalDependencies: + fsevents "~2.3.3" + +type-fest@^0.21.3: + version "0.21.3" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.21.3.tgz#d260a24b0198436e133fa26a524a6d65fa3b2e37" + integrity sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w== + +typescript@^4.9.4: + version "4.9.5" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.9.5.tgz#095979f9bcc0d09da324d58d03ce8f8374cbe65a" + integrity sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g== + +which-pm-runs@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/which-pm-runs/-/which-pm-runs-1.1.0.tgz#35ccf7b1a0fce87bd8b92a478c9d045785d3bf35" + integrity sha512-n1brCuqClxfFfq/Rb0ICg9giSZqCS+pLtccdag6C2HyufBrh3fBOiy9nb6ggRMvWOVH5GrdJskj5iGTZNxd7SA== + +which@^2.0.1: + version "2.0.2" + resolved "https://registry.yarnpkg.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1" + integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA== + dependencies: + isexe "^2.0.0" + +wrap-ansi@^6.2.0: + version "6.2.0" + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-6.2.0.tgz#e9393ba07102e6c91a3b221478f0257cd2856e53" + integrity sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA== + dependencies: + ansi-styles "^4.0.0" + string-width "^4.1.0" + strip-ansi "^6.0.0" + +wrap-ansi@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" + integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== + dependencies: + ansi-styles "^4.0.0" + string-width "^4.1.0" + strip-ansi "^6.0.0" + +yaml@^1.10.0: + version "1.10.2" + resolved "https://registry.yarnpkg.com/yaml/-/yaml-1.10.2.tgz#2301c5ffbf12b467de8da2333a459e29e7920e4b" + integrity sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg== + +yocto-queue@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-0.1.0.tgz#0294eb3dee05028d31ee1a5fa2c556a6aaf10a1b" + integrity sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q== From 0ad788b2348dea5e9c3bfb64651d3bfaf5de4521 Mon Sep 17 00:00:00 2001 From: Joseph Garrone Date: Sun, 29 Sep 2024 23:27:06 +0200 Subject: [PATCH 02/64] Repatriate login src --- package.json | 6 +- src/lib/i18n.ts | 9 + src/lib/models/index.ts | 1 + src/lib/models/script.model.ts | 6 + .../keycloakify-angular.providers.ts | 92 + src/lib/public-api.ts | 12 + src/lib/services/i18n.service.ts | 5 + src/lib/services/index.ts | 2 + src/lib/services/resource-injector.service.ts | 50 + src/login/DefaultPage.ts | 208 +++ .../classes/component-reference.class.ts | 5 + ...tons-multi-valued-attribute.component.html | 24 + ...uttons-multi-valued-attribute.component.ts | 144 ++ .../field-errors/field-errors.component.html | 15 + .../field-errors/field-errors.component.ts | 40 + .../group-label/group-label.component.html | 30 + .../group-label/group-label.component.ts | 49 + src/login/components/index.ts | 11 + .../input-field-by-type.component.html | 63 + .../input-field-by-type.component.ts | 63 + .../input-tag-selects.component.html | 29 + .../input-tag-selects.component.ts | 146 ++ .../input-tag/input-tag.component.html | 49 + .../input-tag/input-tag.component.ts | 104 ++ .../logout-other-sessions.component.html | 19 + .../logout-other-sessions.component.ts | 31 + .../password-wrapper.component.html | 15 + .../password-wrapper.component.ts | 61 + .../select-tag/select-tag.component.html | 31 + .../select-tag/select-tag.component.ts | 105 ++ .../textarea-tag/textarea-tag.component.html | 18 + .../textarea-tag/textarea-tag.component.ts | 59 + .../user-profile-form-fields.component.html | 85 + .../user-profile-form-fields.component.ts | 80 + src/login/containers/template.component.html | 203 +++ src/login/containers/template.component.ts | 89 + src/login/directives/attributes.directive.ts | 23 + src/login/directives/index.ts | 2 + src/login/directives/kc-class.directive.ts | 167 ++ src/login/pages/code/code.component.html | 26 + src/login/pages/code/code.component.ts | 27 + .../delete-account-confirm.component.html | 46 + .../delete-account-confirm.component.ts | 28 + .../delete-credential.component.html | 35 + .../delete-credential.component.ts | 39 + src/login/pages/error/error.component.html | 25 + src/login/pages/error/error.component.ts | 27 + .../frontchannel-logout.component.html | 35 + .../frontchannel-logout.component.ts | 45 + .../idp-review-user-profile.component.html | 41 + .../idp-review-user-profile.component.ts | 51 + src/login/pages/info/info.component.html | 54 + src/login/pages/info/info.component.ts | 61 + .../login-config-totp.component.html | 190 +++ .../login-config-totp.component.ts | 53 + ...n-idp-link-confirm-override.component.html | 40 + ...gin-idp-link-confirm-override.component.ts | 41 + .../login-idp-link-confirm.component.html | 41 + .../login-idp-link-confirm.component.ts | 39 + .../login-idp-link-email.component.html | 37 + .../login-idp-link-email.component.ts | 39 + .../login-oauth-grant.component.html | 92 + .../login-oauth-grant.component.ts | 40 + ...th2-device-verify-user-code.component.html | 63 + ...auth2-device-verify-user-code.component.ts | 41 + .../pages/login-otp/login-otp.component.html | 103 ++ .../pages/login-otp/login-otp.component.ts | 39 + .../login-page-expired.component.html | 35 + .../login-page-expired.component.ts | 38 + ...ys-conditional-authenticate.component.html | 203 +++ ...keys-conditional-authenticate.component.ts | 96 ++ .../login-password.component.html | 90 + .../login-password.component.ts | 49 + ...-recovery-authn-code-config.component.html | 155 ++ ...in-recovery-authn-code-config.component.ts | 51 + ...n-recovery-authn-code-input.component.html | 76 + ...gin-recovery-authn-code-input.component.ts | 43 + .../login-reset-otp.component.html | 65 + .../login-reset-otp.component.ts | 38 + .../login-reset-password.component.html | 95 ++ .../login-reset-password.component.ts | 40 + .../login-update-password.component.html | 116 ++ .../login-update-password.component.ts | 52 + .../login-update-profile.component.html | 59 + .../login-update-profile.component.ts | 48 + .../login-username.component.html | 161 ++ .../login-username.component.ts | 52 + .../login-verify-email.component.html | 27 + .../login-verify-email.component.ts | 39 + .../login-x509-info.component.html | 102 ++ .../login-x509-info.component.ts | 38 + src/login/pages/login/login.component.html | 212 +++ src/login/pages/login/login.component.ts | 57 + .../logout-confirm.component.html | 59 + .../logout-confirm.component.ts | 38 + .../pages/register/register.component.html | 126 ++ .../pages/register/register.component.ts | 58 + .../saml-post-form.component.html | 51 + .../saml-post-form.component.ts | 54 + .../select-authenticator.component.html | 49 + .../select-authenticator.component.ts | 47 + src/login/pages/terms/terms.component.html | 36 + src/login/pages/terms/terms.component.ts | 38 + .../update-email/update-email.component.html | 58 + .../update-email/update-email.component.ts | 48 + .../webauthn-authenticate.component.html | 162 ++ .../webauthn-authenticate.component.ts | 101 ++ .../webauthn-error.component.html | 60 + .../webauthn-error.component.ts | 53 + .../webauthn-register.component.html | 82 + .../webauthn-register.component.ts | 101 ++ src/login/pipes/advanced-msg-str.pipe.ts | 13 + src/login/pipes/index.ts | 6 + src/login/pipes/input-type.pipe.ts | 15 + src/login/pipes/kc-sanitize.pipe.ts | 36 + src/login/pipes/msg-str.pipe.ts | 14 + src/login/pipes/to-array.pipe.ts | 15 + src/login/pipes/to-number.pipe.ts | 13 + src/login/services/index.ts | 2 + .../login-resource-injector.service.ts | 71 + .../services/user-profile-form.service.ts | 1500 +++++++++++++++++ yarn.lock | 9 +- 122 files changed, 8498 insertions(+), 3 deletions(-) create mode 100644 src/lib/i18n.ts create mode 100644 src/lib/models/index.ts create mode 100644 src/lib/models/script.model.ts create mode 100644 src/lib/providers/keycloakify-angular.providers.ts create mode 100644 src/lib/public-api.ts create mode 100644 src/lib/services/i18n.service.ts create mode 100644 src/lib/services/index.ts create mode 100644 src/lib/services/resource-injector.service.ts create mode 100644 src/login/DefaultPage.ts create mode 100644 src/login/classes/component-reference.class.ts create mode 100644 src/login/components/add-remove-buttons-multi-valued-attribute/add-remove-buttons-multi-valued-attribute.component.html create mode 100644 src/login/components/add-remove-buttons-multi-valued-attribute/add-remove-buttons-multi-valued-attribute.component.ts create mode 100644 src/login/components/field-errors/field-errors.component.html create mode 100644 src/login/components/field-errors/field-errors.component.ts create mode 100644 src/login/components/group-label/group-label.component.html create mode 100644 src/login/components/group-label/group-label.component.ts create mode 100644 src/login/components/index.ts create mode 100644 src/login/components/input-field-by-type/input-field-by-type.component.html create mode 100644 src/login/components/input-field-by-type/input-field-by-type.component.ts create mode 100644 src/login/components/input-tag-selects/input-tag-selects.component.html create mode 100644 src/login/components/input-tag-selects/input-tag-selects.component.ts create mode 100644 src/login/components/input-tag/input-tag.component.html create mode 100644 src/login/components/input-tag/input-tag.component.ts create mode 100644 src/login/components/logout-other-sessions/logout-other-sessions.component.html create mode 100644 src/login/components/logout-other-sessions/logout-other-sessions.component.ts create mode 100644 src/login/components/password-wrapper/password-wrapper.component.html create mode 100644 src/login/components/password-wrapper/password-wrapper.component.ts create mode 100644 src/login/components/select-tag/select-tag.component.html create mode 100644 src/login/components/select-tag/select-tag.component.ts create mode 100644 src/login/components/textarea-tag/textarea-tag.component.html create mode 100644 src/login/components/textarea-tag/textarea-tag.component.ts create mode 100644 src/login/components/user-profile-form-fields/user-profile-form-fields.component.html create mode 100644 src/login/components/user-profile-form-fields/user-profile-form-fields.component.ts create mode 100644 src/login/containers/template.component.html create mode 100644 src/login/containers/template.component.ts create mode 100644 src/login/directives/attributes.directive.ts create mode 100644 src/login/directives/index.ts create mode 100644 src/login/directives/kc-class.directive.ts create mode 100644 src/login/pages/code/code.component.html create mode 100644 src/login/pages/code/code.component.ts create mode 100644 src/login/pages/delete-account-confirm/delete-account-confirm.component.html create mode 100644 src/login/pages/delete-account-confirm/delete-account-confirm.component.ts create mode 100644 src/login/pages/delete-credential/delete-credential.component.html create mode 100644 src/login/pages/delete-credential/delete-credential.component.ts create mode 100644 src/login/pages/error/error.component.html create mode 100644 src/login/pages/error/error.component.ts create mode 100644 src/login/pages/frontchannel-logout/frontchannel-logout.component.html create mode 100644 src/login/pages/frontchannel-logout/frontchannel-logout.component.ts create mode 100644 src/login/pages/idp-review-user-profile/idp-review-user-profile.component.html create mode 100644 src/login/pages/idp-review-user-profile/idp-review-user-profile.component.ts create mode 100644 src/login/pages/info/info.component.html create mode 100644 src/login/pages/info/info.component.ts create mode 100644 src/login/pages/login-config-totp/login-config-totp.component.html create mode 100644 src/login/pages/login-config-totp/login-config-totp.component.ts create mode 100644 src/login/pages/login-idp-link-confirm-override/login-idp-link-confirm-override.component.html create mode 100644 src/login/pages/login-idp-link-confirm-override/login-idp-link-confirm-override.component.ts create mode 100644 src/login/pages/login-idp-link-confirm/login-idp-link-confirm.component.html create mode 100644 src/login/pages/login-idp-link-confirm/login-idp-link-confirm.component.ts create mode 100644 src/login/pages/login-idp-link-email/login-idp-link-email.component.html create mode 100644 src/login/pages/login-idp-link-email/login-idp-link-email.component.ts create mode 100644 src/login/pages/login-oauth-grant/login-oauth-grant.component.html create mode 100644 src/login/pages/login-oauth-grant/login-oauth-grant.component.ts create mode 100644 src/login/pages/login-oauth2-device-verify-user-code/login-oauth2-device-verify-user-code.component.html create mode 100644 src/login/pages/login-oauth2-device-verify-user-code/login-oauth2-device-verify-user-code.component.ts create mode 100644 src/login/pages/login-otp/login-otp.component.html create mode 100644 src/login/pages/login-otp/login-otp.component.ts create mode 100644 src/login/pages/login-page-expired/login-page-expired.component.html create mode 100644 src/login/pages/login-page-expired/login-page-expired.component.ts create mode 100644 src/login/pages/login-passkeys-conditional-authenticate/login-passkeys-conditional-authenticate.component.html create mode 100644 src/login/pages/login-passkeys-conditional-authenticate/login-passkeys-conditional-authenticate.component.ts create mode 100644 src/login/pages/login-password/login-password.component.html create mode 100644 src/login/pages/login-password/login-password.component.ts create mode 100644 src/login/pages/login-recovery-authn-code-config/login-recovery-authn-code-config.component.html create mode 100644 src/login/pages/login-recovery-authn-code-config/login-recovery-authn-code-config.component.ts create mode 100644 src/login/pages/login-recovery-authn-code-input/login-recovery-authn-code-input.component.html create mode 100644 src/login/pages/login-recovery-authn-code-input/login-recovery-authn-code-input.component.ts create mode 100644 src/login/pages/login-reset-otp/login-reset-otp.component.html create mode 100644 src/login/pages/login-reset-otp/login-reset-otp.component.ts create mode 100644 src/login/pages/login-reset-password/login-reset-password.component.html create mode 100644 src/login/pages/login-reset-password/login-reset-password.component.ts create mode 100644 src/login/pages/login-update-password/login-update-password.component.html create mode 100644 src/login/pages/login-update-password/login-update-password.component.ts create mode 100644 src/login/pages/login-update-profile/login-update-profile.component.html create mode 100644 src/login/pages/login-update-profile/login-update-profile.component.ts create mode 100644 src/login/pages/login-username/login-username.component.html create mode 100644 src/login/pages/login-username/login-username.component.ts create mode 100644 src/login/pages/login-verify-email/login-verify-email.component.html create mode 100644 src/login/pages/login-verify-email/login-verify-email.component.ts create mode 100644 src/login/pages/login-x509-info/login-x509-info.component.html create mode 100644 src/login/pages/login-x509-info/login-x509-info.component.ts create mode 100644 src/login/pages/login/login.component.html create mode 100644 src/login/pages/login/login.component.ts create mode 100644 src/login/pages/logout-confirm/logout-confirm.component.html create mode 100644 src/login/pages/logout-confirm/logout-confirm.component.ts create mode 100644 src/login/pages/register/register.component.html create mode 100644 src/login/pages/register/register.component.ts create mode 100644 src/login/pages/saml-post-form/saml-post-form.component.html create mode 100644 src/login/pages/saml-post-form/saml-post-form.component.ts create mode 100644 src/login/pages/select-authenticator/select-authenticator.component.html create mode 100644 src/login/pages/select-authenticator/select-authenticator.component.ts create mode 100644 src/login/pages/terms/terms.component.html create mode 100644 src/login/pages/terms/terms.component.ts create mode 100644 src/login/pages/update-email/update-email.component.html create mode 100644 src/login/pages/update-email/update-email.component.ts create mode 100644 src/login/pages/webauthn-authenticate/webauthn-authenticate.component.html create mode 100644 src/login/pages/webauthn-authenticate/webauthn-authenticate.component.ts create mode 100644 src/login/pages/webauthn-error/webauthn-error.component.html create mode 100644 src/login/pages/webauthn-error/webauthn-error.component.ts create mode 100644 src/login/pages/webauthn-register/webauthn-register.component.html create mode 100644 src/login/pages/webauthn-register/webauthn-register.component.ts create mode 100644 src/login/pipes/advanced-msg-str.pipe.ts create mode 100644 src/login/pipes/index.ts create mode 100644 src/login/pipes/input-type.pipe.ts create mode 100644 src/login/pipes/kc-sanitize.pipe.ts create mode 100644 src/login/pipes/msg-str.pipe.ts create mode 100644 src/login/pipes/to-array.pipe.ts create mode 100644 src/login/pipes/to-number.pipe.ts create mode 100644 src/login/services/index.ts create mode 100644 src/login/services/login-resource-injector.service.ts create mode 100644 src/login/services/user-profile-form.service.ts diff --git a/package.json b/package.json index e66f8357..696937e1 100644 --- a/package.json +++ b/package.json @@ -39,7 +39,8 @@ "tsafe": "^1.6.6" }, "peerDependencies": { - "keycloakify": "^11.2.0" + "keycloakify": "^11.2.0", + "@angular/core": "^18.0.0" }, "devDependencies": { "keycloakify": "^11.2.0", @@ -48,6 +49,7 @@ "husky": "^4.3.8", "lint-staged": "^11.0.0", "tsc-alias": "^1.8.10", - "tsx": "^4.15.5" + "tsx": "^4.15.5", + "@angular/core": "^18.2.6" } } diff --git a/src/lib/i18n.ts b/src/lib/i18n.ts new file mode 100644 index 00000000..53f76ea5 --- /dev/null +++ b/src/lib/i18n.ts @@ -0,0 +1,9 @@ +/* eslint-disable @typescript-eslint/no-unused-vars */ + +import { i18nBuilder as accountI18nBuilder } from "keycloakify/account/i18n/noJsx"; +import { i18nBuilder as loginI18nBuilder } from "keycloakify/login/i18n/noJsx"; + +const { ofTypeI18n: I18nlogin } = loginI18nBuilder.build(); +const { ofTypeI18n: I18nAccount } = accountI18nBuilder.build(); +type I18n = typeof I18nAccount | typeof I18nlogin; +export { type I18n }; diff --git a/src/lib/models/index.ts b/src/lib/models/index.ts new file mode 100644 index 00000000..faa6ffa9 --- /dev/null +++ b/src/lib/models/index.ts @@ -0,0 +1 @@ +export * from "./script.model"; diff --git a/src/lib/models/script.model.ts b/src/lib/models/script.model.ts new file mode 100644 index 00000000..b22c229c --- /dev/null +++ b/src/lib/models/script.model.ts @@ -0,0 +1,6 @@ +export type Script = { + type: string; + id: string; + src?: string; + textContent?: string; +}; diff --git a/src/lib/providers/keycloakify-angular.providers.ts b/src/lib/providers/keycloakify-angular.providers.ts new file mode 100644 index 00000000..f08fa5ec --- /dev/null +++ b/src/lib/providers/keycloakify-angular.providers.ts @@ -0,0 +1,92 @@ +import { DOCUMENT } from "@angular/common"; +import { + APP_INITIALIZER, + InjectionToken, + LOCALE_ID, + makeEnvironmentProviders +} from "@angular/core"; +import { I18n } from "../i18n"; +import { I18nService } from "../services"; + +export const I18N = new InjectionToken("i18n"); +export const KC_CONTEXT = new InjectionToken("keycloak context"); +export const USE_DEFAULT_CSS = new InjectionToken("use default css"); +export const CLASSES = new InjectionToken<{ [key in ClassKey]?: string }>("classes"); +export const DO_MAKE_USER_CONFIRM_PASSWORD = new InjectionToken( + "doMakeUserConfirmPassword" +); + +type ClassKey = + | import("keycloakify/login").ClassKey + | import("keycloakify/account").ClassKey; +type KcContextLike = + | import("keycloakify/login/i18n").KcContextLike + | import("keycloakify/account/i18n").KcContextLike; +type KcContext = + | import("keycloakify/login/KcContext").KcContext + | import("keycloakify/account/KcContext").KcContext; + +export type KeycloakifyAngularConfig = { + doMakeUserConfirmPassword?: boolean; + doUseDefaultCss?: boolean; + classes?: { [key in ClassKey]?: string }; + getI18n: (params: { kcContext: KcContextLike }) => { + i18n: unknown; + prI18n_currentLanguage: Promise | undefined; + }; +}; + +export const provideKeycloakifyAngular = (config: KeycloakifyAngularConfig) => + makeEnvironmentProviders([ + { + provide: KC_CONTEXT, + useValue: window.kcContext + }, + { + provide: DO_MAKE_USER_CONFIRM_PASSWORD, + useValue: config?.doMakeUserConfirmPassword ?? true + }, + { + provide: LOCALE_ID, + useFactory: (document: Document) => { + return document.documentElement.lang ?? "en"; + }, + deps: [DOCUMENT] + }, + { + provide: APP_INITIALIZER, + multi: true, + useFactory: + ( + i18nService: I18nService["i18n"]>, + kcContext: KcContext + ) => + async () => { + const getI18n = config.getI18n; + + const { i18n, prI18n_currentLanguage } = getI18n({ + kcContext + }); + let i18nPromise = new Promise(resolve => resolve(i18n)); + if (prI18n_currentLanguage) { + i18nPromise = prI18n_currentLanguage; + } + return i18nPromise.then(i18n => { + i18nService.i18n = i18n; + return true; + }); + }, + deps: [I18nService, KC_CONTEXT] + }, + { provide: USE_DEFAULT_CSS, useValue: config?.doUseDefaultCss ?? true }, + { provide: CLASSES, useValue: config?.classes ?? {} }, + { + provide: I18N, + useFactory: ( + i18nService: I18nService["i18n"]> + ) => { + return i18nService.i18n; + }, + deps: [I18nService] + } + ]); diff --git a/src/lib/public-api.ts b/src/lib/public-api.ts new file mode 100644 index 00000000..f0e713b9 --- /dev/null +++ b/src/lib/public-api.ts @@ -0,0 +1,12 @@ +import { KcContext as KcAccountContext } from "keycloakify/account/KcContext"; +import { KcContext as KcLoginContext } from "keycloakify/login/KcContext"; + +declare global { + interface Window { + kcContext?: KcLoginContext | KcAccountContext; + } +} + +export * from "./models"; +export * from "./providers/keycloakify-angular.providers"; +export * from "./services"; diff --git a/src/lib/services/i18n.service.ts b/src/lib/services/i18n.service.ts new file mode 100644 index 00000000..2862c0e5 --- /dev/null +++ b/src/lib/services/i18n.service.ts @@ -0,0 +1,5 @@ +import { Injectable } from "@angular/core"; +@Injectable({ providedIn: "root" }) +export class I18nService { + i18n!: T; +} diff --git a/src/lib/services/index.ts b/src/lib/services/index.ts new file mode 100644 index 00000000..939a6a8b --- /dev/null +++ b/src/lib/services/index.ts @@ -0,0 +1,2 @@ +export * from "./resource-injector.service"; +export * from "./i18n.service"; diff --git a/src/lib/services/resource-injector.service.ts b/src/lib/services/resource-injector.service.ts new file mode 100644 index 00000000..29877ba5 --- /dev/null +++ b/src/lib/services/resource-injector.service.ts @@ -0,0 +1,50 @@ +import { inject, Injectable, Renderer2, RendererFactory2 } from "@angular/core"; +import { Observable } from "rxjs"; +import { Script } from "../models/script.model"; + +@Injectable({ + providedIn: "root" +}) +export class ResourceInjectorService { + private renderer: Renderer2 = inject(RendererFactory2).createRenderer(null, null); + + createLink(url: string): Observable { + return new Observable(observer => { + // check if the style is already injected + if (Array.from(document.styleSheets).some(s => s.href?.includes(url))) { + observer.next(); + observer.complete(); + console.debug(`stylesheet: ${url} already loaded`); + return; + } + const link = document.createElement("link"); + link.rel = "stylesheet"; + link.href = url; + + link.onload = () => { + observer.next(); + observer.complete(); + }; + + link.onerror = () => { + observer.error(new Error(`Failed to load stylesheet: ${url}`)); + }; + + this.renderer.appendChild(document.head, link); + }); + } + createScript({ type, id, src, textContent }: Script): void { + // check if the script is already injected + if (Array.from(document.scripts).some(s => s.id?.includes(id))) { + console.debug(`script: ${src} already injected`); + return; + } + const script = document.createElement("script"); + script.type = type; + if (src) script.src = src; + if (textContent) script.textContent = textContent; + script.id = id; + + this.renderer.appendChild(document.head, script); + } +} diff --git a/src/login/DefaultPage.ts b/src/login/DefaultPage.ts new file mode 100644 index 00000000..6b869bdf --- /dev/null +++ b/src/login/DefaultPage.ts @@ -0,0 +1,208 @@ +import { Type } from "@angular/core"; +import { ClassKey } from "keycloakify/login"; +import { KcContext } from "keycloakify/login/KcContext"; + +const DefaultPage = async ( + pageId: KcContext["pageId"], + doMakeUserConfirmPassword = true, + doUseDefaultCss = true, + classes: { [key in ClassKey]?: string } = {} +): Promise<{ + ComponentBootstrap: Type; + doMakeUserConfirmPassword: boolean; + doUseDefaultCss: boolean; + classes: { [key in ClassKey]?: string }; +}> => { + let ComponentBootstrapPromise; + switch (pageId) { + case "login.ftl": + ComponentBootstrapPromise = import("./pages/login/login.component").then( + c => c.LoginComponent + ); + break; + case "login-username.ftl": + ComponentBootstrapPromise = import( + "./pages/login-username/login-username.component" + ).then(c => c.LoginUsernameComponent); + break; + case "login-password.ftl": + ComponentBootstrapPromise = import( + "./pages/login-password/login-password.component" + ).then(c => c.LoginPasswordComponent); + break; + case "webauthn-authenticate.ftl": + ComponentBootstrapPromise = import( + "./pages/webauthn-authenticate/webauthn-authenticate.component" + ).then(c => c.WebauthnAuthenticateComponent); + break; + case "webauthn-register.ftl": + ComponentBootstrapPromise = import( + "./pages/webauthn-register/webauthn-register.component" + ).then(c => c.WebauthnRegisterComponent); + break; + case "register.ftl": + ComponentBootstrapPromise = import( + "./pages/register/register.component" + ).then(c => c.RegisterComponent); + break; + case "info.ftl": + ComponentBootstrapPromise = import("./pages/info/info.component").then( + c => c.InfoComponent + ); + break; + case "error.ftl": + ComponentBootstrapPromise = import("./pages/error/error.component").then( + c => c.ErrorComponent + ); + break; + case "login-reset-password.ftl": + ComponentBootstrapPromise = import( + "./pages/login-reset-password/login-reset-password.component" + ).then(c => c.LoginResetPasswordComponent); + break; + case "login-verify-email.ftl": + ComponentBootstrapPromise = import( + "./pages/login-verify-email/login-verify-email.component" + ).then(c => c.LoginVerifyEmailComponent); + break; + case "terms.ftl": + ComponentBootstrapPromise = import("./pages/terms/terms.component").then( + c => c.TermsComponent + ); + break; + case "login-oauth2-device-verify-user-code.ftl": + ComponentBootstrapPromise = import( + "./pages/login-oauth2-device-verify-user-code/login-oauth2-device-verify-user-code.component" + ).then(c => c.LoginOauth2DeviceVerifyUserCodeComponent); + break; + case "login-oauth-grant.ftl": + ComponentBootstrapPromise = import( + "./pages/login-oauth-grant/login-oauth-grant.component" + ).then(c => c.LoginOauthGrantComponent); + break; + case "login-otp.ftl": + ComponentBootstrapPromise = import( + "./pages/login-otp/login-otp.component" + ).then(c => c.LoginOtpComponent); + + break; + case "login-update-profile.ftl": + ComponentBootstrapPromise = import( + "./pages/login-update-profile/login-update-profile.component" + ).then(c => c.LoginUpdateProfileComponent); + break; + case "login-update-password.ftl": + ComponentBootstrapPromise = import( + "./pages/login-update-password/login-update-password.component" + ).then(c => c.LoginUpdatePasswordComponent); + break; + case "login-idp-link-confirm.ftl": + ComponentBootstrapPromise = import( + "./pages/login-idp-link-confirm/login-idp-link-confirm.component" + ).then(c => c.LoginIdpLinkConfirmComponent); + break; + case "login-idp-link-email.ftl": + ComponentBootstrapPromise = import( + "./pages/login-idp-link-email/login-idp-link-email.component" + ).then(c => c.LoginIdpLinkEmailComponent); + break; + case "login-page-expired.ftl": + ComponentBootstrapPromise = import( + "./pages/login-page-expired/login-page-expired.component" + ).then(c => c.LoginPageExpiredComponent); + break; + case "login-config-totp.ftl": + ComponentBootstrapPromise = import( + "./pages/login-config-totp/login-config-totp.component" + ).then(c => c.LoginConfigTotpComponent); + break; + case "logout-confirm.ftl": + ComponentBootstrapPromise = import( + "./pages/logout-confirm/logout-confirm.component" + ).then(c => c.LogoutConfirmComponent); + break; + case "idp-review-user-profile.ftl": + ComponentBootstrapPromise = import( + "./pages/idp-review-user-profile/idp-review-user-profile.component" + ).then(c => c.IdpReviewUserProfileComponent); + break; + case "update-email.ftl": + ComponentBootstrapPromise = import( + "./pages/update-email/update-email.component" + ).then(c => c.UpdateEmailComponent); + break; + case "select-authenticator.ftl": + ComponentBootstrapPromise = import( + "./pages/select-authenticator/select-authenticator.component" + ).then(c => c.SelectAuthenticatorComponent); + break; + case "saml-post-form.ftl": + ComponentBootstrapPromise = import( + "./pages/saml-post-form/saml-post-form.component" + ).then(c => c.SamlPostFormComponent); + break; + case "delete-credential.ftl": + ComponentBootstrapPromise = import( + "./pages/delete-credential/delete-credential.component" + ).then(c => c.DeleteCredentialComponent); + break; + case "code.ftl": + ComponentBootstrapPromise = import("./pages/code/code.component").then( + c => c.CodeComponent + ); + break; + case "delete-account-confirm.ftl": + ComponentBootstrapPromise = import( + "./pages/delete-account-confirm/delete-account-confirm.component" + ).then(c => c.DeleteAccountConfirmComponent); + break; + case "frontchannel-logout.ftl": + ComponentBootstrapPromise = import( + "./pages/frontchannel-logout/frontchannel-logout.component" + ).then(c => c.FrontchannelLogoutComponent); + break; + case "login-recovery-authn-code-config.ftl": + ComponentBootstrapPromise = import( + "./pages/login-recovery-authn-code-config/login-recovery-authn-code-config.component" + ).then(c => c.LoginRecoveryAuthnCodeConfigComponent); + break; + case "login-recovery-authn-code-input.ftl": + ComponentBootstrapPromise = import( + "./pages/login-recovery-authn-code-input/login-recovery-authn-code-input.component" + ).then(c => c.LoginRecoveryAuthnCodeInputComponent); + break; + case "login-reset-otp.ftl": + ComponentBootstrapPromise = import( + "./pages/login-reset-otp/login-reset-otp.component" + ).then(c => c.LoginResetOtpComponent); + break; + case "login-x509-info.ftl": + ComponentBootstrapPromise = import( + "./pages/login-x509-info/login-x509-info.component" + ).then(c => c.LoginX509InfoComponent); + break; + case "webauthn-error.ftl": + ComponentBootstrapPromise = import( + "./pages/webauthn-error/webauthn-error.component" + ).then(c => c.WebauthnErrorComponent); + break; + case "login-passkeys-conditional-authenticate.ftl": + ComponentBootstrapPromise = import( + "./pages/login-passkeys-conditional-authenticate/login-passkeys-conditional-authenticate.component" + ).then(c => c.LoginPasskeysConditionalAuthenticateComponent); + break; + case "login-idp-link-confirm-override.ftl": + ComponentBootstrapPromise = import( + "./pages/login-idp-link-confirm-override/login-idp-link-confirm-override.component" + ).then(c => c.LoginIdpLinkConfirmOverrideComponent); + break; + } + return ComponentBootstrapPromise?.then(ComponentBootstrap => ({ + ComponentBootstrap, + doMakeUserConfirmPassword, + doUseDefaultCss, + classes + })); +}; + +export { DefaultPage }; diff --git a/src/login/classes/component-reference.class.ts b/src/login/classes/component-reference.class.ts new file mode 100644 index 00000000..bcc6fc9c --- /dev/null +++ b/src/login/classes/component-reference.class.ts @@ -0,0 +1,5 @@ +import { ClassKey } from "keycloakify/login"; +export abstract class ComponentReference { + doUseDefaultCss: boolean | undefined; + classes: Partial> | undefined; +} diff --git a/src/login/components/add-remove-buttons-multi-valued-attribute/add-remove-buttons-multi-valued-attribute.component.html b/src/login/components/add-remove-buttons-multi-valued-attribute/add-remove-buttons-multi-valued-attribute.component.html new file mode 100644 index 00000000..46939891 --- /dev/null +++ b/src/login/components/add-remove-buttons-multi-valued-attribute/add-remove-buttons-multi-valued-attribute.component.html @@ -0,0 +1,24 @@ +@let idPostfix = attribute()?.name ?? '' + '-' + (fieldIndex() ?? 0 + 1); +@if (hasRemove()) { + + @if (hasAdd()) { +  |  + } +} +@if (hasAdd()) { + +} diff --git a/src/login/components/add-remove-buttons-multi-valued-attribute/add-remove-buttons-multi-valued-attribute.component.ts b/src/login/components/add-remove-buttons-multi-valued-attribute/add-remove-buttons-multi-valued-attribute.component.ts new file mode 100644 index 00000000..ae489d69 --- /dev/null +++ b/src/login/components/add-remove-buttons-multi-valued-attribute/add-remove-buttons-multi-valued-attribute.component.ts @@ -0,0 +1,144 @@ +import { + ChangeDetectionStrategy, + Component, + computed, + input, + output +} from "@angular/core"; +import { Attribute } from "keycloakify/login"; +import { MsgStrPipe } from "../../pipes/msg-str.pipe"; +import { FormAction } from "../../services/user-profile-form.service"; + +@Component({ + standalone: true, + styles: [ + ` + :host { + display: contents; + } + ` + ], + imports: [MsgStrPipe], + selector: "kc-add-remove-buttons-multi-valued-attribute", + templateUrl: "add-remove-buttons-multi-valued-attribute.component.html", + changeDetection: ChangeDetectionStrategy.OnPush +}) +export class AddRemoveButtonsMultiValuedAttributeComponent { + attribute = input(); + values = input(); + fieldIndex = input(); + dispatchFormAction = output(); + + hasRemove = computed(() => { + const attribute = this.attribute(); + const values = this.values(); + const fieldIndex = this.fieldIndex(); + if (attribute && values && fieldIndex) { + return this.getButtonToDisplayForMultivaluedAttributeField({ + attribute, + values, + fieldIndex + }).hasRemove; + } + return false; + }); + hasAdd = computed(() => { + const attribute = this.attribute(); + const values = this.values(); + const fieldIndex = this.fieldIndex(); + if (attribute && values && fieldIndex) { + return this.getButtonToDisplayForMultivaluedAttributeField({ + attribute, + values, + fieldIndex + }).hasAdd; + } + return false; + }); + + onAdd() { + this.dispatchFormAction.emit({ + action: "update", + name: this.attribute()?.name ?? "", + valueOrValues: [...(this.values() ?? []), ""] + }); + } + + onRemove() { + this.dispatchFormAction.emit({ + action: "update", + name: this.attribute()?.name ?? "", + valueOrValues: (this.values() ?? []).filter((_, i) => i !== this.fieldIndex()) + }); + } + + private getButtonToDisplayForMultivaluedAttributeField(params: { + attribute: Attribute; + values: string[]; + fieldIndex: number; + }) { + const { attribute, values, fieldIndex } = params; + + const hasRemove = (() => { + if (values.length === 1) { + return false; + } + + const minCount = (() => { + const { multivalued } = attribute.validators; + + if (multivalued === undefined) { + return undefined; + } + + const minStr = multivalued.min; + + if (minStr === undefined) { + return undefined; + } + + return parseInt(`${minStr}`); + })(); + + if (minCount === undefined) { + return true; + } + + if (values.length === minCount) { + return false; + } + + return true; + })(); + + const hasAdd = (() => { + if (fieldIndex + 1 !== values.length) { + return false; + } + + const maxCount = (() => { + const { multivalued } = attribute.validators; + + if (multivalued === undefined) { + return undefined; + } + + const maxStr = multivalued.max; + + if (maxStr === undefined) { + return undefined; + } + + return parseInt(`${maxStr}`); + })(); + + if (maxCount === undefined) { + return true; + } + + return values.length !== maxCount; + })(); + + return { hasRemove, hasAdd }; + } +} diff --git a/src/login/components/field-errors/field-errors.component.html b/src/login/components/field-errors/field-errors.component.html new file mode 100644 index 00000000..f16db076 --- /dev/null +++ b/src/login/components/field-errors/field-errors.component.html @@ -0,0 +1,15 @@ +@let index = fieldIndex(); + + @for (error of displayableErrors(); track error; let i = $index) { + @if (error.fieldIndex === index) { + + @if (displayableErrors()?.length ?? 0 - 1 !== i) { +
+ } + } + } +
diff --git a/src/login/components/field-errors/field-errors.component.ts b/src/login/components/field-errors/field-errors.component.ts new file mode 100644 index 00000000..71dd52d4 --- /dev/null +++ b/src/login/components/field-errors/field-errors.component.ts @@ -0,0 +1,40 @@ +import { + ChangeDetectionStrategy, + Component, + forwardRef, + inject, + input +} from "@angular/core"; +import { CLASSES, USE_DEFAULT_CSS } from "keycloakify-angular"; +import { Attribute, ClassKey } from "keycloakify/login"; +import { ComponentReference } from "../../classes/component-reference.class"; +import { KcClassDirective } from "../../directives/kc-class.directive"; +import { FormFieldError } from "../../services/user-profile-form.service"; + +@Component({ + standalone: true, + styles: [ + ` + :host { + display: contents; + } + ` + ], + imports: [KcClassDirective], + selector: "kc-field-errors", + templateUrl: "field-errors.component.html", + changeDetection: ChangeDetectionStrategy.OnPush, + providers: [ + { + provide: ComponentReference, + useExisting: forwardRef(() => FieldErrorsComponent) + } + ] +}) +export class FieldErrorsComponent extends ComponentReference { + attribute = input(); + displayableErrors = input(); + fieldIndex = input(); + override doUseDefaultCss = inject(USE_DEFAULT_CSS); + override classes = inject>>(CLASSES); +} diff --git a/src/login/components/group-label/group-label.component.html b/src/login/components/group-label/group-label.component.html new file mode 100644 index 00000000..fb94f89f --- /dev/null +++ b/src/login/components/group-label/group-label.component.html @@ -0,0 +1,30 @@ +@let attr = attribute(); +@let groupName = groupNameRef(); +@if (attr && groupName !== '') { +
+ @let groupDisplayHeader = attr.group?.displayHeader ?? ''; + @let groupHeaderText = groupDisplayHeader !== '' ? groupDisplayHeader : (attr.group?.name ?? ''); +
+ +
+ @let groupDisplayDescription = attr.group?.displayDescription ?? ''; + @if (groupDisplayDescription !== '') { +
+ +
+ } +
+} diff --git a/src/login/components/group-label/group-label.component.ts b/src/login/components/group-label/group-label.component.ts new file mode 100644 index 00000000..39a78f48 --- /dev/null +++ b/src/login/components/group-label/group-label.component.ts @@ -0,0 +1,49 @@ +import { + ChangeDetectionStrategy, + Component, + computed, + forwardRef, + inject, + input +} from "@angular/core"; +import { CLASSES, USE_DEFAULT_CSS } from "keycloakify-angular"; +import { Attribute, ClassKey } from "keycloakify/login"; +import { ComponentReference } from "../../classes/component-reference.class"; +import { AttributesDirective } from "../../directives/attributes.directive"; +import { KcClassDirective } from "../../directives/kc-class.directive"; +import { AdvancedMsgStrPipe } from "../../pipes/advanced-msg-str.pipe"; + +@Component({ + standalone: true, + styles: [ + ` + :host { + display: contents; + } + ` + ], + imports: [KcClassDirective, AttributesDirective, AdvancedMsgStrPipe], + selector: "kc-group-label", + templateUrl: "group-label.component.html", + changeDetection: ChangeDetectionStrategy.OnPush, + providers: [ + { + provide: ComponentReference, + useExisting: forwardRef(() => GroupLabelComponent) + } + ] +}) +export class GroupLabelComponent extends ComponentReference { + attribute = input(); + groupName = input(); + override doUseDefaultCss = inject(USE_DEFAULT_CSS); + override classes = inject>>(CLASSES); + groupNameRef = computed(() => { + const attribute = this.attribute(); + const groupName = this.groupName(); + if (attribute?.group?.name !== groupName) { + return attribute?.group?.name ?? ""; + } + return ""; + }); +} diff --git a/src/login/components/index.ts b/src/login/components/index.ts new file mode 100644 index 00000000..d2d64094 --- /dev/null +++ b/src/login/components/index.ts @@ -0,0 +1,11 @@ +export * from "./add-remove-buttons-multi-valued-attribute/add-remove-buttons-multi-valued-attribute.component"; +export * from "./field-errors/field-errors.component"; +export * from "./group-label/group-label.component"; +export * from "./input-field-by-type/input-field-by-type.component"; +export * from "./input-tag/input-tag.component"; +export * from "./input-tag-selects/input-tag-selects.component"; +export * from "./logout-other-sessions/logout-other-sessions.component"; +export * from "./password-wrapper/password-wrapper.component"; +export * from "./select-tag/select-tag.component"; +export * from "./textarea-tag/textarea-tag.component"; +export * from "./user-profile-form-fields/user-profile-form-fields.component"; diff --git a/src/login/components/input-field-by-type/input-field-by-type.component.html b/src/login/components/input-field-by-type/input-field-by-type.component.html new file mode 100644 index 00000000..4fda53bc --- /dev/null +++ b/src/login/components/input-field-by-type/input-field-by-type.component.html @@ -0,0 +1,63 @@ +@let attr = attribute(); +@if (attr) { + @let type = attr.annotations.inputType; + @switch (type) { + @case ('textarea') { + + } + @case (type === 'select' || type === 'multiselect' ? type : '') { + + } + @case (type === 'select-radiobuttons' || type === 'multiselect-checkboxes' ? type : '') { + + } + @default { + @let values = valueOrValues(); + + @if (values && (values | toArray: true).length) { + @for (value of values; track value; let i = $index) { + + } + } @else { + @if (attr.name === 'password' || attr.name === 'password-confirm') { + + + + } @else { + + } + } + } + } +} diff --git a/src/login/components/input-field-by-type/input-field-by-type.component.ts b/src/login/components/input-field-by-type/input-field-by-type.component.ts new file mode 100644 index 00000000..b7d868a5 --- /dev/null +++ b/src/login/components/input-field-by-type/input-field-by-type.component.ts @@ -0,0 +1,63 @@ +import { + ChangeDetectionStrategy, + Component, + computed, + forwardRef, + inject, + input, + output +} from "@angular/core"; +import { CLASSES, USE_DEFAULT_CSS } from "keycloakify-angular"; +import { Attribute, ClassKey } from "keycloakify/login"; +import { ComponentReference } from "../../classes/component-reference.class"; +import { ToArrayPipe } from "../../pipes/to-array.pipe"; +import { FormAction, FormFieldError } from "../../services/user-profile-form.service"; +import { InputTagSelectsComponent } from "../input-tag-selects/input-tag-selects.component"; +import { InputTagComponent } from "../input-tag/input-tag.component"; +import { PasswordWrapperComponent } from "../password-wrapper/password-wrapper.component"; +import { SelectTagComponent } from "../select-tag/select-tag.component"; +import { TextareaTagComponent } from "../textarea-tag/textarea-tag.component"; + +@Component({ + standalone: true, + styles: [ + ` + :host { + display: contents; + } + ` + ], + imports: [ + ToArrayPipe, + TextareaTagComponent, + SelectTagComponent, + InputTagSelectsComponent, + InputTagComponent, + PasswordWrapperComponent + ], + selector: "kc-input-field-by-type", + templateUrl: "input-field-by-type.component.html", + changeDetection: ChangeDetectionStrategy.OnPush, + providers: [ + { + provide: ComponentReference, + useExisting: forwardRef(() => InputFieldByTypeComponent) + } + ] +}) +export class InputFieldByTypeComponent extends ComponentReference { + attribute = input(); + valueOrValues = input(); + displayableErrors = input(); + dispatchFormAction = output(); + override doUseDefaultCss = inject(USE_DEFAULT_CSS); + override classes = inject>>(CLASSES); + + attributePassword = computed(() => { + const attribute: Attribute = this.attribute() ?? ({} as Attribute); + return { + ...attribute, + annotations: { ...(attribute.annotations ?? {}), inputType: "password" } + }; + }); +} diff --git a/src/login/components/input-tag-selects/input-tag-selects.component.html b/src/login/components/input-tag-selects/input-tag-selects.component.html new file mode 100644 index 00000000..b993153d --- /dev/null +++ b/src/login/components/input-tag-selects/input-tag-selects.component.html @@ -0,0 +1,29 @@ +@let inputType = context()?.inputType; +@let classInput = context()?.classInput; +@let classLabel = context()?.classLabel; +@let classDiv = context()?.classDiv; +@let attr = attribute(); +@if (attr) { + @for (option of options(); track option) { +
+ + +
+ } +} diff --git a/src/login/components/input-tag-selects/input-tag-selects.component.ts b/src/login/components/input-tag-selects/input-tag-selects.component.ts new file mode 100644 index 00000000..961b848d --- /dev/null +++ b/src/login/components/input-tag-selects/input-tag-selects.component.ts @@ -0,0 +1,146 @@ +import { + ChangeDetectionStrategy, + Component, + computed, + forwardRef, + inject, + input, + output, + Signal +} from "@angular/core"; +import { CLASSES, USE_DEFAULT_CSS } from "keycloakify-angular"; +import { Attribute, ClassKey } from "keycloakify/login"; +import { ComponentReference } from "../../classes/component-reference.class"; +import { KcClassDirective } from "../../directives/kc-class.directive"; +import { AdvancedMsgStrPipe } from "../../pipes/advanced-msg-str.pipe"; +import { FormAction, FormFieldError } from "../../services/user-profile-form.service"; + +@Component({ + standalone: true, + styles: [ + ` + :host { + display: contents; + } + ` + ], + imports: [KcClassDirective, AdvancedMsgStrPipe], + selector: "kc-input-tag-selects", + templateUrl: "input-tag-selects.component.html", + changeDetection: ChangeDetectionStrategy.OnPush, + providers: [ + { + provide: ComponentReference, + useExisting: forwardRef(() => InputTagSelectsComponent) + } + ] +}) +export class InputTagSelectsComponent extends ComponentReference { + attribute = input(); + valueOrValues = input(); + dispatchFormAction = output(); + displayableErrors = input(); + override doUseDefaultCss = inject(USE_DEFAULT_CSS); + override classes = inject>>(CLASSES); + + context: Signal<{ + inputType: "radio" | "checkbox"; + classDiv: ClassKey; + classInput: ClassKey; + classLabel: ClassKey; + } | null> = computed(() => { + const attribute = this.attribute(); + if (attribute) { + const { inputType } = attribute.annotations; + switch (inputType) { + case "select-radiobuttons": + return { + inputType: "radio", + classDiv: "kcInputClassRadio", + classInput: "kcInputClassRadioInput", + classLabel: "kcInputClassRadioLabel" + }; + case "multiselect-checkboxes": + return { + inputType: "checkbox", + classDiv: "kcInputClassCheckbox", + classInput: "kcInputClassCheckboxInput", + classLabel: "kcInputClassCheckboxLabel" + }; + } + } + return null; + }); + + options = computed(() => { + const attribute = this.attribute(); + if (attribute) { + return (() => { + walk: { + const { inputOptionsFromValidation } = attribute.annotations; + + if (inputOptionsFromValidation === undefined) { + break walk; + } + + const validator = ( + attribute.validators as Record + )[inputOptionsFromValidation]; + + if (validator === undefined) { + break walk; + } + + if (validator.options === undefined) { + break walk; + } + + return validator.options; + } + + return attribute.validators.options?.options ?? []; + })(); + } + return []; + }); + + checked(option: string) { + const valueOrValues = this.valueOrValues(); + if (valueOrValues instanceof Array) { + return valueOrValues.includes(option); + } + return valueOrValues === option; + } + + onChange(event: Event, option: string) { + const valueOrValues = this.valueOrValues(); + const isChecked = (event.target as HTMLInputElement).checked; + this.dispatchFormAction.emit({ + action: "update", + name: this.attribute()?.name ?? "", + valueOrValues: (() => { + if (valueOrValues instanceof Array) { + const newValues = [...valueOrValues]; + + if (isChecked) { + newValues.push(option); + } else { + newValues.splice(newValues.indexOf(option), 1); + } + + return newValues; + } + + return (event.target as HTMLInputElement)?.checked ? option : ""; + })() + }); + } + + onBlur() { + this.dispatchFormAction.emit({ + action: "focus lost", + name: this.attribute()?.name ?? "", + fieldIndex: undefined + }); + } +} diff --git a/src/login/components/input-tag/input-tag.component.html b/src/login/components/input-tag/input-tag.component.html new file mode 100644 index 00000000..011b7410 --- /dev/null +++ b/src/login/components/input-tag/input-tag.component.html @@ -0,0 +1,49 @@ +@let attr = attribute(); +@let index = fieldIndex(); +@if (attr) { + + @if (index !== undefined) { + @let values = valueOrValues() ?? [] | toArray; + + + } +} diff --git a/src/login/components/input-tag/input-tag.component.ts b/src/login/components/input-tag/input-tag.component.ts new file mode 100644 index 00000000..412184b2 --- /dev/null +++ b/src/login/components/input-tag/input-tag.component.ts @@ -0,0 +1,104 @@ +import { + ChangeDetectionStrategy, + Component, + computed, + forwardRef, + inject, + input, + output +} from "@angular/core"; +import { CLASSES, USE_DEFAULT_CSS } from "keycloakify-angular"; +import { Attribute, ClassKey } from "keycloakify/login"; +import { ComponentReference } from "../../classes/component-reference.class"; +import { AttributesDirective } from "../../directives/attributes.directive"; +import { KcClassDirective } from "../../directives/kc-class.directive"; +import { AdvancedMsgStrPipe } from "../../pipes/advanced-msg-str.pipe"; +import { InputTypePipe } from "../../pipes/input-type.pipe"; +import { ToArrayPipe } from "../../pipes/to-array.pipe"; +import { ToNumberPipe } from "../../pipes/to-number.pipe"; +import { FormAction, FormFieldError } from "../../services/user-profile-form.service"; +import { AddRemoveButtonsMultiValuedAttributeComponent } from "../add-remove-buttons-multi-valued-attribute/add-remove-buttons-multi-valued-attribute.component"; +import { FieldErrorsComponent } from "../field-errors/field-errors.component"; + +@Component({ + standalone: true, + styles: [ + ` + :host { + display: contents; + } + ` + ], + imports: [ + InputTypePipe, + KcClassDirective, + ToNumberPipe, + AttributesDirective, + ToArrayPipe, + FieldErrorsComponent, + AddRemoveButtonsMultiValuedAttributeComponent, + AdvancedMsgStrPipe + ], + selector: "kc-input-tag", + templateUrl: "input-tag.component.html", + changeDetection: ChangeDetectionStrategy.OnPush, + providers: [ + { + provide: ComponentReference, + useExisting: forwardRef(() => InputTagComponent) + } + ] +}) +export class InputTagComponent extends ComponentReference { + attribute = input(); + valueOrValues = input(); + fieldIndex = input(undefined); + values = input(); + displayableErrors = input(); + dispatchFormAction = output(); + override doUseDefaultCss = inject(USE_DEFAULT_CSS); + override classes = inject>>(CLASSES); + + value = computed(() => { + const valueOrValues = this.valueOrValues(); + const index = this.fieldIndex(); + if (valueOrValues instanceof Array) { + if (index) { + return valueOrValues[index] ?? null; + } + return null; + } + return valueOrValues ?? null; + }); + + onChange(event: Event) { + const valueOrValues = this.valueOrValues(); + this.dispatchFormAction.emit({ + action: "update", + name: this.attribute()?.name ?? "", + valueOrValues: (() => { + if (this.fieldIndex !== undefined) { + if (valueOrValues instanceof Array) { + return valueOrValues.map((value, i) => { + if (i === this.fieldIndex()) { + return (event.target as HTMLInputElement)?.value; + } + + return value; + }); + } + } + + return (event.target as HTMLInputElement)?.value; + })() + }); + } + + onBlur() { + this.dispatchFormAction.emit({ + action: "focus lost", + name: this.attribute()?.name ?? "", + fieldIndex: this.fieldIndex() + }); + } +} diff --git a/src/login/components/logout-other-sessions/logout-other-sessions.component.html b/src/login/components/logout-other-sessions/logout-other-sessions.component.html new file mode 100644 index 00000000..788d35b0 --- /dev/null +++ b/src/login/components/logout-other-sessions/logout-other-sessions.component.html @@ -0,0 +1,19 @@ +
+
+
+ +
+
+
diff --git a/src/login/components/logout-other-sessions/logout-other-sessions.component.ts b/src/login/components/logout-other-sessions/logout-other-sessions.component.ts new file mode 100644 index 00000000..a34ecd02 --- /dev/null +++ b/src/login/components/logout-other-sessions/logout-other-sessions.component.ts @@ -0,0 +1,31 @@ +import { ChangeDetectionStrategy, Component, forwardRef, inject } from "@angular/core"; +import { CLASSES, USE_DEFAULT_CSS } from "keycloakify-angular"; +import { ClassKey } from "keycloakify/login"; +import { ComponentReference } from "../../classes/component-reference.class"; +import { KcClassDirective } from "../../directives/kc-class.directive"; +import { MsgStrPipe } from "../../pipes/msg-str.pipe"; + +@Component({ + selector: "kc-logout-other-sessions", + styles: [ + ` + :host { + display: contents; + } + ` + ], + standalone: true, + imports: [KcClassDirective, MsgStrPipe], + changeDetection: ChangeDetectionStrategy.OnPush, + templateUrl: "./logout-other-sessions.component.html", + providers: [ + { + provide: ComponentReference, + useExisting: forwardRef(() => LogoutOtherSessionsComponent) + } + ] +}) +export class LogoutOtherSessionsComponent extends ComponentReference { + override doUseDefaultCss = inject(USE_DEFAULT_CSS); + override classes = inject>>(CLASSES); +} diff --git a/src/login/components/password-wrapper/password-wrapper.component.html b/src/login/components/password-wrapper/password-wrapper.component.html new file mode 100644 index 00000000..1a4b0283 --- /dev/null +++ b/src/login/components/password-wrapper/password-wrapper.component.html @@ -0,0 +1,15 @@ +
+ + +
diff --git a/src/login/components/password-wrapper/password-wrapper.component.ts b/src/login/components/password-wrapper/password-wrapper.component.ts new file mode 100644 index 00000000..687dca93 --- /dev/null +++ b/src/login/components/password-wrapper/password-wrapper.component.ts @@ -0,0 +1,61 @@ +import { AsyncPipe } from "@angular/common"; +import { + ChangeDetectionStrategy, + Component, + forwardRef, + inject, + input, + Renderer2, + signal, + WritableSignal +} from "@angular/core"; +import { CLASSES, USE_DEFAULT_CSS } from "keycloakify-angular"; +import { ClassKey } from "keycloakify/login"; +import { ComponentReference } from "../../classes/component-reference.class"; +import { KcClassDirective } from "../../directives/kc-class.directive"; +import { MsgStrPipe } from "../../pipes/msg-str.pipe"; + +@Component({ + selector: "kc-password-wrapper", + styles: [ + ` + :host { + display: contents; + } + ` + ], + standalone: true, + changeDetection: ChangeDetectionStrategy.OnPush, + imports: [KcClassDirective, AsyncPipe, MsgStrPipe], + templateUrl: "./password-wrapper.component.html", + providers: [ + { + provide: ComponentReference, + useExisting: forwardRef(() => PasswordWrapperComponent) + } + ] +}) +export class PasswordWrapperComponent extends ComponentReference { + private renderer = inject(Renderer2); + passwordInputId = input.required(); + override doUseDefaultCss = inject(USE_DEFAULT_CSS); + override classes = inject>>(CLASSES); + + isPasswordRevealed: WritableSignal = signal(false); + + togglePasswordVisibility(): void { + this.isPasswordRevealed.update(revealed => !revealed); + this.setPasswordInputType(); + } + + private setPasswordInputType(): void { + const input = document.getElementById(this.passwordInputId()); + if (input) { + this.renderer.setProperty( + input, + "type", + this.isPasswordRevealed() ? "text" : "password" + ); + } + } +} diff --git a/src/login/components/select-tag/select-tag.component.html b/src/login/components/select-tag/select-tag.component.html new file mode 100644 index 00000000..ede6f1ec --- /dev/null +++ b/src/login/components/select-tag/select-tag.component.html @@ -0,0 +1,31 @@ +@let attr = attribute(); +@let multiple = isMultiple(); +@if (attr) { + +} diff --git a/src/login/components/select-tag/select-tag.component.ts b/src/login/components/select-tag/select-tag.component.ts new file mode 100644 index 00000000..e8575e50 --- /dev/null +++ b/src/login/components/select-tag/select-tag.component.ts @@ -0,0 +1,105 @@ +import { + ChangeDetectionStrategy, + Component, + computed, + forwardRef, + inject, + input, + output +} from "@angular/core"; +import { CLASSES, USE_DEFAULT_CSS } from "keycloakify-angular"; +import { Attribute, ClassKey } from "keycloakify/login"; +import { ComponentReference } from "../../classes/component-reference.class"; +import { KcClassDirective } from "../../directives/kc-class.directive"; +import { AdvancedMsgStrPipe } from "../../pipes/advanced-msg-str.pipe"; +import { ToNumberPipe } from "../../pipes/to-number.pipe"; +import { FormAction, FormFieldError } from "../../services/user-profile-form.service"; + +@Component({ + standalone: true, + styles: [ + ` + :host { + display: contents; + } + ` + ], + imports: [KcClassDirective, ToNumberPipe, AdvancedMsgStrPipe], + selector: "kc-select-tag", + templateUrl: "select-tag.component.html", + changeDetection: ChangeDetectionStrategy.OnPush, + providers: [ + { + provide: ComponentReference, + useExisting: forwardRef(() => SelectTagComponent) + } + ] +}) +export class SelectTagComponent extends ComponentReference { + attribute = input(); + valueOrValues = input(); + displayableErrors = input(); + dispatchFormAction = output(); + override doUseDefaultCss = inject(USE_DEFAULT_CSS); + override classes = inject>>(CLASSES); + + isMultiple = computed(() => { + return this.attribute()?.annotations?.inputType === "multiselect"; + }); + + options = computed(() => { + const attribute = this.attribute(); + if (attribute) { + return (() => { + walk: { + const { inputOptionsFromValidation } = attribute.annotations; + + if (inputOptionsFromValidation === undefined) { + break walk; + } + + const validator = ( + attribute.validators as Record + )[inputOptionsFromValidation]; + + if (validator === undefined) { + break walk; + } + + if (validator.options === undefined) { + break walk; + } + + return validator.options; + } + + return attribute.validators.options?.options ?? []; + })(); + } + return []; + }); + + onChange(event: Event) { + this.dispatchFormAction.emit({ + action: "update", + name: this.attribute()?.name ?? "", + valueOrValues: (() => { + if (this.isMultiple()) { + return Array.from( + (event.target as HTMLSelectElement).selectedOptions + ).map(option => option.value); + } + + return (event.target as HTMLSelectElement).value; + })() + }); + } + + onBlur() { + this.dispatchFormAction.emit({ + action: "focus lost", + name: this.attribute()?.name ?? "", + fieldIndex: undefined + }); + } +} diff --git a/src/login/components/textarea-tag/textarea-tag.component.html b/src/login/components/textarea-tag/textarea-tag.component.html new file mode 100644 index 00000000..2a10a52a --- /dev/null +++ b/src/login/components/textarea-tag/textarea-tag.component.html @@ -0,0 +1,18 @@ +@let attr = attribute(); +@if (attr) { + +} diff --git a/src/login/components/textarea-tag/textarea-tag.component.ts b/src/login/components/textarea-tag/textarea-tag.component.ts new file mode 100644 index 00000000..49ecd994 --- /dev/null +++ b/src/login/components/textarea-tag/textarea-tag.component.ts @@ -0,0 +1,59 @@ +import { + ChangeDetectionStrategy, + Component, + forwardRef, + inject, + input, + output +} from "@angular/core"; +import { CLASSES, USE_DEFAULT_CSS } from "keycloakify-angular"; +import { Attribute, ClassKey } from "keycloakify/login"; +import { ComponentReference } from "../../classes/component-reference.class"; +import { KcClassDirective } from "../../directives/kc-class.directive"; +import { ToNumberPipe } from "../../pipes/to-number.pipe"; +import { FormAction, FormFieldError } from "../../services/user-profile-form.service"; + +@Component({ + standalone: true, + styles: [ + ` + :host { + display: contents; + } + ` + ], + imports: [KcClassDirective, ToNumberPipe], + selector: "kc-textarea-tag", + templateUrl: "textarea-tag.component.html", + changeDetection: ChangeDetectionStrategy.OnPush, + providers: [ + { + provide: ComponentReference, + useExisting: forwardRef(() => TextareaTagComponent) + } + ] +}) +export class TextareaTagComponent extends ComponentReference { + attribute = input(); + value = input(); + displayableErrors = input(); + dispatchFormAction = output(); + override doUseDefaultCss = inject(USE_DEFAULT_CSS); + override classes = inject>>(CLASSES); + + onChange(event: Event) { + this.dispatchFormAction.emit({ + action: "update", + name: this.attribute()?.name ?? "", + valueOrValues: (event.target as HTMLTextAreaElement).value + }); + } + + onBlur() { + this.dispatchFormAction.emit({ + action: "focus lost", + name: this.attribute()?.name ?? "", + fieldIndex: undefined + }); + } +} diff --git a/src/login/components/user-profile-form-fields/user-profile-form-fields.component.html b/src/login/components/user-profile-form-fields/user-profile-form-fields.component.html new file mode 100644 index 00000000..67da0e34 --- /dev/null +++ b/src/login/components/user-profile-form-fields/user-profile-form-fields.component.html @@ -0,0 +1,85 @@ +@let formFieldStates = formState().formFieldStates; + +@for (fieldState of formFieldStates; track fieldState.attribute) { + + + + @if (beforeField) { + + + } + +
+
+ +
+ +
+ @if (fieldState.attribute.annotations.inputHelperTextBefore) { +
+ {{ fieldState.attribute.annotations.inputHelperTextBefore | advancedMsgStr }} +
+ } + + + + + + + @if (fieldState.attribute.annotations.inputHelperTextAfter) { +
+ {{ fieldState.attribute.annotations.inputHelperTextAfter | advancedMsgStr }} +
+ } + + @if (afterField) { + + + } + +
+
+} diff --git a/src/login/components/user-profile-form-fields/user-profile-form-fields.component.ts b/src/login/components/user-profile-form-fields/user-profile-form-fields.component.ts new file mode 100644 index 00000000..9215af29 --- /dev/null +++ b/src/login/components/user-profile-form-fields/user-profile-form-fields.component.ts @@ -0,0 +1,80 @@ +import { NgTemplateOutlet } from "@angular/common"; +import { + ChangeDetectionStrategy, + Component, + ContentChild, + effect, + forwardRef, + inject, + output, + TemplateRef +} from "@angular/core"; +import { DO_MAKE_USER_CONFIRM_PASSWORD, KC_CONTEXT } from "keycloakify-angular"; +import { ClassKey } from "keycloakify/login"; +import { KcContext } from "keycloakify/login/KcContext"; +import { ComponentReference } from "../../classes/component-reference.class"; +import { KcClassDirective } from "../../directives/kc-class.directive"; +import { AdvancedMsgStrPipe } from "../../pipes/advanced-msg-str.pipe"; +import { + FormAction, + UserProfileFormService +} from "../../services/user-profile-form.service"; +import { FieldErrorsComponent } from "../field-errors/field-errors.component"; +import { GroupLabelComponent } from "../group-label/group-label.component"; +import { InputFieldByTypeComponent } from "../input-field-by-type/input-field-by-type.component"; +import { CLASSES, USE_DEFAULT_CSS } from "keycloakify-angular"; + +@Component({ + standalone: true, + styles: [ + ` + :host { + display: contents; + } + ` + ], + imports: [ + KcClassDirective, + FieldErrorsComponent, + InputFieldByTypeComponent, + GroupLabelComponent, + NgTemplateOutlet, + AdvancedMsgStrPipe + ], + selector: "kc-user-profile-form-fields", + templateUrl: "user-profile-form-fields.component.html", + changeDetection: ChangeDetectionStrategy.OnPush, + providers: [ + UserProfileFormService, + { + provide: ComponentReference, + useExisting: forwardRef(() => UserProfileFormFieldsComponent) + } + ] +}) +export class UserProfileFormFieldsComponent extends ComponentReference { + kcContext = inject(KC_CONTEXT); + userProfileFormService = inject(UserProfileFormService); + doMakeUserConfirmPassword = inject(DO_MAKE_USER_CONFIRM_PASSWORD); + override doUseDefaultCss = inject(USE_DEFAULT_CSS); + override classes = inject>>(CLASSES); + + onIsFormSubmittable = output(); + + formState = this.userProfileFormService.formState; + + @ContentChild("beforField") beforeField: TemplateRef | undefined; + @ContentChild("afterField") afterField: TemplateRef | undefined; + + constructor() { + super(); + effect(() => { + const isFormSubmittable = this.formState().isFormSubmittable; + this.onIsFormSubmittable.emit(isFormSubmittable); + }); + } + + onDispatch(formAction: FormAction) { + this.userProfileFormService.dispatchFormAction(formAction); + } +} diff --git a/src/login/containers/template.component.html b/src/login/containers/template.component.html new file mode 100644 index 00000000..6cb38d9d --- /dev/null +++ b/src/login/containers/template.component.html @@ -0,0 +1,203 @@ +@let realm = kcContext.realm; +@let message = kcContext.message; +@let auth = kcContext.auth; +@let isAppInitiatedAction = kcContext.isAppInitiatedAction; +@let url = kcContext.url; +@let isReadyToRender = isReadyToRender$ | async; + +@if (isReadyToRender) { +
+
+
+
+
+
+ +
+
+ + @if (i18n.enabledLanguages.length > 1) { +
+
+ +
+
+ } + + + + @if (auth && !auth.showUsername && !auth.showResetCredentials) { +

+ +

+ } @else { +
+ + + + +
+ } +
+ + @if (displayRequiredFields()) { +
+
+ + * + {{ 'requiredFields' | msgStr }} + +
+
+ +
+
+ } @else { + + } +
+ +
+
+ + @if (displayMessage() && message && (message.type !== 'warning' || !isAppInitiatedAction)) { +
+
+ @switch (message.type) { + @case ('success') { + + } + @case ('warning') { + + } + @case ('info') { + + } + @case ('error') { + + } + } +
+ +
+ } + + + @if (!!auth && auth?.showTryAnotherWayLink) { +
+ +
+ } + + + + @if (displayInfo()) { +
+
+ +
+
+ } +
+
+
+
+} diff --git a/src/login/containers/template.component.ts b/src/login/containers/template.component.ts new file mode 100644 index 00000000..834ec292 --- /dev/null +++ b/src/login/containers/template.component.ts @@ -0,0 +1,89 @@ +import { AsyncPipe, NgTemplateOutlet } from "@angular/common"; +import { + ChangeDetectionStrategy, + Component, + forwardRef, + inject, + input, + OnInit, + Renderer2 +} from "@angular/core"; +import { Meta, Title } from "@angular/platform-browser"; +import { CLASSES, I18N, KC_CONTEXT, USE_DEFAULT_CSS } from "keycloakify-angular"; +import { I18n } from "keycloakify/login/i18n"; +import { KcContext } from "keycloakify/login/KcContext/KcContext"; +import { ClassKey, getKcClsx } from "keycloakify/login/lib/kcClsx"; +import { Observable } from "rxjs"; +import { ComponentReference } from "../classes/component-reference.class"; +import { KcClassDirective } from "../directives/kc-class.directive"; +import { KcSanitizePipe } from "../pipes"; +import { MsgStrPipe } from "../pipes/msg-str.pipe"; +import { LoginResourceInjectorService } from "../services/login-resource-injector.service"; + +@Component({ + selector: "kc-login-template", + templateUrl: "./template.component.html", + standalone: true, + imports: [AsyncPipe, KcSanitizePipe, NgTemplateOutlet, KcClassDirective, MsgStrPipe], + changeDetection: ChangeDetectionStrategy.OnPush, + providers: [ + { + provide: ComponentReference, + useExisting: forwardRef(() => TemplateComponent) + } + ] +}) +export class TemplateComponent extends ComponentReference implements OnInit { + i18n = inject(I18N); + renderer = inject(Renderer2); + meta = inject(Meta); + title = inject(Title); + kcContext = inject(KC_CONTEXT); + override doUseDefaultCss = inject(USE_DEFAULT_CSS); + override classes = inject>>(CLASSES); + loginResourceInjectorService = inject(LoginResourceInjectorService); + + displayInfo = input(false); + displayMessage = input(true); + displayRequiredFields = input(false); + documentTitle = input(); + bodyClassName = input(); + + isReadyToRender$: Observable; + + constructor() { + super(); + this.title.setTitle( + this.documentTitle() ?? + this.i18n.msgStr("loginTitle", this.kcContext.realm.displayName) + ); + this.isReadyToRender$ = this.loginResourceInjectorService.injectResource( + this.doUseDefaultCss + ); + } + + ngOnInit() { + this.applyKcIndexClasses(); + } + + private applyKcIndexClasses() { + const kcClsx = getKcClsx({ + doUseDefaultCss: this.doUseDefaultCss, + classes: this.classes + }).kcClsx; + const kcBodyClass = this.bodyClassName() ?? kcClsx("kcBodyClass"); + const kcHtmlClass = kcClsx("kcHtmlClass"); + const kcBodyClasses = kcBodyClass.split(/\s+/); + const kcHtmlClasses = kcHtmlClass.split(/\s+/); + kcBodyClasses.forEach(klass => { + this.renderer.addClass(document.body, klass); + }); + kcHtmlClasses.forEach(klass => { + this.renderer.addClass(document.documentElement, klass); + }); + } + + tryAnotherWay() { + document.forms["kc-select-try-another-way-form" as never].submit(); + } +} diff --git a/src/login/directives/attributes.directive.ts b/src/login/directives/attributes.directive.ts new file mode 100644 index 00000000..dfb7f68c --- /dev/null +++ b/src/login/directives/attributes.directive.ts @@ -0,0 +1,23 @@ +import { Directive, effect, ElementRef, inject, input, Renderer2 } from "@angular/core"; + +@Directive({ selector: "[kcAttributes]", standalone: true }) +export class AttributesDirective { + kcAttributes = input>(); + readonly #el = inject>(ElementRef); + readonly #renderer = inject(Renderer2); + + constructor() { + effect(() => { + const attributes = this.kcAttributes(); + if (attributes) { + Object.entries(attributes).forEach(([key, value]) => { + this.#renderer.setAttribute( + this.#el.nativeElement, + `data-${key}`, + value + ); + }); + } + }); + } +} diff --git a/src/login/directives/index.ts b/src/login/directives/index.ts new file mode 100644 index 00000000..97e90126 --- /dev/null +++ b/src/login/directives/index.ts @@ -0,0 +1,2 @@ +export * from "./attributes.directive"; +export * from "./kc-class.directive"; diff --git a/src/login/directives/kc-class.directive.ts b/src/login/directives/kc-class.directive.ts new file mode 100644 index 00000000..94000bcd --- /dev/null +++ b/src/login/directives/kc-class.directive.ts @@ -0,0 +1,167 @@ +/* eslint-disable @typescript-eslint/no-explicit-any */ +/* eslint-disable @typescript-eslint/consistent-indexed-object-style */ +import { + Directive, + DoCheck, + ElementRef, + inject, + Input, + isDevMode, + Renderer2, + ɵstringify as stringify +} from "@angular/core"; +import { ClassKey } from "keycloakify/login"; +import { getKcClsx } from "keycloakify/login/lib/kcClsx"; +import { ComponentReference } from "../classes/component-reference.class"; + +interface CssClassState { + // PERF: could use a bit mask to represent state as all fields are boolean flags + enabled: boolean; + changed: boolean; + touched: boolean; +} + +type KcClassSupportedTypes = + | ClassKey[] + | Set + | Partial<{ [key in ClassKey]: any }> + | null + | undefined; + +type NgClassSupportedTypes = + | string[] + | Set + | { [key: string]: any } + | null + | undefined; + +@Directive({ selector: "[kcClass]", standalone: true }) +export class KcClassDirective implements DoCheck { + private initialClasses: string[] = []; + private rawClass: NgClassSupportedTypes; + private rawKcClass: KcClassSupportedTypes; + + private stateMap = new Map(); + readonly #renderer = inject(Renderer2); + readonly #el = inject(ElementRef); + readonly #host = inject(ComponentReference); + // eslint-disable-next-line @angular-eslint/no-input-rename + @Input("class") + set klass(value: string) { + this.initialClasses = value != null ? value.trim().split(/\s+/) : []; + } + + // eslint-disable-next-line @angular-eslint/no-input-rename + @Input("ngClass") + set ngClass(value: string | NgClassSupportedTypes) { + this.rawClass = typeof value === "string" ? value.trim().split(/\s+/) : value; + } + + // eslint-disable-next-line @angular-eslint/no-input-rename + @Input("kcClass") + set kcClass(value: ClassKey | KcClassSupportedTypes) { + this.rawKcClass = + typeof value === "string" ? (value.trim().split(/\s+/) as ClassKey[]) : value; + } + + ngDoCheck(): void { + for (const klass of this.initialClasses) { + this._updateState(klass, true); + } + // classes from the [ngClass] binding + const rawClass = this.rawClass; + if (Array.isArray(rawClass) || rawClass instanceof Set) { + for (const klass of rawClass) { + this._updateState(klass, true); + } + } else if (rawClass != null) { + for (const klass of Object.keys(rawClass)) { + this._updateState(klass, Boolean(rawClass[klass])); + } + } + + // classes from the [kcClass] binding + const rawKcClass = this.rawKcClass; + if (Array.isArray(rawKcClass) || rawKcClass instanceof Set) { + for (const klass of rawKcClass) { + this._updateState(klass, true, true); + } + } else if (rawKcClass != null) { + for (const klass of Object.keys(rawKcClass)) { + this._updateState(klass, Boolean(rawKcClass[klass as ClassKey]), true); + } + } + + this._applyStateDiff(); + } + + private _updateState( + klass: string | ClassKey, + nextEnabled: boolean, + kcClsxCheck = false + ) { + const state = this.stateMap.get(klass); + if (state !== undefined) { + if (state.enabled !== nextEnabled) { + state.changed = true; + state.enabled = nextEnabled; + } + state.touched = true; + } else { + let klassChecked = klass; + if (kcClsxCheck) { + const doUseDefaultCss = this.#host.doUseDefaultCss ?? true; + const classes = this.#host.classes; + const kcClsx = getKcClsx({ doUseDefaultCss, classes }).kcClsx; + klassChecked = kcClsx(klass as ClassKey); + } + this.stateMap.set(klassChecked, { + enabled: nextEnabled, + changed: true, + touched: true + }); + } + } + + private _applyStateDiff() { + for (const stateEntry of this.stateMap) { + const klass = stateEntry[0]; + const state = stateEntry[1]; + + if (state.changed) { + this._toggleClass(klass, state.enabled); + state.changed = false; + } else if (!state.touched) { + // A class that was previously active got removed from the new collection of classes - + // remove from the DOM as well. + if (state.enabled) { + this._toggleClass(klass, false); + } + this.stateMap.delete(klass); + } + + state.touched = false; + } + } + + private _toggleClass(klass: string, enabled: boolean): void { + if (isDevMode()) { + if (typeof klass !== "string") { + throw new Error( + `NgClass can only toggle CSS classes expressed as strings, got ${stringify(klass)}` + ); + } + } + + klass = klass.trim(); + if (klass.length > 0) { + klass.split(/\s+/).forEach(klass => { + if (enabled) { + this.#renderer.addClass(this.#el.nativeElement, klass); + } else { + this.#renderer.removeClass(this.#el.nativeElement, klass); + } + }); + } + } +} diff --git a/src/login/pages/code/code.component.html b/src/login/pages/code/code.component.html new file mode 100644 index 00000000..225d9ae9 --- /dev/null +++ b/src/login/pages/code/code.component.html @@ -0,0 +1,26 @@ +@let code = kcContext.code; + + + + @if (code.success) { + {{ 'codeSuccessTitle' | msgStr }} + } @else { + {{ 'codeErrorTitle' | msgStr: code.error }} + } + + + +
+ @if (code.success) { +

{{ 'copyCodeInstruction' | msgStr }}

+ + } @else { +

{{ code.error }}

+ } +
+
+
diff --git a/src/login/pages/code/code.component.ts b/src/login/pages/code/code.component.ts new file mode 100644 index 00000000..b6517f28 --- /dev/null +++ b/src/login/pages/code/code.component.ts @@ -0,0 +1,27 @@ +import { ChangeDetectionStrategy, Component, forwardRef, inject } from "@angular/core"; +import { CLASSES, KC_CONTEXT, USE_DEFAULT_CSS } from "keycloakify-angular"; +import { ClassKey } from "keycloakify/login"; +import { KcContext } from "keycloakify/login/KcContext"; +import { ComponentReference } from "../../classes/component-reference.class"; +import { TemplateComponent } from "../../containers/template.component"; +import { KcClassDirective } from "../../directives/kc-class.directive"; +import { MsgStrPipe } from "../../pipes/msg-str.pipe"; + +@Component({ + standalone: true, + imports: [MsgStrPipe, TemplateComponent, KcClassDirective], + selector: "kc-root", + templateUrl: "code.component.html", + changeDetection: ChangeDetectionStrategy.OnPush, + providers: [ + { + provide: ComponentReference, + useExisting: forwardRef(() => CodeComponent) + } + ] +}) +export class CodeComponent extends ComponentReference { + kcContext = inject>(KC_CONTEXT); + override doUseDefaultCss = inject(USE_DEFAULT_CSS); + override classes = inject>>(CLASSES); +} diff --git a/src/login/pages/delete-account-confirm/delete-account-confirm.component.html b/src/login/pages/delete-account-confirm/delete-account-confirm.component.html new file mode 100644 index 00000000..3cf3b017 --- /dev/null +++ b/src/login/pages/delete-account-confirm/delete-account-confirm.component.html @@ -0,0 +1,46 @@ +@let url = kcContext.url; +@let triggered_from_aia = kcContext.triggered_from_aia; + + + {{ 'deleteAccountConfirm' | msgStr }} + + +
+
+ + {{ 'irreversibleAction' | msgStr }} +
+

{{ 'deletingImplies' | msgStr }}

+
    +
  • {{ 'loggingOutImmediately' | msgStr }}
  • +
  • {{ 'errasingData' | msgStr }}
  • +
+ +
+ + @if (triggered_from_aia) { + + } +
+
+
+
diff --git a/src/login/pages/delete-account-confirm/delete-account-confirm.component.ts b/src/login/pages/delete-account-confirm/delete-account-confirm.component.ts new file mode 100644 index 00000000..0b43cad5 --- /dev/null +++ b/src/login/pages/delete-account-confirm/delete-account-confirm.component.ts @@ -0,0 +1,28 @@ +import { ChangeDetectionStrategy, Component, forwardRef, inject } from "@angular/core"; +import { CLASSES, KC_CONTEXT, USE_DEFAULT_CSS } from "keycloakify-angular"; +import { ClassKey } from "keycloakify/login"; +import { KcContext } from "keycloakify/login/KcContext"; +import { ComponentReference } from "../../classes/component-reference.class"; +import { TemplateComponent } from "../../containers/template.component"; +import { KcClassDirective } from "../../directives"; +import { MsgStrPipe } from "../../pipes/msg-str.pipe"; + +@Component({ + standalone: true, + imports: [TemplateComponent, MsgStrPipe, KcClassDirective], + selector: "kc-root", + templateUrl: "delete-account-confirm.component.html", + changeDetection: ChangeDetectionStrategy.OnPush, + providers: [ + { + provide: ComponentReference, + useExisting: forwardRef(() => DeleteAccountConfirmComponent) + } + ] +}) +export class DeleteAccountConfirmComponent extends ComponentReference { + kcContext = + inject>(KC_CONTEXT); + override doUseDefaultCss = inject(USE_DEFAULT_CSS); + override classes = inject>>(CLASSES); +} diff --git a/src/login/pages/delete-credential/delete-credential.component.html b/src/login/pages/delete-credential/delete-credential.component.html new file mode 100644 index 00000000..7e8c3a18 --- /dev/null +++ b/src/login/pages/delete-credential/delete-credential.component.html @@ -0,0 +1,35 @@ +@let url = kcContext.url; +@let credentialLabel = kcContext.credentialLabel; + + + {{ 'deleteCredentialTitle' | msgStr: credentialLabel }} + + +
+ {{ 'deleteCredentialMessage' | msgStr: credentialLabel }} +
+ +
+ + + +
+
+
+
diff --git a/src/login/pages/delete-credential/delete-credential.component.ts b/src/login/pages/delete-credential/delete-credential.component.ts new file mode 100644 index 00000000..5fc12a17 --- /dev/null +++ b/src/login/pages/delete-credential/delete-credential.component.ts @@ -0,0 +1,39 @@ +import { + ChangeDetectionStrategy, + Component, + forwardRef, + inject, + input +} from "@angular/core"; +import { CLASSES, KC_CONTEXT, USE_DEFAULT_CSS } from "keycloakify-angular"; +import { ClassKey } from "keycloakify/login"; +import { KcContext } from "keycloakify/login/KcContext"; +import { ComponentReference } from "../../classes/component-reference.class"; +import { TemplateComponent } from "../../containers/template.component"; +import { KcClassDirective } from "../../directives/kc-class.directive"; +import { MsgStrPipe } from "../../pipes/msg-str.pipe"; + +@Component({ + standalone: true, + imports: [MsgStrPipe, TemplateComponent, KcClassDirective], + selector: "kc-root", + templateUrl: "delete-credential.component.html", + changeDetection: ChangeDetectionStrategy.OnPush, + providers: [ + { + provide: ComponentReference, + useExisting: forwardRef(() => DeleteCredentialComponent) + } + ] +}) +export class DeleteCredentialComponent extends ComponentReference { + kcContext = + inject>(KC_CONTEXT); + override doUseDefaultCss = inject(USE_DEFAULT_CSS); + override classes = inject>>(CLASSES); + displayRequiredFields = input(false); + documentTitle = input(); + bodyClassName = input(); + displayInfo: boolean = false; + displayMessage: boolean = false; +} diff --git a/src/login/pages/error/error.component.html b/src/login/pages/error/error.component.html new file mode 100644 index 00000000..5a355180 --- /dev/null +++ b/src/login/pages/error/error.component.html @@ -0,0 +1,25 @@ +@let message = kcContext.message; +@let skipLink = kcContext.skipLink; +@let client = kcContext.client; + + + {{ 'errorTitle' | msgStr }} + + +
+

+ @if (!skipLink && !!client?.baseUrl) { +

+ +

+ } +
+
+
diff --git a/src/login/pages/error/error.component.ts b/src/login/pages/error/error.component.ts new file mode 100644 index 00000000..b147f5f0 --- /dev/null +++ b/src/login/pages/error/error.component.ts @@ -0,0 +1,27 @@ +import { ChangeDetectionStrategy, Component, forwardRef, inject } from "@angular/core"; +import { CLASSES, KC_CONTEXT, USE_DEFAULT_CSS } from "keycloakify-angular"; +import { ClassKey } from "keycloakify/login"; +import { KcContext } from "keycloakify/login/KcContext"; +import { ComponentReference } from "../../classes/component-reference.class"; +import { TemplateComponent } from "../../containers/template.component"; +import { KcSanitizePipe } from "../../pipes/kc-sanitize.pipe"; +import { MsgStrPipe } from "../../pipes/msg-str.pipe"; + +@Component({ + standalone: true, + imports: [TemplateComponent, MsgStrPipe, KcSanitizePipe], + selector: "kc-root", + templateUrl: "error.component.html", + changeDetection: ChangeDetectionStrategy.OnPush, + providers: [ + { + provide: ComponentReference, + useExisting: forwardRef(() => ErrorComponent) + } + ] +}) +export class ErrorComponent extends ComponentReference { + kcContext = inject>(KC_CONTEXT); + override doUseDefaultCss = inject(USE_DEFAULT_CSS); + override classes = inject>>(CLASSES); +} diff --git a/src/login/pages/frontchannel-logout/frontchannel-logout.component.html b/src/login/pages/frontchannel-logout/frontchannel-logout.component.html new file mode 100644 index 00000000..24864ede --- /dev/null +++ b/src/login/pages/frontchannel-logout/frontchannel-logout.component.html @@ -0,0 +1,35 @@ +@let logout = kcContext.logout; + + + {{ 'frontchannel-logout.title' | msgStr }} + + +

{{ 'frontchannel-logout.message' | msgStr }}

+
    + @for (client of logout.clients; track client.name; let idx = $index) { +
  • + {{ client.name }} + +
  • + } +
+ @if (logout.logoutRedirectUri) { + + {{ 'doContinue' | msgStr }} + + } +
+
diff --git a/src/login/pages/frontchannel-logout/frontchannel-logout.component.ts b/src/login/pages/frontchannel-logout/frontchannel-logout.component.ts new file mode 100644 index 00000000..cf275103 --- /dev/null +++ b/src/login/pages/frontchannel-logout/frontchannel-logout.component.ts @@ -0,0 +1,45 @@ +import { + ChangeDetectionStrategy, + Component, + forwardRef, + inject, + input, + OnInit +} from "@angular/core"; +import { CLASSES, KC_CONTEXT, USE_DEFAULT_CSS } from "keycloakify-angular"; +import { ClassKey } from "keycloakify/login"; +import { KcContext } from "keycloakify/login/KcContext"; +import { ComponentReference } from "../../classes/component-reference.class"; +import { TemplateComponent } from "../../containers/template.component"; +import { KcSanitizePipe } from "../../pipes/kc-sanitize.pipe"; +import { MsgStrPipe } from "../../pipes/msg-str.pipe"; + +@Component({ + standalone: true, + imports: [TemplateComponent, MsgStrPipe, KcSanitizePipe], + selector: "kc-root", + templateUrl: "frontchannel-logout.component.html", + changeDetection: ChangeDetectionStrategy.OnPush, + providers: [ + { + provide: ComponentReference, + useExisting: forwardRef(() => FrontchannelLogoutComponent) + } + ] +}) +export class FrontchannelLogoutComponent extends ComponentReference implements OnInit { + kcContext = + inject>(KC_CONTEXT); + override doUseDefaultCss = inject(USE_DEFAULT_CSS); + override classes = inject>>(CLASSES); + displayRequiredFields = input(false); + bodyClassName = input(); + displayInfo: boolean = false; + displayMessage: boolean = false; + + ngOnInit(): void { + if (this.kcContext.logout.logoutRedirectUri) { + window.location.replace(this.kcContext.logout.logoutRedirectUri); + } + } +} diff --git a/src/login/pages/idp-review-user-profile/idp-review-user-profile.component.html b/src/login/pages/idp-review-user-profile/idp-review-user-profile.component.html new file mode 100644 index 00000000..44e1c7b2 --- /dev/null +++ b/src/login/pages/idp-review-user-profile/idp-review-user-profile.component.html @@ -0,0 +1,41 @@ +@let url = kcContext.url; + + + {{ 'loginIdpReviewProfileTitle' | msgStr }} + + +
+ +
+
+
+
+
+ +
+
+ +
+
diff --git a/src/login/pages/idp-review-user-profile/idp-review-user-profile.component.ts b/src/login/pages/idp-review-user-profile/idp-review-user-profile.component.ts new file mode 100644 index 00000000..7fde8966 --- /dev/null +++ b/src/login/pages/idp-review-user-profile/idp-review-user-profile.component.ts @@ -0,0 +1,51 @@ +import { + ChangeDetectionStrategy, + Component, + forwardRef, + inject, + input, + signal +} from "@angular/core"; +import { CLASSES, KC_CONTEXT, USE_DEFAULT_CSS } from "keycloakify-angular"; +import { ClassKey } from "keycloakify/login"; +import { KcContext } from "keycloakify/login/KcContext"; +import { ComponentReference } from "../../classes/component-reference.class"; +import { UserProfileFormFieldsComponent } from "../../components/user-profile-form-fields/user-profile-form-fields.component"; +import { TemplateComponent } from "../../containers/template.component"; +import { KcClassDirective } from "../../directives/kc-class.directive"; +import { MsgStrPipe } from "../../pipes/msg-str.pipe"; + +@Component({ + standalone: true, + imports: [ + TemplateComponent, + MsgStrPipe, + UserProfileFormFieldsComponent, + KcClassDirective + ], + selector: "kc-root", + templateUrl: "idp-review-user-profile.component.html", + changeDetection: ChangeDetectionStrategy.OnPush, + providers: [ + { + provide: ComponentReference, + useExisting: forwardRef(() => IdpReviewUserProfileComponent) + } + ] +}) +export class IdpReviewUserProfileComponent extends ComponentReference { + kcContext = + inject>(KC_CONTEXT); + displayRequiredFields = input(true); + documentTitle = input(); + bodyClassName = input(); + override doUseDefaultCss = inject(USE_DEFAULT_CSS); + override classes = inject>>(CLASSES); + isFormSubmittable = signal(false); + displayInfo: boolean = false; + displayMessage: boolean = !this.kcContext?.messagesPerField?.existsError("global"); + + onCallback() { + (document.getElementById("kc-register-form") as HTMLFormElement).submit(); + } +} diff --git a/src/login/pages/info/info.component.html b/src/login/pages/info/info.component.html new file mode 100644 index 00000000..e5a73a73 --- /dev/null +++ b/src/login/pages/info/info.component.html @@ -0,0 +1,54 @@ +@let skipLink = kcContext.skipLink; +@let actionUri = kcContext.actionUri; +@let pageRedirectUri = kcContext.pageRedirectUri; +@let client = kcContext.client; +@let messageHeader = kcContext.messageHeader; +@let message = kcContext.message; + + + + + +
+

+ @if (!skipLink) { + @if (pageRedirectUri) { +

+ + +

+ } + @if (actionUri) { +

+ + +

+ } + @if (client.baseUrl) { +

+ + +

+ } + } +
+
+
diff --git a/src/login/pages/info/info.component.ts b/src/login/pages/info/info.component.ts new file mode 100644 index 00000000..b7fdd40e --- /dev/null +++ b/src/login/pages/info/info.component.ts @@ -0,0 +1,61 @@ +import { + ChangeDetectionStrategy, + Component, + forwardRef, + inject, + input +} from "@angular/core"; +import { CLASSES, KC_CONTEXT, USE_DEFAULT_CSS } from "keycloakify-angular"; +import { ClassKey } from "keycloakify/login"; +import { KcContext } from "keycloakify/login/KcContext"; +import { ComponentReference } from "../../classes/component-reference.class"; +import { TemplateComponent } from "../../containers/template.component"; +import { AdvancedMsgStrPipe } from "../../pipes/advanced-msg-str.pipe"; +import { KcSanitizePipe } from "../../pipes/kc-sanitize.pipe"; +import { MsgStrPipe } from "../../pipes/msg-str.pipe"; + +@Component({ + standalone: true, + imports: [TemplateComponent, MsgStrPipe, KcSanitizePipe, AdvancedMsgStrPipe], + selector: "kc-root", + templateUrl: "info.component.html", + changeDetection: ChangeDetectionStrategy.OnPush, + providers: [ + AdvancedMsgStrPipe, + MsgStrPipe, + KcSanitizePipe, + { + provide: ComponentReference, + useExisting: forwardRef(() => InfoComponent) + } + ] +}) +export class InfoComponent extends ComponentReference { + kcContext = inject>(KC_CONTEXT); + advancedMsgStr = inject(AdvancedMsgStrPipe); + kcSanitize = inject(KcSanitizePipe); + msgStr = inject(MsgStrPipe); + override doUseDefaultCss = inject(USE_DEFAULT_CSS); + override classes = inject>>(CLASSES); + displayRequiredFields = input(false); + documentTitle = input(); + bodyClassName = input(); + displayInfo: boolean = false; + displayMessage: boolean = false; + + get infoMessage() { + let html = this.kcContext.message.summary; + if (this.kcContext.requiredActions) { + html += ""; + + html += this.kcContext.requiredActions + .map(requiredAction => + this.advancedMsgStr.transform(`requiredAction.${requiredAction}`) + ) + .join(", "); + + html += ""; + } + return html; + } +} diff --git a/src/login/pages/login-config-totp/login-config-totp.component.html b/src/login/pages/login-config-totp/login-config-totp.component.html new file mode 100644 index 00000000..56310e7e --- /dev/null +++ b/src/login/pages/login-config-totp/login-config-totp.component.html @@ -0,0 +1,190 @@ +@let totp = kcContext.totp; +@let url = kcContext.url; +@let messagesPerField = kcContext.messagesPerField; +@let mode = kcContext.mode; +@let isAppInitiatedAction = kcContext.isAppInitiatedAction; + + + {{ 'loginTotpStep1' | msgStr }} + + +
    +
  1. +

    {{ 'loginTotpStep1' | msgStr }}

    +
      + @for (app of totp.supportedApplications; track app) { +
    • {{ app | advancedMsgStr }}
    • + } +
    +
  2. + @if (kcContext.mode === 'manual') { +
  3. +

    {{ 'loginTotpManualStep2' | msgStr }}

    +

    + {{ totp.totpSecretEncoded }} +

    +

    + + {{ 'loginTotpScanBarcode' | msgStr }} + +

    +
  4. +
  5. +

    {{ 'loginTotpManualStep3' | msgStr }}

    +

    +
      +
    • + {{ 'loginTotpType' | msgStr }}: {{ 'loginTotp.' + totp.policy.type | advancedMsgStr }} +
    • +
    • {{ 'loginTotpAlgorithm' | msgStr }}: {{ totp.policy.getAlgorithmKey() }}
    • +
    • {{ 'loginTotpDigits' | msgStr }}: {{ totp.policy.digits }}
    • + @if (totp.policy.type === 'totp') { +
    • {{ 'loginTotpInterval' | msgStr }}: {{ totp.policy.period }}
    • + } @else { +
    • {{ 'loginTotpCounter' | msgStr }}: {{ totp.policy.initialCounter }}
    • + } +
    +
  6. + } @else { +
  7. +

    {{ 'loginTotpStep2' | msgStr }}

    + Figure: Barcode +
    +

    + + {{ 'loginTotpUnableToScan' | msgStr }} + +

    +
  8. + } +
  9. +

    {{ 'loginTotpStep3' | msgStr }}

    +

    {{ 'loginTotpStep3DeviceName' | msgStr }}

    +
  10. +
+
+
+
+ + * +
+
+ + @if (messagesPerField.existsError('totp')) { + + } +
+ + @if (mode) { + + } +
+
+
+ + @if (totp.otpCredentials.length >= 1) { + * + } +
+
+ + @if (messagesPerField.existsError('userLabel')) { + + } +
+
+
+ +
+ + @if (isAppInitiatedAction) { + + + } @else { + + } +
+> diff --git a/src/login/pages/login-config-totp/login-config-totp.component.ts b/src/login/pages/login-config-totp/login-config-totp.component.ts new file mode 100644 index 00000000..224dd285 --- /dev/null +++ b/src/login/pages/login-config-totp/login-config-totp.component.ts @@ -0,0 +1,53 @@ +import { + ChangeDetectionStrategy, + Component, + forwardRef, + inject, + input +} from "@angular/core"; +import { CLASSES, KC_CONTEXT, USE_DEFAULT_CSS } from "keycloakify-angular"; +import { ClassKey } from "keycloakify/login"; +import { KcContext } from "keycloakify/login/KcContext"; +import { ComponentReference } from "../../classes/component-reference.class"; +import { LogoutOtherSessionsComponent } from "../../components/logout-other-sessions/logout-other-sessions.component"; +import { TemplateComponent } from "../../containers/template.component"; +import { KcClassDirective } from "../../directives/kc-class.directive"; +import { AdvancedMsgStrPipe } from "../../pipes/advanced-msg-str.pipe"; +import { KcSanitizePipe } from "../../pipes/kc-sanitize.pipe"; +import { MsgStrPipe } from "../../pipes/msg-str.pipe"; + +@Component({ + standalone: true, + imports: [ + TemplateComponent, + MsgStrPipe, + AdvancedMsgStrPipe, + KcClassDirective, + KcSanitizePipe, + LogoutOtherSessionsComponent + ], + selector: "kc-root", + templateUrl: "login-config-totp.component.html", + changeDetection: ChangeDetectionStrategy.OnPush, + providers: [ + { + provide: ComponentReference, + useExisting: forwardRef(() => LoginConfigTotpComponent) + } + ] +}) +export class LoginConfigTotpComponent extends ComponentReference { + kcContext = + inject>(KC_CONTEXT); + + override doUseDefaultCss = inject(USE_DEFAULT_CSS); + override classes = inject>>(CLASSES); + displayRequiredFields = input(false); + documentTitle = input(); + bodyClassName = input(); + displayInfo: boolean = false; + displayMessage: boolean = this.kcContext.messagesPerField.existsError( + "totp", + "userLabel" + ); +} diff --git a/src/login/pages/login-idp-link-confirm-override/login-idp-link-confirm-override.component.html b/src/login/pages/login-idp-link-confirm-override/login-idp-link-confirm-override.component.html new file mode 100644 index 00000000..9e934f96 --- /dev/null +++ b/src/login/pages/login-idp-link-confirm-override/login-idp-link-confirm-override.component.html @@ -0,0 +1,40 @@ +@let url = kcContext.url; +@let idpDisplayName = kcContext.idpDisplayName; + + + + {{ 'confirmOverrideIdpTitle' | msgStr }} + + +
+ {{ 'pageExpiredMsg1' | msgStr }} + + {{ 'doClickHere' | msgStr }} + +
+
+ +
+
+
diff --git a/src/login/pages/login-idp-link-confirm-override/login-idp-link-confirm-override.component.ts b/src/login/pages/login-idp-link-confirm-override/login-idp-link-confirm-override.component.ts new file mode 100644 index 00000000..654a25ce --- /dev/null +++ b/src/login/pages/login-idp-link-confirm-override/login-idp-link-confirm-override.component.ts @@ -0,0 +1,41 @@ +import { + ChangeDetectionStrategy, + Component, + forwardRef, + inject, + input +} from "@angular/core"; +import { CLASSES, KC_CONTEXT, USE_DEFAULT_CSS } from "keycloakify-angular"; +import { ClassKey } from "keycloakify/login"; +import { KcContext } from "keycloakify/login/KcContext"; +import { ComponentReference } from "../../classes/component-reference.class"; +import { TemplateComponent } from "../../containers/template.component"; +import { KcClassDirective } from "../../directives/kc-class.directive"; +import { MsgStrPipe } from "../../pipes/msg-str.pipe"; + +@Component({ + standalone: true, + imports: [KcClassDirective, TemplateComponent, MsgStrPipe], + selector: "kc-root", + templateUrl: "login-idp-link-confirm-override.component.html", + changeDetection: ChangeDetectionStrategy.OnPush, + providers: [ + { + provide: ComponentReference, + useExisting: forwardRef(() => LoginIdpLinkConfirmOverrideComponent) + } + ] +}) +export class LoginIdpLinkConfirmOverrideComponent extends ComponentReference { + kcContext = + inject>( + KC_CONTEXT + ); + override doUseDefaultCss = inject(USE_DEFAULT_CSS); + override classes = inject>>(CLASSES); + displayRequiredFields = input(false); + documentTitle = input(); + bodyClassName = input(); + displayInfo: boolean = false; + displayMessage: boolean = false; +} diff --git a/src/login/pages/login-idp-link-confirm/login-idp-link-confirm.component.html b/src/login/pages/login-idp-link-confirm/login-idp-link-confirm.component.html new file mode 100644 index 00000000..e5152bd9 --- /dev/null +++ b/src/login/pages/login-idp-link-confirm/login-idp-link-confirm.component.html @@ -0,0 +1,41 @@ +@let url = kcContext.url; +@let idpAlias = kcContext.idpAlias; + + + {{ 'confirmLinkIdpTitle' | msgStr }} + + +
+
+ + +
+
+
+
diff --git a/src/login/pages/login-idp-link-confirm/login-idp-link-confirm.component.ts b/src/login/pages/login-idp-link-confirm/login-idp-link-confirm.component.ts new file mode 100644 index 00000000..8b24179a --- /dev/null +++ b/src/login/pages/login-idp-link-confirm/login-idp-link-confirm.component.ts @@ -0,0 +1,39 @@ +import { + ChangeDetectionStrategy, + Component, + forwardRef, + inject, + input +} from "@angular/core"; +import { CLASSES, KC_CONTEXT, USE_DEFAULT_CSS } from "keycloakify-angular"; +import { ClassKey } from "keycloakify/login"; +import { KcContext } from "keycloakify/login/KcContext"; +import { ComponentReference } from "../../classes/component-reference.class"; +import { TemplateComponent } from "../../containers/template.component"; +import { KcClassDirective } from "../../directives/kc-class.directive"; +import { MsgStrPipe } from "../../pipes/msg-str.pipe"; + +@Component({ + standalone: true, + imports: [TemplateComponent, MsgStrPipe, KcClassDirective], + selector: "kc-root", + templateUrl: "login-idp-link-confirm.component.html", + changeDetection: ChangeDetectionStrategy.OnPush, + providers: [ + { + provide: ComponentReference, + useExisting: forwardRef(() => LoginIdpLinkConfirmComponent) + } + ] +}) +export class LoginIdpLinkConfirmComponent extends ComponentReference { + kcContext = + inject>(KC_CONTEXT); + override doUseDefaultCss = inject(USE_DEFAULT_CSS); + override classes = inject>>(CLASSES); + displayRequiredFields = input(false); + documentTitle = input(); + bodyClassName = input(); + displayInfo: boolean = false; + displayMessage: boolean = false; +} diff --git a/src/login/pages/login-idp-link-email/login-idp-link-email.component.html b/src/login/pages/login-idp-link-email/login-idp-link-email.component.html new file mode 100644 index 00000000..72f1f890 --- /dev/null +++ b/src/login/pages/login-idp-link-email/login-idp-link-email.component.html @@ -0,0 +1,37 @@ +@let idpAlias = kcContext.idpAlias; +@let brokerContext = kcContext.brokerContext; +@let realm = kcContext.realm; +@let url = kcContext.url; + + + {{ 'emailLinkIdpTitle' | msgStr: idpAlias }} + + +

+ {{ 'emailLinkIdp1' | msgStr: idpAlias : brokerContext.username : realm.displayName }} +

+

+ {{ 'emailLinkIdp2' | msgStr }} {{ 'doClickHere' | msgStr }} + {{ 'emailLinkIdp3' | msgStr }} +

+

+ {{ 'emailLinkIdp4' | msgStr }} {{ 'doClickHere' | msgStr }} + {{ 'emailLinkIdp5' | msgStr }} +

+
diff --git a/src/login/pages/login-idp-link-email/login-idp-link-email.component.ts b/src/login/pages/login-idp-link-email/login-idp-link-email.component.ts new file mode 100644 index 00000000..5f80436f --- /dev/null +++ b/src/login/pages/login-idp-link-email/login-idp-link-email.component.ts @@ -0,0 +1,39 @@ +import { + ChangeDetectionStrategy, + Component, + forwardRef, + inject, + input +} from "@angular/core"; +import { CLASSES, KC_CONTEXT, USE_DEFAULT_CSS } from "keycloakify-angular"; +import { ClassKey } from "keycloakify/login"; +import { KcContext } from "keycloakify/login/KcContext"; +import { ComponentReference } from "../../classes/component-reference.class"; +import { TemplateComponent } from "../../containers/template.component"; +import { KcClassDirective } from "../../directives/kc-class.directive"; +import { MsgStrPipe } from "../../pipes/msg-str.pipe"; + +@Component({ + standalone: true, + imports: [TemplateComponent, MsgStrPipe, KcClassDirective], + selector: "kc-root", + templateUrl: "login-idp-link-email.component.html", + changeDetection: ChangeDetectionStrategy.OnPush, + providers: [ + { + provide: ComponentReference, + useExisting: forwardRef(() => LoginIdpLinkEmailComponent) + } + ] +}) +export class LoginIdpLinkEmailComponent extends ComponentReference { + kcContext = + inject>(KC_CONTEXT); + override doUseDefaultCss = inject(USE_DEFAULT_CSS); + override classes = inject>>(CLASSES); + displayRequiredFields = input(false); + documentTitle = input(); + bodyClassName = input(); + displayInfo: boolean = false; + displayMessage: boolean = false; +} diff --git a/src/login/pages/login-oauth-grant/login-oauth-grant.component.html b/src/login/pages/login-oauth-grant/login-oauth-grant.component.html new file mode 100644 index 00000000..f6333894 --- /dev/null +++ b/src/login/pages/login-oauth-grant/login-oauth-grant.component.html @@ -0,0 +1,92 @@ +@let client = kcContext.client; +@let oauth = kcContext.oauth; +@let url = kcContext.url; + + + @if (client.attributes['logoUri']) { + + } +

{{ 'oauthGrantTitle' | msgStr: (client.name ? (client.name | advancedMsgStr) : client.clientId) }}

+
+ + +
+

{{ 'oauthGrantRequest' | msgStr }}

+
    + @for (clientScope of oauth.clientScopesRequested; track clientScope) { +
  • + + {{ clientScope.consentScreenText | advancedMsgStr }} + @if (clientScope.dynamicScopeParameter) { + : {{ clientScope.dynamicScopeParameter }} + } + +
  • + } +
+ + @if (client.attributes['policyUri'] || client.attributes['tosUri']) { +

+ @if (client.name) { + {{ 'oauthGrantInformation' | msgStr: (client.name | advancedMsgStr) }} + } @else { + {{ 'oauthGrantInformation' | msgStr: client.clientId }} + } + @if (client.attributes['policyUri']) { + {{ 'oauthGrantReview' | msgStr }} + + {{ 'oauthGrantPolicy' | msgStr }} + + } +

+ } +
+ +
+
+
+
+ +
+
+ + +
+
+
+
+
+
+
+
diff --git a/src/login/pages/login-oauth-grant/login-oauth-grant.component.ts b/src/login/pages/login-oauth-grant/login-oauth-grant.component.ts new file mode 100644 index 00000000..85725a0f --- /dev/null +++ b/src/login/pages/login-oauth-grant/login-oauth-grant.component.ts @@ -0,0 +1,40 @@ +import { + ChangeDetectionStrategy, + Component, + forwardRef, + inject, + input +} from "@angular/core"; +import { CLASSES, KC_CONTEXT, USE_DEFAULT_CSS } from "keycloakify-angular"; +import { ClassKey } from "keycloakify/login"; +import { KcContext } from "keycloakify/login/KcContext"; +import { ComponentReference } from "../../classes/component-reference.class"; +import { TemplateComponent } from "../../containers/template.component"; +import { KcClassDirective } from "../../directives/kc-class.directive"; +import { AdvancedMsgStrPipe } from "../../pipes/advanced-msg-str.pipe"; +import { MsgStrPipe } from "../../pipes/msg-str.pipe"; + +@Component({ + standalone: true, + imports: [KcClassDirective, TemplateComponent, MsgStrPipe, AdvancedMsgStrPipe], + selector: "kc-root", + templateUrl: "login-oauth-grant.component.html", + changeDetection: ChangeDetectionStrategy.OnPush, + providers: [ + { + provide: ComponentReference, + useExisting: forwardRef(() => LoginOauthGrantComponent) + } + ] +}) +export class LoginOauthGrantComponent extends ComponentReference { + kcContext = + inject>(KC_CONTEXT); + override doUseDefaultCss = inject(USE_DEFAULT_CSS); + override classes = inject>>(CLASSES); + displayRequiredFields = input(false); + documentTitle = input(); + bodyClassName = input("oauth"); + displayInfo: boolean = false; + displayMessage: boolean = false; +} diff --git a/src/login/pages/login-oauth2-device-verify-user-code/login-oauth2-device-verify-user-code.component.html b/src/login/pages/login-oauth2-device-verify-user-code/login-oauth2-device-verify-user-code.component.html new file mode 100644 index 00000000..4b59d2b9 --- /dev/null +++ b/src/login/pages/login-oauth2-device-verify-user-code/login-oauth2-device-verify-user-code.component.html @@ -0,0 +1,63 @@ +@let url = kcContext.url; + + + {{ 'oauth2DeviceVerificationTitle' | msgStr }} + + +
+
+
+ +
+ +
+ +
+
+
+
+
+
+ +
+
+ +
+
+
+
+
+
diff --git a/src/login/pages/login-oauth2-device-verify-user-code/login-oauth2-device-verify-user-code.component.ts b/src/login/pages/login-oauth2-device-verify-user-code/login-oauth2-device-verify-user-code.component.ts new file mode 100644 index 00000000..3e127033 --- /dev/null +++ b/src/login/pages/login-oauth2-device-verify-user-code/login-oauth2-device-verify-user-code.component.ts @@ -0,0 +1,41 @@ +import { + ChangeDetectionStrategy, + Component, + forwardRef, + inject, + input +} from "@angular/core"; +import { CLASSES, KC_CONTEXT, USE_DEFAULT_CSS } from "keycloakify-angular"; +import { ClassKey } from "keycloakify/login"; +import { KcContext } from "keycloakify/login/KcContext"; +import { ComponentReference } from "../../classes/component-reference.class"; +import { TemplateComponent } from "../../containers/template.component"; +import { KcClassDirective } from "../../directives/kc-class.directive"; +import { MsgStrPipe } from "../../pipes/msg-str.pipe"; + +@Component({ + standalone: true, + imports: [TemplateComponent, MsgStrPipe, KcClassDirective], + selector: "kc-root", + templateUrl: "login-oauth2-device-verify-user-code.component.html", + changeDetection: ChangeDetectionStrategy.OnPush, + providers: [ + { + provide: ComponentReference, + useExisting: forwardRef(() => LoginOauth2DeviceVerifyUserCodeComponent) + } + ] +}) +export class LoginOauth2DeviceVerifyUserCodeComponent extends ComponentReference { + kcContext = + inject< + Extract + >(KC_CONTEXT); + override doUseDefaultCss = inject(USE_DEFAULT_CSS); + override classes = inject>>(CLASSES); + displayRequiredFields = input(false); + documentTitle = input(); + bodyClassName = input(); + displayInfo: boolean = false; + displayMessage: boolean = false; +} diff --git a/src/login/pages/login-otp/login-otp.component.html b/src/login/pages/login-otp/login-otp.component.html new file mode 100644 index 00000000..86de6b67 --- /dev/null +++ b/src/login/pages/login-otp/login-otp.component.html @@ -0,0 +1,103 @@ +@let url = kcContext.url; +@let otpLogin = kcContext.otpLogin; +@let messagesPerField = kcContext.messagesPerField; + + + {{ 'doLogIn' | msgStr }} + + +
+ @if (otpLogin.userOtpCredentials.length > 1) { +
+
+ @for (otpCredential of otpLogin.userOtpCredentials; track otpCredential; let i = $index) { + + + + + } +
+
+ } +
+
+ +
+
+ + @if (messagesPerField.existsError('totp')) { + + } +
+
+
+
+
+ +
+
+
+
+
diff --git a/src/login/pages/login-otp/login-otp.component.ts b/src/login/pages/login-otp/login-otp.component.ts new file mode 100644 index 00000000..25dd813a --- /dev/null +++ b/src/login/pages/login-otp/login-otp.component.ts @@ -0,0 +1,39 @@ +import { + ChangeDetectionStrategy, + Component, + forwardRef, + inject, + input +} from "@angular/core"; +import { CLASSES, KC_CONTEXT, USE_DEFAULT_CSS } from "keycloakify-angular"; +import { ClassKey } from "keycloakify/login"; +import { KcContext } from "keycloakify/login/KcContext"; +import { ComponentReference } from "../../classes/component-reference.class"; +import { TemplateComponent } from "../../containers/template.component"; +import { KcClassDirective } from "../../directives/kc-class.directive"; +import { KcSanitizePipe } from "../../pipes/kc-sanitize.pipe"; +import { MsgStrPipe } from "../../pipes/msg-str.pipe"; + +@Component({ + standalone: true, + imports: [TemplateComponent, KcClassDirective, MsgStrPipe, KcSanitizePipe], + selector: "kc-root", + templateUrl: "login-otp.component.html", + changeDetection: ChangeDetectionStrategy.OnPush, + providers: [ + { + provide: ComponentReference, + useExisting: forwardRef(() => LoginOtpComponent) + } + ] +}) +export class LoginOtpComponent extends ComponentReference { + kcContext = inject>(KC_CONTEXT); + override doUseDefaultCss = inject(USE_DEFAULT_CSS); + override classes = inject>>(CLASSES); + displayRequiredFields = input(false); + documentTitle = input(); + bodyClassName = input(); + displayInfo: boolean = false; + displayMessage: boolean = this.kcContext.messagesPerField.existsError("totp"); +} diff --git a/src/login/pages/login-page-expired/login-page-expired.component.html b/src/login/pages/login-page-expired/login-page-expired.component.html new file mode 100644 index 00000000..19e83434 --- /dev/null +++ b/src/login/pages/login-page-expired/login-page-expired.component.html @@ -0,0 +1,35 @@ +@let url = kcContext.url; + + + {{ 'pageExpiredTitle' | msgStr }} + + +

+ {{ 'pageExpiredMsg1' | msgStr }} + + {{ 'doClickHere' | msgStr }} + + .
+ {{ 'pageExpiredMsg2' | msgStr }} + + {{ 'doClickHere' | msgStr }} + + . +

+
+
diff --git a/src/login/pages/login-page-expired/login-page-expired.component.ts b/src/login/pages/login-page-expired/login-page-expired.component.ts new file mode 100644 index 00000000..415707aa --- /dev/null +++ b/src/login/pages/login-page-expired/login-page-expired.component.ts @@ -0,0 +1,38 @@ +import { + ChangeDetectionStrategy, + Component, + forwardRef, + inject, + input +} from "@angular/core"; +import { CLASSES, KC_CONTEXT, USE_DEFAULT_CSS } from "keycloakify-angular"; +import { ClassKey } from "keycloakify/login"; +import { KcContext } from "keycloakify/login/KcContext"; +import { ComponentReference } from "../../classes/component-reference.class"; +import { TemplateComponent } from "../../containers/template.component"; +import { MsgStrPipe } from "../../pipes/msg-str.pipe"; + +@Component({ + standalone: true, + imports: [TemplateComponent, MsgStrPipe], + selector: "kc-root", + templateUrl: "login-page-expired.component.html", + changeDetection: ChangeDetectionStrategy.OnPush, + providers: [ + { + provide: ComponentReference, + useExisting: forwardRef(() => LoginPageExpiredComponent) + } + ] +}) +export class LoginPageExpiredComponent extends ComponentReference { + kcContext = + inject>(KC_CONTEXT); + override doUseDefaultCss = inject(USE_DEFAULT_CSS); + override classes = inject>>(CLASSES); + displayRequiredFields = input(false); + documentTitle = input(); + bodyClassName = input(); + displayInfo: boolean = false; + displayMessage: boolean = false; +} diff --git a/src/login/pages/login-passkeys-conditional-authenticate/login-passkeys-conditional-authenticate.component.html b/src/login/pages/login-passkeys-conditional-authenticate/login-passkeys-conditional-authenticate.component.html new file mode 100644 index 00000000..4fb01732 --- /dev/null +++ b/src/login/pages/login-passkeys-conditional-authenticate/login-passkeys-conditional-authenticate.component.html @@ -0,0 +1,203 @@ +@let authenticators = kcContext.authenticators; +@let realm = kcContext.realm; +@let url = kcContext.url; +@let shouldDisplayAuthenticators = kcContext.shouldDisplayAuthenticators; +@let login = kcContext.login; +@let messagesPerField = kcContext.messagesPerField; +@let usernameHidden = kcContext.usernameHidden; +@let registrationDisabled = kcContext.registrationDisabled; + + + {{ 'passkey-login-title' | msgStr }} + + + @if (realm.registrationAllowed && !registrationDisabled) { +
+ + {{ 'noAccount' | msgStr }} + + {{ 'doRegister' | msgStr }} + + +
+ } +
+ + +
+ + + + + + +
+
+ @if (authenticators !== undefined && authenticators.authenticators.length !== 0) { +
+ @for (authenticator of authenticators.authenticators; track authenticator; let i = $index) { + + } +
+ + @if (shouldDisplayAuthenticators) { + @if (authenticators.authenticators.length > 1) { +

+ {{ 'passkey-available-authenticators' | msgStr }} +

+ } + +
+ @for (authenticator of authenticators.authenticators; track authenticator; let i = $index) { +
+ +
+
+ {{ authenticator.label | advancedMsgStr }} +
+ @if ( + authenticator.transports !== undefined && + authenticator.transports.displayNameProperties !== undefined && + authenticator.transports.displayNameProperties.length !== 0 + ) { +
+ @for ( + nameProperty of authenticator.transports.displayNameProperties; + track nameProperty; + let i = $index + ) { + {{ nameProperty | advancedMsgStr }} + @if (i !== authenticator.transports.displayNameProperties.length - 1) { + , + } + } +
+
+ + {{ 'passkey-createdAt-label' | msgStr }} + + + {{ authenticator.createdAt }} + +
+
+ } +
+
+ } +
+ } + } +
+ @if (realm.password) { + + + } +
+
+
+
diff --git a/src/login/pages/login-passkeys-conditional-authenticate/login-passkeys-conditional-authenticate.component.ts b/src/login/pages/login-passkeys-conditional-authenticate/login-passkeys-conditional-authenticate.component.ts new file mode 100644 index 00000000..28d0d4ab --- /dev/null +++ b/src/login/pages/login-passkeys-conditional-authenticate/login-passkeys-conditional-authenticate.component.ts @@ -0,0 +1,96 @@ +import { ChangeDetectionStrategy, Component, forwardRef, inject } from "@angular/core"; +import { CLASSES, KC_CONTEXT, Script, USE_DEFAULT_CSS } from "keycloakify-angular"; +import { ClassKey } from "keycloakify/login"; +import { KcContext } from "keycloakify/login/KcContext"; +import { getKcClsx } from "keycloakify/login/lib/kcClsx"; +import { ComponentReference } from "../../classes/component-reference.class"; +import { TemplateComponent } from "../../containers/template.component"; +import { KcClassDirective } from "../../directives/kc-class.directive"; +import { AdvancedMsgStrPipe } from "../../pipes/advanced-msg-str.pipe"; +import { MsgStrPipe } from "../../pipes/msg-str.pipe"; +import { LoginResourceInjectorService } from "../../services"; + +@Component({ + standalone: true, + imports: [TemplateComponent, MsgStrPipe, KcClassDirective, AdvancedMsgStrPipe], + selector: "kc-root", + templateUrl: "login-passkeys-conditional-authenticate.component.html", + changeDetection: ChangeDetectionStrategy.OnPush, + providers: [ + MsgStrPipe, + { + provide: ComponentReference, + useExisting: forwardRef(() => LoginPasskeysConditionalAuthenticateComponent) + } + ] +}) +export class LoginPasskeysConditionalAuthenticateComponent extends ComponentReference { + kcContext = + inject< + Extract + >(KC_CONTEXT); + loginResourceInjectorService = inject(LoginResourceInjectorService); + msgStr = inject(MsgStrPipe); + override doUseDefaultCss = inject(USE_DEFAULT_CSS); + override classes = inject>>(CLASSES); + displayInfo: boolean = true; + + authButtonId = "authenticateWebAuthnButton"; + + constructor() { + super(); + const { + url, + challenge, + rpId, + userVerification, + isUserIdentified, + + createTimeout + } = this.kcContext; + const scripts: Script[] = [ + { + type: "module", + id: "LoginRecoveryAuthnCodeConfig", + textContent: ` + import { authenticateByWebAuthn } from "${url.resourcesPath}/js/webauthnAuthenticate.js"; + import { initAuthenticate } from "${url.resourcesPath}/js/passkeysConditionalAuth.js"; + + const authButton = document.getElementById("${this.authButtonId}"); + const input = { + isUserIdentified : ${isUserIdentified}, + challenge : ${JSON.stringify(challenge)}, + userVerification : ${JSON.stringify(userVerification)}, + rpId : ${JSON.stringify(rpId)}, + createTimeout : ${createTimeout} + }; + authButton.addEventListener("click", () => { + authenticateByWebAuthn({ + ...input, + errmsg : ${JSON.stringify(this.msgStr.transform("webauthn-unsupported-browser-text"))} + }); + }); + + initAuthenticate({ + ...input, + errmsg : ${JSON.stringify(this.msgStr.transform("passkey-unsupported-browser-text"))} + }); + ` + } + ]; + this.loginResourceInjectorService.insertAdditionalScripts(scripts); + } + + selectAuthListItemIconClass(iconClass: string) { + const kcClsx = getKcClsx({ + doUseDefaultCss: this.doUseDefaultCss ?? true, + classes: this.classes + }).kcClsx; + // eslint-disable-next-line @typescript-eslint/no-explicit-any + const className = kcClsx(iconClass as any); + if (className === iconClass) { + return kcClsx("kcWebAuthnDefaultIcon"); + } + return className; + } +} diff --git a/src/login/pages/login-password/login-password.component.html b/src/login/pages/login-password/login-password.component.html new file mode 100644 index 00000000..437d3950 --- /dev/null +++ b/src/login/pages/login-password/login-password.component.html @@ -0,0 +1,90 @@ +@let url = kcContext.url; +@let messagesPerField = kcContext.messagesPerField; +@let realm = kcContext.realm; + + + {{ 'doLogIn' | msgStr }} + + +
+
+
+
+
+ + + + + + @if (messagesPerField.existsError('password')) { + + + } +
+
+
+
+ @if (realm.resetPasswordAllowed) { + + + {{ 'doForgotPassword' | msgStr }} + + + } +
+
+
+ +
+
+
+
+
+
diff --git a/src/login/pages/login-password/login-password.component.ts b/src/login/pages/login-password/login-password.component.ts new file mode 100644 index 00000000..44848a5f --- /dev/null +++ b/src/login/pages/login-password/login-password.component.ts @@ -0,0 +1,49 @@ +import { + ChangeDetectionStrategy, + Component, + forwardRef, + inject, + input, + signal +} from "@angular/core"; +import { CLASSES, KC_CONTEXT, USE_DEFAULT_CSS } from "keycloakify-angular"; +import { ClassKey } from "keycloakify/login"; +import { KcContext } from "keycloakify/login/KcContext"; +import { ComponentReference } from "../../classes/component-reference.class"; +import { PasswordWrapperComponent } from "../../components/password-wrapper/password-wrapper.component"; +import { TemplateComponent } from "../../containers/template.component"; +import { KcClassDirective } from "../../directives/kc-class.directive"; +import { KcSanitizePipe } from "../../pipes/kc-sanitize.pipe"; +import { MsgStrPipe } from "../../pipes/msg-str.pipe"; + +@Component({ + standalone: true, + imports: [ + TemplateComponent, + MsgStrPipe, + KcClassDirective, + PasswordWrapperComponent, + KcSanitizePipe + ], + selector: "kc-root", + templateUrl: "login-password.component.html", + changeDetection: ChangeDetectionStrategy.OnPush, + providers: [ + { + provide: ComponentReference, + useExisting: forwardRef(() => LoginPasswordComponent) + } + ] +}) +export class LoginPasswordComponent extends ComponentReference { + kcContext = inject>(KC_CONTEXT); + override doUseDefaultCss = inject(USE_DEFAULT_CSS); + override classes = inject>>(CLASSES); + displayRequiredFields = input(false); + documentTitle = input(); + bodyClassName = input(); + displayInfo = false; + displayMessage = this.kcContext.messagesPerField.existsError("password"); + + isLoginButtonDisabled = signal(false); +} diff --git a/src/login/pages/login-recovery-authn-code-config/login-recovery-authn-code-config.component.html b/src/login/pages/login-recovery-authn-code-config/login-recovery-authn-code-config.component.html new file mode 100644 index 00000000..78b178e3 --- /dev/null +++ b/src/login/pages/login-recovery-authn-code-config/login-recovery-authn-code-config.component.html @@ -0,0 +1,155 @@ +@let recoveryAuthnCodesConfigBean = kcContext.recoveryAuthnCodesConfigBean; +@let isAppInitiatedAction = kcContext.isAppInitiatedAction; + + + {{ 'recovery-code-config-header' | msgStr }} + + + +
+
+ +
+

+ Warning alert: + {{ 'recovery-code-config-warning-title' | msgStr }} +

+
+

{{ 'recovery-code-config-warning-message' | msgStr }}

+
+
+ +
    + @for (code of recoveryAuthnCodesConfigBean.generatedRecoveryAuthnCodesList; track code; let i = $index) { +
  1. + {{ i + 1 }}: {{ code.slice(0, 4) }}-{{ code.slice(4, 8) }}-{{ code.slice(8) }} +
  2. + } +
+ + +
+ + + +
+ + + +
+ +
+ +
+ + + + + + + @if (isAppInitiatedAction) { + + + } @else { + + } +
+
+
diff --git a/src/login/pages/login-recovery-authn-code-config/login-recovery-authn-code-config.component.ts b/src/login/pages/login-recovery-authn-code-config/login-recovery-authn-code-config.component.ts new file mode 100644 index 00000000..57cd3109 --- /dev/null +++ b/src/login/pages/login-recovery-authn-code-config/login-recovery-authn-code-config.component.ts @@ -0,0 +1,51 @@ +import { + ChangeDetectionStrategy, + Component, + forwardRef, + inject, + input, + signal +} from "@angular/core"; +import { CLASSES, KC_CONTEXT, USE_DEFAULT_CSS } from "keycloakify-angular"; +import { ClassKey } from "keycloakify/login"; +import { KcContext } from "keycloakify/login/KcContext"; +import { ComponentReference } from "../../classes/component-reference.class"; +import { LogoutOtherSessionsComponent } from "../../components/logout-other-sessions/logout-other-sessions.component"; +import { TemplateComponent } from "../../containers/template.component"; +import { KcClassDirective } from "../../directives"; +import { MsgStrPipe } from "../../pipes/msg-str.pipe"; + +@Component({ + standalone: true, + imports: [ + MsgStrPipe, + TemplateComponent, + KcClassDirective, + LogoutOtherSessionsComponent + ], + selector: "kc-root", + templateUrl: "login-recovery-authn-code-config.component.html", + changeDetection: ChangeDetectionStrategy.OnPush, + providers: [ + { + provide: ComponentReference, + useExisting: forwardRef(() => LoginRecoveryAuthnCodeConfigComponent) + } + ] +}) +export class LoginRecoveryAuthnCodeConfigComponent extends ComponentReference { + kcContext = + inject>( + KC_CONTEXT + ); + override doUseDefaultCss = inject(USE_DEFAULT_CSS); + override classes = inject>>(CLASSES); + displayRequiredFields = input(false); + documentTitle = input(); + bodyClassName = input(); + displayInfo: boolean = false; + displayMessage: boolean = false; + toggleRecoveryCodesConfirmation = signal(false); + + olRecoveryCodesListId = "kc-recovery-codes-list"; +} diff --git a/src/login/pages/login-recovery-authn-code-input/login-recovery-authn-code-input.component.html b/src/login/pages/login-recovery-authn-code-input/login-recovery-authn-code-input.component.html new file mode 100644 index 00000000..4eb895d7 --- /dev/null +++ b/src/login/pages/login-recovery-authn-code-input/login-recovery-authn-code-input.component.html @@ -0,0 +1,76 @@ +@let url = kcContext.url; +@let recoveryAuthnCodesInputBean = kcContext.recoveryAuthnCodesInputBean; +@let messagesPerField = kcContext.messagesPerField; + + + + {{ 'auth-recovery-code-header' | msgStr }} + + + +
+
+
+ +
+
+ + @if (messagesPerField.existsError('recoveryCodeInput')) { + + } +
+
+ +
+
+
+
+
+ +
+
+
+
+
diff --git a/src/login/pages/login-recovery-authn-code-input/login-recovery-authn-code-input.component.ts b/src/login/pages/login-recovery-authn-code-input/login-recovery-authn-code-input.component.ts new file mode 100644 index 00000000..ae62b886 --- /dev/null +++ b/src/login/pages/login-recovery-authn-code-input/login-recovery-authn-code-input.component.ts @@ -0,0 +1,43 @@ +import { + ChangeDetectionStrategy, + Component, + forwardRef, + inject, + input +} from "@angular/core"; +import { CLASSES, KC_CONTEXT, USE_DEFAULT_CSS } from "keycloakify-angular"; +import { ClassKey } from "keycloakify/login"; +import { KcContext } from "keycloakify/login/KcContext"; +import { ComponentReference } from "../../classes/component-reference.class"; +import { TemplateComponent } from "../../containers/template.component"; +import { KcClassDirective } from "../../directives"; +import { KcSanitizePipe } from "../../pipes/kc-sanitize.pipe"; +import { MsgStrPipe } from "../../pipes/msg-str.pipe"; + +@Component({ + standalone: true, + imports: [TemplateComponent, MsgStrPipe, KcClassDirective, KcSanitizePipe], + selector: "kc-root", + templateUrl: "login-recovery-authn-code-input.component.html", + changeDetection: ChangeDetectionStrategy.OnPush, + providers: [ + { + provide: ComponentReference, + useExisting: forwardRef(() => LoginRecoveryAuthnCodeInputComponent) + } + ] +}) +export class LoginRecoveryAuthnCodeInputComponent extends ComponentReference { + kcContext = + inject>( + KC_CONTEXT + ); + override doUseDefaultCss = inject(USE_DEFAULT_CSS); + override classes = inject>>(CLASSES); + displayRequiredFields = input(false); + documentTitle = input(); + bodyClassName = input(); + displayInfo: boolean = false; + displayMessage: boolean = + this.kcContext.messagesPerField.existsError("recoveryCodeInput"); +} diff --git a/src/login/pages/login-reset-otp/login-reset-otp.component.html b/src/login/pages/login-reset-otp/login-reset-otp.component.html new file mode 100644 index 00000000..1745af4d --- /dev/null +++ b/src/login/pages/login-reset-otp/login-reset-otp.component.html @@ -0,0 +1,65 @@ +@let url = kcContext.url; +@let configuredOtpCredentials = kcContext.configuredOtpCredentials; + + + {{ 'doLogIn' | msgStr }} + + +
+
+
+

{{ 'otp-reset-description' | msgStr }}

+ @for (otpCredential of configuredOtpCredentials.userOtpCredentials; track otpCredential; let i = $index) { + + + } +
+
+ +
+
+
+
+
+
+
diff --git a/src/login/pages/login-reset-otp/login-reset-otp.component.ts b/src/login/pages/login-reset-otp/login-reset-otp.component.ts new file mode 100644 index 00000000..30ae45ea --- /dev/null +++ b/src/login/pages/login-reset-otp/login-reset-otp.component.ts @@ -0,0 +1,38 @@ +import { + ChangeDetectionStrategy, + Component, + forwardRef, + inject, + input +} from "@angular/core"; +import { CLASSES, KC_CONTEXT, USE_DEFAULT_CSS } from "keycloakify-angular"; +import { ClassKey } from "keycloakify/login"; +import { KcContext } from "keycloakify/login/KcContext"; +import { ComponentReference } from "../../classes/component-reference.class"; +import { TemplateComponent } from "../../containers/template.component"; +import { KcClassDirective } from "../../directives"; +import { MsgStrPipe } from "../../pipes/msg-str.pipe"; + +@Component({ + standalone: true, + imports: [KcClassDirective, MsgStrPipe, TemplateComponent], + selector: "kc-root", + templateUrl: "login-reset-otp.component.html", + changeDetection: ChangeDetectionStrategy.OnPush, + providers: [ + { + provide: ComponentReference, + useExisting: forwardRef(() => LoginResetOtpComponent) + } + ] +}) +export class LoginResetOtpComponent extends ComponentReference { + kcContext = inject>(KC_CONTEXT); + override doUseDefaultCss = inject(USE_DEFAULT_CSS); + override classes = inject>>(CLASSES); + displayRequiredFields = input(false); + documentTitle = input(); + bodyClassName = input(); + displayInfo: boolean = false; + displayMessage: boolean = this.kcContext.messagesPerField.existsError("totp"); +} diff --git a/src/login/pages/login-reset-password/login-reset-password.component.html b/src/login/pages/login-reset-password/login-reset-password.component.html new file mode 100644 index 00000000..be2c9f48 --- /dev/null +++ b/src/login/pages/login-reset-password/login-reset-password.component.html @@ -0,0 +1,95 @@ +@let url = kcContext.url; +@let messagesPerField = kcContext.messagesPerField; +@let realm = kcContext.realm; +@let auth = kcContext.auth; + + + {{ 'emailForgotTitle' | msgStr }} + + + @if (realm.duplicateEmailsAllowed) { + {{ 'emailInstructionUsername' | msgStr }} + } @else { + {{ 'emailInstruction' | msgStr }} + } + + + +
+
+
+ +
+ +
+ + + @if (messagesPerField.existsError('username')) { + + } +
+
+ +
+
+
+ + + +
+
+
+ +
+
+
+
+
diff --git a/src/login/pages/login-reset-password/login-reset-password.component.ts b/src/login/pages/login-reset-password/login-reset-password.component.ts new file mode 100644 index 00000000..922a32af --- /dev/null +++ b/src/login/pages/login-reset-password/login-reset-password.component.ts @@ -0,0 +1,40 @@ +import { + ChangeDetectionStrategy, + Component, + forwardRef, + inject, + input +} from "@angular/core"; +import { CLASSES, KC_CONTEXT, USE_DEFAULT_CSS } from "keycloakify-angular"; +import { ClassKey } from "keycloakify/login"; +import { KcContext } from "keycloakify/login/KcContext"; +import { ComponentReference } from "../../classes/component-reference.class"; +import { TemplateComponent } from "../../containers/template.component"; +import { KcClassDirective } from "../../directives"; +import { KcSanitizePipe } from "../../pipes/kc-sanitize.pipe"; +import { MsgStrPipe } from "../../pipes/msg-str.pipe"; + +@Component({ + standalone: true, + imports: [TemplateComponent, MsgStrPipe, KcClassDirective, KcSanitizePipe], + selector: "kc-root", + templateUrl: "login-reset-password.component.html", + changeDetection: ChangeDetectionStrategy.OnPush, + providers: [ + { + provide: ComponentReference, + useExisting: forwardRef(() => LoginResetPasswordComponent) + } + ] +}) +export class LoginResetPasswordComponent extends ComponentReference { + kcContext = + inject>(KC_CONTEXT); + override doUseDefaultCss = inject(USE_DEFAULT_CSS); + override classes = inject>>(CLASSES); + displayRequiredFields = input(false); + documentTitle = input(); + bodyClassName = input(); + displayInfo: boolean = false; + displayMessage: boolean = this.kcContext.messagesPerField.existsError("username"); +} diff --git a/src/login/pages/login-update-password/login-update-password.component.html b/src/login/pages/login-update-password/login-update-password.component.html new file mode 100644 index 00000000..70d9d52e --- /dev/null +++ b/src/login/pages/login-update-password/login-update-password.component.html @@ -0,0 +1,116 @@ +@let url = kcContext.url; +@let messagesPerField = kcContext.messagesPerField; +@let isAppInitiatedAction = kcContext.isAppInitiatedAction; + + + + {{ 'updatePasswordTitle' | msgStr }} + + +
+
+
+ +
+
+ + + + + @if (messagesPerField.existsError('password')) { + + } +
+
+ +
+
+ +
+
+ + + + @if (messagesPerField.existsError('password-confirm')) { + + } +
+
+
+ +
+ + @if (isAppInitiatedAction) { + + } +
+
+
+
+
diff --git a/src/login/pages/login-update-password/login-update-password.component.ts b/src/login/pages/login-update-password/login-update-password.component.ts new file mode 100644 index 00000000..558d4119 --- /dev/null +++ b/src/login/pages/login-update-password/login-update-password.component.ts @@ -0,0 +1,52 @@ +import { + ChangeDetectionStrategy, + Component, + forwardRef, + inject, + input +} from "@angular/core"; +import { CLASSES, KC_CONTEXT, USE_DEFAULT_CSS } from "keycloakify-angular"; +import { ClassKey } from "keycloakify/login"; +import { KcContext } from "keycloakify/login/KcContext"; +import { ComponentReference } from "../../classes/component-reference.class"; +import { LogoutOtherSessionsComponent } from "../../components/logout-other-sessions/logout-other-sessions.component"; +import { PasswordWrapperComponent } from "../../components/password-wrapper/password-wrapper.component"; +import { TemplateComponent } from "../../containers/template.component"; +import { KcClassDirective } from "../../directives"; +import { KcSanitizePipe } from "../../pipes/kc-sanitize.pipe"; +import { MsgStrPipe } from "../../pipes/msg-str.pipe"; + +@Component({ + standalone: true, + imports: [ + TemplateComponent, + MsgStrPipe, + KcClassDirective, + PasswordWrapperComponent, + KcSanitizePipe, + LogoutOtherSessionsComponent + ], + selector: "kc-root", + templateUrl: "login-update-password.component.html", + changeDetection: ChangeDetectionStrategy.OnPush, + providers: [ + { + provide: ComponentReference, + useExisting: forwardRef(() => LoginUpdatePasswordComponent) + } + ] +}) +export class LoginUpdatePasswordComponent extends ComponentReference { + kcContext = + inject>(KC_CONTEXT); + override doUseDefaultCss = inject(USE_DEFAULT_CSS); + override classes = inject>>(CLASSES); + displayRequiredFields = input(false); + documentTitle = input(); + bodyClassName = input(); + displayInfo = false; + displayMessage = !this.kcContext.messagesPerField.existsError( + "password", + "password-confirm" + ); +} diff --git a/src/login/pages/login-update-profile/login-update-profile.component.html b/src/login/pages/login-update-profile/login-update-profile.component.html new file mode 100644 index 00000000..07275d5d --- /dev/null +++ b/src/login/pages/login-update-profile/login-update-profile.component.html @@ -0,0 +1,59 @@ +@let url = kcContext.url; +@let isAppInitiatedAction = kcContext.isAppInitiatedAction; + + + {{ 'loginProfileTitle' | msgStr }} + + +
+ + +
+
+
+
+
+ + @if (isAppInitiatedAction) { + + } +
+
+
+
+
diff --git a/src/login/pages/login-update-profile/login-update-profile.component.ts b/src/login/pages/login-update-profile/login-update-profile.component.ts new file mode 100644 index 00000000..c48c8594 --- /dev/null +++ b/src/login/pages/login-update-profile/login-update-profile.component.ts @@ -0,0 +1,48 @@ +import { + ChangeDetectionStrategy, + Component, + forwardRef, + inject, + input, + signal +} from "@angular/core"; +import { CLASSES, KC_CONTEXT, USE_DEFAULT_CSS } from "keycloakify-angular"; +import { ClassKey } from "keycloakify/login"; +import { KcContext } from "keycloakify/login/KcContext"; +import { ComponentReference } from "../../classes/component-reference.class"; +import { UserProfileFormFieldsComponent } from "../../components/user-profile-form-fields/user-profile-form-fields.component"; +import { TemplateComponent } from "../../containers/template.component"; +import { KcClassDirective } from "../../directives"; +import { MsgStrPipe } from "../../pipes/msg-str.pipe"; + +@Component({ + standalone: true, + imports: [ + TemplateComponent, + KcClassDirective, + MsgStrPipe, + UserProfileFormFieldsComponent + ], + selector: "kc-root", + templateUrl: "login-update-profile.component.html", + changeDetection: ChangeDetectionStrategy.OnPush, + providers: [ + { + provide: ComponentReference, + useExisting: forwardRef(() => LoginUpdateProfileComponent) + } + ] +}) +export class LoginUpdateProfileComponent extends ComponentReference { + kcContext = + inject>(KC_CONTEXT); + override doUseDefaultCss = inject(USE_DEFAULT_CSS); + override classes = inject>>(CLASSES); + displayRequiredFields = input(true); + documentTitle = input(); + bodyClassName = input(); + displayInfo: boolean = false; + displayMessage: boolean = this.kcContext.messagesPerField.exists("global"); + + isFormSubmittable = signal(false); +} diff --git a/src/login/pages/login-username/login-username.component.html b/src/login/pages/login-username/login-username.component.html new file mode 100644 index 00000000..fa96f6c9 --- /dev/null +++ b/src/login/pages/login-username/login-username.component.html @@ -0,0 +1,161 @@ +@let realm = kcContext.realm; +@let social = kcContext.social; +@let usernameHidden = kcContext.usernameHidden; +@let messagesPerField = kcContext.messagesPerField; +@let url = kcContext.url; +@let login = kcContext.login; + + + + {{ 'doLogIn' | msgStr }} + + +
+ + {{ 'noAccount' | msgStr }} + + {{ 'doRegister' | msgStr }} + + +
+
+ + @if (!!realm?.password && !!social?.providers?.length) { +
+
+

{{ 'identity-provider-login-label' | msgStr }}

+ +
+ } +
+ +
+
+ @if (realm.password) { +
+ @if (!usernameHidden) { +
+ + + @if (messagesPerField?.existsError('username')) { + + + } + +
+ } + +
+
+ @if (realm.rememberMe && !usernameHidden) { +
+ +
+ } +
+
+
+ +
+
+ } +
+
+
+
diff --git a/src/login/pages/login-username/login-username.component.ts b/src/login/pages/login-username/login-username.component.ts new file mode 100644 index 00000000..feeed758 --- /dev/null +++ b/src/login/pages/login-username/login-username.component.ts @@ -0,0 +1,52 @@ +import { AsyncPipe, NgClass } from "@angular/common"; +import { + ChangeDetectionStrategy, + Component, + forwardRef, + inject, + input, + signal +} from "@angular/core"; +import { CLASSES, KC_CONTEXT, USE_DEFAULT_CSS } from "keycloakify-angular"; +import { ClassKey } from "keycloakify/login"; +import { KcContext } from "keycloakify/login/KcContext"; +import { ComponentReference } from "../../classes/component-reference.class"; +import { TemplateComponent } from "../../containers/template.component"; +import { KcClassDirective } from "../../directives/kc-class.directive"; +import { KcSanitizePipe } from "../../pipes/kc-sanitize.pipe"; +import { MsgStrPipe } from "../../pipes/msg-str.pipe"; + +@Component({ + selector: "kc-root", + templateUrl: "./login-username.component.html", + standalone: true, + changeDetection: ChangeDetectionStrategy.OnPush, + imports: [ + KcClassDirective, + AsyncPipe, + KcSanitizePipe, + NgClass, + TemplateComponent, + MsgStrPipe + ], + providers: [ + { + provide: ComponentReference, + useExisting: forwardRef(() => LoginUsernameComponent) + } + ] +}) +export class LoginUsernameComponent extends ComponentReference { + kcContext = inject>(KC_CONTEXT); + displayRequiredFields = input(false); + documentTitle = input(); + bodyClassName = input(); + override doUseDefaultCss = inject(USE_DEFAULT_CSS); + override classes = inject>>(CLASSES); + isLoginButtonDisabled = signal(false); + displayInfo: boolean = + !!this.kcContext?.realm?.password && + !!this.kcContext?.realm?.registrationAllowed && + !this.kcContext?.registrationDisabled; + displayMessage: boolean = !this.kcContext?.messagesPerField?.existsError("username"); +} diff --git a/src/login/pages/login-verify-email/login-verify-email.component.html b/src/login/pages/login-verify-email/login-verify-email.component.html new file mode 100644 index 00000000..f8a9763a --- /dev/null +++ b/src/login/pages/login-verify-email/login-verify-email.component.html @@ -0,0 +1,27 @@ +@let url = kcContext.url; +@let user = kcContext.user; + + + {{ 'emailVerifyTitle' | msgStr }} + + +

+ {{ 'emailVerifyInstruction2' | msgStr }} +
+ {{ 'doClickHere' | msgStr }} +   + {{ 'emailVerifyInstruction3' | msgStr }} +

+
+ +

+ {{ 'emailVerifyInstruction1' | msgStr: user?.email ?? '' }} +

+
diff --git a/src/login/pages/login-verify-email/login-verify-email.component.ts b/src/login/pages/login-verify-email/login-verify-email.component.ts new file mode 100644 index 00000000..dfb68f35 --- /dev/null +++ b/src/login/pages/login-verify-email/login-verify-email.component.ts @@ -0,0 +1,39 @@ +import { + ChangeDetectionStrategy, + Component, + forwardRef, + inject, + input +} from "@angular/core"; +import { CLASSES, KC_CONTEXT, USE_DEFAULT_CSS } from "keycloakify-angular"; +import { ClassKey } from "keycloakify/login"; +import { KcContext } from "keycloakify/login/KcContext"; +import { ComponentReference } from "../../classes/component-reference.class"; +import { TemplateComponent } from "../../containers/template.component"; +import { KcClassDirective } from "../../directives"; +import { MsgStrPipe } from "../../pipes/msg-str.pipe"; + +@Component({ + standalone: true, + imports: [KcClassDirective, TemplateComponent, MsgStrPipe], + selector: "kc-root", + templateUrl: "login-verify-email.component.html", + changeDetection: ChangeDetectionStrategy.OnPush, + providers: [ + { + provide: ComponentReference, + useExisting: forwardRef(() => LoginVerifyEmailComponent) + } + ] +}) +export class LoginVerifyEmailComponent extends ComponentReference { + kcContext = + inject>(KC_CONTEXT); + override doUseDefaultCss = inject(USE_DEFAULT_CSS); + override classes = inject>>(CLASSES); + displayRequiredFields = input(false); + documentTitle = input(); + bodyClassName = input(); + displayInfo: boolean = true; + displayMessage: boolean = true; +} diff --git a/src/login/pages/login-x509-info/login-x509-info.component.html b/src/login/pages/login-x509-info/login-x509-info.component.html new file mode 100644 index 00000000..d55a6b98 --- /dev/null +++ b/src/login/pages/login-x509-info/login-x509-info.component.html @@ -0,0 +1,102 @@ +@let url = kcContext.url; +@let x509 = kcContext.x509; + + + {{ 'doLogIn' | msgStr }} + + +
+
+
+ +
+ @if (x509.formData.subjectDN) { +
+ +
+ } @else { +
+ +
+ } +
+
+ @if (x509.formData.isUserEnabled) { +
+ +
+
+ +
+ } +
+
+
+
+
+
+
+ + @if (x509.formData.isUserEnabled) { + + } +
+
+
+
+
+
diff --git a/src/login/pages/login-x509-info/login-x509-info.component.ts b/src/login/pages/login-x509-info/login-x509-info.component.ts new file mode 100644 index 00000000..4b988be1 --- /dev/null +++ b/src/login/pages/login-x509-info/login-x509-info.component.ts @@ -0,0 +1,38 @@ +import { + ChangeDetectionStrategy, + Component, + forwardRef, + inject, + input +} from "@angular/core"; +import { CLASSES, KC_CONTEXT, USE_DEFAULT_CSS } from "keycloakify-angular"; +import { ClassKey } from "keycloakify/login"; +import { KcContext } from "keycloakify/login/KcContext"; +import { ComponentReference } from "../../classes/component-reference.class"; +import { TemplateComponent } from "../../containers/template.component"; +import { KcClassDirective } from "../../directives"; +import { MsgStrPipe } from "../../pipes/msg-str.pipe"; + +@Component({ + standalone: true, + imports: [TemplateComponent, MsgStrPipe, KcClassDirective], + selector: "kc-root", + templateUrl: "login-x509-info.component.html", + changeDetection: ChangeDetectionStrategy.OnPush, + providers: [ + { + provide: ComponentReference, + useExisting: forwardRef(() => LoginX509InfoComponent) + } + ] +}) +export class LoginX509InfoComponent extends ComponentReference { + kcContext = inject>(KC_CONTEXT); + override doUseDefaultCss = inject(USE_DEFAULT_CSS); + override classes = inject>>(CLASSES); + displayRequiredFields = input(false); + documentTitle = input(); + bodyClassName = input(); + displayInfo: boolean = false; + displayMessage: boolean = false; +} diff --git a/src/login/pages/login/login.component.html b/src/login/pages/login/login.component.html new file mode 100644 index 00000000..8e2b439b --- /dev/null +++ b/src/login/pages/login/login.component.html @@ -0,0 +1,212 @@ +@let realm = kcContext.realm; +@let social = kcContext.social; +@let usernameHidden = kcContext.usernameHidden; +@let auth = kcContext.auth; +@let messagesPerField = kcContext.messagesPerField; +@let url = kcContext.url; +@let login = kcContext.login; + + + + {{ 'loginAccountTitle' | msgStr }} + + +
+
+ + {{ 'noAccount' | msgStr }} + + {{ 'doRegister' | msgStr }} + + +
+
+
+ + @if (!!realm?.password && !!social?.providers?.length) { +
+
+

{{ 'identity-provider-login-label' | msgStr }}

+ +
+ } +
+ +
+
+ + @if (realm?.password) { +
+ @if (!usernameHidden) { +
+ + + @if (messagesPerField?.existsError('username', 'password')) { + + + } +
+ } + +
+ + + + + + @if (usernameHidden && messagesPerField?.existsError('username', 'password')) { + + + } +
+ +
+
+ @if (realm?.rememberMe && !usernameHidden) { +
+ +
+ } +
+ +
+ @if (realm?.resetPasswordAllowed) { + + {{ 'doForgotPassword' | msgStr }} + + } +
+
+
+ + +
+
+ } +
+
+
+
diff --git a/src/login/pages/login/login.component.ts b/src/login/pages/login/login.component.ts new file mode 100644 index 00000000..10f30b3e --- /dev/null +++ b/src/login/pages/login/login.component.ts @@ -0,0 +1,57 @@ +import { AsyncPipe, NgClass } from "@angular/common"; +import { + ChangeDetectionStrategy, + Component, + forwardRef, + inject, + input, + signal +} from "@angular/core"; +import { CLASSES, KC_CONTEXT, USE_DEFAULT_CSS } from "keycloakify-angular"; +import { ClassKey } from "keycloakify/login"; +import { KcContext } from "keycloakify/login/KcContext"; +import { ComponentReference } from "../../classes/component-reference.class"; +import { PasswordWrapperComponent } from "../../components/password-wrapper/password-wrapper.component"; +import { TemplateComponent } from "../../containers/template.component"; +import { KcClassDirective } from "../../directives/kc-class.directive"; +import { KcSanitizePipe } from "../../pipes/kc-sanitize.pipe"; +import { MsgStrPipe } from "../../pipes/msg-str.pipe"; + +@Component({ + selector: "kc-root", + templateUrl: "./login.component.html", + standalone: true, + changeDetection: ChangeDetectionStrategy.OnPush, + imports: [ + KcClassDirective, + AsyncPipe, + KcSanitizePipe, + PasswordWrapperComponent, + NgClass, + TemplateComponent, + MsgStrPipe + ], + providers: [ + { + provide: ComponentReference, + useExisting: forwardRef(() => LoginComponent) + } + ] +}) +export class LoginComponent extends ComponentReference { + kcContext = inject>(KC_CONTEXT); + displayRequiredFields = input(false); + documentTitle = input(); + bodyClassName = input(); + override doUseDefaultCss = inject(USE_DEFAULT_CSS); + override classes = inject>>(CLASSES); + isLoginButtonDisabled = signal(false); + displayInfo: boolean = + !!this.kcContext?.realm?.password && + !!this.kcContext?.realm?.registrationAllowed && + !this.kcContext?.registrationDisabled; + displayMessage: boolean = !this.kcContext?.messagesPerField?.existsError( + "username", + "password" + ); +} diff --git a/src/login/pages/logout-confirm/logout-confirm.component.html b/src/login/pages/logout-confirm/logout-confirm.component.html new file mode 100644 index 00000000..19342a42 --- /dev/null +++ b/src/login/pages/logout-confirm/logout-confirm.component.html @@ -0,0 +1,59 @@ +@let url = kcContext.url; +@let logoutConfirm = kcContext.logoutConfirm; +@let client = kcContext.client; + + + + {{ 'logoutConfirmTitle' | msgStr }} + + +
+

{{ 'logoutConfirmHeader' | msgStr }}

+
+ +
+
+
+
+
+ +
+
+
+
+ @if (!logoutConfirm.skipLink && client.baseUrl) { +

+ {{ 'backToApplication' | msgStr }} +

+ } +
+
+
+
diff --git a/src/login/pages/logout-confirm/logout-confirm.component.ts b/src/login/pages/logout-confirm/logout-confirm.component.ts new file mode 100644 index 00000000..1723127a --- /dev/null +++ b/src/login/pages/logout-confirm/logout-confirm.component.ts @@ -0,0 +1,38 @@ +import { + ChangeDetectionStrategy, + Component, + forwardRef, + inject, + input +} from "@angular/core"; +import { CLASSES, KC_CONTEXT, USE_DEFAULT_CSS } from "keycloakify-angular"; +import { ClassKey } from "keycloakify/login"; +import { KcContext } from "keycloakify/login/KcContext"; +import { ComponentReference } from "../../classes/component-reference.class"; +import { TemplateComponent } from "../../containers/template.component"; +import { KcClassDirective } from "../../directives"; +import { MsgStrPipe } from "../../pipes/msg-str.pipe"; + +@Component({ + standalone: true, + imports: [MsgStrPipe, TemplateComponent, KcClassDirective], + selector: "kc-root", + templateUrl: "logout-confirm.component.html", + changeDetection: ChangeDetectionStrategy.OnPush, + providers: [ + { + provide: ComponentReference, + useExisting: forwardRef(() => LogoutConfirmComponent) + } + ] +}) +export class LogoutConfirmComponent extends ComponentReference { + kcContext = inject>(KC_CONTEXT); + override doUseDefaultCss = inject(USE_DEFAULT_CSS); + override classes = inject>>(CLASSES); + displayRequiredFields = input(false); + documentTitle = input(); + bodyClassName = input(); + displayInfo: boolean = false; + displayMessage: boolean = true; +} diff --git a/src/login/pages/register/register.component.html b/src/login/pages/register/register.component.html new file mode 100644 index 00000000..b2d88674 --- /dev/null +++ b/src/login/pages/register/register.component.html @@ -0,0 +1,126 @@ +@let messageHeader = kcContext.messageHeader; +@let url = kcContext.url; +@let messagesPerField = kcContext.messagesPerField; +@let recaptchaRequired = kcContext.recaptchaRequired; +@let recaptchaVisible = kcContext.recaptchaVisible; +@let recaptchaSiteKey = kcContext.recaptchaSiteKey; +@let recaptchaAction = kcContext.recaptchaAction; +@let termsAcceptanceRequired = kcContext.termsAcceptanceRequired; + + + + {{ messageHeader ?? 'registerTitle' | advancedMsgStr }} + + +
+ + @if (termsAcceptanceRequired) { +
+
+ {{ 'termsTitle' | msgStr }} +
+ {{ 'termsText' | msgStr }} +
+
+
+
+
+ + +
+ @if (messagesPerField.existsError('termsAccepted')) { +
+ +
+ } +
+ } + @if (recaptchaRequired && (recaptchaVisible || recaptchaAction === undefined)) { +
+
+
+
+
+ } + +
+
+
+ + + +
+
+ @if (recaptchaRequired && !recaptchaVisible && recaptchaAction !== undefined) { +
+ +
+ } @else { +
+ +
+ } +
+
+
+
diff --git a/src/login/pages/register/register.component.ts b/src/login/pages/register/register.component.ts new file mode 100644 index 00000000..74f647ae --- /dev/null +++ b/src/login/pages/register/register.component.ts @@ -0,0 +1,58 @@ +import { AsyncPipe, NgClass } from "@angular/common"; +import { + ChangeDetectionStrategy, + Component, + forwardRef, + inject, + input, + signal +} from "@angular/core"; +import { CLASSES, KC_CONTEXT, USE_DEFAULT_CSS } from "keycloakify-angular"; +import { ClassKey } from "keycloakify/login"; +import { KcContext } from "keycloakify/login/KcContext"; +import { ComponentReference } from "../../classes/component-reference.class"; +import { UserProfileFormFieldsComponent } from "../../components/user-profile-form-fields/user-profile-form-fields.component"; +import { TemplateComponent } from "../../containers/template.component"; +import { KcClassDirective } from "../../directives/kc-class.directive"; +import { AdvancedMsgStrPipe } from "../../pipes/advanced-msg-str.pipe"; +import { KcSanitizePipe } from "../../pipes/kc-sanitize.pipe"; +import { MsgStrPipe } from "../../pipes/msg-str.pipe"; + +@Component({ + selector: "kc-root", + templateUrl: "./register.component.html", + standalone: true, + changeDetection: ChangeDetectionStrategy.OnPush, + imports: [ + KcClassDirective, + AsyncPipe, + KcSanitizePipe, + NgClass, + TemplateComponent, + UserProfileFormFieldsComponent, + MsgStrPipe, + AdvancedMsgStrPipe + ], + providers: [ + { + provide: ComponentReference, + useExisting: forwardRef(() => RegisterComponent) + } + ] +}) +export class RegisterComponent extends ComponentReference { + kcContext = inject>(KC_CONTEXT); + displayRequiredFields = input(false); + documentTitle = input(); + bodyClassName = input(); + override doUseDefaultCss = inject(USE_DEFAULT_CSS); + override classes = inject>>(CLASSES); + isFormSubmittable = signal(false); + areTermsAccepted = signal(false); + displayInfo: boolean = false; + displayMessage: boolean = !this.kcContext?.messagesPerField?.existsError("global"); + + onCallback() { + (document.getElementById("kc-register-form") as HTMLFormElement).submit(); + } +} diff --git a/src/login/pages/saml-post-form/saml-post-form.component.html b/src/login/pages/saml-post-form/saml-post-form.component.html new file mode 100644 index 00000000..6657158d --- /dev/null +++ b/src/login/pages/saml-post-form/saml-post-form.component.html @@ -0,0 +1,51 @@ +@let samlPost = kcContext.samlPost; + + + {{ 'saml.post-form.title' | msgStr }} + + +

{{ 'saml.post-form.message' | msgStr }}

+
+ @if (!!samlPost.SAMLRequest) { + + } + @if (!!samlPost.SAMLResponse) { + + } + @if (!!samlPost.relayState) { + + } + +
+
+ >
diff --git a/src/login/pages/saml-post-form/saml-post-form.component.ts b/src/login/pages/saml-post-form/saml-post-form.component.ts new file mode 100644 index 00000000..e73515d5 --- /dev/null +++ b/src/login/pages/saml-post-form/saml-post-form.component.ts @@ -0,0 +1,54 @@ +import { + AfterViewInit, + ChangeDetectionStrategy, + Component, + forwardRef, + inject, + input, + ViewChild +} from "@angular/core"; +import { CLASSES, KC_CONTEXT, USE_DEFAULT_CSS } from "keycloakify-angular"; +import { ClassKey } from "keycloakify/login"; +import { KcContext } from "keycloakify/login/KcContext"; +import { ComponentReference } from "../../classes/component-reference.class"; +import { TemplateComponent } from "../../containers/template.component"; +import { MsgStrPipe } from "../../pipes/msg-str.pipe"; + +@Component({ + standalone: true, + imports: [TemplateComponent, MsgStrPipe], + selector: "kc-root", + templateUrl: "saml-post-form.component.html", + changeDetection: ChangeDetectionStrategy.OnPush, + providers: [ + { + provide: ComponentReference, + useExisting: forwardRef(() => SamlPostFormComponent) + } + ] +}) +export class SamlPostFormComponent extends ComponentReference implements AfterViewInit { + kcContext = inject>(KC_CONTEXT); + override doUseDefaultCss = inject(USE_DEFAULT_CSS); + override classes = inject>>(CLASSES); + displayRequiredFields = input(false); + documentTitle = input(); + bodyClassName = input(); + displayInfo: boolean = false; + displayMessage: boolean = true; + @ViewChild("setHtmlFormElement") + htmlFormElement!: HTMLFormElement; + + ngAfterViewInit(): void { + if (this.htmlFormElement === null) { + return; + } + + if (this.kcContext.samlPost.url === "#") { + alert("In a real Keycloak the user would be redirected immediately"); + return; + } + + this.htmlFormElement.submit(); + } +} diff --git a/src/login/pages/select-authenticator/select-authenticator.component.html b/src/login/pages/select-authenticator/select-authenticator.component.html new file mode 100644 index 00000000..bd622be4 --- /dev/null +++ b/src/login/pages/select-authenticator/select-authenticator.component.html @@ -0,0 +1,49 @@ +@let url = kcContext.url; +@let auth = kcContext.auth; + + + {{ 'loginChooseAuthenticator' | msgStr }} + + +
+
+ @for (authenticationSelection of auth.authenticationSelections; track authenticationSelection; let i = $index) { + + } +
+
+
+ >
diff --git a/src/login/pages/select-authenticator/select-authenticator.component.ts b/src/login/pages/select-authenticator/select-authenticator.component.ts new file mode 100644 index 00000000..415c2a9d --- /dev/null +++ b/src/login/pages/select-authenticator/select-authenticator.component.ts @@ -0,0 +1,47 @@ +import { NgClass } from "@angular/common"; +import { + ChangeDetectionStrategy, + Component, + forwardRef, + inject, + input +} from "@angular/core"; +import { CLASSES, KC_CONTEXT, USE_DEFAULT_CSS } from "keycloakify-angular"; +import { ClassKey } from "keycloakify/login"; +import { KcContext } from "keycloakify/login/KcContext"; +import { ComponentReference } from "../../classes/component-reference.class"; +import { TemplateComponent } from "../../containers/template.component"; +import { KcClassDirective } from "../../directives"; +import { AdvancedMsgStrPipe } from "../../pipes"; +import { MsgStrPipe } from "../../pipes/msg-str.pipe"; + +@Component({ + standalone: true, + imports: [ + TemplateComponent, + MsgStrPipe, + AdvancedMsgStrPipe, + KcClassDirective, + NgClass + ], + selector: "kc-root", + templateUrl: "select-authenticator.component.html", + changeDetection: ChangeDetectionStrategy.OnPush, + providers: [ + { + provide: ComponentReference, + useExisting: forwardRef(() => SelectAuthenticatorComponent) + } + ] +}) +export class SelectAuthenticatorComponent extends ComponentReference { + kcContext = + inject>(KC_CONTEXT); + override doUseDefaultCss = inject(USE_DEFAULT_CSS); + override classes = inject>>(CLASSES); + displayRequiredFields = input(false); + documentTitle = input(); + bodyClassName = input(); + displayInfo: boolean = false; + displayMessage: boolean = false; +} diff --git a/src/login/pages/terms/terms.component.html b/src/login/pages/terms/terms.component.html new file mode 100644 index 00000000..8aa1d517 --- /dev/null +++ b/src/login/pages/terms/terms.component.html @@ -0,0 +1,36 @@ +@let url = kcContext.url; + + + {{ 'termsTitle' | msgStr }} + + +
{{ 'termsText' | msgStr }}
+
+ + +
+
+
+
diff --git a/src/login/pages/terms/terms.component.ts b/src/login/pages/terms/terms.component.ts new file mode 100644 index 00000000..0302d9ac --- /dev/null +++ b/src/login/pages/terms/terms.component.ts @@ -0,0 +1,38 @@ +import { + ChangeDetectionStrategy, + Component, + forwardRef, + inject, + input +} from "@angular/core"; +import { CLASSES, KC_CONTEXT, USE_DEFAULT_CSS } from "keycloakify-angular"; +import { ClassKey } from "keycloakify/login"; +import { KcContext } from "keycloakify/login/KcContext"; +import { ComponentReference } from "../../classes/component-reference.class"; +import { TemplateComponent } from "../../containers/template.component"; +import { KcClassDirective } from "../../directives"; +import { MsgStrPipe } from "../../pipes/msg-str.pipe"; + +@Component({ + standalone: true, + imports: [MsgStrPipe, TemplateComponent, KcClassDirective], + selector: "kc-root", + templateUrl: "terms.component.html", + changeDetection: ChangeDetectionStrategy.OnPush, + providers: [ + { + provide: ComponentReference, + useExisting: forwardRef(() => TermsComponent) + } + ] +}) +export class TermsComponent extends ComponentReference { + kcContext = inject>(KC_CONTEXT); + override doUseDefaultCss = inject(USE_DEFAULT_CSS); + override classes = inject>>(CLASSES); + displayRequiredFields = input(false); + documentTitle = input(); + bodyClassName = input(); + displayInfo: boolean = false; + displayMessage: boolean = false; +} diff --git a/src/login/pages/update-email/update-email.component.html b/src/login/pages/update-email/update-email.component.html new file mode 100644 index 00000000..56526c75 --- /dev/null +++ b/src/login/pages/update-email/update-email.component.html @@ -0,0 +1,58 @@ +@let url = kcContext.url; +@let isAppInitiatedAction = kcContext.isAppInitiatedAction; + + + {{ 'updateEmailTitle' | msgStr }} + + +
+ +
+
+
+
+ +
+ + @if (isAppInitiatedAction) { + + } +
+
+
+
+
diff --git a/src/login/pages/update-email/update-email.component.ts b/src/login/pages/update-email/update-email.component.ts new file mode 100644 index 00000000..d231405a --- /dev/null +++ b/src/login/pages/update-email/update-email.component.ts @@ -0,0 +1,48 @@ +import { + ChangeDetectionStrategy, + Component, + forwardRef, + inject, + input, + signal +} from "@angular/core"; +import { CLASSES, KC_CONTEXT, USE_DEFAULT_CSS } from "keycloakify-angular"; +import { ClassKey } from "keycloakify/login"; +import { KcContext } from "keycloakify/login/KcContext"; +import { ComponentReference } from "../../classes/component-reference.class"; +import { LogoutOtherSessionsComponent } from "../../components/logout-other-sessions/logout-other-sessions.component"; +import { UserProfileFormFieldsComponent } from "../../components/user-profile-form-fields/user-profile-form-fields.component"; +import { TemplateComponent } from "../../containers/template.component"; +import { KcClassDirective } from "../../directives"; +import { MsgStrPipe } from "../../pipes/msg-str.pipe"; + +@Component({ + standalone: true, + imports: [ + TemplateComponent, + MsgStrPipe, + KcClassDirective, + UserProfileFormFieldsComponent, + LogoutOtherSessionsComponent + ], + selector: "kc-root", + templateUrl: "update-email.component.html", + changeDetection: ChangeDetectionStrategy.OnPush, + providers: [ + { + provide: ComponentReference, + useExisting: forwardRef(() => UpdateEmailComponent) + } + ] +}) +export class UpdateEmailComponent extends ComponentReference { + kcContext = inject>(KC_CONTEXT); + override doUseDefaultCss = inject(USE_DEFAULT_CSS); + override classes = inject>>(CLASSES); + displayRequiredFields = input(true); + documentTitle = input(); + bodyClassName = input(); + displayInfo: boolean = false; + displayMessage: boolean = this.kcContext.messagesPerField.exists("global"); + isFormSubmittable = signal(false); +} diff --git a/src/login/pages/webauthn-authenticate/webauthn-authenticate.component.html b/src/login/pages/webauthn-authenticate/webauthn-authenticate.component.html new file mode 100644 index 00000000..d21f5b33 --- /dev/null +++ b/src/login/pages/webauthn-authenticate/webauthn-authenticate.component.html @@ -0,0 +1,162 @@ +@let url = kcContext.url; +@let authenticators = kcContext.authenticators; +@let shouldDisplayAuthenticators = kcContext.shouldDisplayAuthenticators; + + + + {{ 'webauthn-login-title' | msgStr }} + + +
+ + {{ 'noAccount' | msgStr }} + + {{ 'doRegister' | msgStr }} + + +
+
+ +
+
+ + + + + + +
+ +
+ @if (authenticators) { +
+ @for (authenticator of authenticators.authenticators; track authenticator.credentialId) { + + } + @if (shouldDisplayAuthenticators) { + @if (authenticators.authenticators.length > 1) { +

{{ 'webauthn-available-authenticators' | msgStr }}

+ } +
+ @for ( + authenticator of authenticators.authenticators; + track authenticator.credentialId; + let i = $index + ) { +
+
+ +
+
+ {{ authenticator.label | advancedMsgStr }} +
+ @if (authenticator.transports.displayNameProperties?.length) { +
+ @for ( + displayNameProperty of authenticator.transports.displayNameProperties; + track displayNameProperty; + let last = $last + ) { + {{ displayNameProperty | advancedMsgStr }} + @if (!last) { + , + } + } +
+
+ + {{ 'webauthn-createdAt-label' | msgStr }} + + {{ authenticator.createdAt }} +
+
+ } +
+
+
+ } +
+ } +
+ } + +
+ +
+
+
+
+
diff --git a/src/login/pages/webauthn-authenticate/webauthn-authenticate.component.ts b/src/login/pages/webauthn-authenticate/webauthn-authenticate.component.ts new file mode 100644 index 00000000..3e4e4d46 --- /dev/null +++ b/src/login/pages/webauthn-authenticate/webauthn-authenticate.component.ts @@ -0,0 +1,101 @@ +import { + ChangeDetectionStrategy, + Component, + forwardRef, + inject, + input +} from "@angular/core"; +import { CLASSES, KC_CONTEXT, Script, USE_DEFAULT_CSS } from "keycloakify-angular"; +import { ClassKey } from "keycloakify/login"; +import { KcContext } from "keycloakify/login/KcContext"; +import { getKcClsx } from "keycloakify/login/lib/kcClsx"; +import { ComponentReference } from "../../classes/component-reference.class"; +import { LogoutOtherSessionsComponent } from "../../components/logout-other-sessions/logout-other-sessions.component"; +import { TemplateComponent } from "../../containers/template.component"; +import { KcClassDirective } from "../../directives"; +import { AdvancedMsgStrPipe } from "../../pipes/advanced-msg-str.pipe"; +import { MsgStrPipe } from "../../pipes/msg-str.pipe"; +import { LoginResourceInjectorService } from "../../services"; + +@Component({ + standalone: true, + imports: [ + TemplateComponent, + MsgStrPipe, + AdvancedMsgStrPipe, + KcClassDirective, + LogoutOtherSessionsComponent + ], + selector: "kc-root", + templateUrl: "webauthn-authenticate.component.html", + changeDetection: ChangeDetectionStrategy.OnPush, + providers: [ + MsgStrPipe, + { + provide: ComponentReference, + useExisting: forwardRef(() => WebauthnAuthenticateComponent) + } + ] +}) +export class WebauthnAuthenticateComponent extends ComponentReference { + kcContext = + inject>(KC_CONTEXT); + loginResourceInjectorService = inject(LoginResourceInjectorService); + msgStr = inject(MsgStrPipe); + override doUseDefaultCss = inject(USE_DEFAULT_CSS); + override classes = inject>>(CLASSES); + displayRequiredFields = input(false); + documentTitle = input(); + bodyClassName = input(); + displayInfo: boolean = false; + displayMessage: boolean = true; + + authButtonId = "authenticateWebAuthnButton"; + + constructor() { + super(); + const { + url, + isUserIdentified, + challenge, + userVerification, + rpId, + createTimeout + } = this.kcContext; + const scripts: Script[] = [ + { + type: "module", + id: "WebAuthnAuthenticateScript", + textContent: ` + import { authenticateByWebAuthn } from "${url.resourcesPath}/js/webauthnAuthenticate.js"; + const authButton = document.getElementById('${this.authButtonId}'); + authButton.addEventListener("click", function() { + const input = { + isUserIdentified : ${isUserIdentified}, + challenge : '${challenge}', + userVerification : '${userVerification}', + rpId : '${rpId}', + createTimeout : ${createTimeout}, + errmsg : ${JSON.stringify(this.msgStr.transform("webauthn-unsupported-browser-text"))} + }; + authenticateByWebAuthn(input); + }); + ` + } + ]; + this.loginResourceInjectorService.insertAdditionalScripts(scripts); + } + + selectAuthListItemIconClass(iconClass: string) { + const kcClsx = getKcClsx({ + doUseDefaultCss: this.doUseDefaultCss ?? true, + classes: this.classes + }).kcClsx; + // eslint-disable-next-line @typescript-eslint/no-explicit-any + const className = kcClsx(iconClass as any); + if (className === iconClass) { + return kcClsx("kcWebAuthnDefaultIcon"); + } + return className; + } +} diff --git a/src/login/pages/webauthn-error/webauthn-error.component.html b/src/login/pages/webauthn-error/webauthn-error.component.html new file mode 100644 index 00000000..720404d6 --- /dev/null +++ b/src/login/pages/webauthn-error/webauthn-error.component.html @@ -0,0 +1,60 @@ +@let url = kcContext.url; +@let isAppInitiatedAction = kcContext.isAppInitiatedAction; + + + + {{ 'webauthn-error-title' | msgStr }} + + +
+ + +
+ + @if (isAppInitiatedAction) { +
+ +
+ } +
+
diff --git a/src/login/pages/webauthn-error/webauthn-error.component.ts b/src/login/pages/webauthn-error/webauthn-error.component.ts new file mode 100644 index 00000000..ca20e5b2 --- /dev/null +++ b/src/login/pages/webauthn-error/webauthn-error.component.ts @@ -0,0 +1,53 @@ +import { + ChangeDetectionStrategy, + Component, + forwardRef, + inject, + input +} from "@angular/core"; +import { CLASSES, KC_CONTEXT, USE_DEFAULT_CSS } from "keycloakify-angular"; +import { ClassKey } from "keycloakify/login"; +import { KcContext } from "keycloakify/login/KcContext"; +import { ComponentReference } from "../../classes/component-reference.class"; +import { LogoutOtherSessionsComponent } from "../../components/logout-other-sessions/logout-other-sessions.component"; +import { TemplateComponent } from "../../containers/template.component"; +import { KcClassDirective } from "../../directives"; +import { MsgStrPipe } from "../../pipes/msg-str.pipe"; + +@Component({ + standalone: true, + imports: [ + TemplateComponent, + MsgStrPipe, + KcClassDirective, + LogoutOtherSessionsComponent + ], + selector: "kc-root", + templateUrl: "webauthn-error.component.html", + changeDetection: ChangeDetectionStrategy.OnPush, + providers: [ + { + provide: ComponentReference, + useExisting: forwardRef(() => WebauthnErrorComponent) + } + ] +}) +export class WebauthnErrorComponent extends ComponentReference { + kcContext = inject>(KC_CONTEXT); + override doUseDefaultCss = inject(USE_DEFAULT_CSS); + override classes = inject>>(CLASSES); + displayRequiredFields = input(false); + documentTitle = input(); + bodyClassName = input(); + displayInfo: boolean = false; + displayMessage: boolean = true; + + onClick() { + // @ts-expect-error: Trusted Keycloak's code + document.getElementById("isSetRetry").value = "retry"; + // @ts-expect-error: Trusted Keycloak's code + document.getElementById("executionValue").value = "${execution}"; + // @ts-expect-error: Trusted Keycloak's code + document.getElementById("kc-error-credential-form").submit(); + } +} diff --git a/src/login/pages/webauthn-register/webauthn-register.component.html b/src/login/pages/webauthn-register/webauthn-register.component.html new file mode 100644 index 00000000..78193623 --- /dev/null +++ b/src/login/pages/webauthn-register/webauthn-register.component.html @@ -0,0 +1,82 @@ +@let url = kcContext.url; +@let isSetRetry = kcContext.isSetRetry; +@let isAppInitiatedAction = kcContext.isAppInitiatedAction; + + + + + {{ 'webauthn-registration-title' | msgStr }} + + +
+
+ + + + + + + +
+
+ + @if (!isSetRetry && isAppInitiatedAction) { +
+ +
+ } +
+
diff --git a/src/login/pages/webauthn-register/webauthn-register.component.ts b/src/login/pages/webauthn-register/webauthn-register.component.ts new file mode 100644 index 00000000..36d1330b --- /dev/null +++ b/src/login/pages/webauthn-register/webauthn-register.component.ts @@ -0,0 +1,101 @@ +import { + ChangeDetectionStrategy, + Component, + forwardRef, + inject, + input +} from "@angular/core"; +import { CLASSES, KC_CONTEXT, Script, USE_DEFAULT_CSS } from "keycloakify-angular"; +import { ClassKey } from "keycloakify/login"; +import { KcContext } from "keycloakify/login/KcContext"; +import { ComponentReference } from "../../classes/component-reference.class"; +import { LogoutOtherSessionsComponent } from "../../components/logout-other-sessions/logout-other-sessions.component"; +import { TemplateComponent } from "../../containers/template.component"; +import { KcClassDirective } from "../../directives"; +import { MsgStrPipe } from "../../pipes/msg-str.pipe"; +import { LoginResourceInjectorService } from "../../services"; + +@Component({ + standalone: true, + imports: [ + TemplateComponent, + MsgStrPipe, + KcClassDirective, + LogoutOtherSessionsComponent + ], + selector: "kc-root", + templateUrl: "webauthn-register.component.html", + changeDetection: ChangeDetectionStrategy.OnPush, + providers: [ + MsgStrPipe, + { + provide: ComponentReference, + useExisting: forwardRef(() => WebauthnRegisterComponent) + } + ] +}) +export class WebauthnRegisterComponent extends ComponentReference { + kcContext = + inject>(KC_CONTEXT); + loginResourceInjectorService = inject(LoginResourceInjectorService); + msgStr = inject(MsgStrPipe); + override doUseDefaultCss = inject(USE_DEFAULT_CSS); + override classes = inject>>(CLASSES); + displayRequiredFields = input(false); + documentTitle = input(); + bodyClassName = input(); + displayInfo: boolean = false; + displayMessage: boolean = true; + + authButtonId = "authenticateWebAuthnButton"; + + constructor() { + super(); + const { + url, + challenge, + userid, + username, + signatureAlgorithms, + rpEntityName, + rpId, + attestationConveyancePreference, + authenticatorAttachment, + requireResidentKey, + userVerificationRequirement, + createTimeout, + excludeCredentialIds + } = this.kcContext; + const scripts: Script[] = [ + { + type: "module", + id: "WebAuthnRegisterScript", + textContent: ` + import { registerByWebAuthn } from "${url.resourcesPath}/js/webauthnRegister.js"; + const registerButton = document.getElementById('${this.authButtonId}'); + registerButton.addEventListener("click", function() { + const input = { + challenge : '${challenge}', + userid : '${userid}', + username : '${username}', + signatureAlgorithms : ${JSON.stringify(signatureAlgorithms)}, + rpEntityName : ${JSON.stringify(rpEntityName)}, + rpId : ${JSON.stringify(rpId)}, + attestationConveyancePreference : ${JSON.stringify(attestationConveyancePreference)}, + authenticatorAttachment : ${JSON.stringify(authenticatorAttachment)}, + requireResidentKey : ${JSON.stringify(requireResidentKey)}, + userVerificationRequirement : ${JSON.stringify(userVerificationRequirement)}, + createTimeout : ${createTimeout}, + excludeCredentialIds : ${JSON.stringify(excludeCredentialIds)}, + initLabel : ${JSON.stringify(this.msgStr.transform("webauthn-registration-init-label"))}, + initLabelPrompt : ${JSON.stringify(this.msgStr.transform("webauthn-registration-init-label-prompt"))}, + errmsg : ${JSON.stringify(this.msgStr.transform("webauthn-unsupported-browser-text"))} + }; + registerByWebAuthn(input); + }); + ` + } + ]; + this.loginResourceInjectorService.insertAdditionalScripts(scripts); + } +} diff --git a/src/login/pipes/advanced-msg-str.pipe.ts b/src/login/pipes/advanced-msg-str.pipe.ts new file mode 100644 index 00000000..6e78aa77 --- /dev/null +++ b/src/login/pipes/advanced-msg-str.pipe.ts @@ -0,0 +1,13 @@ +import { inject, Pipe, PipeTransform } from "@angular/core"; +import { I18N } from "keycloakify-angular"; +import { I18n } from "keycloakify/login/i18n"; +@Pipe({ + name: "advancedMsgStr", + standalone: true +}) +export class AdvancedMsgStrPipe implements PipeTransform { + readonly #i18n = inject(I18N); + transform(value: string, ...args: (string | undefined)[]): string { + return this.#i18n.advancedMsgStr(value, ...args); + } +} diff --git a/src/login/pipes/index.ts b/src/login/pipes/index.ts new file mode 100644 index 00000000..b6fa0a64 --- /dev/null +++ b/src/login/pipes/index.ts @@ -0,0 +1,6 @@ +export * from "./advanced-msg-str.pipe"; +export * from "./input-type.pipe"; +export * from "./kc-sanitize.pipe"; +export * from "./msg-str.pipe"; +export * from "./to-array.pipe"; +export * from "./to-number.pipe"; diff --git a/src/login/pipes/input-type.pipe.ts b/src/login/pipes/input-type.pipe.ts new file mode 100644 index 00000000..2faea6bc --- /dev/null +++ b/src/login/pipes/input-type.pipe.ts @@ -0,0 +1,15 @@ +import { Pipe, PipeTransform } from "@angular/core"; + +@Pipe({ + name: "inputType", + standalone: true +}) +export class InputTypePipe implements PipeTransform { + transform(inputType?: string): string { + if (inputType?.startsWith("html5-")) { + return inputType.slice(6); + } + + return inputType ?? "text"; + } +} diff --git a/src/login/pipes/kc-sanitize.pipe.ts b/src/login/pipes/kc-sanitize.pipe.ts new file mode 100644 index 00000000..ea3bec53 --- /dev/null +++ b/src/login/pipes/kc-sanitize.pipe.ts @@ -0,0 +1,36 @@ +import { Pipe, PipeTransform } from "@angular/core"; +import { + DomSanitizer, + SafeHtml, + SafeResourceUrl, + SafeScript, + SafeStyle, + SafeUrl +} from "@angular/platform-browser"; + +@Pipe({ name: "kcSanitize", standalone: true }) +export class KcSanitizePipe implements PipeTransform { + constructor(private sanitizer: DomSanitizer) {} + // TODO: Fix typing + + transform( + // eslint-disable-next-line @typescript-eslint/no-explicit-any + value: any, + type: string + ): SafeHtml | SafeStyle | SafeScript | SafeUrl | SafeResourceUrl { + switch (type) { + case "html": + return this.sanitizer.bypassSecurityTrustHtml(value); + case "style": + return this.sanitizer.bypassSecurityTrustStyle(value); + case "script": + return this.sanitizer.bypassSecurityTrustScript(value); + case "url": + return this.sanitizer.bypassSecurityTrustUrl(value); + case "resourceUrl": + return this.sanitizer.bypassSecurityTrustResourceUrl(value); + default: + throw new Error(`Invalid safe type specified: ${type}`); + } + } +} diff --git a/src/login/pipes/msg-str.pipe.ts b/src/login/pipes/msg-str.pipe.ts new file mode 100644 index 00000000..e3613d3d --- /dev/null +++ b/src/login/pipes/msg-str.pipe.ts @@ -0,0 +1,14 @@ +import { inject, Pipe, PipeTransform } from "@angular/core"; +import { I18N } from "keycloakify-angular"; +import { I18n } from "keycloakify/login/i18n"; +import { MessageKey } from "keycloakify/login/i18n/messages_defaultSet/types"; +@Pipe({ + name: "msgStr", + standalone: true +}) +export class MsgStrPipe implements PipeTransform { + readonly #i18n = inject(I18N); + transform(value: MessageKey, ...args: (string | undefined)[]): string { + return this.#i18n.msgStr(value, ...args); + } +} diff --git a/src/login/pipes/to-array.pipe.ts b/src/login/pipes/to-array.pipe.ts new file mode 100644 index 00000000..99f9b8ca --- /dev/null +++ b/src/login/pipes/to-array.pipe.ts @@ -0,0 +1,15 @@ +import { Pipe, PipeTransform } from "@angular/core"; + +@Pipe({ + name: "toArray", + standalone: true +}) +export class ToArrayPipe implements PipeTransform { + transform(value: string | string[], emptyWhenString = false): string[] { + // if (!value) throw new Error('must pass a value'); + if (value instanceof Array) { + return value; + } + return emptyWhenString ? [] : [value]; + } +} diff --git a/src/login/pipes/to-number.pipe.ts b/src/login/pipes/to-number.pipe.ts new file mode 100644 index 00000000..66f9a4c9 --- /dev/null +++ b/src/login/pipes/to-number.pipe.ts @@ -0,0 +1,13 @@ +import { Pipe, PipeTransform } from "@angular/core"; + +@Pipe({ + name: "toNumber", + standalone: true +}) +export class ToNumberPipe implements PipeTransform { + transform(value: string | number): number { + const number = parseInt(`${value}`); + if (isNaN(number)) throw new Error("number is NaN"); + return number; + } +} diff --git a/src/login/services/index.ts b/src/login/services/index.ts new file mode 100644 index 00000000..9c5c8132 --- /dev/null +++ b/src/login/services/index.ts @@ -0,0 +1,2 @@ +export * from "./login-resource-injector.service"; +export * from "./user-profile-form.service"; diff --git a/src/login/services/login-resource-injector.service.ts b/src/login/services/login-resource-injector.service.ts new file mode 100644 index 00000000..654f2ba1 --- /dev/null +++ b/src/login/services/login-resource-injector.service.ts @@ -0,0 +1,71 @@ +import { inject, Injectable } from "@angular/core"; +import { KC_CONTEXT, ResourceInjectorService, Script } from "keycloakify-angular"; +import { KcContext } from "keycloakify/login/KcContext"; +import { catchError, forkJoin, of, switchMap } from "rxjs"; + +@Injectable({ + providedIn: "root" +}) +export class LoginResourceInjectorService { + private kcContext: KcContext = inject(KC_CONTEXT); + private resourceInjectorService: ResourceInjectorService = inject( + ResourceInjectorService + ); + + injectResource(doUseDefaultCss = true) { + if (!doUseDefaultCss) { + this.injectScripts(); + return of(true); + } + const stylesheets = [ + `${this.kcContext.url.resourcesCommonPath}/node_modules/@patternfly/patternfly/patternfly.min.css`, + `${this.kcContext.url.resourcesCommonPath}/node_modules/patternfly/dist/css/patternfly.min.css`, + `${this.kcContext.url.resourcesCommonPath}/node_modules/patternfly/dist/css/patternfly-additions.min.css`, + `${this.kcContext.url.resourcesCommonPath}/lib/pficon/pficon.css`, + `${this.kcContext.url.resourcesPath}/css/login.css` + ]; + + return forkJoin( + stylesheets.map(url => this.resourceInjectorService.createLink(url)) + ).pipe( + switchMap(() => { + this.injectScripts(); + return of(true); + }), + catchError(error => { + console.error("Error loading styles:", error); + return of(false); + }) + ); + } + + insertAdditionalScripts(scripts: Script[]) { + scripts.map(script => this.resourceInjectorService.createScript(script)); + } + + private injectScripts() { + const scripts: Script[] = [ + { + type: "module", + id: `${this.kcContext.url.resourcesPath}/js/menu-button-links.js`, + src: `${this.kcContext.url.resourcesPath}/js/menu-button-links.js` + }, + ...this.kcContext.scripts.map(script => ({ + type: "text/javascript", + src: script, + id: script + })), + { + type: "module", + id: "authenticationSession", + textContent: ` + import { checkCookiesAndSetTimer } from "${this.kcContext.url.resourcesPath}/js/authChecker.js"; + + checkCookiesAndSetTimer( + "${this.kcContext.url.ssoLoginInOtherTabsUrl}" + );` + } + ]; + this.insertAdditionalScripts(scripts); + } +} diff --git a/src/login/services/user-profile-form.service.ts b/src/login/services/user-profile-form.service.ts new file mode 100644 index 00000000..c395adcf --- /dev/null +++ b/src/login/services/user-profile-form.service.ts @@ -0,0 +1,1500 @@ +/* eslint-disable @typescript-eslint/no-explicit-any */ +/* eslint-disable @typescript-eslint/ban-ts-comment */ + +import { + computed, + inject, + Injectable, + signal, + Signal, + WritableSignal +} from "@angular/core"; +import { DomSanitizer, SafeHtml } from "@angular/platform-browser"; +import { DO_MAKE_USER_CONFIRM_PASSWORD, I18N, KC_CONTEXT } from "keycloakify-angular"; +import { + Attribute, + KcContext, + PasswordPolicies, + Validators +} from "keycloakify/login/KcContext"; +import type { + I18n, + KcContextLike as KcContextLike_i18n, + MessageKey_defaultSet +} from "keycloakify/login/i18n"; +import { emailRegexp } from "keycloakify/tools/emailRegExp"; +import { formatNumber } from "keycloakify/tools/formatNumber"; +import { structuredCloneButFunctions } from "keycloakify/tools/structuredCloneButFunctions"; +import { assert, id } from "tsafe"; +import { LoginResourceInjectorService } from "./login-resource-injector.service"; + +type KcContextLike_useGetErrors = KcContextLike_i18n & { + messagesPerField: Pick; + passwordPolicies?: PasswordPolicies; +}; +export namespace FormFieldError { + export type Source = + | Source.Validator + | Source.PasswordPolicy + | Source.Server + | Source.Other; + + export namespace Source { + export type Validator = { + type: "validator"; + name: keyof Validators; + }; + export type PasswordPolicy = { + type: "passwordPolicy"; + name: keyof PasswordPolicies; + }; + export type Server = { + type: "server"; + }; + + export type Other = { + type: "other"; + rule: "passwordConfirmMatchesPassword" | "requiredField"; + }; + } +} + +export type KcContextLike = KcContextLike_i18n & + KcContextLike_useGetErrors & { + profile: { + attributesByName: Record; + html5DataAnnotations?: Record; + }; + passwordRequired?: boolean; + realm: { registrationEmailAsUsername: boolean }; + url: { + resourcesPath: string; + }; + }; +export type FormFieldError = { + errorMessage: SafeHtml; // this was jsx, be carefull + errorMessageStr: string; + source: FormFieldError.Source; + fieldIndex: number | undefined; +}; +namespace internal { + export type FormFieldState = { + attribute: Attribute; + errors: FormFieldError[]; + hasLostFocusAtLeastOnce: boolean | boolean[]; + valueOrValues: string | string[]; + }; + + export type State = { + formFieldStates: FormFieldState[]; + }; +} +type FormFieldState = { + attribute: Attribute; + displayableErrors: FormFieldError[]; + valueOrValues: string | string[]; +}; +type FormState = { + isFormSubmittable: boolean; + formFieldStates: FormFieldState[]; +}; +export type FormAction = + | { + action: "update"; + name: string; + valueOrValues: string | string[]; + /** Default false */ + displayErrorsImmediately?: boolean; + } + | { + action: "focus lost"; + name: string; + fieldIndex: number | undefined; + }; + +@Injectable({ providedIn: "root" }) +export class UserProfileFormService { + private kcContext: KcContextLike = + inject>(KC_CONTEXT); + private i18n = inject(I18N); + private doMakeUserConfirmPassword = inject(DO_MAKE_USER_CONFIRM_PASSWORD); + private loginResourceInjectorService = inject(LoginResourceInjectorService); + private sanitizer: DomSanitizer = inject(DomSanitizer); + private initialState: internal.State = (() => { + const attributes: Attribute[] = (() => { + mock_user_profile_attributes_for_older_keycloak_versions: { + if ( + "profile" in this.kcContext && + "attributesByName" in this.kcContext.profile && + Object.keys(this.kcContext.profile.attributesByName).length !== 0 + ) { + break mock_user_profile_attributes_for_older_keycloak_versions; + } + + if ( + "register" in this.kcContext && + this.kcContext.register instanceof Object && + "formData" in this.kcContext.register + ) { + //NOTE: Handle legacy register.ftl page + return (["firstName", "lastName", "email", "username"] as const) + .filter(name => + name !== "username" + ? true + : !this.kcContext.realm.registrationEmailAsUsername + ) + .map(name => + id({ + name: name, + displayName: id<`\${${MessageKey_defaultSet}}`>( + `\${${name}}` + ), + required: true, + value: + (this.kcContext as any).register.formData[name] ?? "", + html5DataAnnotations: {}, + readOnly: false, + validators: {}, + annotations: {}, + autocomplete: (() => { + switch (name) { + case "email": + return "email"; + case "username": + return "username"; + default: + return undefined; + } + })() + }) + ); + } + + if ("user" in this.kcContext && this.kcContext.user instanceof Object) { + //NOTE: Handle legacy login-update-profile.ftl + return (["username", "email", "firstName", "lastName"] as const) + .filter(name => + name !== "username" + ? true + : (this.kcContext as any).user.editUsernameAllowed + ) + .map(name => + id({ + name: name, + displayName: id<`\${${MessageKey_defaultSet}}`>( + `\${${name}}` + ), + required: true, + value: (this.kcContext as any).user[name] ?? "", + html5DataAnnotations: {}, + readOnly: false, + validators: {}, + annotations: {}, + autocomplete: (() => { + switch (name) { + case "email": + return "email"; + case "username": + return "username"; + default: + return undefined; + } + })() + }) + ); + } + + if ("email" in this.kcContext && this.kcContext.email instanceof Object) { + //NOTE: Handle legacy update-email.ftl + return [ + id({ + name: "email", + displayName: id<`\${${MessageKey_defaultSet}}`>(`\${email}`), + required: true, + value: (this.kcContext.email as any).value ?? "", + html5DataAnnotations: {}, + readOnly: false, + validators: {}, + annotations: {}, + autocomplete: "email" + }) + ]; + } + + assert(false, "Unable to mock user profile from the current kcContext"); + } + + return Object.values(this.kcContext.profile.attributesByName).map( + structuredCloneButFunctions + ); + })(); + // Retro-compatibility and consistency patches + attributes.forEach(attribute => { + patch_legacy_group: { + if (typeof attribute.group !== "string") { + break patch_legacy_group; + } + + const { + group, + groupDisplayHeader, + groupDisplayDescription, + groupAnnotations + } = attribute as Attribute & { + group: string; + groupDisplayHeader?: string; + groupDisplayDescription?: string; + groupAnnotations: Record; + }; + + delete attribute.group; + // @ts-expect-error + delete attribute.groupDisplayHeader; + // @ts-expect-error + delete attribute.groupDisplayDescription; + // @ts-expect-error + delete attribute.groupAnnotations; + + if (group === "") { + break patch_legacy_group; + } + + attribute.group = { + name: group, + displayHeader: groupDisplayHeader, + displayDescription: groupDisplayDescription, + annotations: groupAnnotations, + html5DataAnnotations: {} + }; + } + + // Attributes with options rendered by default as select inputs + if ( + attribute.validators.options !== undefined && + attribute.annotations.inputType === undefined + ) { + attribute.annotations.inputType = "select"; + } + + // Consistency patch on values/value property + { + if (this.getIsMultivaluedSingleField({ attribute })) { + attribute.multivalued = true; + } + + if (attribute.multivalued) { + attribute.values ??= + attribute.value !== undefined ? [attribute.value] : []; + delete attribute.value; + } else { + attribute.value ??= attribute.values?.[0]; + delete attribute.values; + } + } + }); + add_password_and_password_confirm: { + if (!this.kcContext.passwordRequired) { + break add_password_and_password_confirm; + } + + attributes.forEach((attribute, i) => { + if ( + attribute.name !== + (this.kcContext.realm.registrationEmailAsUsername + ? "email" + : "username") + ) { + // NOTE: We want to add password and password-confirm after the field that identifies the user. + // It's either email or username. + return; + } + + attributes.splice( + i + 1, + 0, + { + name: "password", + displayName: id<`\${${MessageKey_defaultSet}}`>("${password}"), + required: true, + readOnly: false, + validators: {}, + annotations: {}, + autocomplete: "new-password", + html5DataAnnotations: {} + }, + { + name: "password-confirm", + displayName: + id<`\${${MessageKey_defaultSet}}`>("${passwordConfirm}"), + required: true, + readOnly: false, + validators: {}, + annotations: {}, + html5DataAnnotations: {}, + autocomplete: "new-password" + } + ); + }); + } + const initialFormFieldState: { + attribute: Attribute; + valueOrValues: string | string[]; + }[] = []; + + for (const attribute of attributes) { + handle_multi_valued_attribute: { + if (!attribute.multivalued) { + break handle_multi_valued_attribute; + } + + const values = attribute.values?.length ? attribute.values : [""]; + + apply_validator_min_range: { + if (this.getIsMultivaluedSingleField({ attribute })) { + break apply_validator_min_range; + } + + const validator = attribute.validators.multivalued; + + if (validator === undefined) { + break apply_validator_min_range; + } + + const { min: minStr } = validator; + + if (!minStr) { + break apply_validator_min_range; + } + + const min = parseInt(`${minStr}`); + + for (let index = values.length; index < min; index++) { + values.push(""); + } + } + + initialFormFieldState.push({ + attribute, + valueOrValues: values + }); + + continue; + } + + initialFormFieldState.push({ + attribute, + valueOrValues: attribute.value ?? "" + }); + } + + const initialState: internal.State = { + formFieldStates: initialFormFieldState.map( + ({ attribute, valueOrValues }) => ({ + attribute, + errors: this.getErrors({ + attributeName: attribute.name, + formFieldStates: initialFormFieldState + }), + hasLostFocusAtLeastOnce: + valueOrValues instanceof Array && + !this.getIsMultivaluedSingleField({ attribute }) + ? valueOrValues.map(() => false) + : false, + valueOrValues: valueOrValues + }) + ) + }; + return initialState; + })(); + + private state: WritableSignal = signal(this.initialState); + + formState: Signal = computed(() => { + const state: internal.State = this.state(); + return { + formFieldStates: state.formFieldStates.map( + ({ + errors, + hasLostFocusAtLeastOnce: hasLostFocusAtLeastOnceOrArr, + attribute, + ...valueOrValuesWrap + }) => ({ + displayableErrors: errors.filter(error => { + const hasLostFocusAtLeastOnce = + typeof hasLostFocusAtLeastOnceOrArr === "boolean" + ? hasLostFocusAtLeastOnceOrArr + : error.fieldIndex !== undefined + ? hasLostFocusAtLeastOnceOrArr[error.fieldIndex] + : hasLostFocusAtLeastOnceOrArr[ + hasLostFocusAtLeastOnceOrArr.length - 1 + ]; + let value = false; + switch (error.source.type) { + case "server": + value = true; + break; + case "other": + switch (error.source.rule) { + case "requiredField": + value = hasLostFocusAtLeastOnce; + break; + case "passwordConfirmMatchesPassword": + value = hasLostFocusAtLeastOnce; + break; + } + // assert>(false); + break; + case "passwordPolicy": + switch (error.source.name) { + case "length": + value = hasLostFocusAtLeastOnce; + break; + case "digits": + value = hasLostFocusAtLeastOnce; + break; + case "lowerCase": + value = hasLostFocusAtLeastOnce; + break; + case "upperCase": + value = hasLostFocusAtLeastOnce; + break; + case "specialChars": + value = hasLostFocusAtLeastOnce; + break; + case "notUsername": + value = true; + break; + case "notEmail": + value = true; + break; + } + // assert>(false); + break; + case "validator": + switch (error.source.name) { + case "length": + value = hasLostFocusAtLeastOnce; + break; + case "pattern": + value = hasLostFocusAtLeastOnce; + break; + case "email": + value = hasLostFocusAtLeastOnce; + break; + case "integer": + value = hasLostFocusAtLeastOnce; + break; + case "multivalued": + value = hasLostFocusAtLeastOnce; + break; + case "options": + value = hasLostFocusAtLeastOnce; + break; + } + // assert>(false); + break; + } + return value; + }), + attribute, + ...valueOrValuesWrap + }) + ), + isFormSubmittable: state.formFieldStates.every( + ({ errors }) => errors.length === 0 + ) + }; + }); + + constructor() { + this.loginResourceInjectorService.insertAdditionalScripts( + Object.keys(this.kcContext.profile?.html5DataAnnotations ?? {}) + .filter(key => key !== "kcMultivalued" && key !== "kcNumberFormat") // NOTE: Keycloakify handles it. + .map(key => ({ + type: "module", + src: `${this.kcContext.url.resourcesPath}/js/${key}.js`, + id: `${this.kcContext.url.resourcesPath}/js/${key}.js` + })) + ); + } + + public dispatchFormAction(formAction: FormAction) { + if (!formAction) return; + const state = this.state(); + const formFieldState = state.formFieldStates.find( + ({ attribute }) => attribute.name === formAction.name + ); + assert(formFieldState !== undefined); + switch (formAction.action) { + case "update": + formFieldState.valueOrValues = formAction.valueOrValues; + + apply_formatters: { + const { attribute } = formFieldState; + + const { kcNumberFormat } = attribute.html5DataAnnotations ?? {}; + + if (!kcNumberFormat) { + break apply_formatters; + } + + if (formFieldState.valueOrValues instanceof Array) { + formFieldState.valueOrValues = formFieldState.valueOrValues.map( + value => formatNumber(value, kcNumberFormat) + ); + } else { + formFieldState.valueOrValues = formatNumber( + formFieldState.valueOrValues, + kcNumberFormat + ); + } + } + + formFieldState.errors = this.getErrors({ + attributeName: formAction.name, + formFieldStates: state.formFieldStates + }); + + simulate_focus_lost: { + const { displayErrorsImmediately = false } = formAction; + + if (!displayErrorsImmediately) { + break simulate_focus_lost; + } + + for (const fieldIndex of formAction.valueOrValues instanceof Array + ? formAction.valueOrValues.map((...[, index]) => index) + : [undefined]) { + this.dispatchFormAction({ + action: "focus lost", + name: formAction.name, + fieldIndex + }); + } + } + + update_password_confirm: { + if (this.doMakeUserConfirmPassword) { + break update_password_confirm; + } + + if (formAction.name !== "password") { + break update_password_confirm; + } + + this.dispatchFormAction({ + action: "update", + name: "password-confirm", + valueOrValues: formAction.valueOrValues, + displayErrorsImmediately: formAction.displayErrorsImmediately + }); + } + + trigger_password_confirm_validation_on_password_change: { + if (!this.doMakeUserConfirmPassword) { + break trigger_password_confirm_validation_on_password_change; + } + + if (formAction.name !== "password") { + break trigger_password_confirm_validation_on_password_change; + } + + this.dispatchFormAction({ + action: "update", + name: "password-confirm", + valueOrValues: (() => { + const formFieldState = state.formFieldStates.find( + ({ attribute }) => attribute.name === "password-confirm" + ); + + assert(formFieldState !== undefined); + + return formFieldState.valueOrValues; + })(), + displayErrorsImmediately: formAction.displayErrorsImmediately + }); + } + + break; + case "focus lost": + if (formFieldState.hasLostFocusAtLeastOnce instanceof Array) { + const { fieldIndex } = formAction; + assert(fieldIndex !== undefined); + formFieldState.hasLostFocusAtLeastOnce[fieldIndex] = true; + break; + } + + formFieldState.hasLostFocusAtLeastOnce = true; + break; + } + this.state.update(state => ({ + ...state, + formFieldStates: state.formFieldStates.map(f => { + if (f.attribute === formFieldState.attribute) return formFieldState; + return f; + }) + })); + } + + private getIsMultivaluedSingleField(params: { attribute: Attribute }) { + const { attribute } = params; + + return attribute.annotations.inputType?.startsWith("multiselect") ?? false; + } + + private getErrors(params: { + attributeName: string; + formFieldStates: { + attribute: Attribute; + valueOrValues: string | string[]; + }[]; + }): FormFieldError[] { + const { messagesPerField, passwordPolicies } = this.kcContext; + + const { msgStr, advancedMsgStr } = this.i18n; + const { attributeName, formFieldStates } = params; + + const formFieldState = formFieldStates.find( + ({ attribute }) => attribute.name === attributeName + ); + + assert(formFieldState !== undefined); + + const { attribute } = formFieldState; + + const valueOrValues = (() => { + let { valueOrValues } = formFieldState; + + unFormat_number: { + const { kcNumberUnFormat } = attribute.html5DataAnnotations ?? {}; + + if (!kcNumberUnFormat) { + break unFormat_number; + } + + if (valueOrValues instanceof Array) { + valueOrValues = valueOrValues.map(value => + formatNumber(value, kcNumberUnFormat) + ); + } else { + valueOrValues = formatNumber(valueOrValues, kcNumberUnFormat); + } + } + + return valueOrValues; + })(); + + assert(attribute !== undefined); + + server_side_error: { + if (attribute.multivalued) { + const defaultValues = attribute.values?.length ? attribute.values : [""]; + + assert(valueOrValues instanceof Array); + + const values = valueOrValues; + + if ( + JSON.stringify(defaultValues) !== + JSON.stringify(values.slice(0, defaultValues.length)) + ) { + break server_side_error; + } + } else { + const defaultValue = attribute.value ?? ""; + + assert(typeof valueOrValues === "string"); + + const value = valueOrValues; + + if (defaultValue !== value) { + break server_side_error; + } + } + + let doesErrorExist: boolean; + + try { + doesErrorExist = messagesPerField.existsError(attributeName); + } catch { + break server_side_error; + } + + if (!doesErrorExist) { + break server_side_error; + } + + const errorMessageStr = messagesPerField.get(attributeName); + + return [ + { + errorMessageStr, + errorMessage: this.sanitizer.bypassSecurityTrustHtml( + `${errorMessageStr}` + ), + fieldIndex: undefined, + source: { + type: "server" + } + } + ]; + } + + handle_multi_valued_multi_fields: { + if (!attribute.multivalued) { + break handle_multi_valued_multi_fields; + } + + if (this.getIsMultivaluedSingleField({ attribute })) { + break handle_multi_valued_multi_fields; + } + + assert(valueOrValues instanceof Array); + + const values = valueOrValues; + + const errors = values + .map((...[, index]) => { + const specificValueErrors = this.getErrors({ + attributeName, + formFieldStates: formFieldStates.map(formFieldState => { + if (formFieldState.attribute.name === attributeName) { + assert(formFieldState.valueOrValues instanceof Array); + return { + attribute: { + ...attribute, + annotations: { + ...attribute.annotations, + inputType: undefined + }, + multivalued: false + }, + valueOrValues: formFieldState.valueOrValues[index] + }; + } + + return formFieldState; + }) + }); + + return specificValueErrors + .filter(error => { + if ( + error.source.type === "other" && + error.source.rule === "requiredField" + ) { + return false; + } + + return true; + }) + .map( + (error): FormFieldError => ({ + ...error, + fieldIndex: index + }) + ); + }) + .reduce((acc, errors) => [...acc, ...errors], []); + + required_field: { + if (!attribute.required) { + break required_field; + } + + if (values.every(value => value !== "")) { + break required_field; + } + + const msgArgs = ["error-user-attribute-required"] as const; + + errors.push({ + errorMessage: this.sanitizer.bypassSecurityTrustHtml( + `${msgStr(...msgArgs)}` + ), + errorMessageStr: msgStr(...msgArgs), + fieldIndex: undefined, + source: { + type: "other", + rule: "requiredField" + } + }); + } + + return errors; + } + + handle_multi_valued_single_field: { + if (!attribute.multivalued) { + break handle_multi_valued_single_field; + } + + if (!this.getIsMultivaluedSingleField({ attribute })) { + break handle_multi_valued_single_field; + } + + const validatorName = "multivalued"; + + const validator = attribute.validators[validatorName]; + + if (validator === undefined) { + return []; + } + + const { min: minStr } = validator; + + const min = minStr ? parseInt(`${minStr}`) : attribute.required ? 1 : 0; + + assert(!isNaN(min)); + + const { max: maxStr } = validator; + + const max = !maxStr ? Infinity : parseInt(`${maxStr}`); + + assert(!isNaN(max)); + + assert(valueOrValues instanceof Array); + + const values = valueOrValues; + + if (min <= values.length && values.length <= max) { + return []; + } + + const msgArgs = [ + "error-invalid-multivalued-size", + `${min}`, + `${max}` + ] as const; + + return [ + { + errorMessage: this.sanitizer.bypassSecurityTrustHtml( + `${msgStr(...msgArgs)}` + ), + errorMessageStr: msgStr(...msgArgs), + fieldIndex: undefined, + source: { + type: "validator", + name: validatorName + } + } + ]; + } + + assert(typeof valueOrValues === "string"); + + const value = valueOrValues; + + const errors: FormFieldError[] = []; + + check_password_policies: { + if (attributeName !== "password") { + break check_password_policies; + } + + if (passwordPolicies === undefined) { + break check_password_policies; + } + + check_password_policy_x: { + const policyName = "length"; + + const policy = passwordPolicies[policyName]; + + if (!policy) { + break check_password_policy_x; + } + + const minLength = policy; + + if (value.length >= minLength) { + break check_password_policy_x; + } + + const msgArgs = [ + "invalidPasswordMinLengthMessage", + `${minLength}` + ] as const; + + errors.push({ + errorMessage: this.sanitizer.bypassSecurityTrustHtml( + `${msgStr(...msgArgs)}` + ), + errorMessageStr: msgStr(...msgArgs), + fieldIndex: undefined, + source: { + type: "passwordPolicy", + name: policyName + } + }); + } + + check_password_policy_x: { + const policyName = "digits"; + + const policy = passwordPolicies[policyName]; + + if (!policy) { + break check_password_policy_x; + } + + const minNumberOfDigits = policy; + + if ( + value.split("").filter(char => !isNaN(parseInt(char))).length >= + minNumberOfDigits + ) { + break check_password_policy_x; + } + + const msgArgs = [ + "invalidPasswordMinDigitsMessage", + `${minNumberOfDigits}` + ] as const; + + errors.push({ + errorMessage: this.sanitizer.bypassSecurityTrustHtml( + `${msgStr(...msgArgs)}` + ), + errorMessageStr: msgStr(...msgArgs), + fieldIndex: undefined, + source: { + type: "passwordPolicy", + name: policyName + } + }); + } + + check_password_policy_x: { + const policyName = "lowerCase"; + + const policy = passwordPolicies[policyName]; + + if (!policy) { + break check_password_policy_x; + } + + const minNumberOfLowerCaseChar = policy; + + if ( + value + .split("") + .filter( + char => + char === char.toLowerCase() && char !== char.toUpperCase() + ).length >= minNumberOfLowerCaseChar + ) { + break check_password_policy_x; + } + + const msgArgs = [ + "invalidPasswordMinLowerCaseCharsMessage", + `${minNumberOfLowerCaseChar}` + ] as const; + + errors.push({ + errorMessage: this.sanitizer.bypassSecurityTrustHtml( + `${msgStr(...msgArgs)}` + ), + errorMessageStr: msgStr(...msgArgs), + fieldIndex: undefined, + source: { + type: "passwordPolicy", + name: policyName + } + }); + } + + check_password_policy_x: { + const policyName = "upperCase"; + + const policy = passwordPolicies[policyName]; + + if (!policy) { + break check_password_policy_x; + } + + const minNumberOfUpperCaseChar = policy; + + if ( + value + .split("") + .filter( + char => + char === char.toUpperCase() && char !== char.toLowerCase() + ).length >= minNumberOfUpperCaseChar + ) { + break check_password_policy_x; + } + + const msgArgs = [ + "invalidPasswordMinUpperCaseCharsMessage", + `${minNumberOfUpperCaseChar}` + ] as const; + + errors.push({ + errorMessage: this.sanitizer.bypassSecurityTrustHtml( + `${msgStr(...msgArgs)}` + ), + errorMessageStr: msgStr(...msgArgs), + fieldIndex: undefined, + source: { + type: "passwordPolicy", + name: policyName + } + }); + } + + check_password_policy_x: { + const policyName = "specialChars"; + + const policy = passwordPolicies[policyName]; + + if (!policy) { + break check_password_policy_x; + } + + const minNumberOfSpecialChar = policy; + + if ( + value.split("").filter(char => !char.match(/[a-zA-Z0-9]/)).length >= + minNumberOfSpecialChar + ) { + break check_password_policy_x; + } + + const msgArgs = [ + "invalidPasswordMinSpecialCharsMessage", + `${minNumberOfSpecialChar}` + ] as const; + + errors.push({ + errorMessage: this.sanitizer.bypassSecurityTrustHtml( + `${msgStr(...msgArgs)}` + ), + errorMessageStr: msgStr(...msgArgs), + fieldIndex: undefined, + source: { + type: "passwordPolicy", + name: policyName + } + }); + } + + check_password_policy_x: { + const policyName = "notUsername"; + + const notUsername = passwordPolicies[policyName]; + + if (!notUsername) { + break check_password_policy_x; + } + + const usernameFormFieldState = formFieldStates.find( + formFieldState => formFieldState.attribute.name === "username" + ); + + if (!usernameFormFieldState) { + break check_password_policy_x; + } + + const usernameValue = (() => { + let { valueOrValues } = usernameFormFieldState; + + assert(typeof valueOrValues === "string"); + + unFormat_number: { + const { kcNumberUnFormat } = attribute.html5DataAnnotations ?? {}; + + if (!kcNumberUnFormat) { + break unFormat_number; + } + + valueOrValues = formatNumber(valueOrValues, kcNumberUnFormat); + } + + return valueOrValues; + })(); + + if (usernameValue === "") { + break check_password_policy_x; + } + + if (value !== usernameValue) { + break check_password_policy_x; + } + + const msgArgs = ["invalidPasswordNotUsernameMessage"] as const; + + errors.push({ + errorMessage: this.sanitizer.bypassSecurityTrustHtml( + `${msgStr(...msgArgs)}` + ), + errorMessageStr: msgStr(...msgArgs), + fieldIndex: undefined, + source: { + type: "passwordPolicy", + name: policyName + } + }); + } + + check_password_policy_x: { + const policyName = "notEmail"; + + const notEmail = passwordPolicies[policyName]; + + if (!notEmail) { + break check_password_policy_x; + } + + const emailFormFieldState = formFieldStates.find( + formFieldState => formFieldState.attribute.name === "email" + ); + + if (!emailFormFieldState) { + break check_password_policy_x; + } + + assert(typeof emailFormFieldState.valueOrValues === "string"); + + { + const emailValue = emailFormFieldState.valueOrValues; + + if (emailValue === "") { + break check_password_policy_x; + } + + if (value !== emailValue) { + break check_password_policy_x; + } + } + + const msgArgs = ["invalidPasswordNotEmailMessage"] as const; + + errors.push({ + errorMessage: this.sanitizer.bypassSecurityTrustHtml( + `${msgStr(...msgArgs)}` + ), + errorMessageStr: msgStr(...msgArgs), + fieldIndex: undefined, + source: { + type: "passwordPolicy", + name: policyName + } + }); + } + } + + password_confirm_matches_password: { + if (attributeName !== "password-confirm") { + break password_confirm_matches_password; + } + + const passwordFormFieldState = formFieldStates.find( + formFieldState => formFieldState.attribute.name === "password" + ); + + assert(passwordFormFieldState !== undefined); + + assert(typeof passwordFormFieldState.valueOrValues === "string"); + + { + const passwordValue = passwordFormFieldState.valueOrValues; + + if (value === passwordValue) { + break password_confirm_matches_password; + } + } + + const msgArgs = ["invalidPasswordConfirmMessage"] as const; + + errors.push({ + errorMessage: this.sanitizer.bypassSecurityTrustHtml( + `${msgStr(...msgArgs)}` + ), + errorMessageStr: msgStr(...msgArgs), + fieldIndex: undefined, + source: { + type: "other", + rule: "passwordConfirmMatchesPassword" + } + }); + } + + const { validators } = attribute; + + required_field: { + if (!attribute.required) { + break required_field; + } + + if (value !== "") { + break required_field; + } + + const msgArgs = ["error-user-attribute-required"] as const; + + errors.push({ + errorMessage: this.sanitizer.bypassSecurityTrustHtml( + `${msgStr(...msgArgs)}` + ), + errorMessageStr: msgStr(...msgArgs), + fieldIndex: undefined, + source: { + type: "other", + rule: "requiredField" + } + }); + } + + validator_x: { + const validatorName = "length"; + + const validator = validators[validatorName]; + + if (!validator) { + break validator_x; + } + + const { + "ignore.empty.value": ignoreEmptyValue = false, + max, + min + } = validator; + + if (ignoreEmptyValue && value === "") { + break validator_x; + } + + const source: FormFieldError.Source = { + type: "validator", + name: validatorName + }; + + if (max && value.length > parseInt(`${max}`)) { + const msgArgs = ["error-invalid-length-too-long", `${max}`] as const; + + errors.push({ + errorMessage: this.sanitizer.bypassSecurityTrustHtml( + `${msgStr(...msgArgs)}` + ), + errorMessageStr: msgStr(...msgArgs), + fieldIndex: undefined, + source + }); + } + + if (min && value.length < parseInt(`${min}`)) { + const msgArgs = ["error-invalid-length-too-short", `${min}`] as const; + + errors.push({ + errorMessage: this.sanitizer.bypassSecurityTrustHtml( + `${msgStr(...msgArgs)}` + ), + errorMessageStr: msgStr(...msgArgs), + fieldIndex: undefined, + source + }); + } + } + + validator_x: { + const validatorName = "pattern"; + + const validator = validators[validatorName]; + + if (validator === undefined) { + break validator_x; + } + + const { + "ignore.empty.value": ignoreEmptyValue = false, + pattern, + "error-message": errorMessageKey + } = validator; + + if (ignoreEmptyValue && value === "") { + break validator_x; + } + + if (new RegExp(pattern).test(value)) { + break validator_x; + } + + const msgArgs = [ + errorMessageKey ?? id("shouldMatchPattern"), + pattern + ] as const; + + errors.push({ + errorMessage: this.sanitizer.bypassSecurityTrustHtml( + `${advancedMsgStr(...msgArgs)}` + ), + errorMessageStr: advancedMsgStr(...msgArgs), + fieldIndex: undefined, + source: { + type: "validator", + name: validatorName + } + }); + } + + validator_x: { + { + const lastError = errors[errors.length - 1]; + if ( + lastError !== undefined && + lastError.source.type === "validator" && + lastError.source.name === "pattern" + ) { + break validator_x; + } + } + + const validatorName = "email"; + + const validator = validators[validatorName]; + + if (validator === undefined) { + break validator_x; + } + + const { "ignore.empty.value": ignoreEmptyValue = false } = validator; + + if (ignoreEmptyValue && value === "") { + break validator_x; + } + + if (emailRegexp.test(value)) { + break validator_x; + } + + const msgArgs = [id("invalidEmailMessage")] as const; + + errors.push({ + errorMessage: this.sanitizer.bypassSecurityTrustHtml( + `${msgStr(...msgArgs)}` + ), + errorMessageStr: msgStr(...msgArgs), + fieldIndex: undefined, + source: { + type: "validator", + name: validatorName + } + }); + } + + validator_x: { + const validatorName = "integer"; + + const validator = validators[validatorName]; + + if (validator === undefined) { + break validator_x; + } + + const { + "ignore.empty.value": ignoreEmptyValue = false, + max, + min + } = validator; + + if (ignoreEmptyValue && value === "") { + break validator_x; + } + + const intValue = parseInt(value); + + const source: FormFieldError.Source = { + type: "validator", + name: validatorName + }; + + if (isNaN(intValue)) { + const msgArgs = ["mustBeAnInteger"] as const; + + errors.push({ + errorMessage: this.sanitizer.bypassSecurityTrustHtml( + `${msgStr(...msgArgs)}` + ), + errorMessageStr: msgStr(...msgArgs), + fieldIndex: undefined, + source + }); + + break validator_x; + } + + if (max && intValue > parseInt(`${max}`)) { + const msgArgs = ["error-number-out-of-range-too-big", `${max}`] as const; + + errors.push({ + errorMessage: this.sanitizer.bypassSecurityTrustHtml( + `${msgStr(...msgArgs)}` + ), + errorMessageStr: msgStr(...msgArgs), + fieldIndex: undefined, + source + }); + + break validator_x; + } + + if (min && intValue < parseInt(`${min}`)) { + const msgArgs = [ + "error-number-out-of-range-too-small", + `${min}` + ] as const; + + errors.push({ + errorMessage: this.sanitizer.bypassSecurityTrustHtml( + `${msgStr(...msgArgs)}` + ), + errorMessageStr: msgStr(...msgArgs), + fieldIndex: undefined, + source + }); + + break validator_x; + } + } + + validator_x: { + const validatorName = "options"; + + const validator = validators[validatorName]; + + if (validator === undefined) { + break validator_x; + } + + if (value === "") { + break validator_x; + } + + if (validator.options.indexOf(value) >= 0) { + break validator_x; + } + + const msgArgs = [id("notAValidOption")] as const; + + errors.push({ + errorMessage: this.sanitizer.bypassSecurityTrustHtml( + `${msgStr(...msgArgs)}` + ), + errorMessageStr: msgStr(...msgArgs), + fieldIndex: undefined, + source: { + type: "validator", + name: validatorName + } + }); + } + + //TODO: Implement missing validators. See Validators type definition. + + return errors; + } +} diff --git a/yarn.lock b/yarn.lock index 06dfb7bc..bc910922 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2,6 +2,13 @@ # yarn lockfile v1 +"@angular/core@^18.2.6": + version "18.2.6" + resolved "https://registry.yarnpkg.com/@angular/core/-/core-18.2.6.tgz#d6d251fae36684ce49759e41e6456c6996271f4a" + integrity sha512-PjFad2j4YBwLVTw+0Te8CJCa/tV0W8caTHG8aOjj3ObdL6ihGI+FKnwerLc9RVzDFd14BOO4C6/+LbOQAh3Ltw== + dependencies: + tslib "^2.3.0" + "@babel/code-frame@^7.0.0": version "7.24.7" resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.24.7.tgz#882fd9e09e8ee324e496bd040401c6f046ef4465" @@ -1052,7 +1059,7 @@ tsc-alias@^1.8.10: normalize-path "^3.0.0" plimit-lit "^1.2.6" -tslib@^2.1.0: +tslib@^2.1.0, tslib@^2.3.0: version "2.7.0" resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.7.0.tgz#d9b40c5c40ab59e8738f297df3087bf1a2690c01" integrity sha512-gLXCKdN1/j47AiHiOkJN69hJmcbGTHI0ImLmbYLHykhgeN0jVGola9yVjFgzCUklsZQMW55o+dW7IXv3RCXDzA== From 1c3926d86dd77049dea17b46c6c072965f61811b Mon Sep 17 00:00:00 2001 From: Joseph Garrone Date: Mon, 30 Sep 2024 00:33:28 +0200 Subject: [PATCH 03/64] No relative imports in ejectable components --- package.json | 8 +- .../keycloakify-angular.providers.ts | 8 +- src/login/DefaultPage.ts | 94 +++++++++---------- .../classes/component-reference.class.ts | 2 +- ...uttons-multi-valued-attribute.component.ts | 6 +- .../field-errors/field-errors.component.ts | 14 ++- .../group-label/group-label.component.ts | 16 ++-- .../input-field-by-type.component.ts | 17 +++- .../input-tag-selects.component.ts | 19 ++-- .../input-tag/input-tag.component.ts | 27 ++++-- .../logout-other-sessions.component.ts | 13 ++- .../password-wrapper.component.ts | 13 ++- .../select-tag/select-tag.component.ts | 21 +++-- .../textarea-tag/textarea-tag.component.ts | 19 ++-- .../user-profile-form-fields.component.ts | 18 ++-- src/login/containers/template.component.ts | 9 +- src/login/directives/kc-class.directive.ts | 2 +- src/login/pages/code/code.component.ts | 16 ++-- .../delete-account-confirm.component.ts | 16 ++-- .../delete-credential.component.ts | 16 ++-- src/login/pages/error/error.component.ts | 16 ++-- .../frontchannel-logout.component.ts | 16 ++-- .../idp-review-user-profile.component.ts | 18 ++-- src/login/pages/info/info.component.ts | 18 ++-- .../login-config-totp.component.ts | 22 +++-- ...gin-idp-link-confirm-override.component.ts | 16 ++-- .../login-idp-link-confirm.component.ts | 16 ++-- .../login-idp-link-email.component.ts | 16 ++-- .../login-oauth-grant.component.ts | 18 ++-- ...auth2-device-verify-user-code.component.ts | 16 ++-- .../pages/login-otp/login-otp.component.ts | 18 ++-- .../login-page-expired.component.ts | 14 ++- ...keys-conditional-authenticate.component.ts | 21 +++-- .../login-password.component.ts | 20 ++-- ...in-recovery-authn-code-config.component.ts | 18 ++-- ...gin-recovery-authn-code-input.component.ts | 18 ++-- .../login-reset-otp.component.ts | 16 ++-- .../login-reset-password.component.ts | 18 ++-- .../login-update-password.component.ts | 22 +++-- .../login-update-profile.component.ts | 18 ++-- .../login-username.component.ts | 18 ++-- .../login-verify-email.component.ts | 16 ++-- .../login-x509-info.component.ts | 16 ++-- src/login/pages/login/login.component.ts | 20 ++-- .../logout-confirm.component.ts | 16 ++-- .../pages/register/register.component.ts | 22 +++-- .../saml-post-form.component.ts | 14 ++- .../select-authenticator.component.ts | 18 ++-- src/login/pages/terms/terms.component.ts | 16 ++-- .../update-email/update-email.component.ts | 20 ++-- .../webauthn-authenticate.component.ts | 23 +++-- .../webauthn-error.component.ts | 18 ++-- .../webauthn-register.component.ts | 21 +++-- src/login/pipes/advanced-msg-str.pipe.ts | 4 +- src/login/pipes/msg-str.pipe.ts | 4 +- .../login-resource-injector.service.ts | 3 +- .../services/user-profile-form.service.ts | 10 +- src/tsconfig.json | 5 +- yarn.lock | 14 +++ 59 files changed, 608 insertions(+), 379 deletions(-) diff --git a/package.json b/package.json index 696937e1..224f1234 100644 --- a/package.json +++ b/package.json @@ -40,7 +40,9 @@ }, "peerDependencies": { "keycloakify": "^11.2.0", - "@angular/core": "^18.0.0" + "@angular/core": "^18.0.0", + "@angular/common": "^18.0.0", + "@angular/platform-browser": "^18.0.0" }, "devDependencies": { "keycloakify": "^11.2.0", @@ -50,6 +52,8 @@ "lint-staged": "^11.0.0", "tsc-alias": "^1.8.10", "tsx": "^4.15.5", - "@angular/core": "^18.2.6" + "@angular/core": "^18.2.6", + "@angular/common": "^18.2.6", + "@angular/platform-browser": "^18.2.6" } } diff --git a/src/lib/providers/keycloakify-angular.providers.ts b/src/lib/providers/keycloakify-angular.providers.ts index f08fa5ec..699a7c5f 100644 --- a/src/lib/providers/keycloakify-angular.providers.ts +++ b/src/lib/providers/keycloakify-angular.providers.ts @@ -17,11 +17,11 @@ export const DO_MAKE_USER_CONFIRM_PASSWORD = new InjectionToken( ); type ClassKey = - | import("keycloakify/login").ClassKey - | import("keycloakify/account").ClassKey; + | import("keycloakify/login/lib/kcClsx").ClassKey + | import("keycloakify/account/lib/kcClsx").ClassKey; type KcContextLike = - | import("keycloakify/login/i18n").KcContextLike - | import("keycloakify/account/i18n").KcContextLike; + | import("keycloakify/login/i18n/noJsx").KcContextLike + | import("keycloakify/account/i18n/noJsx").KcContextLike; type KcContext = | import("keycloakify/login/KcContext").KcContext | import("keycloakify/account/KcContext").KcContext; diff --git a/src/login/DefaultPage.ts b/src/login/DefaultPage.ts index 6b869bdf..09d7e00a 100644 --- a/src/login/DefaultPage.ts +++ b/src/login/DefaultPage.ts @@ -1,5 +1,5 @@ import { Type } from "@angular/core"; -import { ClassKey } from "keycloakify/login"; +import { ClassKey } from "keycloakify/login/lib/kcClsx"; import { KcContext } from "keycloakify/login/KcContext"; const DefaultPage = async ( @@ -16,184 +16,184 @@ const DefaultPage = async ( let ComponentBootstrapPromise; switch (pageId) { case "login.ftl": - ComponentBootstrapPromise = import("./pages/login/login.component").then( - c => c.LoginComponent - ); + ComponentBootstrapPromise = import( + "@keycloakify/angular/login/pages/login/login.component" + ).then(c => c.LoginComponent); break; case "login-username.ftl": ComponentBootstrapPromise = import( - "./pages/login-username/login-username.component" + "@keycloakify/angular/login/pages/login-username/login-username.component" ).then(c => c.LoginUsernameComponent); break; case "login-password.ftl": ComponentBootstrapPromise = import( - "./pages/login-password/login-password.component" + "@keycloakify/angular/login/pages/login-password/login-password.component" ).then(c => c.LoginPasswordComponent); break; case "webauthn-authenticate.ftl": ComponentBootstrapPromise = import( - "./pages/webauthn-authenticate/webauthn-authenticate.component" + "@keycloakify/angular/login/pages/webauthn-authenticate/webauthn-authenticate.component" ).then(c => c.WebauthnAuthenticateComponent); break; case "webauthn-register.ftl": ComponentBootstrapPromise = import( - "./pages/webauthn-register/webauthn-register.component" + "@keycloakify/angular/login/pages/webauthn-register/webauthn-register.component" ).then(c => c.WebauthnRegisterComponent); break; case "register.ftl": ComponentBootstrapPromise = import( - "./pages/register/register.component" + "@keycloakify/angular/login/pages/register/register.component" ).then(c => c.RegisterComponent); break; case "info.ftl": - ComponentBootstrapPromise = import("./pages/info/info.component").then( - c => c.InfoComponent - ); + ComponentBootstrapPromise = import( + "@keycloakify/angular/login/pages/info/info.component" + ).then(c => c.InfoComponent); break; case "error.ftl": - ComponentBootstrapPromise = import("./pages/error/error.component").then( - c => c.ErrorComponent - ); + ComponentBootstrapPromise = import( + "@keycloakify/angular/login/pages/error/error.component" + ).then(c => c.ErrorComponent); break; case "login-reset-password.ftl": ComponentBootstrapPromise = import( - "./pages/login-reset-password/login-reset-password.component" + "@keycloakify/angular/login/pages/login-reset-password/login-reset-password.component" ).then(c => c.LoginResetPasswordComponent); break; case "login-verify-email.ftl": ComponentBootstrapPromise = import( - "./pages/login-verify-email/login-verify-email.component" + "@keycloakify/angular/login/pages/login-verify-email/login-verify-email.component" ).then(c => c.LoginVerifyEmailComponent); break; case "terms.ftl": - ComponentBootstrapPromise = import("./pages/terms/terms.component").then( - c => c.TermsComponent - ); + ComponentBootstrapPromise = import( + "@keycloakify/angular/login/pages/terms/terms.component" + ).then(c => c.TermsComponent); break; case "login-oauth2-device-verify-user-code.ftl": ComponentBootstrapPromise = import( - "./pages/login-oauth2-device-verify-user-code/login-oauth2-device-verify-user-code.component" + "@keycloakify/angular/login/pages/login-oauth2-device-verify-user-code/login-oauth2-device-verify-user-code.component" ).then(c => c.LoginOauth2DeviceVerifyUserCodeComponent); break; case "login-oauth-grant.ftl": ComponentBootstrapPromise = import( - "./pages/login-oauth-grant/login-oauth-grant.component" + "@keycloakify/angular/login/pages/login-oauth-grant/login-oauth-grant.component" ).then(c => c.LoginOauthGrantComponent); break; case "login-otp.ftl": ComponentBootstrapPromise = import( - "./pages/login-otp/login-otp.component" + "@keycloakify/angular/login/pages/login-otp/login-otp.component" ).then(c => c.LoginOtpComponent); break; case "login-update-profile.ftl": ComponentBootstrapPromise = import( - "./pages/login-update-profile/login-update-profile.component" + "@keycloakify/angular/login/pages/login-update-profile/login-update-profile.component" ).then(c => c.LoginUpdateProfileComponent); break; case "login-update-password.ftl": ComponentBootstrapPromise = import( - "./pages/login-update-password/login-update-password.component" + "@keycloakify/angular/login/pages/login-update-password/login-update-password.component" ).then(c => c.LoginUpdatePasswordComponent); break; case "login-idp-link-confirm.ftl": ComponentBootstrapPromise = import( - "./pages/login-idp-link-confirm/login-idp-link-confirm.component" + "@keycloakify/angular/login/pages/login-idp-link-confirm/login-idp-link-confirm.component" ).then(c => c.LoginIdpLinkConfirmComponent); break; case "login-idp-link-email.ftl": ComponentBootstrapPromise = import( - "./pages/login-idp-link-email/login-idp-link-email.component" + "@keycloakify/angular/login/pages/login-idp-link-email/login-idp-link-email.component" ).then(c => c.LoginIdpLinkEmailComponent); break; case "login-page-expired.ftl": ComponentBootstrapPromise = import( - "./pages/login-page-expired/login-page-expired.component" + "@keycloakify/angular/login/pages/login-page-expired/login-page-expired.component" ).then(c => c.LoginPageExpiredComponent); break; case "login-config-totp.ftl": ComponentBootstrapPromise = import( - "./pages/login-config-totp/login-config-totp.component" + "@keycloakify/angular/login/pages/login-config-totp/login-config-totp.component" ).then(c => c.LoginConfigTotpComponent); break; case "logout-confirm.ftl": ComponentBootstrapPromise = import( - "./pages/logout-confirm/logout-confirm.component" + "@keycloakify/angular/login/pages/logout-confirm/logout-confirm.component" ).then(c => c.LogoutConfirmComponent); break; case "idp-review-user-profile.ftl": ComponentBootstrapPromise = import( - "./pages/idp-review-user-profile/idp-review-user-profile.component" + "@keycloakify/angular/login/pages/idp-review-user-profile/idp-review-user-profile.component" ).then(c => c.IdpReviewUserProfileComponent); break; case "update-email.ftl": ComponentBootstrapPromise = import( - "./pages/update-email/update-email.component" + "@keycloakify/angular/login/pages/update-email/update-email.component" ).then(c => c.UpdateEmailComponent); break; case "select-authenticator.ftl": ComponentBootstrapPromise = import( - "./pages/select-authenticator/select-authenticator.component" + "@keycloakify/angular/login/pages/select-authenticator/select-authenticator.component" ).then(c => c.SelectAuthenticatorComponent); break; case "saml-post-form.ftl": ComponentBootstrapPromise = import( - "./pages/saml-post-form/saml-post-form.component" + "@keycloakify/angular/login/pages/saml-post-form/saml-post-form.component" ).then(c => c.SamlPostFormComponent); break; case "delete-credential.ftl": ComponentBootstrapPromise = import( - "./pages/delete-credential/delete-credential.component" + "@keycloakify/angular/login/pages/delete-credential/delete-credential.component" ).then(c => c.DeleteCredentialComponent); break; case "code.ftl": - ComponentBootstrapPromise = import("./pages/code/code.component").then( - c => c.CodeComponent - ); + ComponentBootstrapPromise = import( + "@keycloakify/angular/login/pages/code/code.component" + ).then(c => c.CodeComponent); break; case "delete-account-confirm.ftl": ComponentBootstrapPromise = import( - "./pages/delete-account-confirm/delete-account-confirm.component" + "@keycloakify/angular/login/pages/delete-account-confirm/delete-account-confirm.component" ).then(c => c.DeleteAccountConfirmComponent); break; case "frontchannel-logout.ftl": ComponentBootstrapPromise = import( - "./pages/frontchannel-logout/frontchannel-logout.component" + "@keycloakify/angular/login/pages/frontchannel-logout/frontchannel-logout.component" ).then(c => c.FrontchannelLogoutComponent); break; case "login-recovery-authn-code-config.ftl": ComponentBootstrapPromise = import( - "./pages/login-recovery-authn-code-config/login-recovery-authn-code-config.component" + "@keycloakify/angular/login/pages/login-recovery-authn-code-config/login-recovery-authn-code-config.component" ).then(c => c.LoginRecoveryAuthnCodeConfigComponent); break; case "login-recovery-authn-code-input.ftl": ComponentBootstrapPromise = import( - "./pages/login-recovery-authn-code-input/login-recovery-authn-code-input.component" + "@keycloakify/angular/login/pages/login-recovery-authn-code-input/login-recovery-authn-code-input.component" ).then(c => c.LoginRecoveryAuthnCodeInputComponent); break; case "login-reset-otp.ftl": ComponentBootstrapPromise = import( - "./pages/login-reset-otp/login-reset-otp.component" + "@keycloakify/angular/login/pages/login-reset-otp/login-reset-otp.component" ).then(c => c.LoginResetOtpComponent); break; case "login-x509-info.ftl": ComponentBootstrapPromise = import( - "./pages/login-x509-info/login-x509-info.component" + "@keycloakify/angular/login/pages/login-x509-info/login-x509-info.component" ).then(c => c.LoginX509InfoComponent); break; case "webauthn-error.ftl": ComponentBootstrapPromise = import( - "./pages/webauthn-error/webauthn-error.component" + "@keycloakify/angular/login/pages/webauthn-error/webauthn-error.component" ).then(c => c.WebauthnErrorComponent); break; case "login-passkeys-conditional-authenticate.ftl": ComponentBootstrapPromise = import( - "./pages/login-passkeys-conditional-authenticate/login-passkeys-conditional-authenticate.component" + "@keycloakify/angular/login/pages/login-passkeys-conditional-authenticate/login-passkeys-conditional-authenticate.component" ).then(c => c.LoginPasskeysConditionalAuthenticateComponent); break; case "login-idp-link-confirm-override.ftl": ComponentBootstrapPromise = import( - "./pages/login-idp-link-confirm-override/login-idp-link-confirm-override.component" + "@keycloakify/angular/login/pages/login-idp-link-confirm-override/login-idp-link-confirm-override.component" ).then(c => c.LoginIdpLinkConfirmOverrideComponent); break; } diff --git a/src/login/classes/component-reference.class.ts b/src/login/classes/component-reference.class.ts index bcc6fc9c..453cc8c8 100644 --- a/src/login/classes/component-reference.class.ts +++ b/src/login/classes/component-reference.class.ts @@ -1,4 +1,4 @@ -import { ClassKey } from "keycloakify/login"; +import { ClassKey } from "keycloakify/login/lib/kcClsx"; export abstract class ComponentReference { doUseDefaultCss: boolean | undefined; classes: Partial> | undefined; diff --git a/src/login/components/add-remove-buttons-multi-valued-attribute/add-remove-buttons-multi-valued-attribute.component.ts b/src/login/components/add-remove-buttons-multi-valued-attribute/add-remove-buttons-multi-valued-attribute.component.ts index ae489d69..1b1127fb 100644 --- a/src/login/components/add-remove-buttons-multi-valued-attribute/add-remove-buttons-multi-valued-attribute.component.ts +++ b/src/login/components/add-remove-buttons-multi-valued-attribute/add-remove-buttons-multi-valued-attribute.component.ts @@ -5,9 +5,9 @@ import { input, output } from "@angular/core"; -import { Attribute } from "keycloakify/login"; -import { MsgStrPipe } from "../../pipes/msg-str.pipe"; -import { FormAction } from "../../services/user-profile-form.service"; +import { Attribute } from "keycloakify/login/KcContext"; +import { MsgStrPipe } from "@keycloakify/angular/login/pipes/msg-str.pipe"; +import { FormAction } from "@keycloakify/angular/login/services/user-profile-form.service"; @Component({ standalone: true, diff --git a/src/login/components/field-errors/field-errors.component.ts b/src/login/components/field-errors/field-errors.component.ts index 71dd52d4..9d21d907 100644 --- a/src/login/components/field-errors/field-errors.component.ts +++ b/src/login/components/field-errors/field-errors.component.ts @@ -5,11 +5,15 @@ import { inject, input } from "@angular/core"; -import { CLASSES, USE_DEFAULT_CSS } from "keycloakify-angular"; -import { Attribute, ClassKey } from "keycloakify/login"; -import { ComponentReference } from "../../classes/component-reference.class"; -import { KcClassDirective } from "../../directives/kc-class.directive"; -import { FormFieldError } from "../../services/user-profile-form.service"; +import { + CLASSES, + USE_DEFAULT_CSS +} from "@keycloakify/angular/lib/providers/keycloakify-angular.providers"; +import { Attribute } from "keycloakify/login/KcContext"; +import { ClassKey } from "keycloakify/login/lib/kcClsx"; +import { ComponentReference } from "@keycloakify/angular/login/classes/component-reference.class"; +import { KcClassDirective } from "@keycloakify/angular/login/directives/kc-class.directive"; +import { FormFieldError } from "@keycloakify/angular/login/services/user-profile-form.service"; @Component({ standalone: true, diff --git a/src/login/components/group-label/group-label.component.ts b/src/login/components/group-label/group-label.component.ts index 39a78f48..e88d3979 100644 --- a/src/login/components/group-label/group-label.component.ts +++ b/src/login/components/group-label/group-label.component.ts @@ -6,12 +6,16 @@ import { inject, input } from "@angular/core"; -import { CLASSES, USE_DEFAULT_CSS } from "keycloakify-angular"; -import { Attribute, ClassKey } from "keycloakify/login"; -import { ComponentReference } from "../../classes/component-reference.class"; -import { AttributesDirective } from "../../directives/attributes.directive"; -import { KcClassDirective } from "../../directives/kc-class.directive"; -import { AdvancedMsgStrPipe } from "../../pipes/advanced-msg-str.pipe"; +import { + CLASSES, + USE_DEFAULT_CSS +} from "@keycloakify/angular/lib/providers/keycloakify-angular.providers"; +import { Attribute } from "keycloakify/login/KcContext"; +import { ClassKey } from "keycloakify/login/lib/kcClsx"; +import { ComponentReference } from "@keycloakify/angular/login/classes/component-reference.class"; +import { AttributesDirective } from "@keycloakify/angular/login/directives/attributes.directive"; +import { KcClassDirective } from "@keycloakify/angular/login/directives/kc-class.directive"; +import { AdvancedMsgStrPipe } from "@keycloakify/angular/login/pipes/advanced-msg-str.pipe"; @Component({ standalone: true, diff --git a/src/login/components/input-field-by-type/input-field-by-type.component.ts b/src/login/components/input-field-by-type/input-field-by-type.component.ts index b7d868a5..b2bdadbd 100644 --- a/src/login/components/input-field-by-type/input-field-by-type.component.ts +++ b/src/login/components/input-field-by-type/input-field-by-type.component.ts @@ -7,11 +7,18 @@ import { input, output } from "@angular/core"; -import { CLASSES, USE_DEFAULT_CSS } from "keycloakify-angular"; -import { Attribute, ClassKey } from "keycloakify/login"; -import { ComponentReference } from "../../classes/component-reference.class"; -import { ToArrayPipe } from "../../pipes/to-array.pipe"; -import { FormAction, FormFieldError } from "../../services/user-profile-form.service"; +import { + CLASSES, + USE_DEFAULT_CSS +} from "@keycloakify/angular/lib/providers/keycloakify-angular.providers"; +import { Attribute } from "keycloakify/login/KcContext"; +import { ClassKey } from "keycloakify/login/lib/kcClsx"; +import { ComponentReference } from "@keycloakify/angular/login/classes/component-reference.class"; +import { ToArrayPipe } from "@keycloakify/angular/login/pipes/to-array.pipe"; +import { + FormAction, + FormFieldError +} from "@keycloakify/angular/login/services/user-profile-form.service"; import { InputTagSelectsComponent } from "../input-tag-selects/input-tag-selects.component"; import { InputTagComponent } from "../input-tag/input-tag.component"; import { PasswordWrapperComponent } from "../password-wrapper/password-wrapper.component"; diff --git a/src/login/components/input-tag-selects/input-tag-selects.component.ts b/src/login/components/input-tag-selects/input-tag-selects.component.ts index 961b848d..6da7c224 100644 --- a/src/login/components/input-tag-selects/input-tag-selects.component.ts +++ b/src/login/components/input-tag-selects/input-tag-selects.component.ts @@ -8,12 +8,19 @@ import { output, Signal } from "@angular/core"; -import { CLASSES, USE_DEFAULT_CSS } from "keycloakify-angular"; -import { Attribute, ClassKey } from "keycloakify/login"; -import { ComponentReference } from "../../classes/component-reference.class"; -import { KcClassDirective } from "../../directives/kc-class.directive"; -import { AdvancedMsgStrPipe } from "../../pipes/advanced-msg-str.pipe"; -import { FormAction, FormFieldError } from "../../services/user-profile-form.service"; +import { + CLASSES, + USE_DEFAULT_CSS +} from "@keycloakify/angular/lib/providers/keycloakify-angular.providers"; +import { Attribute } from "keycloakify/login/KcContext"; +import { ClassKey } from "keycloakify/login/lib/kcClsx"; +import { ComponentReference } from "@keycloakify/angular/login/classes/component-reference.class"; +import { KcClassDirective } from "@keycloakify/angular/login/directives/kc-class.directive"; +import { AdvancedMsgStrPipe } from "@keycloakify/angular/login/pipes/advanced-msg-str.pipe"; +import { + FormAction, + FormFieldError +} from "@keycloakify/angular/login/services/user-profile-form.service"; @Component({ standalone: true, diff --git a/src/login/components/input-tag/input-tag.component.ts b/src/login/components/input-tag/input-tag.component.ts index 412184b2..7eb94420 100644 --- a/src/login/components/input-tag/input-tag.component.ts +++ b/src/login/components/input-tag/input-tag.component.ts @@ -7,16 +7,23 @@ import { input, output } from "@angular/core"; -import { CLASSES, USE_DEFAULT_CSS } from "keycloakify-angular"; -import { Attribute, ClassKey } from "keycloakify/login"; -import { ComponentReference } from "../../classes/component-reference.class"; -import { AttributesDirective } from "../../directives/attributes.directive"; -import { KcClassDirective } from "../../directives/kc-class.directive"; -import { AdvancedMsgStrPipe } from "../../pipes/advanced-msg-str.pipe"; -import { InputTypePipe } from "../../pipes/input-type.pipe"; -import { ToArrayPipe } from "../../pipes/to-array.pipe"; -import { ToNumberPipe } from "../../pipes/to-number.pipe"; -import { FormAction, FormFieldError } from "../../services/user-profile-form.service"; +import { + CLASSES, + USE_DEFAULT_CSS +} from "@keycloakify/angular/lib/providers/keycloakify-angular.providers"; +import { Attribute } from "keycloakify/login/KcContext"; +import { ClassKey } from "keycloakify/login/lib/kcClsx"; +import { ComponentReference } from "@keycloakify/angular/login/classes/component-reference.class"; +import { AttributesDirective } from "@keycloakify/angular/login/directives/attributes.directive"; +import { KcClassDirective } from "@keycloakify/angular/login/directives/kc-class.directive"; +import { AdvancedMsgStrPipe } from "@keycloakify/angular/login/pipes/advanced-msg-str.pipe"; +import { InputTypePipe } from "@keycloakify/angular/login/pipes/input-type.pipe"; +import { ToArrayPipe } from "@keycloakify/angular/login/pipes/to-array.pipe"; +import { ToNumberPipe } from "@keycloakify/angular/login/pipes/to-number.pipe"; +import { + FormAction, + FormFieldError +} from "@keycloakify/angular/login/services/user-profile-form.service"; import { AddRemoveButtonsMultiValuedAttributeComponent } from "../add-remove-buttons-multi-valued-attribute/add-remove-buttons-multi-valued-attribute.component"; import { FieldErrorsComponent } from "../field-errors/field-errors.component"; diff --git a/src/login/components/logout-other-sessions/logout-other-sessions.component.ts b/src/login/components/logout-other-sessions/logout-other-sessions.component.ts index a34ecd02..841bc9b0 100644 --- a/src/login/components/logout-other-sessions/logout-other-sessions.component.ts +++ b/src/login/components/logout-other-sessions/logout-other-sessions.component.ts @@ -1,9 +1,12 @@ import { ChangeDetectionStrategy, Component, forwardRef, inject } from "@angular/core"; -import { CLASSES, USE_DEFAULT_CSS } from "keycloakify-angular"; -import { ClassKey } from "keycloakify/login"; -import { ComponentReference } from "../../classes/component-reference.class"; -import { KcClassDirective } from "../../directives/kc-class.directive"; -import { MsgStrPipe } from "../../pipes/msg-str.pipe"; +import { + CLASSES, + USE_DEFAULT_CSS +} from "@keycloakify/angular/lib/providers/keycloakify-angular.providers"; +import { ClassKey } from "keycloakify/login/lib/kcClsx"; +import { ComponentReference } from "@keycloakify/angular/login/classes/component-reference.class"; +import { KcClassDirective } from "@keycloakify/angular/login/directives/kc-class.directive"; +import { MsgStrPipe } from "@keycloakify/angular/login/pipes/msg-str.pipe"; @Component({ selector: "kc-logout-other-sessions", diff --git a/src/login/components/password-wrapper/password-wrapper.component.ts b/src/login/components/password-wrapper/password-wrapper.component.ts index 687dca93..f41e1770 100644 --- a/src/login/components/password-wrapper/password-wrapper.component.ts +++ b/src/login/components/password-wrapper/password-wrapper.component.ts @@ -9,11 +9,14 @@ import { signal, WritableSignal } from "@angular/core"; -import { CLASSES, USE_DEFAULT_CSS } from "keycloakify-angular"; -import { ClassKey } from "keycloakify/login"; -import { ComponentReference } from "../../classes/component-reference.class"; -import { KcClassDirective } from "../../directives/kc-class.directive"; -import { MsgStrPipe } from "../../pipes/msg-str.pipe"; +import { + CLASSES, + USE_DEFAULT_CSS +} from "@keycloakify/angular/lib/providers/keycloakify-angular.providers"; +import { ClassKey } from "keycloakify/login/lib/kcClsx"; +import { ComponentReference } from "@keycloakify/angular/login/classes/component-reference.class"; +import { KcClassDirective } from "@keycloakify/angular/login/directives/kc-class.directive"; +import { MsgStrPipe } from "@keycloakify/angular/login/pipes/msg-str.pipe"; @Component({ selector: "kc-password-wrapper", diff --git a/src/login/components/select-tag/select-tag.component.ts b/src/login/components/select-tag/select-tag.component.ts index e8575e50..b07cd5a4 100644 --- a/src/login/components/select-tag/select-tag.component.ts +++ b/src/login/components/select-tag/select-tag.component.ts @@ -7,13 +7,20 @@ import { input, output } from "@angular/core"; -import { CLASSES, USE_DEFAULT_CSS } from "keycloakify-angular"; -import { Attribute, ClassKey } from "keycloakify/login"; -import { ComponentReference } from "../../classes/component-reference.class"; -import { KcClassDirective } from "../../directives/kc-class.directive"; -import { AdvancedMsgStrPipe } from "../../pipes/advanced-msg-str.pipe"; -import { ToNumberPipe } from "../../pipes/to-number.pipe"; -import { FormAction, FormFieldError } from "../../services/user-profile-form.service"; +import { + CLASSES, + USE_DEFAULT_CSS +} from "@keycloakify/angular/lib/providers/keycloakify-angular.providers"; +import { Attribute } from "keycloakify/login/KcContext"; +import { ClassKey } from "keycloakify/login/lib/kcClsx"; +import { ComponentReference } from "@keycloakify/angular/login/classes/component-reference.class"; +import { KcClassDirective } from "@keycloakify/angular/login/directives/kc-class.directive"; +import { AdvancedMsgStrPipe } from "@keycloakify/angular/login/pipes/advanced-msg-str.pipe"; +import { ToNumberPipe } from "@keycloakify/angular/login/pipes/to-number.pipe"; +import { + FormAction, + FormFieldError +} from "@keycloakify/angular/login/services/user-profile-form.service"; @Component({ standalone: true, diff --git a/src/login/components/textarea-tag/textarea-tag.component.ts b/src/login/components/textarea-tag/textarea-tag.component.ts index 49ecd994..99f73232 100644 --- a/src/login/components/textarea-tag/textarea-tag.component.ts +++ b/src/login/components/textarea-tag/textarea-tag.component.ts @@ -6,12 +6,19 @@ import { input, output } from "@angular/core"; -import { CLASSES, USE_DEFAULT_CSS } from "keycloakify-angular"; -import { Attribute, ClassKey } from "keycloakify/login"; -import { ComponentReference } from "../../classes/component-reference.class"; -import { KcClassDirective } from "../../directives/kc-class.directive"; -import { ToNumberPipe } from "../../pipes/to-number.pipe"; -import { FormAction, FormFieldError } from "../../services/user-profile-form.service"; +import { + CLASSES, + USE_DEFAULT_CSS +} from "@keycloakify/angular/lib/providers/keycloakify-angular.providers"; +import { Attribute } from "keycloakify/login/KcContext"; +import { ClassKey } from "keycloakify/login/lib/kcClsx"; +import { ComponentReference } from "@keycloakify/angular/login/classes/component-reference.class"; +import { KcClassDirective } from "@keycloakify/angular/login/directives/kc-class.directive"; +import { ToNumberPipe } from "@keycloakify/angular/login/pipes/to-number.pipe"; +import { + FormAction, + FormFieldError +} from "@keycloakify/angular/login/services/user-profile-form.service"; @Component({ standalone: true, diff --git a/src/login/components/user-profile-form-fields/user-profile-form-fields.component.ts b/src/login/components/user-profile-form-fields/user-profile-form-fields.component.ts index 9215af29..32b65de1 100644 --- a/src/login/components/user-profile-form-fields/user-profile-form-fields.component.ts +++ b/src/login/components/user-profile-form-fields/user-profile-form-fields.component.ts @@ -9,20 +9,24 @@ import { output, TemplateRef } from "@angular/core"; -import { DO_MAKE_USER_CONFIRM_PASSWORD, KC_CONTEXT } from "keycloakify-angular"; -import { ClassKey } from "keycloakify/login"; +import { + DO_MAKE_USER_CONFIRM_PASSWORD, + KC_CONTEXT, + CLASSES, + USE_DEFAULT_CSS +} from "@keycloakify/angular/lib/providers/keycloakify-angular.providers"; +import { ClassKey } from "keycloakify/login/lib/kcClsx"; import { KcContext } from "keycloakify/login/KcContext"; -import { ComponentReference } from "../../classes/component-reference.class"; -import { KcClassDirective } from "../../directives/kc-class.directive"; -import { AdvancedMsgStrPipe } from "../../pipes/advanced-msg-str.pipe"; +import { ComponentReference } from "@keycloakify/angular/login/classes/component-reference.class"; +import { KcClassDirective } from "@keycloakify/angular/login/directives/kc-class.directive"; +import { AdvancedMsgStrPipe } from "@keycloakify/angular/login/pipes/advanced-msg-str.pipe"; import { FormAction, UserProfileFormService -} from "../../services/user-profile-form.service"; +} from "@keycloakify/angular/login/services/user-profile-form.service"; import { FieldErrorsComponent } from "../field-errors/field-errors.component"; import { GroupLabelComponent } from "../group-label/group-label.component"; import { InputFieldByTypeComponent } from "../input-field-by-type/input-field-by-type.component"; -import { CLASSES, USE_DEFAULT_CSS } from "keycloakify-angular"; @Component({ standalone: true, diff --git a/src/login/containers/template.component.ts b/src/login/containers/template.component.ts index 834ec292..ebcda00b 100644 --- a/src/login/containers/template.component.ts +++ b/src/login/containers/template.component.ts @@ -9,8 +9,13 @@ import { Renderer2 } from "@angular/core"; import { Meta, Title } from "@angular/platform-browser"; -import { CLASSES, I18N, KC_CONTEXT, USE_DEFAULT_CSS } from "keycloakify-angular"; -import { I18n } from "keycloakify/login/i18n"; +import { + CLASSES, + I18N, + KC_CONTEXT, + USE_DEFAULT_CSS +} from "@keycloakify/angular/lib/providers/keycloakify-angular.providers"; +import type { I18n } from "../i18n"; import { KcContext } from "keycloakify/login/KcContext/KcContext"; import { ClassKey, getKcClsx } from "keycloakify/login/lib/kcClsx"; import { Observable } from "rxjs"; diff --git a/src/login/directives/kc-class.directive.ts b/src/login/directives/kc-class.directive.ts index 94000bcd..80e92da4 100644 --- a/src/login/directives/kc-class.directive.ts +++ b/src/login/directives/kc-class.directive.ts @@ -10,7 +10,7 @@ import { Renderer2, ɵstringify as stringify } from "@angular/core"; -import { ClassKey } from "keycloakify/login"; +import { ClassKey } from "keycloakify/login/lib/kcClsx"; import { getKcClsx } from "keycloakify/login/lib/kcClsx"; import { ComponentReference } from "../classes/component-reference.class"; diff --git a/src/login/pages/code/code.component.ts b/src/login/pages/code/code.component.ts index b6517f28..4c2ae8a6 100644 --- a/src/login/pages/code/code.component.ts +++ b/src/login/pages/code/code.component.ts @@ -1,11 +1,15 @@ import { ChangeDetectionStrategy, Component, forwardRef, inject } from "@angular/core"; -import { CLASSES, KC_CONTEXT, USE_DEFAULT_CSS } from "keycloakify-angular"; -import { ClassKey } from "keycloakify/login"; +import { + CLASSES, + KC_CONTEXT, + USE_DEFAULT_CSS +} from "@keycloakify/angular/lib/providers/keycloakify-angular.providers"; +import { ClassKey } from "keycloakify/login/lib/kcClsx"; import { KcContext } from "keycloakify/login/KcContext"; -import { ComponentReference } from "../../classes/component-reference.class"; -import { TemplateComponent } from "../../containers/template.component"; -import { KcClassDirective } from "../../directives/kc-class.directive"; -import { MsgStrPipe } from "../../pipes/msg-str.pipe"; +import { ComponentReference } from "@keycloakify/angular/login/classes/component-reference.class"; +import { TemplateComponent } from "@keycloakify/angular/login/containers/template.component"; +import { KcClassDirective } from "@keycloakify/angular/login/directives/kc-class.directive"; +import { MsgStrPipe } from "@keycloakify/angular/login/pipes/msg-str.pipe"; @Component({ standalone: true, diff --git a/src/login/pages/delete-account-confirm/delete-account-confirm.component.ts b/src/login/pages/delete-account-confirm/delete-account-confirm.component.ts index 0b43cad5..d5c5471c 100644 --- a/src/login/pages/delete-account-confirm/delete-account-confirm.component.ts +++ b/src/login/pages/delete-account-confirm/delete-account-confirm.component.ts @@ -1,11 +1,15 @@ import { ChangeDetectionStrategy, Component, forwardRef, inject } from "@angular/core"; -import { CLASSES, KC_CONTEXT, USE_DEFAULT_CSS } from "keycloakify-angular"; -import { ClassKey } from "keycloakify/login"; +import { + CLASSES, + KC_CONTEXT, + USE_DEFAULT_CSS +} from "@keycloakify/angular/lib/providers/keycloakify-angular.providers"; +import { ClassKey } from "keycloakify/login/lib/kcClsx"; import { KcContext } from "keycloakify/login/KcContext"; -import { ComponentReference } from "../../classes/component-reference.class"; -import { TemplateComponent } from "../../containers/template.component"; -import { KcClassDirective } from "../../directives"; -import { MsgStrPipe } from "../../pipes/msg-str.pipe"; +import { ComponentReference } from "@keycloakify/angular/login/classes/component-reference.class"; +import { TemplateComponent } from "@keycloakify/angular/login/containers/template.component"; +import { KcClassDirective } from "@keycloakify/angular/login/directives"; +import { MsgStrPipe } from "@keycloakify/angular/login/pipes/msg-str.pipe"; @Component({ standalone: true, diff --git a/src/login/pages/delete-credential/delete-credential.component.ts b/src/login/pages/delete-credential/delete-credential.component.ts index 5fc12a17..88db5c45 100644 --- a/src/login/pages/delete-credential/delete-credential.component.ts +++ b/src/login/pages/delete-credential/delete-credential.component.ts @@ -5,13 +5,17 @@ import { inject, input } from "@angular/core"; -import { CLASSES, KC_CONTEXT, USE_DEFAULT_CSS } from "keycloakify-angular"; -import { ClassKey } from "keycloakify/login"; +import { + CLASSES, + KC_CONTEXT, + USE_DEFAULT_CSS +} from "@keycloakify/angular/lib/providers/keycloakify-angular.providers"; +import { ClassKey } from "keycloakify/login/lib/kcClsx"; import { KcContext } from "keycloakify/login/KcContext"; -import { ComponentReference } from "../../classes/component-reference.class"; -import { TemplateComponent } from "../../containers/template.component"; -import { KcClassDirective } from "../../directives/kc-class.directive"; -import { MsgStrPipe } from "../../pipes/msg-str.pipe"; +import { ComponentReference } from "@keycloakify/angular/login/classes/component-reference.class"; +import { TemplateComponent } from "@keycloakify/angular/login/containers/template.component"; +import { KcClassDirective } from "@keycloakify/angular/login/directives/kc-class.directive"; +import { MsgStrPipe } from "@keycloakify/angular/login/pipes/msg-str.pipe"; @Component({ standalone: true, diff --git a/src/login/pages/error/error.component.ts b/src/login/pages/error/error.component.ts index b147f5f0..91984b5c 100644 --- a/src/login/pages/error/error.component.ts +++ b/src/login/pages/error/error.component.ts @@ -1,11 +1,15 @@ import { ChangeDetectionStrategy, Component, forwardRef, inject } from "@angular/core"; -import { CLASSES, KC_CONTEXT, USE_DEFAULT_CSS } from "keycloakify-angular"; -import { ClassKey } from "keycloakify/login"; +import { + CLASSES, + KC_CONTEXT, + USE_DEFAULT_CSS +} from "@keycloakify/angular/lib/providers/keycloakify-angular.providers"; +import { ClassKey } from "keycloakify/login/lib/kcClsx"; import { KcContext } from "keycloakify/login/KcContext"; -import { ComponentReference } from "../../classes/component-reference.class"; -import { TemplateComponent } from "../../containers/template.component"; -import { KcSanitizePipe } from "../../pipes/kc-sanitize.pipe"; -import { MsgStrPipe } from "../../pipes/msg-str.pipe"; +import { ComponentReference } from "@keycloakify/angular/login/classes/component-reference.class"; +import { TemplateComponent } from "@keycloakify/angular/login/containers/template.component"; +import { KcSanitizePipe } from "@keycloakify/angular/login/pipes/kc-sanitize.pipe"; +import { MsgStrPipe } from "@keycloakify/angular/login/pipes/msg-str.pipe"; @Component({ standalone: true, diff --git a/src/login/pages/frontchannel-logout/frontchannel-logout.component.ts b/src/login/pages/frontchannel-logout/frontchannel-logout.component.ts index cf275103..72b56c34 100644 --- a/src/login/pages/frontchannel-logout/frontchannel-logout.component.ts +++ b/src/login/pages/frontchannel-logout/frontchannel-logout.component.ts @@ -6,13 +6,17 @@ import { input, OnInit } from "@angular/core"; -import { CLASSES, KC_CONTEXT, USE_DEFAULT_CSS } from "keycloakify-angular"; -import { ClassKey } from "keycloakify/login"; +import { + CLASSES, + KC_CONTEXT, + USE_DEFAULT_CSS +} from "@keycloakify/angular/lib/providers/keycloakify-angular.providers"; +import { ClassKey } from "keycloakify/login/lib/kcClsx"; import { KcContext } from "keycloakify/login/KcContext"; -import { ComponentReference } from "../../classes/component-reference.class"; -import { TemplateComponent } from "../../containers/template.component"; -import { KcSanitizePipe } from "../../pipes/kc-sanitize.pipe"; -import { MsgStrPipe } from "../../pipes/msg-str.pipe"; +import { ComponentReference } from "@keycloakify/angular/login/classes/component-reference.class"; +import { TemplateComponent } from "@keycloakify/angular/login/containers/template.component"; +import { KcSanitizePipe } from "@keycloakify/angular/login/pipes/kc-sanitize.pipe"; +import { MsgStrPipe } from "@keycloakify/angular/login/pipes/msg-str.pipe"; @Component({ standalone: true, diff --git a/src/login/pages/idp-review-user-profile/idp-review-user-profile.component.ts b/src/login/pages/idp-review-user-profile/idp-review-user-profile.component.ts index 7fde8966..f1ac56ce 100644 --- a/src/login/pages/idp-review-user-profile/idp-review-user-profile.component.ts +++ b/src/login/pages/idp-review-user-profile/idp-review-user-profile.component.ts @@ -6,14 +6,18 @@ import { input, signal } from "@angular/core"; -import { CLASSES, KC_CONTEXT, USE_DEFAULT_CSS } from "keycloakify-angular"; -import { ClassKey } from "keycloakify/login"; +import { + CLASSES, + KC_CONTEXT, + USE_DEFAULT_CSS +} from "@keycloakify/angular/lib/providers/keycloakify-angular.providers"; +import { ClassKey } from "keycloakify/login/lib/kcClsx"; import { KcContext } from "keycloakify/login/KcContext"; -import { ComponentReference } from "../../classes/component-reference.class"; -import { UserProfileFormFieldsComponent } from "../../components/user-profile-form-fields/user-profile-form-fields.component"; -import { TemplateComponent } from "../../containers/template.component"; -import { KcClassDirective } from "../../directives/kc-class.directive"; -import { MsgStrPipe } from "../../pipes/msg-str.pipe"; +import { ComponentReference } from "@keycloakify/angular/login/classes/component-reference.class"; +import { UserProfileFormFieldsComponent } from "@keycloakify/angular/login/components/user-profile-form-fields/user-profile-form-fields.component"; +import { TemplateComponent } from "@keycloakify/angular/login/containers/template.component"; +import { KcClassDirective } from "@keycloakify/angular/login/directives/kc-class.directive"; +import { MsgStrPipe } from "@keycloakify/angular/login/pipes/msg-str.pipe"; @Component({ standalone: true, diff --git a/src/login/pages/info/info.component.ts b/src/login/pages/info/info.component.ts index b7fdd40e..f03dce0d 100644 --- a/src/login/pages/info/info.component.ts +++ b/src/login/pages/info/info.component.ts @@ -5,14 +5,18 @@ import { inject, input } from "@angular/core"; -import { CLASSES, KC_CONTEXT, USE_DEFAULT_CSS } from "keycloakify-angular"; -import { ClassKey } from "keycloakify/login"; +import { + CLASSES, + KC_CONTEXT, + USE_DEFAULT_CSS +} from "@keycloakify/angular/lib/providers/keycloakify-angular.providers"; +import { ClassKey } from "keycloakify/login/lib/kcClsx"; import { KcContext } from "keycloakify/login/KcContext"; -import { ComponentReference } from "../../classes/component-reference.class"; -import { TemplateComponent } from "../../containers/template.component"; -import { AdvancedMsgStrPipe } from "../../pipes/advanced-msg-str.pipe"; -import { KcSanitizePipe } from "../../pipes/kc-sanitize.pipe"; -import { MsgStrPipe } from "../../pipes/msg-str.pipe"; +import { ComponentReference } from "@keycloakify/angular/login/classes/component-reference.class"; +import { TemplateComponent } from "@keycloakify/angular/login/containers/template.component"; +import { AdvancedMsgStrPipe } from "@keycloakify/angular/login/pipes/advanced-msg-str.pipe"; +import { KcSanitizePipe } from "@keycloakify/angular/login/pipes/kc-sanitize.pipe"; +import { MsgStrPipe } from "@keycloakify/angular/login/pipes/msg-str.pipe"; @Component({ standalone: true, diff --git a/src/login/pages/login-config-totp/login-config-totp.component.ts b/src/login/pages/login-config-totp/login-config-totp.component.ts index 224dd285..ae43f5bd 100644 --- a/src/login/pages/login-config-totp/login-config-totp.component.ts +++ b/src/login/pages/login-config-totp/login-config-totp.component.ts @@ -5,16 +5,20 @@ import { inject, input } from "@angular/core"; -import { CLASSES, KC_CONTEXT, USE_DEFAULT_CSS } from "keycloakify-angular"; -import { ClassKey } from "keycloakify/login"; +import { + CLASSES, + KC_CONTEXT, + USE_DEFAULT_CSS +} from "@keycloakify/angular/lib/providers/keycloakify-angular.providers"; +import { ClassKey } from "keycloakify/login/lib/kcClsx"; import { KcContext } from "keycloakify/login/KcContext"; -import { ComponentReference } from "../../classes/component-reference.class"; -import { LogoutOtherSessionsComponent } from "../../components/logout-other-sessions/logout-other-sessions.component"; -import { TemplateComponent } from "../../containers/template.component"; -import { KcClassDirective } from "../../directives/kc-class.directive"; -import { AdvancedMsgStrPipe } from "../../pipes/advanced-msg-str.pipe"; -import { KcSanitizePipe } from "../../pipes/kc-sanitize.pipe"; -import { MsgStrPipe } from "../../pipes/msg-str.pipe"; +import { ComponentReference } from "@keycloakify/angular/login/classes/component-reference.class"; +import { LogoutOtherSessionsComponent } from "@keycloakify/angular/login/components/logout-other-sessions/logout-other-sessions.component"; +import { TemplateComponent } from "@keycloakify/angular/login/containers/template.component"; +import { KcClassDirective } from "@keycloakify/angular/login/directives/kc-class.directive"; +import { AdvancedMsgStrPipe } from "@keycloakify/angular/login/pipes/advanced-msg-str.pipe"; +import { KcSanitizePipe } from "@keycloakify/angular/login/pipes/kc-sanitize.pipe"; +import { MsgStrPipe } from "@keycloakify/angular/login/pipes/msg-str.pipe"; @Component({ standalone: true, diff --git a/src/login/pages/login-idp-link-confirm-override/login-idp-link-confirm-override.component.ts b/src/login/pages/login-idp-link-confirm-override/login-idp-link-confirm-override.component.ts index 654a25ce..2098d279 100644 --- a/src/login/pages/login-idp-link-confirm-override/login-idp-link-confirm-override.component.ts +++ b/src/login/pages/login-idp-link-confirm-override/login-idp-link-confirm-override.component.ts @@ -5,13 +5,17 @@ import { inject, input } from "@angular/core"; -import { CLASSES, KC_CONTEXT, USE_DEFAULT_CSS } from "keycloakify-angular"; -import { ClassKey } from "keycloakify/login"; +import { + CLASSES, + KC_CONTEXT, + USE_DEFAULT_CSS +} from "@keycloakify/angular/lib/providers/keycloakify-angular.providers"; +import { ClassKey } from "keycloakify/login/lib/kcClsx"; import { KcContext } from "keycloakify/login/KcContext"; -import { ComponentReference } from "../../classes/component-reference.class"; -import { TemplateComponent } from "../../containers/template.component"; -import { KcClassDirective } from "../../directives/kc-class.directive"; -import { MsgStrPipe } from "../../pipes/msg-str.pipe"; +import { ComponentReference } from "@keycloakify/angular/login/classes/component-reference.class"; +import { TemplateComponent } from "@keycloakify/angular/login/containers/template.component"; +import { KcClassDirective } from "@keycloakify/angular/login/directives/kc-class.directive"; +import { MsgStrPipe } from "@keycloakify/angular/login/pipes/msg-str.pipe"; @Component({ standalone: true, diff --git a/src/login/pages/login-idp-link-confirm/login-idp-link-confirm.component.ts b/src/login/pages/login-idp-link-confirm/login-idp-link-confirm.component.ts index 8b24179a..3f1f4c45 100644 --- a/src/login/pages/login-idp-link-confirm/login-idp-link-confirm.component.ts +++ b/src/login/pages/login-idp-link-confirm/login-idp-link-confirm.component.ts @@ -5,13 +5,17 @@ import { inject, input } from "@angular/core"; -import { CLASSES, KC_CONTEXT, USE_DEFAULT_CSS } from "keycloakify-angular"; -import { ClassKey } from "keycloakify/login"; +import { + CLASSES, + KC_CONTEXT, + USE_DEFAULT_CSS +} from "@keycloakify/angular/lib/providers/keycloakify-angular.providers"; +import { ClassKey } from "keycloakify/login/lib/kcClsx"; import { KcContext } from "keycloakify/login/KcContext"; -import { ComponentReference } from "../../classes/component-reference.class"; -import { TemplateComponent } from "../../containers/template.component"; -import { KcClassDirective } from "../../directives/kc-class.directive"; -import { MsgStrPipe } from "../../pipes/msg-str.pipe"; +import { ComponentReference } from "@keycloakify/angular/login/classes/component-reference.class"; +import { TemplateComponent } from "@keycloakify/angular/login/containers/template.component"; +import { KcClassDirective } from "@keycloakify/angular/login/directives/kc-class.directive"; +import { MsgStrPipe } from "@keycloakify/angular/login/pipes/msg-str.pipe"; @Component({ standalone: true, diff --git a/src/login/pages/login-idp-link-email/login-idp-link-email.component.ts b/src/login/pages/login-idp-link-email/login-idp-link-email.component.ts index 5f80436f..958fa931 100644 --- a/src/login/pages/login-idp-link-email/login-idp-link-email.component.ts +++ b/src/login/pages/login-idp-link-email/login-idp-link-email.component.ts @@ -5,13 +5,17 @@ import { inject, input } from "@angular/core"; -import { CLASSES, KC_CONTEXT, USE_DEFAULT_CSS } from "keycloakify-angular"; -import { ClassKey } from "keycloakify/login"; +import { + CLASSES, + KC_CONTEXT, + USE_DEFAULT_CSS +} from "@keycloakify/angular/lib/providers/keycloakify-angular.providers"; +import { ClassKey } from "keycloakify/login/lib/kcClsx"; import { KcContext } from "keycloakify/login/KcContext"; -import { ComponentReference } from "../../classes/component-reference.class"; -import { TemplateComponent } from "../../containers/template.component"; -import { KcClassDirective } from "../../directives/kc-class.directive"; -import { MsgStrPipe } from "../../pipes/msg-str.pipe"; +import { ComponentReference } from "@keycloakify/angular/login/classes/component-reference.class"; +import { TemplateComponent } from "@keycloakify/angular/login/containers/template.component"; +import { KcClassDirective } from "@keycloakify/angular/login/directives/kc-class.directive"; +import { MsgStrPipe } from "@keycloakify/angular/login/pipes/msg-str.pipe"; @Component({ standalone: true, diff --git a/src/login/pages/login-oauth-grant/login-oauth-grant.component.ts b/src/login/pages/login-oauth-grant/login-oauth-grant.component.ts index 85725a0f..543b9857 100644 --- a/src/login/pages/login-oauth-grant/login-oauth-grant.component.ts +++ b/src/login/pages/login-oauth-grant/login-oauth-grant.component.ts @@ -5,14 +5,18 @@ import { inject, input } from "@angular/core"; -import { CLASSES, KC_CONTEXT, USE_DEFAULT_CSS } from "keycloakify-angular"; -import { ClassKey } from "keycloakify/login"; +import { + CLASSES, + KC_CONTEXT, + USE_DEFAULT_CSS +} from "@keycloakify/angular/lib/providers/keycloakify-angular.providers"; +import { ClassKey } from "keycloakify/login/lib/kcClsx"; import { KcContext } from "keycloakify/login/KcContext"; -import { ComponentReference } from "../../classes/component-reference.class"; -import { TemplateComponent } from "../../containers/template.component"; -import { KcClassDirective } from "../../directives/kc-class.directive"; -import { AdvancedMsgStrPipe } from "../../pipes/advanced-msg-str.pipe"; -import { MsgStrPipe } from "../../pipes/msg-str.pipe"; +import { ComponentReference } from "@keycloakify/angular/login/classes/component-reference.class"; +import { TemplateComponent } from "@keycloakify/angular/login/containers/template.component"; +import { KcClassDirective } from "@keycloakify/angular/login/directives/kc-class.directive"; +import { AdvancedMsgStrPipe } from "@keycloakify/angular/login/pipes/advanced-msg-str.pipe"; +import { MsgStrPipe } from "@keycloakify/angular/login/pipes/msg-str.pipe"; @Component({ standalone: true, diff --git a/src/login/pages/login-oauth2-device-verify-user-code/login-oauth2-device-verify-user-code.component.ts b/src/login/pages/login-oauth2-device-verify-user-code/login-oauth2-device-verify-user-code.component.ts index 3e127033..8d004222 100644 --- a/src/login/pages/login-oauth2-device-verify-user-code/login-oauth2-device-verify-user-code.component.ts +++ b/src/login/pages/login-oauth2-device-verify-user-code/login-oauth2-device-verify-user-code.component.ts @@ -5,13 +5,17 @@ import { inject, input } from "@angular/core"; -import { CLASSES, KC_CONTEXT, USE_DEFAULT_CSS } from "keycloakify-angular"; -import { ClassKey } from "keycloakify/login"; +import { + CLASSES, + KC_CONTEXT, + USE_DEFAULT_CSS +} from "@keycloakify/angular/lib/providers/keycloakify-angular.providers"; +import { ClassKey } from "keycloakify/login/lib/kcClsx"; import { KcContext } from "keycloakify/login/KcContext"; -import { ComponentReference } from "../../classes/component-reference.class"; -import { TemplateComponent } from "../../containers/template.component"; -import { KcClassDirective } from "../../directives/kc-class.directive"; -import { MsgStrPipe } from "../../pipes/msg-str.pipe"; +import { ComponentReference } from "@keycloakify/angular/login/classes/component-reference.class"; +import { TemplateComponent } from "@keycloakify/angular/login/containers/template.component"; +import { KcClassDirective } from "@keycloakify/angular/login/directives/kc-class.directive"; +import { MsgStrPipe } from "@keycloakify/angular/login/pipes/msg-str.pipe"; @Component({ standalone: true, diff --git a/src/login/pages/login-otp/login-otp.component.ts b/src/login/pages/login-otp/login-otp.component.ts index 25dd813a..4213b05a 100644 --- a/src/login/pages/login-otp/login-otp.component.ts +++ b/src/login/pages/login-otp/login-otp.component.ts @@ -5,14 +5,18 @@ import { inject, input } from "@angular/core"; -import { CLASSES, KC_CONTEXT, USE_DEFAULT_CSS } from "keycloakify-angular"; -import { ClassKey } from "keycloakify/login"; +import { + CLASSES, + KC_CONTEXT, + USE_DEFAULT_CSS +} from "@keycloakify/angular/lib/providers/keycloakify-angular.providers"; +import { ClassKey } from "keycloakify/login/lib/kcClsx"; import { KcContext } from "keycloakify/login/KcContext"; -import { ComponentReference } from "../../classes/component-reference.class"; -import { TemplateComponent } from "../../containers/template.component"; -import { KcClassDirective } from "../../directives/kc-class.directive"; -import { KcSanitizePipe } from "../../pipes/kc-sanitize.pipe"; -import { MsgStrPipe } from "../../pipes/msg-str.pipe"; +import { ComponentReference } from "@keycloakify/angular/login/classes/component-reference.class"; +import { TemplateComponent } from "@keycloakify/angular/login/containers/template.component"; +import { KcClassDirective } from "@keycloakify/angular/login/directives/kc-class.directive"; +import { KcSanitizePipe } from "@keycloakify/angular/login/pipes/kc-sanitize.pipe"; +import { MsgStrPipe } from "@keycloakify/angular/login/pipes/msg-str.pipe"; @Component({ standalone: true, diff --git a/src/login/pages/login-page-expired/login-page-expired.component.ts b/src/login/pages/login-page-expired/login-page-expired.component.ts index 415707aa..3d1f4e42 100644 --- a/src/login/pages/login-page-expired/login-page-expired.component.ts +++ b/src/login/pages/login-page-expired/login-page-expired.component.ts @@ -5,12 +5,16 @@ import { inject, input } from "@angular/core"; -import { CLASSES, KC_CONTEXT, USE_DEFAULT_CSS } from "keycloakify-angular"; -import { ClassKey } from "keycloakify/login"; +import { + CLASSES, + KC_CONTEXT, + USE_DEFAULT_CSS +} from "@keycloakify/angular/lib/providers/keycloakify-angular.providers"; +import { ClassKey } from "keycloakify/login/lib/kcClsx"; import { KcContext } from "keycloakify/login/KcContext"; -import { ComponentReference } from "../../classes/component-reference.class"; -import { TemplateComponent } from "../../containers/template.component"; -import { MsgStrPipe } from "../../pipes/msg-str.pipe"; +import { ComponentReference } from "@keycloakify/angular/login/classes/component-reference.class"; +import { TemplateComponent } from "@keycloakify/angular/login/containers/template.component"; +import { MsgStrPipe } from "@keycloakify/angular/login/pipes/msg-str.pipe"; @Component({ standalone: true, diff --git a/src/login/pages/login-passkeys-conditional-authenticate/login-passkeys-conditional-authenticate.component.ts b/src/login/pages/login-passkeys-conditional-authenticate/login-passkeys-conditional-authenticate.component.ts index 28d0d4ab..131f9abb 100644 --- a/src/login/pages/login-passkeys-conditional-authenticate/login-passkeys-conditional-authenticate.component.ts +++ b/src/login/pages/login-passkeys-conditional-authenticate/login-passkeys-conditional-authenticate.component.ts @@ -1,14 +1,19 @@ import { ChangeDetectionStrategy, Component, forwardRef, inject } from "@angular/core"; -import { CLASSES, KC_CONTEXT, Script, USE_DEFAULT_CSS } from "keycloakify-angular"; -import { ClassKey } from "keycloakify/login"; +import { + CLASSES, + KC_CONTEXT, + USE_DEFAULT_CSS +} from "@keycloakify/angular/lib/providers/keycloakify-angular.providers"; +import { Script } from "@keycloakify/angular/lib/models"; +import { ClassKey } from "keycloakify/login/lib/kcClsx"; import { KcContext } from "keycloakify/login/KcContext"; import { getKcClsx } from "keycloakify/login/lib/kcClsx"; -import { ComponentReference } from "../../classes/component-reference.class"; -import { TemplateComponent } from "../../containers/template.component"; -import { KcClassDirective } from "../../directives/kc-class.directive"; -import { AdvancedMsgStrPipe } from "../../pipes/advanced-msg-str.pipe"; -import { MsgStrPipe } from "../../pipes/msg-str.pipe"; -import { LoginResourceInjectorService } from "../../services"; +import { ComponentReference } from "@keycloakify/angular/login/classes/component-reference.class"; +import { TemplateComponent } from "@keycloakify/angular/login/containers/template.component"; +import { KcClassDirective } from "@keycloakify/angular/login/directives/kc-class.directive"; +import { AdvancedMsgStrPipe } from "@keycloakify/angular/login/pipes/advanced-msg-str.pipe"; +import { MsgStrPipe } from "@keycloakify/angular/login/pipes/msg-str.pipe"; +import { LoginResourceInjectorService } from "@keycloakify/angular/login/services"; @Component({ standalone: true, diff --git a/src/login/pages/login-password/login-password.component.ts b/src/login/pages/login-password/login-password.component.ts index 44848a5f..fa6628e7 100644 --- a/src/login/pages/login-password/login-password.component.ts +++ b/src/login/pages/login-password/login-password.component.ts @@ -6,15 +6,19 @@ import { input, signal } from "@angular/core"; -import { CLASSES, KC_CONTEXT, USE_DEFAULT_CSS } from "keycloakify-angular"; -import { ClassKey } from "keycloakify/login"; +import { + CLASSES, + KC_CONTEXT, + USE_DEFAULT_CSS +} from "@keycloakify/angular/lib/providers/keycloakify-angular.providers"; +import { ClassKey } from "keycloakify/login/lib/kcClsx"; import { KcContext } from "keycloakify/login/KcContext"; -import { ComponentReference } from "../../classes/component-reference.class"; -import { PasswordWrapperComponent } from "../../components/password-wrapper/password-wrapper.component"; -import { TemplateComponent } from "../../containers/template.component"; -import { KcClassDirective } from "../../directives/kc-class.directive"; -import { KcSanitizePipe } from "../../pipes/kc-sanitize.pipe"; -import { MsgStrPipe } from "../../pipes/msg-str.pipe"; +import { ComponentReference } from "@keycloakify/angular/login/classes/component-reference.class"; +import { PasswordWrapperComponent } from "@keycloakify/angular/login/components/password-wrapper/password-wrapper.component"; +import { TemplateComponent } from "@keycloakify/angular/login/containers/template.component"; +import { KcClassDirective } from "@keycloakify/angular/login/directives/kc-class.directive"; +import { KcSanitizePipe } from "@keycloakify/angular/login/pipes/kc-sanitize.pipe"; +import { MsgStrPipe } from "@keycloakify/angular/login/pipes/msg-str.pipe"; @Component({ standalone: true, diff --git a/src/login/pages/login-recovery-authn-code-config/login-recovery-authn-code-config.component.ts b/src/login/pages/login-recovery-authn-code-config/login-recovery-authn-code-config.component.ts index 57cd3109..167afee3 100644 --- a/src/login/pages/login-recovery-authn-code-config/login-recovery-authn-code-config.component.ts +++ b/src/login/pages/login-recovery-authn-code-config/login-recovery-authn-code-config.component.ts @@ -6,14 +6,18 @@ import { input, signal } from "@angular/core"; -import { CLASSES, KC_CONTEXT, USE_DEFAULT_CSS } from "keycloakify-angular"; -import { ClassKey } from "keycloakify/login"; +import { + CLASSES, + KC_CONTEXT, + USE_DEFAULT_CSS +} from "@keycloakify/angular/lib/providers/keycloakify-angular.providers"; +import { ClassKey } from "keycloakify/login/lib/kcClsx"; import { KcContext } from "keycloakify/login/KcContext"; -import { ComponentReference } from "../../classes/component-reference.class"; -import { LogoutOtherSessionsComponent } from "../../components/logout-other-sessions/logout-other-sessions.component"; -import { TemplateComponent } from "../../containers/template.component"; -import { KcClassDirective } from "../../directives"; -import { MsgStrPipe } from "../../pipes/msg-str.pipe"; +import { ComponentReference } from "@keycloakify/angular/login/classes/component-reference.class"; +import { LogoutOtherSessionsComponent } from "@keycloakify/angular/login/components/logout-other-sessions/logout-other-sessions.component"; +import { TemplateComponent } from "@keycloakify/angular/login/containers/template.component"; +import { KcClassDirective } from "@keycloakify/angular/login/directives"; +import { MsgStrPipe } from "@keycloakify/angular/login/pipes/msg-str.pipe"; @Component({ standalone: true, diff --git a/src/login/pages/login-recovery-authn-code-input/login-recovery-authn-code-input.component.ts b/src/login/pages/login-recovery-authn-code-input/login-recovery-authn-code-input.component.ts index ae62b886..c21a3956 100644 --- a/src/login/pages/login-recovery-authn-code-input/login-recovery-authn-code-input.component.ts +++ b/src/login/pages/login-recovery-authn-code-input/login-recovery-authn-code-input.component.ts @@ -5,14 +5,18 @@ import { inject, input } from "@angular/core"; -import { CLASSES, KC_CONTEXT, USE_DEFAULT_CSS } from "keycloakify-angular"; -import { ClassKey } from "keycloakify/login"; +import { + CLASSES, + KC_CONTEXT, + USE_DEFAULT_CSS +} from "@keycloakify/angular/lib/providers/keycloakify-angular.providers"; +import { ClassKey } from "keycloakify/login/lib/kcClsx"; import { KcContext } from "keycloakify/login/KcContext"; -import { ComponentReference } from "../../classes/component-reference.class"; -import { TemplateComponent } from "../../containers/template.component"; -import { KcClassDirective } from "../../directives"; -import { KcSanitizePipe } from "../../pipes/kc-sanitize.pipe"; -import { MsgStrPipe } from "../../pipes/msg-str.pipe"; +import { ComponentReference } from "@keycloakify/angular/login/classes/component-reference.class"; +import { TemplateComponent } from "@keycloakify/angular/login/containers/template.component"; +import { KcClassDirective } from "@keycloakify/angular/login/directives"; +import { KcSanitizePipe } from "@keycloakify/angular/login/pipes/kc-sanitize.pipe"; +import { MsgStrPipe } from "@keycloakify/angular/login/pipes/msg-str.pipe"; @Component({ standalone: true, diff --git a/src/login/pages/login-reset-otp/login-reset-otp.component.ts b/src/login/pages/login-reset-otp/login-reset-otp.component.ts index 30ae45ea..e27f2c67 100644 --- a/src/login/pages/login-reset-otp/login-reset-otp.component.ts +++ b/src/login/pages/login-reset-otp/login-reset-otp.component.ts @@ -5,13 +5,17 @@ import { inject, input } from "@angular/core"; -import { CLASSES, KC_CONTEXT, USE_DEFAULT_CSS } from "keycloakify-angular"; -import { ClassKey } from "keycloakify/login"; +import { + CLASSES, + KC_CONTEXT, + USE_DEFAULT_CSS +} from "@keycloakify/angular/lib/providers/keycloakify-angular.providers"; +import { ClassKey } from "keycloakify/login/lib/kcClsx"; import { KcContext } from "keycloakify/login/KcContext"; -import { ComponentReference } from "../../classes/component-reference.class"; -import { TemplateComponent } from "../../containers/template.component"; -import { KcClassDirective } from "../../directives"; -import { MsgStrPipe } from "../../pipes/msg-str.pipe"; +import { ComponentReference } from "@keycloakify/angular/login/classes/component-reference.class"; +import { TemplateComponent } from "@keycloakify/angular/login/containers/template.component"; +import { KcClassDirective } from "@keycloakify/angular/login/directives"; +import { MsgStrPipe } from "@keycloakify/angular/login/pipes/msg-str.pipe"; @Component({ standalone: true, diff --git a/src/login/pages/login-reset-password/login-reset-password.component.ts b/src/login/pages/login-reset-password/login-reset-password.component.ts index 922a32af..34dbbb8e 100644 --- a/src/login/pages/login-reset-password/login-reset-password.component.ts +++ b/src/login/pages/login-reset-password/login-reset-password.component.ts @@ -5,14 +5,18 @@ import { inject, input } from "@angular/core"; -import { CLASSES, KC_CONTEXT, USE_DEFAULT_CSS } from "keycloakify-angular"; -import { ClassKey } from "keycloakify/login"; +import { + CLASSES, + KC_CONTEXT, + USE_DEFAULT_CSS +} from "@keycloakify/angular/lib/providers/keycloakify-angular.providers"; +import { ClassKey } from "keycloakify/login/lib/kcClsx"; import { KcContext } from "keycloakify/login/KcContext"; -import { ComponentReference } from "../../classes/component-reference.class"; -import { TemplateComponent } from "../../containers/template.component"; -import { KcClassDirective } from "../../directives"; -import { KcSanitizePipe } from "../../pipes/kc-sanitize.pipe"; -import { MsgStrPipe } from "../../pipes/msg-str.pipe"; +import { ComponentReference } from "@keycloakify/angular/login/classes/component-reference.class"; +import { TemplateComponent } from "@keycloakify/angular/login/containers/template.component"; +import { KcClassDirective } from "@keycloakify/angular/login/directives"; +import { KcSanitizePipe } from "@keycloakify/angular/login/pipes/kc-sanitize.pipe"; +import { MsgStrPipe } from "@keycloakify/angular/login/pipes/msg-str.pipe"; @Component({ standalone: true, diff --git a/src/login/pages/login-update-password/login-update-password.component.ts b/src/login/pages/login-update-password/login-update-password.component.ts index 558d4119..5bda0558 100644 --- a/src/login/pages/login-update-password/login-update-password.component.ts +++ b/src/login/pages/login-update-password/login-update-password.component.ts @@ -5,16 +5,20 @@ import { inject, input } from "@angular/core"; -import { CLASSES, KC_CONTEXT, USE_DEFAULT_CSS } from "keycloakify-angular"; -import { ClassKey } from "keycloakify/login"; +import { + CLASSES, + KC_CONTEXT, + USE_DEFAULT_CSS +} from "@keycloakify/angular/lib/providers/keycloakify-angular.providers"; +import { ClassKey } from "keycloakify/login/lib/kcClsx"; import { KcContext } from "keycloakify/login/KcContext"; -import { ComponentReference } from "../../classes/component-reference.class"; -import { LogoutOtherSessionsComponent } from "../../components/logout-other-sessions/logout-other-sessions.component"; -import { PasswordWrapperComponent } from "../../components/password-wrapper/password-wrapper.component"; -import { TemplateComponent } from "../../containers/template.component"; -import { KcClassDirective } from "../../directives"; -import { KcSanitizePipe } from "../../pipes/kc-sanitize.pipe"; -import { MsgStrPipe } from "../../pipes/msg-str.pipe"; +import { ComponentReference } from "@keycloakify/angular/login/classes/component-reference.class"; +import { LogoutOtherSessionsComponent } from "@keycloakify/angular/login/components/logout-other-sessions/logout-other-sessions.component"; +import { PasswordWrapperComponent } from "@keycloakify/angular/login/components/password-wrapper/password-wrapper.component"; +import { TemplateComponent } from "@keycloakify/angular/login/containers/template.component"; +import { KcClassDirective } from "@keycloakify/angular/login/directives"; +import { KcSanitizePipe } from "@keycloakify/angular/login/pipes/kc-sanitize.pipe"; +import { MsgStrPipe } from "@keycloakify/angular/login/pipes/msg-str.pipe"; @Component({ standalone: true, diff --git a/src/login/pages/login-update-profile/login-update-profile.component.ts b/src/login/pages/login-update-profile/login-update-profile.component.ts index c48c8594..830baddc 100644 --- a/src/login/pages/login-update-profile/login-update-profile.component.ts +++ b/src/login/pages/login-update-profile/login-update-profile.component.ts @@ -6,14 +6,18 @@ import { input, signal } from "@angular/core"; -import { CLASSES, KC_CONTEXT, USE_DEFAULT_CSS } from "keycloakify-angular"; -import { ClassKey } from "keycloakify/login"; +import { + CLASSES, + KC_CONTEXT, + USE_DEFAULT_CSS +} from "@keycloakify/angular/lib/providers/keycloakify-angular.providers"; +import { ClassKey } from "keycloakify/login/lib/kcClsx"; import { KcContext } from "keycloakify/login/KcContext"; -import { ComponentReference } from "../../classes/component-reference.class"; -import { UserProfileFormFieldsComponent } from "../../components/user-profile-form-fields/user-profile-form-fields.component"; -import { TemplateComponent } from "../../containers/template.component"; -import { KcClassDirective } from "../../directives"; -import { MsgStrPipe } from "../../pipes/msg-str.pipe"; +import { ComponentReference } from "@keycloakify/angular/login/classes/component-reference.class"; +import { UserProfileFormFieldsComponent } from "@keycloakify/angular/login/components/user-profile-form-fields/user-profile-form-fields.component"; +import { TemplateComponent } from "@keycloakify/angular/login/containers/template.component"; +import { KcClassDirective } from "@keycloakify/angular/login/directives"; +import { MsgStrPipe } from "@keycloakify/angular/login/pipes/msg-str.pipe"; @Component({ standalone: true, diff --git a/src/login/pages/login-username/login-username.component.ts b/src/login/pages/login-username/login-username.component.ts index feeed758..69d7ce7a 100644 --- a/src/login/pages/login-username/login-username.component.ts +++ b/src/login/pages/login-username/login-username.component.ts @@ -7,14 +7,18 @@ import { input, signal } from "@angular/core"; -import { CLASSES, KC_CONTEXT, USE_DEFAULT_CSS } from "keycloakify-angular"; -import { ClassKey } from "keycloakify/login"; +import { + CLASSES, + KC_CONTEXT, + USE_DEFAULT_CSS +} from "@keycloakify/angular/lib/providers/keycloakify-angular.providers"; +import { ClassKey } from "keycloakify/login/lib/kcClsx"; import { KcContext } from "keycloakify/login/KcContext"; -import { ComponentReference } from "../../classes/component-reference.class"; -import { TemplateComponent } from "../../containers/template.component"; -import { KcClassDirective } from "../../directives/kc-class.directive"; -import { KcSanitizePipe } from "../../pipes/kc-sanitize.pipe"; -import { MsgStrPipe } from "../../pipes/msg-str.pipe"; +import { ComponentReference } from "@keycloakify/angular/login/classes/component-reference.class"; +import { TemplateComponent } from "@keycloakify/angular/login/containers/template.component"; +import { KcClassDirective } from "@keycloakify/angular/login/directives/kc-class.directive"; +import { KcSanitizePipe } from "@keycloakify/angular/login/pipes/kc-sanitize.pipe"; +import { MsgStrPipe } from "@keycloakify/angular/login/pipes/msg-str.pipe"; @Component({ selector: "kc-root", diff --git a/src/login/pages/login-verify-email/login-verify-email.component.ts b/src/login/pages/login-verify-email/login-verify-email.component.ts index dfb68f35..8a8891d3 100644 --- a/src/login/pages/login-verify-email/login-verify-email.component.ts +++ b/src/login/pages/login-verify-email/login-verify-email.component.ts @@ -5,13 +5,17 @@ import { inject, input } from "@angular/core"; -import { CLASSES, KC_CONTEXT, USE_DEFAULT_CSS } from "keycloakify-angular"; -import { ClassKey } from "keycloakify/login"; +import { + CLASSES, + KC_CONTEXT, + USE_DEFAULT_CSS +} from "@keycloakify/angular/lib/providers/keycloakify-angular.providers"; +import { ClassKey } from "keycloakify/login/lib/kcClsx"; import { KcContext } from "keycloakify/login/KcContext"; -import { ComponentReference } from "../../classes/component-reference.class"; -import { TemplateComponent } from "../../containers/template.component"; -import { KcClassDirective } from "../../directives"; -import { MsgStrPipe } from "../../pipes/msg-str.pipe"; +import { ComponentReference } from "@keycloakify/angular/login/classes/component-reference.class"; +import { TemplateComponent } from "@keycloakify/angular/login/containers/template.component"; +import { KcClassDirective } from "@keycloakify/angular/login/directives"; +import { MsgStrPipe } from "@keycloakify/angular/login/pipes/msg-str.pipe"; @Component({ standalone: true, diff --git a/src/login/pages/login-x509-info/login-x509-info.component.ts b/src/login/pages/login-x509-info/login-x509-info.component.ts index 4b988be1..223d7697 100644 --- a/src/login/pages/login-x509-info/login-x509-info.component.ts +++ b/src/login/pages/login-x509-info/login-x509-info.component.ts @@ -5,13 +5,17 @@ import { inject, input } from "@angular/core"; -import { CLASSES, KC_CONTEXT, USE_DEFAULT_CSS } from "keycloakify-angular"; -import { ClassKey } from "keycloakify/login"; +import { + CLASSES, + KC_CONTEXT, + USE_DEFAULT_CSS +} from "@keycloakify/angular/lib/providers/keycloakify-angular.providers"; +import { ClassKey } from "keycloakify/login/lib/kcClsx"; import { KcContext } from "keycloakify/login/KcContext"; -import { ComponentReference } from "../../classes/component-reference.class"; -import { TemplateComponent } from "../../containers/template.component"; -import { KcClassDirective } from "../../directives"; -import { MsgStrPipe } from "../../pipes/msg-str.pipe"; +import { ComponentReference } from "@keycloakify/angular/login/classes/component-reference.class"; +import { TemplateComponent } from "@keycloakify/angular/login/containers/template.component"; +import { KcClassDirective } from "@keycloakify/angular/login/directives"; +import { MsgStrPipe } from "@keycloakify/angular/login/pipes/msg-str.pipe"; @Component({ standalone: true, diff --git a/src/login/pages/login/login.component.ts b/src/login/pages/login/login.component.ts index 10f30b3e..d77ebf01 100644 --- a/src/login/pages/login/login.component.ts +++ b/src/login/pages/login/login.component.ts @@ -7,15 +7,19 @@ import { input, signal } from "@angular/core"; -import { CLASSES, KC_CONTEXT, USE_DEFAULT_CSS } from "keycloakify-angular"; -import { ClassKey } from "keycloakify/login"; +import { + CLASSES, + KC_CONTEXT, + USE_DEFAULT_CSS +} from "@keycloakify/angular/lib/providers/keycloakify-angular.providers"; +import { ClassKey } from "keycloakify/login/lib/kcClsx"; import { KcContext } from "keycloakify/login/KcContext"; -import { ComponentReference } from "../../classes/component-reference.class"; -import { PasswordWrapperComponent } from "../../components/password-wrapper/password-wrapper.component"; -import { TemplateComponent } from "../../containers/template.component"; -import { KcClassDirective } from "../../directives/kc-class.directive"; -import { KcSanitizePipe } from "../../pipes/kc-sanitize.pipe"; -import { MsgStrPipe } from "../../pipes/msg-str.pipe"; +import { ComponentReference } from "@keycloakify/angular/login/classes/component-reference.class"; +import { PasswordWrapperComponent } from "@keycloakify/angular/login/components/password-wrapper/password-wrapper.component"; +import { TemplateComponent } from "@keycloakify/angular/login/containers/template.component"; +import { KcClassDirective } from "@keycloakify/angular/login/directives/kc-class.directive"; +import { KcSanitizePipe } from "@keycloakify/angular/login/pipes/kc-sanitize.pipe"; +import { MsgStrPipe } from "@keycloakify/angular/login/pipes/msg-str.pipe"; @Component({ selector: "kc-root", diff --git a/src/login/pages/logout-confirm/logout-confirm.component.ts b/src/login/pages/logout-confirm/logout-confirm.component.ts index 1723127a..3321dd50 100644 --- a/src/login/pages/logout-confirm/logout-confirm.component.ts +++ b/src/login/pages/logout-confirm/logout-confirm.component.ts @@ -5,13 +5,17 @@ import { inject, input } from "@angular/core"; -import { CLASSES, KC_CONTEXT, USE_DEFAULT_CSS } from "keycloakify-angular"; -import { ClassKey } from "keycloakify/login"; +import { + CLASSES, + KC_CONTEXT, + USE_DEFAULT_CSS +} from "@keycloakify/angular/lib/providers/keycloakify-angular.providers"; +import { ClassKey } from "keycloakify/login/lib/kcClsx"; import { KcContext } from "keycloakify/login/KcContext"; -import { ComponentReference } from "../../classes/component-reference.class"; -import { TemplateComponent } from "../../containers/template.component"; -import { KcClassDirective } from "../../directives"; -import { MsgStrPipe } from "../../pipes/msg-str.pipe"; +import { ComponentReference } from "@keycloakify/angular/login/classes/component-reference.class"; +import { TemplateComponent } from "@keycloakify/angular/login/containers/template.component"; +import { KcClassDirective } from "@keycloakify/angular/login/directives"; +import { MsgStrPipe } from "@keycloakify/angular/login/pipes/msg-str.pipe"; @Component({ standalone: true, diff --git a/src/login/pages/register/register.component.ts b/src/login/pages/register/register.component.ts index 74f647ae..9e185748 100644 --- a/src/login/pages/register/register.component.ts +++ b/src/login/pages/register/register.component.ts @@ -7,16 +7,20 @@ import { input, signal } from "@angular/core"; -import { CLASSES, KC_CONTEXT, USE_DEFAULT_CSS } from "keycloakify-angular"; -import { ClassKey } from "keycloakify/login"; +import { + CLASSES, + KC_CONTEXT, + USE_DEFAULT_CSS +} from "@keycloakify/angular/lib/providers/keycloakify-angular.providers"; +import { ClassKey } from "keycloakify/login/lib/kcClsx"; import { KcContext } from "keycloakify/login/KcContext"; -import { ComponentReference } from "../../classes/component-reference.class"; -import { UserProfileFormFieldsComponent } from "../../components/user-profile-form-fields/user-profile-form-fields.component"; -import { TemplateComponent } from "../../containers/template.component"; -import { KcClassDirective } from "../../directives/kc-class.directive"; -import { AdvancedMsgStrPipe } from "../../pipes/advanced-msg-str.pipe"; -import { KcSanitizePipe } from "../../pipes/kc-sanitize.pipe"; -import { MsgStrPipe } from "../../pipes/msg-str.pipe"; +import { ComponentReference } from "@keycloakify/angular/login/classes/component-reference.class"; +import { UserProfileFormFieldsComponent } from "@keycloakify/angular/login/components/user-profile-form-fields/user-profile-form-fields.component"; +import { TemplateComponent } from "@keycloakify/angular/login/containers/template.component"; +import { KcClassDirective } from "@keycloakify/angular/login/directives/kc-class.directive"; +import { AdvancedMsgStrPipe } from "@keycloakify/angular/login/pipes/advanced-msg-str.pipe"; +import { KcSanitizePipe } from "@keycloakify/angular/login/pipes/kc-sanitize.pipe"; +import { MsgStrPipe } from "@keycloakify/angular/login/pipes/msg-str.pipe"; @Component({ selector: "kc-root", diff --git a/src/login/pages/saml-post-form/saml-post-form.component.ts b/src/login/pages/saml-post-form/saml-post-form.component.ts index e73515d5..f5dae397 100644 --- a/src/login/pages/saml-post-form/saml-post-form.component.ts +++ b/src/login/pages/saml-post-form/saml-post-form.component.ts @@ -7,12 +7,16 @@ import { input, ViewChild } from "@angular/core"; -import { CLASSES, KC_CONTEXT, USE_DEFAULT_CSS } from "keycloakify-angular"; -import { ClassKey } from "keycloakify/login"; +import { + CLASSES, + KC_CONTEXT, + USE_DEFAULT_CSS +} from "@keycloakify/angular/lib/providers/keycloakify-angular.providers"; +import { ClassKey } from "keycloakify/login/lib/kcClsx"; import { KcContext } from "keycloakify/login/KcContext"; -import { ComponentReference } from "../../classes/component-reference.class"; -import { TemplateComponent } from "../../containers/template.component"; -import { MsgStrPipe } from "../../pipes/msg-str.pipe"; +import { ComponentReference } from "@keycloakify/angular/login/classes/component-reference.class"; +import { TemplateComponent } from "@keycloakify/angular/login/containers/template.component"; +import { MsgStrPipe } from "@keycloakify/angular/login/pipes/msg-str.pipe"; @Component({ standalone: true, diff --git a/src/login/pages/select-authenticator/select-authenticator.component.ts b/src/login/pages/select-authenticator/select-authenticator.component.ts index 415c2a9d..55cd6877 100644 --- a/src/login/pages/select-authenticator/select-authenticator.component.ts +++ b/src/login/pages/select-authenticator/select-authenticator.component.ts @@ -6,14 +6,18 @@ import { inject, input } from "@angular/core"; -import { CLASSES, KC_CONTEXT, USE_DEFAULT_CSS } from "keycloakify-angular"; -import { ClassKey } from "keycloakify/login"; +import { + CLASSES, + KC_CONTEXT, + USE_DEFAULT_CSS +} from "@keycloakify/angular/lib/providers/keycloakify-angular.providers"; +import { ClassKey } from "keycloakify/login/lib/kcClsx"; import { KcContext } from "keycloakify/login/KcContext"; -import { ComponentReference } from "../../classes/component-reference.class"; -import { TemplateComponent } from "../../containers/template.component"; -import { KcClassDirective } from "../../directives"; -import { AdvancedMsgStrPipe } from "../../pipes"; -import { MsgStrPipe } from "../../pipes/msg-str.pipe"; +import { ComponentReference } from "@keycloakify/angular/login/classes/component-reference.class"; +import { TemplateComponent } from "@keycloakify/angular/login/containers/template.component"; +import { KcClassDirective } from "@keycloakify/angular/login/directives"; +import { AdvancedMsgStrPipe } from "@keycloakify/angular/login/pipes"; +import { MsgStrPipe } from "@keycloakify/angular/login/pipes/msg-str.pipe"; @Component({ standalone: true, diff --git a/src/login/pages/terms/terms.component.ts b/src/login/pages/terms/terms.component.ts index 0302d9ac..9f403414 100644 --- a/src/login/pages/terms/terms.component.ts +++ b/src/login/pages/terms/terms.component.ts @@ -5,13 +5,17 @@ import { inject, input } from "@angular/core"; -import { CLASSES, KC_CONTEXT, USE_DEFAULT_CSS } from "keycloakify-angular"; -import { ClassKey } from "keycloakify/login"; +import { + CLASSES, + KC_CONTEXT, + USE_DEFAULT_CSS +} from "@keycloakify/angular/lib/providers/keycloakify-angular.providers"; +import { ClassKey } from "keycloakify/login/lib/kcClsx"; import { KcContext } from "keycloakify/login/KcContext"; -import { ComponentReference } from "../../classes/component-reference.class"; -import { TemplateComponent } from "../../containers/template.component"; -import { KcClassDirective } from "../../directives"; -import { MsgStrPipe } from "../../pipes/msg-str.pipe"; +import { ComponentReference } from "@keycloakify/angular/login/classes/component-reference.class"; +import { TemplateComponent } from "@keycloakify/angular/login/containers/template.component"; +import { KcClassDirective } from "@keycloakify/angular/login/directives"; +import { MsgStrPipe } from "@keycloakify/angular/login/pipes/msg-str.pipe"; @Component({ standalone: true, diff --git a/src/login/pages/update-email/update-email.component.ts b/src/login/pages/update-email/update-email.component.ts index d231405a..5f2dcaea 100644 --- a/src/login/pages/update-email/update-email.component.ts +++ b/src/login/pages/update-email/update-email.component.ts @@ -6,15 +6,19 @@ import { input, signal } from "@angular/core"; -import { CLASSES, KC_CONTEXT, USE_DEFAULT_CSS } from "keycloakify-angular"; -import { ClassKey } from "keycloakify/login"; +import { + CLASSES, + KC_CONTEXT, + USE_DEFAULT_CSS +} from "@keycloakify/angular/lib/providers/keycloakify-angular.providers"; +import { ClassKey } from "keycloakify/login/lib/kcClsx"; import { KcContext } from "keycloakify/login/KcContext"; -import { ComponentReference } from "../../classes/component-reference.class"; -import { LogoutOtherSessionsComponent } from "../../components/logout-other-sessions/logout-other-sessions.component"; -import { UserProfileFormFieldsComponent } from "../../components/user-profile-form-fields/user-profile-form-fields.component"; -import { TemplateComponent } from "../../containers/template.component"; -import { KcClassDirective } from "../../directives"; -import { MsgStrPipe } from "../../pipes/msg-str.pipe"; +import { ComponentReference } from "@keycloakify/angular/login/classes/component-reference.class"; +import { LogoutOtherSessionsComponent } from "@keycloakify/angular/login/components/logout-other-sessions/logout-other-sessions.component"; +import { UserProfileFormFieldsComponent } from "@keycloakify/angular/login/components/user-profile-form-fields/user-profile-form-fields.component"; +import { TemplateComponent } from "@keycloakify/angular/login/containers/template.component"; +import { KcClassDirective } from "@keycloakify/angular/login/directives"; +import { MsgStrPipe } from "@keycloakify/angular/login/pipes/msg-str.pipe"; @Component({ standalone: true, diff --git a/src/login/pages/webauthn-authenticate/webauthn-authenticate.component.ts b/src/login/pages/webauthn-authenticate/webauthn-authenticate.component.ts index 3e4e4d46..cd66016b 100644 --- a/src/login/pages/webauthn-authenticate/webauthn-authenticate.component.ts +++ b/src/login/pages/webauthn-authenticate/webauthn-authenticate.component.ts @@ -5,17 +5,22 @@ import { inject, input } from "@angular/core"; -import { CLASSES, KC_CONTEXT, Script, USE_DEFAULT_CSS } from "keycloakify-angular"; -import { ClassKey } from "keycloakify/login"; +import { + CLASSES, + KC_CONTEXT, + USE_DEFAULT_CSS +} from "@keycloakify/angular/lib/providers/keycloakify-angular.providers"; +import { Script } from "@keycloakify/angular/lib/models"; +import { ClassKey } from "keycloakify/login/lib/kcClsx"; import { KcContext } from "keycloakify/login/KcContext"; import { getKcClsx } from "keycloakify/login/lib/kcClsx"; -import { ComponentReference } from "../../classes/component-reference.class"; -import { LogoutOtherSessionsComponent } from "../../components/logout-other-sessions/logout-other-sessions.component"; -import { TemplateComponent } from "../../containers/template.component"; -import { KcClassDirective } from "../../directives"; -import { AdvancedMsgStrPipe } from "../../pipes/advanced-msg-str.pipe"; -import { MsgStrPipe } from "../../pipes/msg-str.pipe"; -import { LoginResourceInjectorService } from "../../services"; +import { ComponentReference } from "@keycloakify/angular/login/classes/component-reference.class"; +import { LogoutOtherSessionsComponent } from "@keycloakify/angular/login/components/logout-other-sessions/logout-other-sessions.component"; +import { TemplateComponent } from "@keycloakify/angular/login/containers/template.component"; +import { KcClassDirective } from "@keycloakify/angular/login/directives"; +import { AdvancedMsgStrPipe } from "@keycloakify/angular/login/pipes/advanced-msg-str.pipe"; +import { MsgStrPipe } from "@keycloakify/angular/login/pipes/msg-str.pipe"; +import { LoginResourceInjectorService } from "@keycloakify/angular/login/services"; @Component({ standalone: true, diff --git a/src/login/pages/webauthn-error/webauthn-error.component.ts b/src/login/pages/webauthn-error/webauthn-error.component.ts index ca20e5b2..382f846e 100644 --- a/src/login/pages/webauthn-error/webauthn-error.component.ts +++ b/src/login/pages/webauthn-error/webauthn-error.component.ts @@ -5,14 +5,18 @@ import { inject, input } from "@angular/core"; -import { CLASSES, KC_CONTEXT, USE_DEFAULT_CSS } from "keycloakify-angular"; -import { ClassKey } from "keycloakify/login"; +import { + CLASSES, + KC_CONTEXT, + USE_DEFAULT_CSS +} from "@keycloakify/angular/lib/providers/keycloakify-angular.providers"; +import { ClassKey } from "keycloakify/login/lib/kcClsx"; import { KcContext } from "keycloakify/login/KcContext"; -import { ComponentReference } from "../../classes/component-reference.class"; -import { LogoutOtherSessionsComponent } from "../../components/logout-other-sessions/logout-other-sessions.component"; -import { TemplateComponent } from "../../containers/template.component"; -import { KcClassDirective } from "../../directives"; -import { MsgStrPipe } from "../../pipes/msg-str.pipe"; +import { ComponentReference } from "@keycloakify/angular/login/classes/component-reference.class"; +import { LogoutOtherSessionsComponent } from "@keycloakify/angular/login/components/logout-other-sessions/logout-other-sessions.component"; +import { TemplateComponent } from "@keycloakify/angular/login/containers/template.component"; +import { KcClassDirective } from "@keycloakify/angular/login/directives"; +import { MsgStrPipe } from "@keycloakify/angular/login/pipes/msg-str.pipe"; @Component({ standalone: true, diff --git a/src/login/pages/webauthn-register/webauthn-register.component.ts b/src/login/pages/webauthn-register/webauthn-register.component.ts index 36d1330b..93cc7e72 100644 --- a/src/login/pages/webauthn-register/webauthn-register.component.ts +++ b/src/login/pages/webauthn-register/webauthn-register.component.ts @@ -5,15 +5,20 @@ import { inject, input } from "@angular/core"; -import { CLASSES, KC_CONTEXT, Script, USE_DEFAULT_CSS } from "keycloakify-angular"; -import { ClassKey } from "keycloakify/login"; +import { + CLASSES, + KC_CONTEXT, + USE_DEFAULT_CSS +} from "@keycloakify/angular/lib/providers/keycloakify-angular.providers"; +import { Script } from "@keycloakify/angular/lib/models"; +import { ClassKey } from "keycloakify/login/lib/kcClsx"; import { KcContext } from "keycloakify/login/KcContext"; -import { ComponentReference } from "../../classes/component-reference.class"; -import { LogoutOtherSessionsComponent } from "../../components/logout-other-sessions/logout-other-sessions.component"; -import { TemplateComponent } from "../../containers/template.component"; -import { KcClassDirective } from "../../directives"; -import { MsgStrPipe } from "../../pipes/msg-str.pipe"; -import { LoginResourceInjectorService } from "../../services"; +import { ComponentReference } from "@keycloakify/angular/login/classes/component-reference.class"; +import { LogoutOtherSessionsComponent } from "@keycloakify/angular/login/components/logout-other-sessions/logout-other-sessions.component"; +import { TemplateComponent } from "@keycloakify/angular/login/containers/template.component"; +import { KcClassDirective } from "@keycloakify/angular/login/directives"; +import { MsgStrPipe } from "@keycloakify/angular/login/pipes/msg-str.pipe"; +import { LoginResourceInjectorService } from "@keycloakify/angular/login/services"; @Component({ standalone: true, diff --git a/src/login/pipes/advanced-msg-str.pipe.ts b/src/login/pipes/advanced-msg-str.pipe.ts index 6e78aa77..6e32ba47 100644 --- a/src/login/pipes/advanced-msg-str.pipe.ts +++ b/src/login/pipes/advanced-msg-str.pipe.ts @@ -1,6 +1,6 @@ import { inject, Pipe, PipeTransform } from "@angular/core"; -import { I18N } from "keycloakify-angular"; -import { I18n } from "keycloakify/login/i18n"; +import { I18N } from "@keycloakify/angular/lib/providers/keycloakify-angular.providers"; +import { I18n } from "../i18n"; @Pipe({ name: "advancedMsgStr", standalone: true diff --git a/src/login/pipes/msg-str.pipe.ts b/src/login/pipes/msg-str.pipe.ts index e3613d3d..ceefb709 100644 --- a/src/login/pipes/msg-str.pipe.ts +++ b/src/login/pipes/msg-str.pipe.ts @@ -1,6 +1,6 @@ import { inject, Pipe, PipeTransform } from "@angular/core"; -import { I18N } from "keycloakify-angular"; -import { I18n } from "keycloakify/login/i18n"; +import { I18N } from "@keycloakify/angular/lib/providers/keycloakify-angular.providers"; +import { I18n } from "../i18n"; import { MessageKey } from "keycloakify/login/i18n/messages_defaultSet/types"; @Pipe({ name: "msgStr", diff --git a/src/login/services/login-resource-injector.service.ts b/src/login/services/login-resource-injector.service.ts index 654f2ba1..af880323 100644 --- a/src/login/services/login-resource-injector.service.ts +++ b/src/login/services/login-resource-injector.service.ts @@ -1,5 +1,6 @@ import { inject, Injectable } from "@angular/core"; -import { KC_CONTEXT, ResourceInjectorService, Script } from "keycloakify-angular"; +import { KC_CONTEXT } from "@keycloakify/angular/lib/providers/keycloakify-angular.providers"; +import { ResourceInjectorService, Script } from "@keycloakify/angular/lib/public-api"; import { KcContext } from "keycloakify/login/KcContext"; import { catchError, forkJoin, of, switchMap } from "rxjs"; diff --git a/src/login/services/user-profile-form.service.ts b/src/login/services/user-profile-form.service.ts index c395adcf..94225c5d 100644 --- a/src/login/services/user-profile-form.service.ts +++ b/src/login/services/user-profile-form.service.ts @@ -10,7 +10,11 @@ import { WritableSignal } from "@angular/core"; import { DomSanitizer, SafeHtml } from "@angular/platform-browser"; -import { DO_MAKE_USER_CONFIRM_PASSWORD, I18N, KC_CONTEXT } from "keycloakify-angular"; +import { + DO_MAKE_USER_CONFIRM_PASSWORD, + I18N, + KC_CONTEXT +} from "@keycloakify/angular/lib/providers/keycloakify-angular.providers"; import { Attribute, KcContext, @@ -18,10 +22,10 @@ import { Validators } from "keycloakify/login/KcContext"; import type { - I18n, KcContextLike as KcContextLike_i18n, MessageKey_defaultSet -} from "keycloakify/login/i18n"; +} from "keycloakify/login/i18n/noJsx"; +import type { I18n } from "../i18n"; import { emailRegexp } from "keycloakify/tools/emailRegExp"; import { formatNumber } from "keycloakify/tools/formatNumber"; import { structuredCloneButFunctions } from "keycloakify/tools/structuredCloneButFunctions"; diff --git a/src/tsconfig.json b/src/tsconfig.json index 9faced4b..c0b21cbc 100644 --- a/src/tsconfig.json +++ b/src/tsconfig.json @@ -5,13 +5,14 @@ "rootDir": ".", "module": "ES2020", "target": "ES2017", - "lib": ["es2015", "DOM", "ES2019.Object"], + "lib": ["es2017", "DOM", "ES2019.Object"], "moduleResolution": "node", "baseUrl": ".", "paths": { "@keycloakify/angular/*": ["./*"] }, "jsx": "react-jsx", - "allowSyntheticDefaultImports": true + "allowSyntheticDefaultImports": true, + "experimentalDecorators": true } } diff --git a/yarn.lock b/yarn.lock index bc910922..866b3c3a 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2,6 +2,13 @@ # yarn lockfile v1 +"@angular/common@^18.2.6": + version "18.2.6" + resolved "https://registry.yarnpkg.com/@angular/common/-/common-18.2.6.tgz#f5b57bf0e9b66a5b25526877d193227a53cad539" + integrity sha512-89793ow+wrI1c7C6kyMbnweLNIZHzXthosxAEjipRZGBrqBYjvTtkE45Fl+5yBa3JO7bAhyGkUnEoyvWtZIAEA== + dependencies: + tslib "^2.3.0" + "@angular/core@^18.2.6": version "18.2.6" resolved "https://registry.yarnpkg.com/@angular/core/-/core-18.2.6.tgz#d6d251fae36684ce49759e41e6456c6996271f4a" @@ -9,6 +16,13 @@ dependencies: tslib "^2.3.0" +"@angular/platform-browser@^18.2.6": + version "18.2.6" + resolved "https://registry.yarnpkg.com/@angular/platform-browser/-/platform-browser-18.2.6.tgz#c6b7497e82f481ece1b6e54db633d16a8099572d" + integrity sha512-RA8UMiYNLga+QMwpKcDw1357gYPfPyY/rmLeezMak//BbsENFYQOJ4Z6DBOBNiPlHxmBsUJMGaKdlpQhfCROyQ== + dependencies: + tslib "^2.3.0" + "@babel/code-frame@^7.0.0": version "7.24.7" resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.24.7.tgz#882fd9e09e8ee324e496bd040401c6f046ef4465" From 81323e6ae2507b38706dffdba236255c4481e22c Mon Sep 17 00:00:00 2001 From: Joseph Garrone Date: Mon, 30 Sep 2024 01:09:59 +0200 Subject: [PATCH 04/64] Setup scripts --- package.json | 6 +- scripts/build.ts | 145 ++---------------- scripts/link-in-app.ts | 6 +- scripts/shared/cacheDirPath.ts | 2 +- scripts/shared/startRebuildOnSrcChange.ts | 2 +- scripts/tools/Deferred.ts | 39 +++++ scripts/tools/SemVer.ts | 118 ++++++++++++++ scripts/tools/StatefulObservable.ts | 57 +++++++ scripts/tools/crawl.ts | 35 +++++ scripts/tools/fs.existsAsync.ts | 11 ++ scripts/tools/fs.rm.ts | 43 ++++++ scripts/tools/fs.rmSync.ts | 34 ++++ scripts/tools/getThisCodebaseRootDirPath.ts | 19 +++ .../tools/partitionPromiseSettledResults.ts | 20 +++ scripts/tools/transformCodebase.ts | 88 +++++++++++ scripts/tools/waitForDebounce.ts | 48 ++++++ yarn.lock | 24 ++- 17 files changed, 554 insertions(+), 143 deletions(-) create mode 100644 scripts/tools/Deferred.ts create mode 100644 scripts/tools/SemVer.ts create mode 100644 scripts/tools/StatefulObservable.ts create mode 100644 scripts/tools/crawl.ts create mode 100644 scripts/tools/fs.existsAsync.ts create mode 100644 scripts/tools/fs.rm.ts create mode 100644 scripts/tools/fs.rmSync.ts create mode 100644 scripts/tools/getThisCodebaseRootDirPath.ts create mode 100644 scripts/tools/partitionPromiseSettledResults.ts create mode 100644 scripts/tools/transformCodebase.ts create mode 100644 scripts/tools/waitForDebounce.ts diff --git a/package.json b/package.json index 224f1234..729d3a8e 100644 --- a/package.json +++ b/package.json @@ -54,6 +54,10 @@ "tsx": "^4.15.5", "@angular/core": "^18.2.6", "@angular/common": "^18.2.6", - "@angular/platform-browser": "^18.2.6" + "@angular/platform-browser": "^18.2.6", + "@types/node": "^22.7.4", + "rxjs": "^7.8.1", + "zone.js": "^0.14.0", + "chalk": "^5.3.0" } } diff --git a/scripts/build.ts b/scripts/build.ts index 027e80d8..72c6029b 100644 --- a/scripts/build.ts +++ b/scripts/build.ts @@ -1,140 +1,29 @@ import * as fs from "fs"; import { join } from "path"; -import { assert } from "tsafe/assert"; -import { transformCodebase } from "../../src/bin/tools/transformCodebase"; -import { createPublicKeycloakifyDevResourcesDir } from "./createPublicKeycloakifyDevResourcesDir"; -import { createAccountV1Dir } from "./createAccountV1Dir"; +import { transformCodebase } from "./tools/transformCodebase"; import chalk from "chalk"; -import { run } from "../shared/run"; -import { vendorFrontendDependencies } from "./vendorFrontendDependencies"; +import { run } from "./shared/run"; (async () => { console.log(chalk.cyan("Building Keycloakify...")); const startTime = Date.now(); - if (fs.existsSync(join("dist", "bin", "main.original.js"))) { - fs.renameSync( - join("dist", "bin", "main.original.js"), - join("dist", "bin", "main.js") - ); - - fs.readdirSync(join("dist", "bin")).forEach(fileBasename => { - if (/[0-9]\.index.js/.test(fileBasename) || fileBasename.endsWith(".node")) { - fs.rmSync(join("dist", "bin", fileBasename)); - } - }); - } - - run(`npx tsc -p ${join("src", "bin", "tsconfig.json")}`); - - if ( - !fs - .readFileSync(join("dist", "bin", "main.js")) - .toString("utf8") - .includes("__nccwpck_require__") - ) { - fs.cpSync( - join("dist", "bin", "main.js"), - join("dist", "bin", "main.original.js") - ); - } - - run(`npx ncc build ${join("dist", "bin", "main.js")} -o ${join("dist", "ncc_out")}`); + run(`npx tsc -p ${join("src", "tsconfig.json")}`); transformCodebase({ - srcDirPath: join("dist", "ncc_out"), - destDirPath: join("dist", "bin"), + srcDirPath: join("src"), + destDirPath: join("dist"), transformSourceCode: ({ fileRelativePath, sourceCode }) => { - if (fileRelativePath === "index.js") { - return { - newFileName: "main.js", - modifiedSourceCode: sourceCode - }; + if (!fileRelativePath.endsWith(".html")) { + return undefined; } return { modifiedSourceCode: sourceCode }; } }); - fs.rmSync(join("dist", "ncc_out"), { recursive: true }); - - { - let hasBeenPatched = false; - - fs.readdirSync(join("dist", "bin")).forEach(fileBasename => { - if (fileBasename !== "main.js" && !fileBasename.endsWith(".index.js")) { - return; - } - - const { hasBeenPatched: hasBeenPatched_i } = patchDeprecatedBufferApiUsage( - join("dist", "bin", fileBasename) - ); - - if (hasBeenPatched_i) { - hasBeenPatched = true; - } - }); - - assert(hasBeenPatched); - } - - fs.chmodSync( - join("dist", "bin", "main.js"), - fs.statSync(join("dist", "bin", "main.js")).mode | - fs.constants.S_IXUSR | - fs.constants.S_IXGRP | - fs.constants.S_IXOTH - ); - - run(`npx tsc -p ${join("src", "tsconfig.json")}`); run(`npx tsc-alias -p ${join("src", "tsconfig.json")}`); - vendorFrontendDependencies({ distDirPath: join(process.cwd(), "dist") }); - - if (fs.existsSync(join("dist", "vite-plugin", "index.original.js"))) { - fs.renameSync( - join("dist", "vite-plugin", "index.original.js"), - join("dist", "vite-plugin", "index.js") - ); - } - - run(`npx tsc -p ${join("src", "vite-plugin", "tsconfig.json")}`); - - if ( - !fs - .readFileSync(join("dist", "vite-plugin", "index.js")) - .toString("utf8") - .includes("__nccwpck_require__") - ) { - fs.cpSync( - join("dist", "vite-plugin", "index.js"), - join("dist", "vite-plugin", "index.original.js") - ); - } - - run( - `npx ncc build ${join("dist", "vite-plugin", "index.js")} -o ${join( - "dist", - "ncc_out" - )}` - ); - - fs.readdirSync(join("dist", "ncc_out")).forEach(fileBasename => { - assert(!fileBasename.endsWith(".index.js")); - assert(!fileBasename.endsWith(".node")); - }); - - transformCodebase({ - srcDirPath: join("dist", "ncc_out"), - destDirPath: join("dist", "vite-plugin"), - transformSourceCode: ({ fileRelativePath, sourceCode }) => { - assert(fileRelativePath === "index.js"); - - return { modifiedSourceCode: sourceCode }; - } - }); - - fs.rmSync(join("dist", "ncc_out"), { recursive: true }); { const dirBasename = "src"; @@ -146,9 +35,7 @@ import { vendorFrontendDependencies } from "./vendorFrontendDependencies"; fs.cpSync(dirBasename, destDirPath, { recursive: true }); } - await createPublicKeycloakifyDevResourcesDir(); - await createAccountV1Dir(); - + /* transformCodebase({ srcDirPath: join("stories"), destDirPath: join("dist", "stories"), @@ -160,23 +47,9 @@ import { vendorFrontendDependencies } from "./vendorFrontendDependencies"; return { modifiedSourceCode: sourceCode }; } }); + */ console.log( chalk.green(`✓ built in ${((Date.now() - startTime) / 1000).toFixed(2)}s`) ); })(); - -function patchDeprecatedBufferApiUsage(filePath: string) { - const before = fs.readFileSync(filePath).toString("utf8"); - - const after = before.replace( - `var buffer = new Buffer(toRead);`, - `var buffer = Buffer.allocUnsafe ? Buffer.allocUnsafe(toRead) : new Buffer(toRead);` - ); - - fs.writeFileSync(filePath, Buffer.from(after, "utf8")); - - const hasBeenPatched = after !== before; - - return { hasBeenPatched }; -} diff --git a/scripts/link-in-app.ts b/scripts/link-in-app.ts index da7661fc..340d37ed 100644 --- a/scripts/link-in-app.ts +++ b/scripts/link-in-app.ts @@ -1,15 +1,15 @@ import { execSync } from "child_process"; import { join as pathJoin, relative as pathRelative } from "path"; -import { getThisCodebaseRootDirPath } from "../src/bin/tools/getThisCodebaseRootDirPath"; +import { getThisCodebaseRootDirPath } from "./tools/getThisCodebaseRootDirPath"; import * as fs from "fs"; import * as os from "os"; -const singletonDependencies: string[] = ["react", "@types/react"]; +const singletonDependencies: string[] = ["keycloakify", "rxjs", "zone.js"]; // For example [ "@emotion" ] it's more convenient than // having to list every sub emotion packages (@emotion/css @emotion/utils ...) // in singletonDependencies -const namespaceSingletonDependencies: string[] = []; +const namespaceSingletonDependencies: string[] = ["@angular"]; const rootDirPath = getThisCodebaseRootDirPath(); diff --git a/scripts/shared/cacheDirPath.ts b/scripts/shared/cacheDirPath.ts index cf7b0af7..004b824b 100644 --- a/scripts/shared/cacheDirPath.ts +++ b/scripts/shared/cacheDirPath.ts @@ -1,5 +1,5 @@ import { join as pathJoin } from "path"; -import { getThisCodebaseRootDirPath } from "../../src/bin/tools/getThisCodebaseRootDirPath"; +import { getThisCodebaseRootDirPath } from "../tools/getThisCodebaseRootDirPath"; export const cacheDirPath = pathJoin( getThisCodebaseRootDirPath(), diff --git a/scripts/shared/startRebuildOnSrcChange.ts b/scripts/shared/startRebuildOnSrcChange.ts index e630664f..5cccc0c2 100644 --- a/scripts/shared/startRebuildOnSrcChange.ts +++ b/scripts/shared/startRebuildOnSrcChange.ts @@ -1,5 +1,5 @@ import * as child_process from "child_process"; -import { waitForDebounceFactory } from "powerhooks/tools/waitForDebounce"; +import { waitForDebounceFactory } from "../tools/waitForDebounce"; import chokidar from "chokidar"; import * as runExclusive from "run-exclusive"; import { Deferred } from "evt/tools/Deferred"; diff --git a/scripts/tools/Deferred.ts b/scripts/tools/Deferred.ts new file mode 100644 index 00000000..06510a16 --- /dev/null +++ b/scripts/tools/Deferred.ts @@ -0,0 +1,39 @@ +import { overwriteReadonlyProp } from "tsafe/lab/overwriteReadonlyProp"; + +export class Deferred { + public readonly pr: Promise; + + /** NOTE: Does not need to be called bound to instance*/ + public readonly resolve: (value: T) => void; + public readonly reject: (error: any) => void; + + constructor() { + let resolve!: (value: T) => void; + let reject!: (error: any) => void; + + this.pr = new Promise((resolve_, reject_) => { + resolve = value => { + overwriteReadonlyProp(this, "isPending", false); + resolve_(value); + }; + + reject = error => { + overwriteReadonlyProp(this, "isPending", false); + reject_(error); + }; + }); + + this.resolve = resolve; + this.reject = reject; + } + + public readonly isPending: boolean = true; +} + +export namespace Deferred { + export type Unpack> = T extends Deferred ? U : never; +} + +export class VoidDeferred extends Deferred { + public declare readonly resolve: () => void; +} diff --git a/scripts/tools/SemVer.ts b/scripts/tools/SemVer.ts new file mode 100644 index 00000000..5a7b3d93 --- /dev/null +++ b/scripts/tools/SemVer.ts @@ -0,0 +1,118 @@ +export type SemVer = { + major: number; + minor: number; + patch: number; + rc?: number; + parsedFrom: string; +}; + +export namespace SemVer { + const bumpTypes = ["major", "minor", "patch", "rc", "no bump"] as const; + + export type BumpType = (typeof bumpTypes)[number]; + + export function parse(versionStr: string): SemVer { + const match = versionStr.match( + /^v?([0-9]+)\.([0-9]+)(?:\.([0-9]+))?(?:-rc.([0-9]+))?$/ + ); + + if (!match) { + throw new Error(`${versionStr} is not a valid semantic version`); + } + + const semVer: Omit = { + major: parseInt(match[1]), + minor: parseInt(match[2]), + patch: (() => { + const str = match[3]; + + return str === undefined ? 0 : parseInt(str); + })(), + ...(() => { + const str = match[4]; + return str === undefined ? {} : { rc: parseInt(str) }; + })() + }; + + const initialStr = stringify(semVer); + + Object.defineProperty(semVer, "parsedFrom", { + enumerable: true, + get: function () { + const currentStr = stringify(this); + + if (currentStr !== initialStr) { + throw new Error( + `SemVer.parsedFrom can't be read anymore, the version have been modified from ${initialStr} to ${currentStr}` + ); + } + + return versionStr; + } + }); + + return semVer as any; + } + + export function stringify(v: Omit): string { + return `${v.major}.${v.minor}.${v.patch}${ + v.rc === undefined ? "" : `-rc.${v.rc}` + }`; + } + + /** + * + * v1 < v2 => -1 + * v1 === v2 => 0 + * v1 > v2 => 1 + * + */ + export function compare(v1: SemVer, v2: SemVer): -1 | 0 | 1 { + const sign = (diff: number): -1 | 0 | 1 => (diff === 0 ? 0 : diff < 0 ? -1 : 1); + const noUndefined = (n: number | undefined) => n ?? Infinity; + + for (const level of ["major", "minor", "patch", "rc"] as const) { + if (noUndefined(v1[level]) !== noUndefined(v2[level])) { + return sign(noUndefined(v1[level]) - noUndefined(v2[level])); + } + } + + return 0; + } + + /* + console.log(compare(parse("3.0.0-rc.3"), parse("3.0.0")) === -1 ) + console.log(compare(parse("3.0.0-rc.3"), parse("3.0.0-rc.4")) === -1 ) + console.log(compare(parse("3.0.0-rc.3"), parse("4.0.0")) === -1 ) + */ + + export function bumpType(params: { + versionBehind: string | SemVer; + versionAhead: string | SemVer; + }): BumpType | "no bump" { + const versionAhead = + typeof params.versionAhead === "string" + ? parse(params.versionAhead) + : params.versionAhead; + const versionBehind = + typeof params.versionBehind === "string" + ? parse(params.versionBehind) + : params.versionBehind; + + if (compare(versionBehind, versionAhead) === 1) { + throw new Error( + `Version regression ${stringify(versionBehind)} -> ${stringify( + versionAhead + )}` + ); + } + + for (const level of ["major", "minor", "patch", "rc"] as const) { + if (versionBehind[level] !== versionAhead[level]) { + return level; + } + } + + return "no bump"; + } +} diff --git a/scripts/tools/StatefulObservable.ts b/scripts/tools/StatefulObservable.ts new file mode 100644 index 00000000..7b43b5a4 --- /dev/null +++ b/scripts/tools/StatefulObservable.ts @@ -0,0 +1,57 @@ +export type StatefulObservable = { + current: T; + subscribe: (next: (data: T) => void) => Subscription; +}; + +export type StatefulReadonlyObservable = { + readonly current: T; + subscribe: (next: (data: T) => void) => Subscription; +}; + +export type Subscription = { + unsubscribe(): void; +}; + +export function createStatefulObservable( + getInitialValue: () => T +): StatefulObservable { + let nextFunctions: ((data: T) => void)[] = []; + + const { get, set } = (() => { + let wrappedState: [T] | undefined = undefined; + + return { + get: () => { + if (wrappedState === undefined) { + wrappedState = [getInitialValue()]; + } + return wrappedState[0]; + }, + set: (data: T) => { + wrappedState = [data]; + + nextFunctions.forEach(next => next(data)); + } + }; + })(); + + return Object.defineProperty( + { + current: null as any as T, + subscribe: (next: (data: T) => void) => { + nextFunctions.push(next); + + return { + unsubscribe: () => + nextFunctions.splice(nextFunctions.indexOf(next), 1) + }; + } + }, + "current", + { + enumerable: true, + get, + set + } + ); +} diff --git a/scripts/tools/crawl.ts b/scripts/tools/crawl.ts new file mode 100644 index 00000000..86ba2078 --- /dev/null +++ b/scripts/tools/crawl.ts @@ -0,0 +1,35 @@ +import * as fs from "fs"; +import { join as pathJoin, relative as pathRelative } from "path"; + +const crawlRec = (dirPath: string, filePaths: string[]) => { + for (const basename of fs.readdirSync(dirPath)) { + const fileOrDirPath = pathJoin(dirPath, basename); + + if (fs.lstatSync(fileOrDirPath).isDirectory()) { + crawlRec(fileOrDirPath, filePaths); + + continue; + } + + filePaths.push(fileOrDirPath); + } +}; + +/** List all files in a given directory return paths relative to the dir_path */ +export function crawl(params: { + dirPath: string; + returnedPathsType: "absolute" | "relative to dirPath"; +}): string[] { + const { dirPath, returnedPathsType } = params; + + const filePaths: string[] = []; + + crawlRec(dirPath, filePaths); + + switch (returnedPathsType) { + case "absolute": + return filePaths; + case "relative to dirPath": + return filePaths.map(filePath => pathRelative(dirPath, filePath)); + } +} diff --git a/scripts/tools/fs.existsAsync.ts b/scripts/tools/fs.existsAsync.ts new file mode 100644 index 00000000..359caabd --- /dev/null +++ b/scripts/tools/fs.existsAsync.ts @@ -0,0 +1,11 @@ +import * as fs from "fs/promises"; + +export async function existsAsync(path: string) { + try { + await fs.stat(path); + return true; + } catch (error) { + if ((error as Error & { code: string }).code === "ENOENT") return false; + throw error; + } +} diff --git a/scripts/tools/fs.rm.ts b/scripts/tools/fs.rm.ts new file mode 100644 index 00000000..4dd28c2b --- /dev/null +++ b/scripts/tools/fs.rm.ts @@ -0,0 +1,43 @@ +import * as fs from "fs/promises"; +import { join as pathJoin } from "path"; +import { SemVer } from "./SemVer"; + +/** + * Polyfill of fs.rm(dirPath, { "recursive": true }) + * For older version of Node + */ +export async function rm(dirPath: string, options: { recursive: true; force?: true }) { + if (SemVer.compare(SemVer.parse(process.version), SemVer.parse("14.14.0")) > 0) { + return fs.rm(dirPath, options); + } + + const { force = true } = options; + + if (force && !(await checkDirExists(dirPath))) { + return; + } + + const removeDir_rec = async (dirPath: string) => + Promise.all( + (await fs.readdir(dirPath)).map(async basename => { + const fileOrDirpath = pathJoin(dirPath, basename); + + if ((await fs.lstat(fileOrDirpath)).isDirectory()) { + await removeDir_rec(fileOrDirpath); + } else { + await fs.unlink(fileOrDirpath); + } + }) + ); + + await removeDir_rec(dirPath); +} + +async function checkDirExists(dirPath: string) { + try { + await fs.access(dirPath, fs.constants.F_OK); + return true; + } catch { + return false; + } +} diff --git a/scripts/tools/fs.rmSync.ts b/scripts/tools/fs.rmSync.ts new file mode 100644 index 00000000..866063f8 --- /dev/null +++ b/scripts/tools/fs.rmSync.ts @@ -0,0 +1,34 @@ +import * as fs from "fs"; +import { join as pathJoin } from "path"; +import { SemVer } from "./SemVer"; + +/** + * Polyfill of fs.rmSync(dirPath, { "recursive": true }) + * For older version of Node + */ +export function rmSync(dirPath: string, options: { recursive: true; force?: true }) { + if (SemVer.compare(SemVer.parse(process.version), SemVer.parse("14.14.0")) > 0) { + fs.rmSync(dirPath, options); + return; + } + + const { force = true } = options; + + if (force && !fs.existsSync(dirPath)) { + return; + } + + const removeDir_rec = (dirPath: string) => + fs.readdirSync(dirPath).forEach(basename => { + const fileOrDirPath = pathJoin(dirPath, basename); + + if (fs.lstatSync(fileOrDirPath).isDirectory()) { + removeDir_rec(fileOrDirPath); + return; + } else { + fs.unlinkSync(fileOrDirPath); + } + }); + + removeDir_rec(dirPath); +} diff --git a/scripts/tools/getThisCodebaseRootDirPath.ts b/scripts/tools/getThisCodebaseRootDirPath.ts new file mode 100644 index 00000000..f880ffc9 --- /dev/null +++ b/scripts/tools/getThisCodebaseRootDirPath.ts @@ -0,0 +1,19 @@ +import * as fs from "fs"; +import * as path from "path"; + +function getThisCodebaseRootDirPath_rec(dirPath: string): string { + if (fs.existsSync(path.join(dirPath, "package.json"))) { + return dirPath; + } + return getThisCodebaseRootDirPath_rec(path.join(dirPath, "..")); +} + +let result: string | undefined = undefined; + +export function getThisCodebaseRootDirPath(): string { + if (result !== undefined) { + return result; + } + + return (result = getThisCodebaseRootDirPath_rec(__dirname)); +} diff --git a/scripts/tools/partitionPromiseSettledResults.ts b/scripts/tools/partitionPromiseSettledResults.ts new file mode 100644 index 00000000..c682790b --- /dev/null +++ b/scripts/tools/partitionPromiseSettledResults.ts @@ -0,0 +1,20 @@ +export type PromiseSettledAndPartitioned = [T[], any[]]; + +export function partitionPromiseSettledResults() { + return [ + ( + [successes, failures]: PromiseSettledAndPartitioned, + item: PromiseSettledResult + ) => + item.status === "rejected" + ? ([ + successes, + [item.reason, ...failures] + ] as PromiseSettledAndPartitioned) + : ([ + [item.value, ...successes], + failures + ] as PromiseSettledAndPartitioned), + [[], []] as PromiseSettledAndPartitioned + ] as const; +} diff --git a/scripts/tools/transformCodebase.ts b/scripts/tools/transformCodebase.ts new file mode 100644 index 00000000..94957244 --- /dev/null +++ b/scripts/tools/transformCodebase.ts @@ -0,0 +1,88 @@ +import * as fs from "fs"; +import * as path from "path"; +import { crawl } from "./crawl"; +import { rmSync } from "../tools/fs.rmSync"; + +type TransformSourceCode = (params: { + sourceCode: Buffer; + filePath: string; + fileRelativePath: string; +}) => + | { + modifiedSourceCode: Buffer; + newFileName?: string; + } + | undefined; + +/** + * Apply a transformation function to every file of directory + * If source and destination are the same this function can be used to apply the transformation in place + * like filtering out some files or modifying them. + * */ +export function transformCodebase(params: { + srcDirPath: string; + destDirPath: string; + transformSourceCode?: TransformSourceCode; +}) { + const { srcDirPath, transformSourceCode } = params; + + const isTargetSameAsSource = path.relative(srcDirPath, params.destDirPath) === ""; + + const destDirPath = isTargetSameAsSource + ? path.join(srcDirPath, "..", "tmp_xOsPdkPsTdzPs34sOkHs") + : params.destDirPath; + + fs.mkdirSync(destDirPath, { + recursive: true + }); + + for (const fileRelativePath of crawl({ + dirPath: srcDirPath, + returnedPathsType: "relative to dirPath" + })) { + const filePath = path.join(srcDirPath, fileRelativePath); + const destFilePath = path.join(destDirPath, fileRelativePath); + + // NOTE: Optimization, if we don't need to transform the file, just copy + // it using the lower level implementation. + if (transformSourceCode === undefined) { + fs.mkdirSync(path.dirname(destFilePath), { + recursive: true + }); + + fs.copyFileSync(filePath, destFilePath); + + continue; + } + + const transformSourceCodeResult = transformSourceCode({ + sourceCode: fs.readFileSync(filePath), + filePath, + fileRelativePath + }); + + if (transformSourceCodeResult === undefined) { + continue; + } + + fs.mkdirSync(path.dirname(destFilePath), { + recursive: true + }); + + const { newFileName, modifiedSourceCode } = transformSourceCodeResult; + + fs.writeFileSync( + path.join( + path.dirname(destFilePath), + newFileName ?? path.basename(destFilePath) + ), + modifiedSourceCode + ); + } + + if (isTargetSameAsSource) { + rmSync(srcDirPath, { recursive: true }); + + fs.renameSync(destDirPath, srcDirPath); + } +} diff --git a/scripts/tools/waitForDebounce.ts b/scripts/tools/waitForDebounce.ts new file mode 100644 index 00000000..b53bf9e3 --- /dev/null +++ b/scripts/tools/waitForDebounce.ts @@ -0,0 +1,48 @@ +import { Deferred } from "./Deferred"; +import { createStatefulObservable } from "./StatefulObservable"; + +export function waitForDebounceFactory(params: { delay: number }) { + const { delay } = params; + + const obsCurr = createStatefulObservable< + { timer: ReturnType; startTime: number } | undefined + >(() => undefined); + + function waitForDebounce(): Promise { + const dOut = new Deferred(); + + const timerCallback = () => { + obsCurr.current = undefined; + dOut.resolve(); + }; + + if (obsCurr.current !== undefined) { + clearTimeout(obsCurr.current.timer); + + obsCurr.current.timer = setTimeout( + timerCallback, + delay - (Date.now() - obsCurr.current.startTime) + ); + + return dOut.pr; + } else { + const startTime = Date.now(); + + obsCurr.current = { + timer: setTimeout(timerCallback, delay), + startTime + }; + } + + return dOut.pr; + } + + const obsIsDebouncing = createStatefulObservable(() => false); + + obsCurr.subscribe(curr => (obsIsDebouncing.current = curr !== undefined)); + + return { + waitForDebounce, + obsIsDebouncing + }; +} diff --git a/yarn.lock b/yarn.lock index 866b3c3a..df48ed06 100644 --- a/yarn.lock +++ b/yarn.lock @@ -187,6 +187,13 @@ "@nodelib/fs.scandir" "2.1.5" fastq "^1.6.0" +"@types/node@^22.7.4": + version "22.7.4" + resolved "https://registry.yarnpkg.com/@types/node/-/node-22.7.4.tgz#e35d6f48dca3255ce44256ddc05dee1c23353fcc" + integrity sha512-y+NPi1rFzDs1NdQHHToqeiX2TIS79SWEAw9GYhkkx8bD0ChpfqC+n2j5OXOCpzfojBEBt6DnEnnG9MY0zk1XLg== + dependencies: + undici-types "~6.19.2" + "@types/parse-json@^4.0.0": version "4.0.2" resolved "https://registry.yarnpkg.com/@types/parse-json/-/parse-json-4.0.2.tgz#5950e50960793055845e956c427fc2b0d70c5239" @@ -283,6 +290,11 @@ chalk@^4.0.0: ansi-styles "^4.1.0" supports-color "^7.1.0" +chalk@^5.3.0: + version "5.3.0" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-5.3.0.tgz#67c20a7ebef70e7f3970a01f90fa210cb6860385" + integrity sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w== + chokidar@^3.5.3: version "3.6.0" resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.6.0.tgz#197c6cc669ef2a8dc5e7b4d97ee4e092c3eb0d5b" @@ -931,7 +943,7 @@ run-parallel@^1.1.9: dependencies: queue-microtask "^1.2.2" -rxjs@^7.5.1: +rxjs@^7.5.1, rxjs@^7.8.1: version "7.8.1" resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-7.8.1.tgz#6f6f3d99ea8044291efd92e7c7fcf562c4057543" integrity sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg== @@ -1098,6 +1110,11 @@ typescript@^4.9.4: resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.9.5.tgz#095979f9bcc0d09da324d58d03ce8f8374cbe65a" integrity sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g== +undici-types@~6.19.2: + version "6.19.8" + resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-6.19.8.tgz#35111c9d1437ab83a7cdc0abae2f26d88eda0a02" + integrity sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw== + which-pm-runs@^1.0.0: version "1.1.0" resolved "https://registry.yarnpkg.com/which-pm-runs/-/which-pm-runs-1.1.0.tgz#35ccf7b1a0fce87bd8b92a478c9d045785d3bf35" @@ -1137,3 +1154,8 @@ yocto-queue@^0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-0.1.0.tgz#0294eb3dee05028d31ee1a5fa2c556a6aaf10a1b" integrity sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q== + +zone.js@^0.14.0: + version "0.14.10" + resolved "https://registry.yarnpkg.com/zone.js/-/zone.js-0.14.10.tgz#23b8b29687c6bffece996e5ee5b854050e7775c8" + integrity sha512-YGAhaO7J5ywOXW6InXNlLmfU194F8lVgu7bRntUF3TiG8Y3nBK0x1UJJuHUP/e8IyihkjCYqhCScpSwnlaSRkQ== From 0df1e0c1b607bd5ba8dfce6fc4f766a9c5eddaaa Mon Sep 17 00:00:00 2001 From: Joseph Garrone Date: Mon, 30 Sep 2024 01:13:50 +0200 Subject: [PATCH 05/64] Fix CI --- .github/FUNDING.yaml | 4 ---- .github/workflows/ci.yaml | 32 ++++---------------------------- package.json | 2 +- 3 files changed, 5 insertions(+), 33 deletions(-) delete mode 100644 .github/FUNDING.yaml diff --git a/.github/FUNDING.yaml b/.github/FUNDING.yaml deleted file mode 100644 index daf83ff5..00000000 --- a/.github/FUNDING.yaml +++ /dev/null @@ -1,4 +0,0 @@ -# These are supported funding model platforms - -github: [garronej] -custom: ['https://www.ringerhq.com/experts/garronej'] diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml index 9fca0a23..81fb9b81 100644 --- a/.github/workflows/ci.yaml +++ b/.github/workflows/ci.yaml @@ -9,9 +9,8 @@ on: jobs: - test_lint: + test_format: runs-on: ubuntu-latest - if: ${{ !github.event.created && github.repository != 'garronej/ts-ci' }} steps: - uses: actions/checkout@v4 - uses: actions/setup-node@v4 @@ -19,37 +18,14 @@ jobs: - name: If this step fails run 'npm run format' then commit again. run: npm run _format --list-different test: - runs-on: ${{ matrix.os }} - needs: test_lint - strategy: - matrix: - node: [ '18' ] - os: [ ubuntu-latest ] - name: Test with Node v${{ matrix.node }} on ${{ matrix.os }} - steps: - - uses: actions/checkout@v4 - - uses: actions/setup-node@v4 - with: - node-version: ${{ matrix.node }} - - uses: bahmutov/npm-install@v1 - - run: npm run build - - run: npm run test - - storybook: runs-on: ubuntu-latest - if: github.event_name == 'push' && github.ref == 'refs/heads/main' - needs: test + needs: test_format steps: - uses: actions/checkout@v4 - uses: actions/setup-node@v4 - with: - node-version: '18' - uses: bahmutov/npm-install@v1 - - run: npm run build-storybook - - run: git remote set-url origin https://git:${GITHUB_TOKEN}@github.com/${{github.repository}}.git - env: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - - run: npx -y -p gh-pages@3.1.0 gh-pages -d ./storybook-static -u "github-actions-bot " + - run: npm run build + #- run: npm run test check_if_version_upgraded: name: Check if version upgrade diff --git a/package.json b/package.json index 729d3a8e..fbc2fa99 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@keycloakify/angular", - "version": "0.0.1", + "version": "0.0.0", "description": "Angular components for Keycloakify", "repository": { "type": "git", From 3ef36bd11755ffddb6610cf942b6e500f6ef5c20 Mon Sep 17 00:00:00 2001 From: Joseph Garrone Date: Mon, 30 Sep 2024 01:36:04 +0200 Subject: [PATCH 06/64] Building --- package.json | 6 +++--- .../field-errors/field-errors.component.ts | 5 +---- .../group-label/group-label.component.ts | 5 +---- .../input-field-by-type.component.ts | 15 ++++++--------- .../input-tag-selects.component.ts | 5 +---- .../components/input-tag/input-tag.component.ts | 9 +++------ .../logout-other-sessions.component.ts | 5 +---- .../password-wrapper.component.ts | 5 +---- .../components/select-tag/select-tag.component.ts | 5 +---- .../textarea-tag/textarea-tag.component.ts | 5 +---- .../user-profile-form-fields.component.ts | 8 ++++---- src/login/containers/template.component.ts | 14 +++++++------- src/login/pages/code/code.component.ts | 2 +- .../delete-account-confirm.component.ts | 2 +- .../delete-credential.component.ts | 2 +- src/login/pages/error/error.component.ts | 2 +- .../frontchannel-logout.component.ts | 2 +- .../idp-review-user-profile.component.ts | 2 +- src/login/pages/info/info.component.ts | 2 +- .../login-config-totp.component.ts | 2 +- .../login-idp-link-confirm-override.component.ts | 2 +- .../login-idp-link-confirm.component.ts | 2 +- .../login-idp-link-email.component.ts | 2 +- .../login-oauth-grant.component.ts | 2 +- ...in-oauth2-device-verify-user-code.component.ts | 2 +- src/login/pages/login-otp/login-otp.component.ts | 2 +- .../login-page-expired.component.ts | 2 +- ...passkeys-conditional-authenticate.component.ts | 2 +- .../login-password/login-password.component.ts | 2 +- .../login-recovery-authn-code-config.component.ts | 2 +- .../login-recovery-authn-code-input.component.ts | 2 +- .../login-reset-otp/login-reset-otp.component.ts | 2 +- .../login-reset-password.component.ts | 2 +- .../login-update-password.component.ts | 2 +- .../login-update-profile.component.ts | 2 +- .../login-username/login-username.component.ts | 2 +- .../login-verify-email.component.ts | 2 +- .../login-x509-info/login-x509-info.component.ts | 2 +- src/login/pages/login/login.component.ts | 2 +- .../logout-confirm/logout-confirm.component.ts | 2 +- src/login/pages/register/register.component.ts | 2 +- .../saml-post-form/saml-post-form.component.ts | 2 +- .../select-authenticator.component.ts | 2 +- src/login/pages/terms/terms.component.ts | 2 +- .../pages/update-email/update-email.component.ts | 2 +- .../webauthn-authenticate.component.ts | 2 +- .../webauthn-error/webauthn-error.component.ts | 2 +- .../webauthn-register.component.ts | 2 +- src/login/pipes/advanced-msg-str.pipe.ts | 2 +- src/login/pipes/msg-str.pipe.ts | 2 +- .../services/login-resource-injector.service.ts | 2 +- src/login/services/user-profile-form.service.ts | 2 +- yarn.lock | 8 ++++---- 53 files changed, 74 insertions(+), 101 deletions(-) diff --git a/package.json b/package.json index fbc2fa99..85c05397 100644 --- a/package.json +++ b/package.json @@ -7,7 +7,7 @@ "url": "git://github.com/keycloakify/keycloakify-angular.git" }, "scripts": { - "build": "tsx scripts/build/main.ts", + "build": "tsx scripts/build.ts", "link-in-starter": "tsx scripts/link-in-starter.ts", "_format": "prettier '**/*.{ts,tsx,json,md}'", "format": "yarn _format --write", @@ -39,13 +39,13 @@ "tsafe": "^1.6.6" }, "peerDependencies": { - "keycloakify": "^11.2.0", + "keycloakify": "^11.2.2", "@angular/core": "^18.0.0", "@angular/common": "^18.0.0", "@angular/platform-browser": "^18.0.0" }, "devDependencies": { - "keycloakify": "^11.2.0", + "keycloakify": "^11.2.2", "prettier": "^3.2.5", "typescript": "^4.9.4", "husky": "^4.3.8", diff --git a/src/login/components/field-errors/field-errors.component.ts b/src/login/components/field-errors/field-errors.component.ts index 9d21d907..eea0297c 100644 --- a/src/login/components/field-errors/field-errors.component.ts +++ b/src/login/components/field-errors/field-errors.component.ts @@ -5,10 +5,7 @@ import { inject, input } from "@angular/core"; -import { - CLASSES, - USE_DEFAULT_CSS -} from "@keycloakify/angular/lib/providers/keycloakify-angular.providers"; +import { CLASSES, USE_DEFAULT_CSS } from "@keycloakify/angular/lib/public-api"; import { Attribute } from "keycloakify/login/KcContext"; import { ClassKey } from "keycloakify/login/lib/kcClsx"; import { ComponentReference } from "@keycloakify/angular/login/classes/component-reference.class"; diff --git a/src/login/components/group-label/group-label.component.ts b/src/login/components/group-label/group-label.component.ts index e88d3979..2402d888 100644 --- a/src/login/components/group-label/group-label.component.ts +++ b/src/login/components/group-label/group-label.component.ts @@ -6,10 +6,7 @@ import { inject, input } from "@angular/core"; -import { - CLASSES, - USE_DEFAULT_CSS -} from "@keycloakify/angular/lib/providers/keycloakify-angular.providers"; +import { CLASSES, USE_DEFAULT_CSS } from "@keycloakify/angular/lib/public-api"; import { Attribute } from "keycloakify/login/KcContext"; import { ClassKey } from "keycloakify/login/lib/kcClsx"; import { ComponentReference } from "@keycloakify/angular/login/classes/component-reference.class"; diff --git a/src/login/components/input-field-by-type/input-field-by-type.component.ts b/src/login/components/input-field-by-type/input-field-by-type.component.ts index b2bdadbd..be603a8d 100644 --- a/src/login/components/input-field-by-type/input-field-by-type.component.ts +++ b/src/login/components/input-field-by-type/input-field-by-type.component.ts @@ -7,10 +7,7 @@ import { input, output } from "@angular/core"; -import { - CLASSES, - USE_DEFAULT_CSS -} from "@keycloakify/angular/lib/providers/keycloakify-angular.providers"; +import { CLASSES, USE_DEFAULT_CSS } from "@keycloakify/angular/lib/public-api"; import { Attribute } from "keycloakify/login/KcContext"; import { ClassKey } from "keycloakify/login/lib/kcClsx"; import { ComponentReference } from "@keycloakify/angular/login/classes/component-reference.class"; @@ -19,11 +16,11 @@ import { FormAction, FormFieldError } from "@keycloakify/angular/login/services/user-profile-form.service"; -import { InputTagSelectsComponent } from "../input-tag-selects/input-tag-selects.component"; -import { InputTagComponent } from "../input-tag/input-tag.component"; -import { PasswordWrapperComponent } from "../password-wrapper/password-wrapper.component"; -import { SelectTagComponent } from "../select-tag/select-tag.component"; -import { TextareaTagComponent } from "../textarea-tag/textarea-tag.component"; +import { InputTagSelectsComponent } from "@keycloakify/angular/login/components/input-tag-selects/input-tag-selects.component"; +import { InputTagComponent } from "@keycloakify/angular/login/components/input-tag/input-tag.component"; +import { PasswordWrapperComponent } from "@keycloakify/angular/login/components/password-wrapper/password-wrapper.component"; +import { SelectTagComponent } from "@keycloakify/angular/login/components/select-tag/select-tag.component"; +import { TextareaTagComponent } from "@keycloakify/angular/login/components/textarea-tag/textarea-tag.component"; @Component({ standalone: true, diff --git a/src/login/components/input-tag-selects/input-tag-selects.component.ts b/src/login/components/input-tag-selects/input-tag-selects.component.ts index 6da7c224..00dba4a8 100644 --- a/src/login/components/input-tag-selects/input-tag-selects.component.ts +++ b/src/login/components/input-tag-selects/input-tag-selects.component.ts @@ -8,10 +8,7 @@ import { output, Signal } from "@angular/core"; -import { - CLASSES, - USE_DEFAULT_CSS -} from "@keycloakify/angular/lib/providers/keycloakify-angular.providers"; +import { CLASSES, USE_DEFAULT_CSS } from "@keycloakify/angular/lib/public-api"; import { Attribute } from "keycloakify/login/KcContext"; import { ClassKey } from "keycloakify/login/lib/kcClsx"; import { ComponentReference } from "@keycloakify/angular/login/classes/component-reference.class"; diff --git a/src/login/components/input-tag/input-tag.component.ts b/src/login/components/input-tag/input-tag.component.ts index 7eb94420..5135e600 100644 --- a/src/login/components/input-tag/input-tag.component.ts +++ b/src/login/components/input-tag/input-tag.component.ts @@ -7,10 +7,7 @@ import { input, output } from "@angular/core"; -import { - CLASSES, - USE_DEFAULT_CSS -} from "@keycloakify/angular/lib/providers/keycloakify-angular.providers"; +import { CLASSES, USE_DEFAULT_CSS } from "@keycloakify/angular/lib/public-api"; import { Attribute } from "keycloakify/login/KcContext"; import { ClassKey } from "keycloakify/login/lib/kcClsx"; import { ComponentReference } from "@keycloakify/angular/login/classes/component-reference.class"; @@ -24,8 +21,8 @@ import { FormAction, FormFieldError } from "@keycloakify/angular/login/services/user-profile-form.service"; -import { AddRemoveButtonsMultiValuedAttributeComponent } from "../add-remove-buttons-multi-valued-attribute/add-remove-buttons-multi-valued-attribute.component"; -import { FieldErrorsComponent } from "../field-errors/field-errors.component"; +import { AddRemoveButtonsMultiValuedAttributeComponent } from "@keycloakify/angular/login/components/add-remove-buttons-multi-valued-attribute/add-remove-buttons-multi-valued-attribute.component"; +import { FieldErrorsComponent } from "@keycloakify/angular/login/components/field-errors/field-errors.component"; @Component({ standalone: true, diff --git a/src/login/components/logout-other-sessions/logout-other-sessions.component.ts b/src/login/components/logout-other-sessions/logout-other-sessions.component.ts index 841bc9b0..978ef2b8 100644 --- a/src/login/components/logout-other-sessions/logout-other-sessions.component.ts +++ b/src/login/components/logout-other-sessions/logout-other-sessions.component.ts @@ -1,8 +1,5 @@ import { ChangeDetectionStrategy, Component, forwardRef, inject } from "@angular/core"; -import { - CLASSES, - USE_DEFAULT_CSS -} from "@keycloakify/angular/lib/providers/keycloakify-angular.providers"; +import { CLASSES, USE_DEFAULT_CSS } from "@keycloakify/angular/lib/public-api"; import { ClassKey } from "keycloakify/login/lib/kcClsx"; import { ComponentReference } from "@keycloakify/angular/login/classes/component-reference.class"; import { KcClassDirective } from "@keycloakify/angular/login/directives/kc-class.directive"; diff --git a/src/login/components/password-wrapper/password-wrapper.component.ts b/src/login/components/password-wrapper/password-wrapper.component.ts index f41e1770..def92350 100644 --- a/src/login/components/password-wrapper/password-wrapper.component.ts +++ b/src/login/components/password-wrapper/password-wrapper.component.ts @@ -9,10 +9,7 @@ import { signal, WritableSignal } from "@angular/core"; -import { - CLASSES, - USE_DEFAULT_CSS -} from "@keycloakify/angular/lib/providers/keycloakify-angular.providers"; +import { CLASSES, USE_DEFAULT_CSS } from "@keycloakify/angular/lib/public-api"; import { ClassKey } from "keycloakify/login/lib/kcClsx"; import { ComponentReference } from "@keycloakify/angular/login/classes/component-reference.class"; import { KcClassDirective } from "@keycloakify/angular/login/directives/kc-class.directive"; diff --git a/src/login/components/select-tag/select-tag.component.ts b/src/login/components/select-tag/select-tag.component.ts index b07cd5a4..5dbccba1 100644 --- a/src/login/components/select-tag/select-tag.component.ts +++ b/src/login/components/select-tag/select-tag.component.ts @@ -7,10 +7,7 @@ import { input, output } from "@angular/core"; -import { - CLASSES, - USE_DEFAULT_CSS -} from "@keycloakify/angular/lib/providers/keycloakify-angular.providers"; +import { CLASSES, USE_DEFAULT_CSS } from "@keycloakify/angular/lib/public-api"; import { Attribute } from "keycloakify/login/KcContext"; import { ClassKey } from "keycloakify/login/lib/kcClsx"; import { ComponentReference } from "@keycloakify/angular/login/classes/component-reference.class"; diff --git a/src/login/components/textarea-tag/textarea-tag.component.ts b/src/login/components/textarea-tag/textarea-tag.component.ts index 99f73232..56673ea6 100644 --- a/src/login/components/textarea-tag/textarea-tag.component.ts +++ b/src/login/components/textarea-tag/textarea-tag.component.ts @@ -6,10 +6,7 @@ import { input, output } from "@angular/core"; -import { - CLASSES, - USE_DEFAULT_CSS -} from "@keycloakify/angular/lib/providers/keycloakify-angular.providers"; +import { CLASSES, USE_DEFAULT_CSS } from "@keycloakify/angular/lib/public-api"; import { Attribute } from "keycloakify/login/KcContext"; import { ClassKey } from "keycloakify/login/lib/kcClsx"; import { ComponentReference } from "@keycloakify/angular/login/classes/component-reference.class"; diff --git a/src/login/components/user-profile-form-fields/user-profile-form-fields.component.ts b/src/login/components/user-profile-form-fields/user-profile-form-fields.component.ts index 32b65de1..1d5b396f 100644 --- a/src/login/components/user-profile-form-fields/user-profile-form-fields.component.ts +++ b/src/login/components/user-profile-form-fields/user-profile-form-fields.component.ts @@ -14,7 +14,7 @@ import { KC_CONTEXT, CLASSES, USE_DEFAULT_CSS -} from "@keycloakify/angular/lib/providers/keycloakify-angular.providers"; +} from "@keycloakify/angular/lib/public-api"; import { ClassKey } from "keycloakify/login/lib/kcClsx"; import { KcContext } from "keycloakify/login/KcContext"; import { ComponentReference } from "@keycloakify/angular/login/classes/component-reference.class"; @@ -24,9 +24,9 @@ import { FormAction, UserProfileFormService } from "@keycloakify/angular/login/services/user-profile-form.service"; -import { FieldErrorsComponent } from "../field-errors/field-errors.component"; -import { GroupLabelComponent } from "../group-label/group-label.component"; -import { InputFieldByTypeComponent } from "../input-field-by-type/input-field-by-type.component"; +import { FieldErrorsComponent } from "@keycloakify/angular/login/components/field-errors/field-errors.component"; +import { GroupLabelComponent } from "@keycloakify/angular/login/components/group-label/group-label.component"; +import { InputFieldByTypeComponent } from "@keycloakify/angular/login/components/input-field-by-type/input-field-by-type.component"; @Component({ standalone: true, diff --git a/src/login/containers/template.component.ts b/src/login/containers/template.component.ts index ebcda00b..bee991f9 100644 --- a/src/login/containers/template.component.ts +++ b/src/login/containers/template.component.ts @@ -14,16 +14,16 @@ import { I18N, KC_CONTEXT, USE_DEFAULT_CSS -} from "@keycloakify/angular/lib/providers/keycloakify-angular.providers"; -import type { I18n } from "../i18n"; +} from "@keycloakify/angular/lib/public-api"; +import type { I18n } from "@keycloakify/angular/login/i18n"; import { KcContext } from "keycloakify/login/KcContext/KcContext"; import { ClassKey, getKcClsx } from "keycloakify/login/lib/kcClsx"; import { Observable } from "rxjs"; -import { ComponentReference } from "../classes/component-reference.class"; -import { KcClassDirective } from "../directives/kc-class.directive"; -import { KcSanitizePipe } from "../pipes"; -import { MsgStrPipe } from "../pipes/msg-str.pipe"; -import { LoginResourceInjectorService } from "../services/login-resource-injector.service"; +import { ComponentReference } from "@keycloakify/angular/login/classes/component-reference.class"; +import { KcClassDirective } from "@keycloakify/angular/login/directives/kc-class.directive"; +import { KcSanitizePipe } from "@keycloakify/angular/login/pipes"; +import { MsgStrPipe } from "@keycloakify/angular/login/pipes/msg-str.pipe"; +import { LoginResourceInjectorService } from "@keycloakify/angular/login/services/login-resource-injector.service"; @Component({ selector: "kc-login-template", diff --git a/src/login/pages/code/code.component.ts b/src/login/pages/code/code.component.ts index 4c2ae8a6..1300d9b5 100644 --- a/src/login/pages/code/code.component.ts +++ b/src/login/pages/code/code.component.ts @@ -3,7 +3,7 @@ import { CLASSES, KC_CONTEXT, USE_DEFAULT_CSS -} from "@keycloakify/angular/lib/providers/keycloakify-angular.providers"; +} from "@keycloakify/angular/lib/public-api"; import { ClassKey } from "keycloakify/login/lib/kcClsx"; import { KcContext } from "keycloakify/login/KcContext"; import { ComponentReference } from "@keycloakify/angular/login/classes/component-reference.class"; diff --git a/src/login/pages/delete-account-confirm/delete-account-confirm.component.ts b/src/login/pages/delete-account-confirm/delete-account-confirm.component.ts index d5c5471c..30a6d65f 100644 --- a/src/login/pages/delete-account-confirm/delete-account-confirm.component.ts +++ b/src/login/pages/delete-account-confirm/delete-account-confirm.component.ts @@ -3,7 +3,7 @@ import { CLASSES, KC_CONTEXT, USE_DEFAULT_CSS -} from "@keycloakify/angular/lib/providers/keycloakify-angular.providers"; +} from "@keycloakify/angular/lib/public-api"; import { ClassKey } from "keycloakify/login/lib/kcClsx"; import { KcContext } from "keycloakify/login/KcContext"; import { ComponentReference } from "@keycloakify/angular/login/classes/component-reference.class"; diff --git a/src/login/pages/delete-credential/delete-credential.component.ts b/src/login/pages/delete-credential/delete-credential.component.ts index 88db5c45..d15b9388 100644 --- a/src/login/pages/delete-credential/delete-credential.component.ts +++ b/src/login/pages/delete-credential/delete-credential.component.ts @@ -9,7 +9,7 @@ import { CLASSES, KC_CONTEXT, USE_DEFAULT_CSS -} from "@keycloakify/angular/lib/providers/keycloakify-angular.providers"; +} from "@keycloakify/angular/lib/public-api"; import { ClassKey } from "keycloakify/login/lib/kcClsx"; import { KcContext } from "keycloakify/login/KcContext"; import { ComponentReference } from "@keycloakify/angular/login/classes/component-reference.class"; diff --git a/src/login/pages/error/error.component.ts b/src/login/pages/error/error.component.ts index 91984b5c..7f61d544 100644 --- a/src/login/pages/error/error.component.ts +++ b/src/login/pages/error/error.component.ts @@ -3,7 +3,7 @@ import { CLASSES, KC_CONTEXT, USE_DEFAULT_CSS -} from "@keycloakify/angular/lib/providers/keycloakify-angular.providers"; +} from "@keycloakify/angular/lib/public-api"; import { ClassKey } from "keycloakify/login/lib/kcClsx"; import { KcContext } from "keycloakify/login/KcContext"; import { ComponentReference } from "@keycloakify/angular/login/classes/component-reference.class"; diff --git a/src/login/pages/frontchannel-logout/frontchannel-logout.component.ts b/src/login/pages/frontchannel-logout/frontchannel-logout.component.ts index 72b56c34..d99e0299 100644 --- a/src/login/pages/frontchannel-logout/frontchannel-logout.component.ts +++ b/src/login/pages/frontchannel-logout/frontchannel-logout.component.ts @@ -10,7 +10,7 @@ import { CLASSES, KC_CONTEXT, USE_DEFAULT_CSS -} from "@keycloakify/angular/lib/providers/keycloakify-angular.providers"; +} from "@keycloakify/angular/lib/public-api"; import { ClassKey } from "keycloakify/login/lib/kcClsx"; import { KcContext } from "keycloakify/login/KcContext"; import { ComponentReference } from "@keycloakify/angular/login/classes/component-reference.class"; diff --git a/src/login/pages/idp-review-user-profile/idp-review-user-profile.component.ts b/src/login/pages/idp-review-user-profile/idp-review-user-profile.component.ts index f1ac56ce..2c23d778 100644 --- a/src/login/pages/idp-review-user-profile/idp-review-user-profile.component.ts +++ b/src/login/pages/idp-review-user-profile/idp-review-user-profile.component.ts @@ -10,7 +10,7 @@ import { CLASSES, KC_CONTEXT, USE_DEFAULT_CSS -} from "@keycloakify/angular/lib/providers/keycloakify-angular.providers"; +} from "@keycloakify/angular/lib/public-api"; import { ClassKey } from "keycloakify/login/lib/kcClsx"; import { KcContext } from "keycloakify/login/KcContext"; import { ComponentReference } from "@keycloakify/angular/login/classes/component-reference.class"; diff --git a/src/login/pages/info/info.component.ts b/src/login/pages/info/info.component.ts index f03dce0d..d698ddea 100644 --- a/src/login/pages/info/info.component.ts +++ b/src/login/pages/info/info.component.ts @@ -9,7 +9,7 @@ import { CLASSES, KC_CONTEXT, USE_DEFAULT_CSS -} from "@keycloakify/angular/lib/providers/keycloakify-angular.providers"; +} from "@keycloakify/angular/lib/public-api"; import { ClassKey } from "keycloakify/login/lib/kcClsx"; import { KcContext } from "keycloakify/login/KcContext"; import { ComponentReference } from "@keycloakify/angular/login/classes/component-reference.class"; diff --git a/src/login/pages/login-config-totp/login-config-totp.component.ts b/src/login/pages/login-config-totp/login-config-totp.component.ts index ae43f5bd..2b64dbac 100644 --- a/src/login/pages/login-config-totp/login-config-totp.component.ts +++ b/src/login/pages/login-config-totp/login-config-totp.component.ts @@ -9,7 +9,7 @@ import { CLASSES, KC_CONTEXT, USE_DEFAULT_CSS -} from "@keycloakify/angular/lib/providers/keycloakify-angular.providers"; +} from "@keycloakify/angular/lib/public-api"; import { ClassKey } from "keycloakify/login/lib/kcClsx"; import { KcContext } from "keycloakify/login/KcContext"; import { ComponentReference } from "@keycloakify/angular/login/classes/component-reference.class"; diff --git a/src/login/pages/login-idp-link-confirm-override/login-idp-link-confirm-override.component.ts b/src/login/pages/login-idp-link-confirm-override/login-idp-link-confirm-override.component.ts index 2098d279..757575ba 100644 --- a/src/login/pages/login-idp-link-confirm-override/login-idp-link-confirm-override.component.ts +++ b/src/login/pages/login-idp-link-confirm-override/login-idp-link-confirm-override.component.ts @@ -9,7 +9,7 @@ import { CLASSES, KC_CONTEXT, USE_DEFAULT_CSS -} from "@keycloakify/angular/lib/providers/keycloakify-angular.providers"; +} from "@keycloakify/angular/lib/public-api"; import { ClassKey } from "keycloakify/login/lib/kcClsx"; import { KcContext } from "keycloakify/login/KcContext"; import { ComponentReference } from "@keycloakify/angular/login/classes/component-reference.class"; diff --git a/src/login/pages/login-idp-link-confirm/login-idp-link-confirm.component.ts b/src/login/pages/login-idp-link-confirm/login-idp-link-confirm.component.ts index 3f1f4c45..0f69111b 100644 --- a/src/login/pages/login-idp-link-confirm/login-idp-link-confirm.component.ts +++ b/src/login/pages/login-idp-link-confirm/login-idp-link-confirm.component.ts @@ -9,7 +9,7 @@ import { CLASSES, KC_CONTEXT, USE_DEFAULT_CSS -} from "@keycloakify/angular/lib/providers/keycloakify-angular.providers"; +} from "@keycloakify/angular/lib/public-api"; import { ClassKey } from "keycloakify/login/lib/kcClsx"; import { KcContext } from "keycloakify/login/KcContext"; import { ComponentReference } from "@keycloakify/angular/login/classes/component-reference.class"; diff --git a/src/login/pages/login-idp-link-email/login-idp-link-email.component.ts b/src/login/pages/login-idp-link-email/login-idp-link-email.component.ts index 958fa931..e9aa7049 100644 --- a/src/login/pages/login-idp-link-email/login-idp-link-email.component.ts +++ b/src/login/pages/login-idp-link-email/login-idp-link-email.component.ts @@ -9,7 +9,7 @@ import { CLASSES, KC_CONTEXT, USE_DEFAULT_CSS -} from "@keycloakify/angular/lib/providers/keycloakify-angular.providers"; +} from "@keycloakify/angular/lib/public-api"; import { ClassKey } from "keycloakify/login/lib/kcClsx"; import { KcContext } from "keycloakify/login/KcContext"; import { ComponentReference } from "@keycloakify/angular/login/classes/component-reference.class"; diff --git a/src/login/pages/login-oauth-grant/login-oauth-grant.component.ts b/src/login/pages/login-oauth-grant/login-oauth-grant.component.ts index 543b9857..bb9a79b7 100644 --- a/src/login/pages/login-oauth-grant/login-oauth-grant.component.ts +++ b/src/login/pages/login-oauth-grant/login-oauth-grant.component.ts @@ -9,7 +9,7 @@ import { CLASSES, KC_CONTEXT, USE_DEFAULT_CSS -} from "@keycloakify/angular/lib/providers/keycloakify-angular.providers"; +} from "@keycloakify/angular/lib/public-api"; import { ClassKey } from "keycloakify/login/lib/kcClsx"; import { KcContext } from "keycloakify/login/KcContext"; import { ComponentReference } from "@keycloakify/angular/login/classes/component-reference.class"; diff --git a/src/login/pages/login-oauth2-device-verify-user-code/login-oauth2-device-verify-user-code.component.ts b/src/login/pages/login-oauth2-device-verify-user-code/login-oauth2-device-verify-user-code.component.ts index 8d004222..f560c24c 100644 --- a/src/login/pages/login-oauth2-device-verify-user-code/login-oauth2-device-verify-user-code.component.ts +++ b/src/login/pages/login-oauth2-device-verify-user-code/login-oauth2-device-verify-user-code.component.ts @@ -9,7 +9,7 @@ import { CLASSES, KC_CONTEXT, USE_DEFAULT_CSS -} from "@keycloakify/angular/lib/providers/keycloakify-angular.providers"; +} from "@keycloakify/angular/lib/public-api"; import { ClassKey } from "keycloakify/login/lib/kcClsx"; import { KcContext } from "keycloakify/login/KcContext"; import { ComponentReference } from "@keycloakify/angular/login/classes/component-reference.class"; diff --git a/src/login/pages/login-otp/login-otp.component.ts b/src/login/pages/login-otp/login-otp.component.ts index 4213b05a..aad6cea9 100644 --- a/src/login/pages/login-otp/login-otp.component.ts +++ b/src/login/pages/login-otp/login-otp.component.ts @@ -9,7 +9,7 @@ import { CLASSES, KC_CONTEXT, USE_DEFAULT_CSS -} from "@keycloakify/angular/lib/providers/keycloakify-angular.providers"; +} from "@keycloakify/angular/lib/public-api"; import { ClassKey } from "keycloakify/login/lib/kcClsx"; import { KcContext } from "keycloakify/login/KcContext"; import { ComponentReference } from "@keycloakify/angular/login/classes/component-reference.class"; diff --git a/src/login/pages/login-page-expired/login-page-expired.component.ts b/src/login/pages/login-page-expired/login-page-expired.component.ts index 3d1f4e42..c7eeee25 100644 --- a/src/login/pages/login-page-expired/login-page-expired.component.ts +++ b/src/login/pages/login-page-expired/login-page-expired.component.ts @@ -9,7 +9,7 @@ import { CLASSES, KC_CONTEXT, USE_DEFAULT_CSS -} from "@keycloakify/angular/lib/providers/keycloakify-angular.providers"; +} from "@keycloakify/angular/lib/public-api"; import { ClassKey } from "keycloakify/login/lib/kcClsx"; import { KcContext } from "keycloakify/login/KcContext"; import { ComponentReference } from "@keycloakify/angular/login/classes/component-reference.class"; diff --git a/src/login/pages/login-passkeys-conditional-authenticate/login-passkeys-conditional-authenticate.component.ts b/src/login/pages/login-passkeys-conditional-authenticate/login-passkeys-conditional-authenticate.component.ts index 131f9abb..f55f8f18 100644 --- a/src/login/pages/login-passkeys-conditional-authenticate/login-passkeys-conditional-authenticate.component.ts +++ b/src/login/pages/login-passkeys-conditional-authenticate/login-passkeys-conditional-authenticate.component.ts @@ -3,7 +3,7 @@ import { CLASSES, KC_CONTEXT, USE_DEFAULT_CSS -} from "@keycloakify/angular/lib/providers/keycloakify-angular.providers"; +} from "@keycloakify/angular/lib/public-api"; import { Script } from "@keycloakify/angular/lib/models"; import { ClassKey } from "keycloakify/login/lib/kcClsx"; import { KcContext } from "keycloakify/login/KcContext"; diff --git a/src/login/pages/login-password/login-password.component.ts b/src/login/pages/login-password/login-password.component.ts index fa6628e7..473fdedc 100644 --- a/src/login/pages/login-password/login-password.component.ts +++ b/src/login/pages/login-password/login-password.component.ts @@ -10,7 +10,7 @@ import { CLASSES, KC_CONTEXT, USE_DEFAULT_CSS -} from "@keycloakify/angular/lib/providers/keycloakify-angular.providers"; +} from "@keycloakify/angular/lib/public-api"; import { ClassKey } from "keycloakify/login/lib/kcClsx"; import { KcContext } from "keycloakify/login/KcContext"; import { ComponentReference } from "@keycloakify/angular/login/classes/component-reference.class"; diff --git a/src/login/pages/login-recovery-authn-code-config/login-recovery-authn-code-config.component.ts b/src/login/pages/login-recovery-authn-code-config/login-recovery-authn-code-config.component.ts index 167afee3..8b2a880e 100644 --- a/src/login/pages/login-recovery-authn-code-config/login-recovery-authn-code-config.component.ts +++ b/src/login/pages/login-recovery-authn-code-config/login-recovery-authn-code-config.component.ts @@ -10,7 +10,7 @@ import { CLASSES, KC_CONTEXT, USE_DEFAULT_CSS -} from "@keycloakify/angular/lib/providers/keycloakify-angular.providers"; +} from "@keycloakify/angular/lib/public-api"; import { ClassKey } from "keycloakify/login/lib/kcClsx"; import { KcContext } from "keycloakify/login/KcContext"; import { ComponentReference } from "@keycloakify/angular/login/classes/component-reference.class"; diff --git a/src/login/pages/login-recovery-authn-code-input/login-recovery-authn-code-input.component.ts b/src/login/pages/login-recovery-authn-code-input/login-recovery-authn-code-input.component.ts index c21a3956..505f1664 100644 --- a/src/login/pages/login-recovery-authn-code-input/login-recovery-authn-code-input.component.ts +++ b/src/login/pages/login-recovery-authn-code-input/login-recovery-authn-code-input.component.ts @@ -9,7 +9,7 @@ import { CLASSES, KC_CONTEXT, USE_DEFAULT_CSS -} from "@keycloakify/angular/lib/providers/keycloakify-angular.providers"; +} from "@keycloakify/angular/lib/public-api"; import { ClassKey } from "keycloakify/login/lib/kcClsx"; import { KcContext } from "keycloakify/login/KcContext"; import { ComponentReference } from "@keycloakify/angular/login/classes/component-reference.class"; diff --git a/src/login/pages/login-reset-otp/login-reset-otp.component.ts b/src/login/pages/login-reset-otp/login-reset-otp.component.ts index e27f2c67..01f71ad2 100644 --- a/src/login/pages/login-reset-otp/login-reset-otp.component.ts +++ b/src/login/pages/login-reset-otp/login-reset-otp.component.ts @@ -9,7 +9,7 @@ import { CLASSES, KC_CONTEXT, USE_DEFAULT_CSS -} from "@keycloakify/angular/lib/providers/keycloakify-angular.providers"; +} from "@keycloakify/angular/lib/public-api"; import { ClassKey } from "keycloakify/login/lib/kcClsx"; import { KcContext } from "keycloakify/login/KcContext"; import { ComponentReference } from "@keycloakify/angular/login/classes/component-reference.class"; diff --git a/src/login/pages/login-reset-password/login-reset-password.component.ts b/src/login/pages/login-reset-password/login-reset-password.component.ts index 34dbbb8e..9992a474 100644 --- a/src/login/pages/login-reset-password/login-reset-password.component.ts +++ b/src/login/pages/login-reset-password/login-reset-password.component.ts @@ -9,7 +9,7 @@ import { CLASSES, KC_CONTEXT, USE_DEFAULT_CSS -} from "@keycloakify/angular/lib/providers/keycloakify-angular.providers"; +} from "@keycloakify/angular/lib/public-api"; import { ClassKey } from "keycloakify/login/lib/kcClsx"; import { KcContext } from "keycloakify/login/KcContext"; import { ComponentReference } from "@keycloakify/angular/login/classes/component-reference.class"; diff --git a/src/login/pages/login-update-password/login-update-password.component.ts b/src/login/pages/login-update-password/login-update-password.component.ts index 5bda0558..37602c20 100644 --- a/src/login/pages/login-update-password/login-update-password.component.ts +++ b/src/login/pages/login-update-password/login-update-password.component.ts @@ -9,7 +9,7 @@ import { CLASSES, KC_CONTEXT, USE_DEFAULT_CSS -} from "@keycloakify/angular/lib/providers/keycloakify-angular.providers"; +} from "@keycloakify/angular/lib/public-api"; import { ClassKey } from "keycloakify/login/lib/kcClsx"; import { KcContext } from "keycloakify/login/KcContext"; import { ComponentReference } from "@keycloakify/angular/login/classes/component-reference.class"; diff --git a/src/login/pages/login-update-profile/login-update-profile.component.ts b/src/login/pages/login-update-profile/login-update-profile.component.ts index 830baddc..f55c3c53 100644 --- a/src/login/pages/login-update-profile/login-update-profile.component.ts +++ b/src/login/pages/login-update-profile/login-update-profile.component.ts @@ -10,7 +10,7 @@ import { CLASSES, KC_CONTEXT, USE_DEFAULT_CSS -} from "@keycloakify/angular/lib/providers/keycloakify-angular.providers"; +} from "@keycloakify/angular/lib/public-api"; import { ClassKey } from "keycloakify/login/lib/kcClsx"; import { KcContext } from "keycloakify/login/KcContext"; import { ComponentReference } from "@keycloakify/angular/login/classes/component-reference.class"; diff --git a/src/login/pages/login-username/login-username.component.ts b/src/login/pages/login-username/login-username.component.ts index 69d7ce7a..2ced42b3 100644 --- a/src/login/pages/login-username/login-username.component.ts +++ b/src/login/pages/login-username/login-username.component.ts @@ -11,7 +11,7 @@ import { CLASSES, KC_CONTEXT, USE_DEFAULT_CSS -} from "@keycloakify/angular/lib/providers/keycloakify-angular.providers"; +} from "@keycloakify/angular/lib/public-api"; import { ClassKey } from "keycloakify/login/lib/kcClsx"; import { KcContext } from "keycloakify/login/KcContext"; import { ComponentReference } from "@keycloakify/angular/login/classes/component-reference.class"; diff --git a/src/login/pages/login-verify-email/login-verify-email.component.ts b/src/login/pages/login-verify-email/login-verify-email.component.ts index 8a8891d3..f530da48 100644 --- a/src/login/pages/login-verify-email/login-verify-email.component.ts +++ b/src/login/pages/login-verify-email/login-verify-email.component.ts @@ -9,7 +9,7 @@ import { CLASSES, KC_CONTEXT, USE_DEFAULT_CSS -} from "@keycloakify/angular/lib/providers/keycloakify-angular.providers"; +} from "@keycloakify/angular/lib/public-api"; import { ClassKey } from "keycloakify/login/lib/kcClsx"; import { KcContext } from "keycloakify/login/KcContext"; import { ComponentReference } from "@keycloakify/angular/login/classes/component-reference.class"; diff --git a/src/login/pages/login-x509-info/login-x509-info.component.ts b/src/login/pages/login-x509-info/login-x509-info.component.ts index 223d7697..d8062a2d 100644 --- a/src/login/pages/login-x509-info/login-x509-info.component.ts +++ b/src/login/pages/login-x509-info/login-x509-info.component.ts @@ -9,7 +9,7 @@ import { CLASSES, KC_CONTEXT, USE_DEFAULT_CSS -} from "@keycloakify/angular/lib/providers/keycloakify-angular.providers"; +} from "@keycloakify/angular/lib/public-api"; import { ClassKey } from "keycloakify/login/lib/kcClsx"; import { KcContext } from "keycloakify/login/KcContext"; import { ComponentReference } from "@keycloakify/angular/login/classes/component-reference.class"; diff --git a/src/login/pages/login/login.component.ts b/src/login/pages/login/login.component.ts index d77ebf01..ed714050 100644 --- a/src/login/pages/login/login.component.ts +++ b/src/login/pages/login/login.component.ts @@ -11,7 +11,7 @@ import { CLASSES, KC_CONTEXT, USE_DEFAULT_CSS -} from "@keycloakify/angular/lib/providers/keycloakify-angular.providers"; +} from "@keycloakify/angular/lib/public-api"; import { ClassKey } from "keycloakify/login/lib/kcClsx"; import { KcContext } from "keycloakify/login/KcContext"; import { ComponentReference } from "@keycloakify/angular/login/classes/component-reference.class"; diff --git a/src/login/pages/logout-confirm/logout-confirm.component.ts b/src/login/pages/logout-confirm/logout-confirm.component.ts index 3321dd50..0aa93f73 100644 --- a/src/login/pages/logout-confirm/logout-confirm.component.ts +++ b/src/login/pages/logout-confirm/logout-confirm.component.ts @@ -9,7 +9,7 @@ import { CLASSES, KC_CONTEXT, USE_DEFAULT_CSS -} from "@keycloakify/angular/lib/providers/keycloakify-angular.providers"; +} from "@keycloakify/angular/lib/public-api"; import { ClassKey } from "keycloakify/login/lib/kcClsx"; import { KcContext } from "keycloakify/login/KcContext"; import { ComponentReference } from "@keycloakify/angular/login/classes/component-reference.class"; diff --git a/src/login/pages/register/register.component.ts b/src/login/pages/register/register.component.ts index 9e185748..14a94cca 100644 --- a/src/login/pages/register/register.component.ts +++ b/src/login/pages/register/register.component.ts @@ -11,7 +11,7 @@ import { CLASSES, KC_CONTEXT, USE_DEFAULT_CSS -} from "@keycloakify/angular/lib/providers/keycloakify-angular.providers"; +} from "@keycloakify/angular/lib/public-api"; import { ClassKey } from "keycloakify/login/lib/kcClsx"; import { KcContext } from "keycloakify/login/KcContext"; import { ComponentReference } from "@keycloakify/angular/login/classes/component-reference.class"; diff --git a/src/login/pages/saml-post-form/saml-post-form.component.ts b/src/login/pages/saml-post-form/saml-post-form.component.ts index f5dae397..2abe7f23 100644 --- a/src/login/pages/saml-post-form/saml-post-form.component.ts +++ b/src/login/pages/saml-post-form/saml-post-form.component.ts @@ -11,7 +11,7 @@ import { CLASSES, KC_CONTEXT, USE_DEFAULT_CSS -} from "@keycloakify/angular/lib/providers/keycloakify-angular.providers"; +} from "@keycloakify/angular/lib/public-api"; import { ClassKey } from "keycloakify/login/lib/kcClsx"; import { KcContext } from "keycloakify/login/KcContext"; import { ComponentReference } from "@keycloakify/angular/login/classes/component-reference.class"; diff --git a/src/login/pages/select-authenticator/select-authenticator.component.ts b/src/login/pages/select-authenticator/select-authenticator.component.ts index 55cd6877..52dd32eb 100644 --- a/src/login/pages/select-authenticator/select-authenticator.component.ts +++ b/src/login/pages/select-authenticator/select-authenticator.component.ts @@ -10,7 +10,7 @@ import { CLASSES, KC_CONTEXT, USE_DEFAULT_CSS -} from "@keycloakify/angular/lib/providers/keycloakify-angular.providers"; +} from "@keycloakify/angular/lib/public-api"; import { ClassKey } from "keycloakify/login/lib/kcClsx"; import { KcContext } from "keycloakify/login/KcContext"; import { ComponentReference } from "@keycloakify/angular/login/classes/component-reference.class"; diff --git a/src/login/pages/terms/terms.component.ts b/src/login/pages/terms/terms.component.ts index 9f403414..cb8a351d 100644 --- a/src/login/pages/terms/terms.component.ts +++ b/src/login/pages/terms/terms.component.ts @@ -9,7 +9,7 @@ import { CLASSES, KC_CONTEXT, USE_DEFAULT_CSS -} from "@keycloakify/angular/lib/providers/keycloakify-angular.providers"; +} from "@keycloakify/angular/lib/public-api"; import { ClassKey } from "keycloakify/login/lib/kcClsx"; import { KcContext } from "keycloakify/login/KcContext"; import { ComponentReference } from "@keycloakify/angular/login/classes/component-reference.class"; diff --git a/src/login/pages/update-email/update-email.component.ts b/src/login/pages/update-email/update-email.component.ts index 5f2dcaea..006ca69e 100644 --- a/src/login/pages/update-email/update-email.component.ts +++ b/src/login/pages/update-email/update-email.component.ts @@ -10,7 +10,7 @@ import { CLASSES, KC_CONTEXT, USE_DEFAULT_CSS -} from "@keycloakify/angular/lib/providers/keycloakify-angular.providers"; +} from "@keycloakify/angular/lib/public-api"; import { ClassKey } from "keycloakify/login/lib/kcClsx"; import { KcContext } from "keycloakify/login/KcContext"; import { ComponentReference } from "@keycloakify/angular/login/classes/component-reference.class"; diff --git a/src/login/pages/webauthn-authenticate/webauthn-authenticate.component.ts b/src/login/pages/webauthn-authenticate/webauthn-authenticate.component.ts index cd66016b..d74ef31c 100644 --- a/src/login/pages/webauthn-authenticate/webauthn-authenticate.component.ts +++ b/src/login/pages/webauthn-authenticate/webauthn-authenticate.component.ts @@ -9,7 +9,7 @@ import { CLASSES, KC_CONTEXT, USE_DEFAULT_CSS -} from "@keycloakify/angular/lib/providers/keycloakify-angular.providers"; +} from "@keycloakify/angular/lib/public-api"; import { Script } from "@keycloakify/angular/lib/models"; import { ClassKey } from "keycloakify/login/lib/kcClsx"; import { KcContext } from "keycloakify/login/KcContext"; diff --git a/src/login/pages/webauthn-error/webauthn-error.component.ts b/src/login/pages/webauthn-error/webauthn-error.component.ts index 382f846e..5a87e66d 100644 --- a/src/login/pages/webauthn-error/webauthn-error.component.ts +++ b/src/login/pages/webauthn-error/webauthn-error.component.ts @@ -9,7 +9,7 @@ import { CLASSES, KC_CONTEXT, USE_DEFAULT_CSS -} from "@keycloakify/angular/lib/providers/keycloakify-angular.providers"; +} from "@keycloakify/angular/lib/public-api"; import { ClassKey } from "keycloakify/login/lib/kcClsx"; import { KcContext } from "keycloakify/login/KcContext"; import { ComponentReference } from "@keycloakify/angular/login/classes/component-reference.class"; diff --git a/src/login/pages/webauthn-register/webauthn-register.component.ts b/src/login/pages/webauthn-register/webauthn-register.component.ts index 93cc7e72..d491815a 100644 --- a/src/login/pages/webauthn-register/webauthn-register.component.ts +++ b/src/login/pages/webauthn-register/webauthn-register.component.ts @@ -9,7 +9,7 @@ import { CLASSES, KC_CONTEXT, USE_DEFAULT_CSS -} from "@keycloakify/angular/lib/providers/keycloakify-angular.providers"; +} from "@keycloakify/angular/lib/public-api"; import { Script } from "@keycloakify/angular/lib/models"; import { ClassKey } from "keycloakify/login/lib/kcClsx"; import { KcContext } from "keycloakify/login/KcContext"; diff --git a/src/login/pipes/advanced-msg-str.pipe.ts b/src/login/pipes/advanced-msg-str.pipe.ts index 6e32ba47..65d00c59 100644 --- a/src/login/pipes/advanced-msg-str.pipe.ts +++ b/src/login/pipes/advanced-msg-str.pipe.ts @@ -1,5 +1,5 @@ import { inject, Pipe, PipeTransform } from "@angular/core"; -import { I18N } from "@keycloakify/angular/lib/providers/keycloakify-angular.providers"; +import { I18N } from "@keycloakify/angular/lib/public-api"; import { I18n } from "../i18n"; @Pipe({ name: "advancedMsgStr", diff --git a/src/login/pipes/msg-str.pipe.ts b/src/login/pipes/msg-str.pipe.ts index ceefb709..0397b291 100644 --- a/src/login/pipes/msg-str.pipe.ts +++ b/src/login/pipes/msg-str.pipe.ts @@ -1,5 +1,5 @@ import { inject, Pipe, PipeTransform } from "@angular/core"; -import { I18N } from "@keycloakify/angular/lib/providers/keycloakify-angular.providers"; +import { I18N } from "@keycloakify/angular/lib/public-api"; import { I18n } from "../i18n"; import { MessageKey } from "keycloakify/login/i18n/messages_defaultSet/types"; @Pipe({ diff --git a/src/login/services/login-resource-injector.service.ts b/src/login/services/login-resource-injector.service.ts index af880323..6a8600dc 100644 --- a/src/login/services/login-resource-injector.service.ts +++ b/src/login/services/login-resource-injector.service.ts @@ -1,5 +1,5 @@ import { inject, Injectable } from "@angular/core"; -import { KC_CONTEXT } from "@keycloakify/angular/lib/providers/keycloakify-angular.providers"; +import { KC_CONTEXT } from "@keycloakify/angular/lib/public-api"; import { ResourceInjectorService, Script } from "@keycloakify/angular/lib/public-api"; import { KcContext } from "keycloakify/login/KcContext"; import { catchError, forkJoin, of, switchMap } from "rxjs"; diff --git a/src/login/services/user-profile-form.service.ts b/src/login/services/user-profile-form.service.ts index 94225c5d..7ae6eaf5 100644 --- a/src/login/services/user-profile-form.service.ts +++ b/src/login/services/user-profile-form.service.ts @@ -14,7 +14,7 @@ import { DO_MAKE_USER_CONFIRM_PASSWORD, I18N, KC_CONTEXT -} from "@keycloakify/angular/lib/providers/keycloakify-angular.providers"; +} from "@keycloakify/angular/lib/public-api"; import { Attribute, KcContext, diff --git a/yarn.lock b/yarn.lock index df48ed06..b63cde10 100644 --- a/yarn.lock +++ b/yarn.lock @@ -682,10 +682,10 @@ json-parse-even-better-errors@^2.3.0: resolved "https://registry.yarnpkg.com/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz#7c47805a94319928e05777405dc12e1f7a4ee02d" integrity sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w== -keycloakify@^11.2.0: - version "11.2.0" - resolved "https://registry.yarnpkg.com/keycloakify/-/keycloakify-11.2.0.tgz#8f00bb1240d18d09202c8d4bff5a1e92d7bfb049" - integrity sha512-8DnU5F6DmtCUKXOhApAm1/5E0ewGYCn3YNy5TKP6zHBpCEIlHNZ6i0lrGQj10rlmwwaOwPEDVNpOZTKZDsHp7Q== +keycloakify@^11.2.2: + version "11.2.2" + resolved "https://registry.yarnpkg.com/keycloakify/-/keycloakify-11.2.2.tgz#316b562ad3545e304571d37543d69afdf62d552c" + integrity sha512-QiRTAyiya3zpuwnzuiSJiEKaBGe7Dk0NaAIKfv+bUaXPMsEAncQHaHBCeMy5vACfxIiMpBjdLAgIpPT9br7Qwg== dependencies: tsafe "^1.6.6" From 2ca875a6b4df39c9da312b3809b63759155a2102 Mon Sep 17 00:00:00 2001 From: Joseph Garrone Date: Mon, 30 Sep 2024 01:39:56 +0200 Subject: [PATCH 07/64] Release candidate --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 85c05397..22706899 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@keycloakify/angular", - "version": "0.0.0", + "version": "0.0.1-rc.0", "description": "Angular components for Keycloakify", "repository": { "type": "git", From f7ec87518b4feaee46b851142382319b66571a80 Mon Sep 17 00:00:00 2001 From: Joseph Garrone Date: Mon, 30 Sep 2024 01:44:16 +0200 Subject: [PATCH 08/64] Add config for publishing under a namespace --- package.json | 3 +++ 1 file changed, 3 insertions(+) diff --git a/package.json b/package.json index 22706899..0a80f2f8 100644 --- a/package.json +++ b/package.json @@ -59,5 +59,8 @@ "rxjs": "^7.8.1", "zone.js": "^0.14.0", "chalk": "^5.3.0" + }, + "publishConfig": { + "access": "public" } } From f4499cac65b32022ccbd9bd69ad2a8a99b49bc9b Mon Sep 17 00:00:00 2001 From: Joseph Garrone Date: Mon, 30 Sep 2024 05:20:15 +0200 Subject: [PATCH 09/64] Working angular build --- package.json | 11 +- scripts/build.ts | 55 - scripts/build/main.ts | 131 + scripts/build/workspace | 1 + src/__all.ts | 1 + yarn.lock | 5446 ++++++++++++++++++++++++++++++++++++++- 6 files changed, 5546 insertions(+), 99 deletions(-) delete mode 100644 scripts/build.ts create mode 100644 scripts/build/main.ts create mode 160000 scripts/build/workspace create mode 100644 src/__all.ts diff --git a/package.json b/package.json index 0a80f2f8..16774c30 100644 --- a/package.json +++ b/package.json @@ -7,7 +7,7 @@ "url": "git://github.com/keycloakify/keycloakify-angular.git" }, "scripts": { - "build": "tsx scripts/build.ts", + "build": "tsx scripts/build/main.ts", "link-in-starter": "tsx scripts/link-in-starter.ts", "_format": "prettier '**/*.{ts,tsx,json,md}'", "format": "yarn _format --write", @@ -47,7 +47,7 @@ "devDependencies": { "keycloakify": "^11.2.2", "prettier": "^3.2.5", - "typescript": "^4.9.4", + "typescript": "~5.4.0", "husky": "^4.3.8", "lint-staged": "^11.0.0", "tsc-alias": "^1.8.10", @@ -58,7 +58,12 @@ "@types/node": "^22.7.4", "rxjs": "^7.8.1", "zone.js": "^0.14.0", - "chalk": "^5.3.0" + "chalk": "^5.3.0", + "@angular-devkit/build-angular": "^18.2.6", + "@angular/compiler-cli": "^18.2.6", + "@angular/compiler": "^18.2.6", + "ng-packagr": "^18.2.1", + "tslib": "^2.7.0" }, "publishConfig": { "access": "public" diff --git a/scripts/build.ts b/scripts/build.ts deleted file mode 100644 index 72c6029b..00000000 --- a/scripts/build.ts +++ /dev/null @@ -1,55 +0,0 @@ -import * as fs from "fs"; -import { join } from "path"; -import { transformCodebase } from "./tools/transformCodebase"; -import chalk from "chalk"; -import { run } from "./shared/run"; - -(async () => { - console.log(chalk.cyan("Building Keycloakify...")); - - const startTime = Date.now(); - - run(`npx tsc -p ${join("src", "tsconfig.json")}`); - - transformCodebase({ - srcDirPath: join("src"), - destDirPath: join("dist"), - transformSourceCode: ({ fileRelativePath, sourceCode }) => { - if (!fileRelativePath.endsWith(".html")) { - return undefined; - } - - return { modifiedSourceCode: sourceCode }; - } - }); - - run(`npx tsc-alias -p ${join("src", "tsconfig.json")}`); - - { - const dirBasename = "src"; - - const destDirPath = join("dist", dirBasename); - - fs.rmSync(destDirPath, { recursive: true, force: true }); - - fs.cpSync(dirBasename, destDirPath, { recursive: true }); - } - - /* - transformCodebase({ - srcDirPath: join("stories"), - destDirPath: join("dist", "stories"), - transformSourceCode: ({ fileRelativePath, sourceCode }) => { - if (!fileRelativePath.endsWith(".stories.tsx")) { - return undefined; - } - - return { modifiedSourceCode: sourceCode }; - } - }); - */ - - console.log( - chalk.green(`✓ built in ${((Date.now() - startTime) / 1000).toFixed(2)}s`) - ); -})(); diff --git a/scripts/build/main.ts b/scripts/build/main.ts new file mode 100644 index 00000000..c6291bb1 --- /dev/null +++ b/scripts/build/main.ts @@ -0,0 +1,131 @@ +import * as fs from "fs"; +import { join as pathJoin, basename as pathBasename } from "path"; +import { transformCodebase } from "../tools/transformCodebase"; +import chalk from "chalk"; +import { run } from "../shared/run"; +import { getThisCodebaseRootDirPath } from "../tools/getThisCodebaseRootDirPath"; + +(async () => { + console.log(chalk.cyan("Building Keycloakify...")); + + const startTime = Date.now(); + + const distDirPath = pathJoin(getThisCodebaseRootDirPath(), "dist"); + + if (fs.existsSync(distDirPath)) { + fs.rmSync(distDirPath, { recursive: true, force: true }); + } + + // Compile for angular + { + const angularWorkspaceDirPath = pathJoin(distDirPath, "workspace"); + + transformCodebase({ + srcDirPath: pathJoin(__dirname, "workspace"), + destDirPath: angularWorkspaceDirPath + }); + + transformCodebase({ + srcDirPath: pathJoin(getThisCodebaseRootDirPath(), "src"), + destDirPath: pathJoin( + angularWorkspaceDirPath, + "projects", + "keycloakify-angular", + "src" + ) + }); + + //run(`yarn`, { cwd: angularWorkspaceDirPath }); + run(`yarn build`, { cwd: angularWorkspaceDirPath }); + + const angularDistDirPath = pathJoin( + angularWorkspaceDirPath, + "dist", + "keycloakify-angular" + ); + + transformCodebase({ + srcDirPath: pathJoin(angularDistDirPath, "esm2022"), + destDirPath: distDirPath, + transformSourceCode: ({ fileRelativePath, sourceCode }) => { + if (pathBasename(fileRelativePath) === "keycloakify-angular.mjs") { + return undefined; + } + + return { modifiedSourceCode: sourceCode }; + } + }); + + transformCodebase({ + srcDirPath: angularDistDirPath, + destDirPath: distDirPath, + transformSourceCode: ({ fileRelativePath, sourceCode }) => { + if (fileRelativePath.startsWith("esm2022")) { + return undefined; + } + + if (fileRelativePath.startsWith("fesm2022")) { + return undefined; + } + + if (!fileRelativePath.endsWith(".d.ts")) { + return undefined; + } + + return { modifiedSourceCode: sourceCode }; + } + }); + + fs.rmSync(angularWorkspaceDirPath, { recursive: true, force: true }); + + if (Date.now() > 0) { + process.exit(0); + } + } + + /* + run(`npx tsc -p ${join("src", "tsconfig.json")}`); + + transformCodebase({ + srcDirPath: join("src"), + destDirPath: join("dist"), + transformSourceCode: ({ fileRelativePath, sourceCode }) => { + if (!fileRelativePath.endsWith(".html")) { + return undefined; + } + + return { modifiedSourceCode: sourceCode }; + } + }); + */ + + run(`npx tsc-alias -p ${pathJoin("src", "tsconfig.json")}`); + + { + const dirBasename = "src"; + + const destDirPath = pathJoin("dist", dirBasename); + + fs.rmSync(destDirPath, { recursive: true, force: true }); + + fs.cpSync(dirBasename, destDirPath, { recursive: true }); + } + + /* + transformCodebase({ + srcDirPath: join("stories"), + destDirPath: join("dist", "stories"), + transformSourceCode: ({ fileRelativePath, sourceCode }) => { + if (!fileRelativePath.endsWith(".stories.tsx")) { + return undefined; + } + + return { modifiedSourceCode: sourceCode }; + } + }); + */ + + console.log( + chalk.green(`✓ built in ${((Date.now() - startTime) / 1000).toFixed(2)}s`) + ); +})(); diff --git a/scripts/build/workspace b/scripts/build/workspace new file mode 160000 index 00000000..a4233242 --- /dev/null +++ b/scripts/build/workspace @@ -0,0 +1 @@ +Subproject commit a42332421c05aec460ed12542c57cc97cb37e6bd diff --git a/src/__all.ts b/src/__all.ts new file mode 100644 index 00000000..c40e51b1 --- /dev/null +++ b/src/__all.ts @@ -0,0 +1 @@ +export * as e0 from "./login/components/textarea-tag/textarea-tag.component"; diff --git a/yarn.lock b/yarn.lock index b63cde10..57bad9ed 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2,6 +2,143 @@ # yarn lockfile v1 +"@ampproject/remapping@2.3.0", "@ampproject/remapping@^2.2.0": + version "2.3.0" + resolved "https://registry.yarnpkg.com/@ampproject/remapping/-/remapping-2.3.0.tgz#ed441b6fa600072520ce18b43d2c8cc8caecc7f4" + integrity sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw== + dependencies: + "@jridgewell/gen-mapping" "^0.3.5" + "@jridgewell/trace-mapping" "^0.3.24" + +"@angular-devkit/architect@0.1802.6": + version "0.1802.6" + resolved "https://registry.yarnpkg.com/@angular-devkit/architect/-/architect-0.1802.6.tgz#8f37e570e9aec303616cc85d54372838f2472c67" + integrity sha512-oF7cPFdTLxeuvXkK/opSdIxZ1E4LrBbmuytQ/nCoAGOaKBWdqvwagRZ6jVhaI0Gwu48rkcV7Zhesg/ESNnROdw== + dependencies: + "@angular-devkit/core" "18.2.6" + rxjs "7.8.1" + +"@angular-devkit/build-angular@^18.2.6": + version "18.2.6" + resolved "https://registry.yarnpkg.com/@angular-devkit/build-angular/-/build-angular-18.2.6.tgz#95e6161bb5d9b9631c72172d5a9e4facb4193fdb" + integrity sha512-u12cJZttgs5j7gICHWSmcaTCu0EFXEzKqI8nkYCwq2MtuJlAXiMQSXYuEP9OU3Go4vMAPtQh2kShyOWCX5b4EQ== + dependencies: + "@ampproject/remapping" "2.3.0" + "@angular-devkit/architect" "0.1802.6" + "@angular-devkit/build-webpack" "0.1802.6" + "@angular-devkit/core" "18.2.6" + "@angular/build" "18.2.6" + "@babel/core" "7.25.2" + "@babel/generator" "7.25.0" + "@babel/helper-annotate-as-pure" "7.24.7" + "@babel/helper-split-export-declaration" "7.24.7" + "@babel/plugin-transform-async-generator-functions" "7.25.0" + "@babel/plugin-transform-async-to-generator" "7.24.7" + "@babel/plugin-transform-runtime" "7.24.7" + "@babel/preset-env" "7.25.3" + "@babel/runtime" "7.25.0" + "@discoveryjs/json-ext" "0.6.1" + "@ngtools/webpack" "18.2.6" + "@vitejs/plugin-basic-ssl" "1.1.0" + ansi-colors "4.1.3" + autoprefixer "10.4.20" + babel-loader "9.1.3" + browserslist "^4.21.5" + copy-webpack-plugin "12.0.2" + critters "0.0.24" + css-loader "7.1.2" + esbuild-wasm "0.23.0" + fast-glob "3.3.2" + http-proxy-middleware "3.0.0" + https-proxy-agent "7.0.5" + istanbul-lib-instrument "6.0.3" + jsonc-parser "3.3.1" + karma-source-map-support "1.4.0" + less "4.2.0" + less-loader "12.2.0" + license-webpack-plugin "4.0.2" + loader-utils "3.3.1" + magic-string "0.30.11" + mini-css-extract-plugin "2.9.0" + mrmime "2.0.0" + open "10.1.0" + ora "5.4.1" + parse5-html-rewriting-stream "7.0.0" + picomatch "4.0.2" + piscina "4.6.1" + postcss "8.4.41" + postcss-loader "8.1.1" + resolve-url-loader "5.0.0" + rxjs "7.8.1" + sass "1.77.6" + sass-loader "16.0.0" + semver "7.6.3" + source-map-loader "5.0.0" + source-map-support "0.5.21" + terser "5.31.6" + tree-kill "1.2.2" + tslib "2.6.3" + vite "5.4.6" + watchpack "2.4.1" + webpack "5.94.0" + webpack-dev-middleware "7.4.2" + webpack-dev-server "5.0.4" + webpack-merge "6.0.1" + webpack-subresource-integrity "5.1.0" + optionalDependencies: + esbuild "0.23.0" + +"@angular-devkit/build-webpack@0.1802.6": + version "0.1802.6" + resolved "https://registry.yarnpkg.com/@angular-devkit/build-webpack/-/build-webpack-0.1802.6.tgz#b8b07205299c2d3637c58841783c23e658385a59" + integrity sha512-JMLcXFaitJplwZMKkqhbYirINCRD6eOPZuIGaIOVynXYGWgvJkLT9t5C2wm9HqSLtp1K7NcYG2Y7PtTVR4krnQ== + dependencies: + "@angular-devkit/architect" "0.1802.6" + rxjs "7.8.1" + +"@angular-devkit/core@18.2.6": + version "18.2.6" + resolved "https://registry.yarnpkg.com/@angular-devkit/core/-/core-18.2.6.tgz#9b3009779e534f3060b3f0c27c73af2bb85bcde6" + integrity sha512-la4CFvs5PcRWSkQ/H7TB5cPZirFVA9GoWk5LzIk8si6VjWBJRm8b3keKJoC9LlNeABRUIR5z0ocYkyQQUhdMfg== + dependencies: + ajv "8.17.1" + ajv-formats "3.0.1" + jsonc-parser "3.3.1" + picomatch "4.0.2" + rxjs "7.8.1" + source-map "0.7.4" + +"@angular/build@18.2.6": + version "18.2.6" + resolved "https://registry.yarnpkg.com/@angular/build/-/build-18.2.6.tgz#e0fa6da2b43bcf73ab9d9362e762a3c2aaac9f19" + integrity sha512-TQzX6Mi7uXFvmz7+OVl4Za7WawYPcx+B5Ewm6IY/DdMyB9P/Z4tbKb1LO+ynWUXYwm7avXo6XQQ4m5ArDY5F/A== + dependencies: + "@ampproject/remapping" "2.3.0" + "@angular-devkit/architect" "0.1802.6" + "@babel/core" "7.25.2" + "@babel/helper-annotate-as-pure" "7.24.7" + "@babel/helper-split-export-declaration" "7.24.7" + "@babel/plugin-syntax-import-attributes" "7.24.7" + "@inquirer/confirm" "3.1.22" + "@vitejs/plugin-basic-ssl" "1.1.0" + browserslist "^4.23.0" + critters "0.0.24" + esbuild "0.23.0" + fast-glob "3.3.2" + https-proxy-agent "7.0.5" + listr2 "8.2.4" + lmdb "3.0.13" + magic-string "0.30.11" + mrmime "2.0.0" + parse5-html-rewriting-stream "7.0.0" + picomatch "4.0.2" + piscina "4.6.1" + rollup "4.22.4" + sass "1.77.6" + semver "7.6.3" + vite "5.4.6" + watchpack "2.4.1" + "@angular/common@^18.2.6": version "18.2.6" resolved "https://registry.yarnpkg.com/@angular/common/-/common-18.2.6.tgz#f5b57bf0e9b66a5b25526877d193227a53cad539" @@ -9,6 +146,27 @@ dependencies: tslib "^2.3.0" +"@angular/compiler-cli@^18.2.6": + version "18.2.6" + resolved "https://registry.yarnpkg.com/@angular/compiler-cli/-/compiler-cli-18.2.6.tgz#84d94852ec5088107a9ffa81908b38c51c576bd5" + integrity sha512-b5x9STfjNiNM/S0D+CnqRP9UOxPtSz1+RlCH5WdOMiW/p8j5p6dBix8YYgTe6Wg3OD7eItD2pnFQKgF/dWiopA== + dependencies: + "@babel/core" "7.25.2" + "@jridgewell/sourcemap-codec" "^1.4.14" + chokidar "^3.0.0" + convert-source-map "^1.5.1" + reflect-metadata "^0.2.0" + semver "^7.0.0" + tslib "^2.3.0" + yargs "^17.2.1" + +"@angular/compiler@^18.2.6": + version "18.2.6" + resolved "https://registry.yarnpkg.com/@angular/compiler/-/compiler-18.2.6.tgz#e0c847b1f4d5e4e1d6bbaee471246a8d2e6a656b" + integrity sha512-3tX2/Qw+bZ8XzKitviH8jzNGyY0uohhehhBB57OJOCc+yr4ojy/7SYFnun1lSsRnDztdCE461641X4iQLCQ94w== + dependencies: + tslib "^2.3.0" + "@angular/core@^18.2.6": version "18.2.6" resolved "https://registry.yarnpkg.com/@angular/core/-/core-18.2.6.tgz#d6d251fae36684ce49759e41e6456c6996271f4a" @@ -23,7 +181,7 @@ dependencies: tslib "^2.3.0" -"@babel/code-frame@^7.0.0": +"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.24.7": version "7.24.7" resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.24.7.tgz#882fd9e09e8ee324e496bd040401c6f046ef4465" integrity sha512-BcYH1CVJBO9tvyIZ2jVeXgSIMvGZ2FDRvDdOIVQyuklNKSsx+eppDEBq/g47Ayw+RqNFE+URvOShmf+f/qwAlA== @@ -31,11 +189,222 @@ "@babel/highlight" "^7.24.7" picocolors "^1.0.0" +"@babel/compat-data@^7.22.6", "@babel/compat-data@^7.25.2": + version "7.25.4" + resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.25.4.tgz#7d2a80ce229890edcf4cc259d4d696cb4dae2fcb" + integrity sha512-+LGRog6RAsCJrrrg/IO6LGmpphNe5DiK30dGjCoxxeGv49B10/3XYGxPsAwrDlMFcFEvdAUavDT8r9k/hSyQqQ== + +"@babel/core@7.25.2", "@babel/core@^7.23.9": + version "7.25.2" + resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.25.2.tgz#ed8eec275118d7613e77a352894cd12ded8eba77" + integrity sha512-BBt3opiCOxUr9euZ5/ro/Xv8/V7yJ5bjYMqG/C1YAo8MIKAnumZalCN+msbci3Pigy4lIQfPUpfMM27HMGaYEA== + dependencies: + "@ampproject/remapping" "^2.2.0" + "@babel/code-frame" "^7.24.7" + "@babel/generator" "^7.25.0" + "@babel/helper-compilation-targets" "^7.25.2" + "@babel/helper-module-transforms" "^7.25.2" + "@babel/helpers" "^7.25.0" + "@babel/parser" "^7.25.0" + "@babel/template" "^7.25.0" + "@babel/traverse" "^7.25.2" + "@babel/types" "^7.25.2" + convert-source-map "^2.0.0" + debug "^4.1.0" + gensync "^1.0.0-beta.2" + json5 "^2.2.3" + semver "^6.3.1" + +"@babel/generator@7.25.0": + version "7.25.0" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.25.0.tgz#f858ddfa984350bc3d3b7f125073c9af6988f18e" + integrity sha512-3LEEcj3PVW8pW2R1SR1M89g/qrYk/m/mB/tLqn7dn4sbBUQyTqnlod+II2U4dqiGtUmkcnAmkMDralTFZttRiw== + dependencies: + "@babel/types" "^7.25.0" + "@jridgewell/gen-mapping" "^0.3.5" + "@jridgewell/trace-mapping" "^0.3.25" + jsesc "^2.5.1" + +"@babel/generator@^7.25.0", "@babel/generator@^7.25.6": + version "7.25.6" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.25.6.tgz#0df1ad8cb32fe4d2b01d8bf437f153d19342a87c" + integrity sha512-VPC82gr1seXOpkjAAKoLhP50vx4vGNlF4msF64dSFq1P8RfB+QAuJWGHPXXPc8QyfVWwwB/TNNU4+ayZmHNbZw== + dependencies: + "@babel/types" "^7.25.6" + "@jridgewell/gen-mapping" "^0.3.5" + "@jridgewell/trace-mapping" "^0.3.25" + jsesc "^2.5.1" + +"@babel/helper-annotate-as-pure@7.24.7", "@babel/helper-annotate-as-pure@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.24.7.tgz#5373c7bc8366b12a033b4be1ac13a206c6656aab" + integrity sha512-BaDeOonYvhdKw+JoMVkAixAAJzG2jVPIwWoKBPdYuY9b452e2rPuI9QPYh3KpofZ3pW2akOmwZLOiOsHMiqRAg== + dependencies: + "@babel/types" "^7.24.7" + +"@babel/helper-builder-binary-assignment-operator-visitor@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.24.7.tgz#37d66feb012024f2422b762b9b2a7cfe27c7fba3" + integrity sha512-xZeCVVdwb4MsDBkkyZ64tReWYrLRHlMN72vP7Bdm3OUOuyFZExhsHUUnuWnm2/XOlAJzR0LfPpB56WXZn0X/lA== + dependencies: + "@babel/traverse" "^7.24.7" + "@babel/types" "^7.24.7" + +"@babel/helper-compilation-targets@^7.22.6", "@babel/helper-compilation-targets@^7.24.7", "@babel/helper-compilation-targets@^7.24.8", "@babel/helper-compilation-targets@^7.25.2": + version "7.25.2" + resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.25.2.tgz#e1d9410a90974a3a5a66e84ff55ef62e3c02d06c" + integrity sha512-U2U5LsSaZ7TAt3cfaymQ8WHh0pxvdHoEk6HVpaexxixjyEquMh0L0YNJNM6CTGKMXV1iksi0iZkGw4AcFkPaaw== + dependencies: + "@babel/compat-data" "^7.25.2" + "@babel/helper-validator-option" "^7.24.8" + browserslist "^4.23.1" + lru-cache "^5.1.1" + semver "^6.3.1" + +"@babel/helper-create-class-features-plugin@^7.24.7", "@babel/helper-create-class-features-plugin@^7.25.4": + version "7.25.4" + resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.25.4.tgz#57eaf1af38be4224a9d9dd01ddde05b741f50e14" + integrity sha512-ro/bFs3/84MDgDmMwbcHgDa8/E6J3QKNTk4xJJnVeFtGE+tL0K26E3pNxhYz2b67fJpt7Aphw5XcploKXuCvCQ== + dependencies: + "@babel/helper-annotate-as-pure" "^7.24.7" + "@babel/helper-member-expression-to-functions" "^7.24.8" + "@babel/helper-optimise-call-expression" "^7.24.7" + "@babel/helper-replace-supers" "^7.25.0" + "@babel/helper-skip-transparent-expression-wrappers" "^7.24.7" + "@babel/traverse" "^7.25.4" + semver "^6.3.1" + +"@babel/helper-create-regexp-features-plugin@^7.18.6", "@babel/helper-create-regexp-features-plugin@^7.24.7", "@babel/helper-create-regexp-features-plugin@^7.25.0", "@babel/helper-create-regexp-features-plugin@^7.25.2": + version "7.25.2" + resolved "https://registry.yarnpkg.com/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.25.2.tgz#24c75974ed74183797ffd5f134169316cd1808d9" + integrity sha512-+wqVGP+DFmqwFD3EH6TMTfUNeqDehV3E/dl+Sd54eaXqm17tEUNbEIn4sVivVowbvUpOtIGxdo3GoXyDH9N/9g== + dependencies: + "@babel/helper-annotate-as-pure" "^7.24.7" + regexpu-core "^5.3.1" + semver "^6.3.1" + +"@babel/helper-define-polyfill-provider@^0.6.2": + version "0.6.2" + resolved "https://registry.yarnpkg.com/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.6.2.tgz#18594f789c3594acb24cfdb4a7f7b7d2e8bd912d" + integrity sha512-LV76g+C502biUK6AyZ3LK10vDpDyCzZnhZFXkH1L75zHPj68+qc8Zfpx2th+gzwA2MzyK+1g/3EPl62yFnVttQ== + dependencies: + "@babel/helper-compilation-targets" "^7.22.6" + "@babel/helper-plugin-utils" "^7.22.5" + debug "^4.1.1" + lodash.debounce "^4.0.8" + resolve "^1.14.2" + +"@babel/helper-member-expression-to-functions@^7.24.8": + version "7.24.8" + resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.24.8.tgz#6155e079c913357d24a4c20480db7c712a5c3fb6" + integrity sha512-LABppdt+Lp/RlBxqrh4qgf1oEH/WxdzQNDJIu5gC/W1GyvPVrOBiItmmM8wan2fm4oYqFuFfkXmlGpLQhPY8CA== + dependencies: + "@babel/traverse" "^7.24.8" + "@babel/types" "^7.24.8" + +"@babel/helper-module-imports@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.24.7.tgz#f2f980392de5b84c3328fc71d38bd81bbb83042b" + integrity sha512-8AyH3C+74cgCVVXow/myrynrAGv+nTVg5vKu2nZph9x7RcRwzmh0VFallJuFTZ9mx6u4eSdXZfcOzSqTUm0HCA== + dependencies: + "@babel/traverse" "^7.24.7" + "@babel/types" "^7.24.7" + +"@babel/helper-module-transforms@^7.24.7", "@babel/helper-module-transforms@^7.24.8", "@babel/helper-module-transforms@^7.25.0", "@babel/helper-module-transforms@^7.25.2": + version "7.25.2" + resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.25.2.tgz#ee713c29768100f2776edf04d4eb23b8d27a66e6" + integrity sha512-BjyRAbix6j/wv83ftcVJmBt72QtHI56C7JXZoG2xATiLpmoC7dpd8WnkikExHDVPpi/3qCmO6WY1EaXOluiecQ== + dependencies: + "@babel/helper-module-imports" "^7.24.7" + "@babel/helper-simple-access" "^7.24.7" + "@babel/helper-validator-identifier" "^7.24.7" + "@babel/traverse" "^7.25.2" + +"@babel/helper-optimise-call-expression@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.24.7.tgz#8b0a0456c92f6b323d27cfd00d1d664e76692a0f" + integrity sha512-jKiTsW2xmWwxT1ixIdfXUZp+P5yURx2suzLZr5Hi64rURpDYdMW0pv+Uf17EYk2Rd428Lx4tLsnjGJzYKDM/6A== + dependencies: + "@babel/types" "^7.24.7" + +"@babel/helper-plugin-utils@^7.0.0", "@babel/helper-plugin-utils@^7.10.4", "@babel/helper-plugin-utils@^7.12.13", "@babel/helper-plugin-utils@^7.14.5", "@babel/helper-plugin-utils@^7.18.6", "@babel/helper-plugin-utils@^7.22.5", "@babel/helper-plugin-utils@^7.24.7", "@babel/helper-plugin-utils@^7.24.8", "@babel/helper-plugin-utils@^7.8.0", "@babel/helper-plugin-utils@^7.8.3": + version "7.24.8" + resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.24.8.tgz#94ee67e8ec0e5d44ea7baeb51e571bd26af07878" + integrity sha512-FFWx5142D8h2Mgr/iPVGH5G7w6jDn4jUSpZTyDnQO0Yn7Ks2Kuz6Pci8H6MPCoUJegd/UZQ3tAvfLCxQSnWWwg== + +"@babel/helper-remap-async-to-generator@^7.24.7", "@babel/helper-remap-async-to-generator@^7.25.0": + version "7.25.0" + resolved "https://registry.yarnpkg.com/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.25.0.tgz#d2f0fbba059a42d68e5e378feaf181ef6055365e" + integrity sha512-NhavI2eWEIz/H9dbrG0TuOicDhNexze43i5z7lEqwYm0WEZVTwnPpA0EafUTP7+6/W79HWIP2cTe3Z5NiSTVpw== + dependencies: + "@babel/helper-annotate-as-pure" "^7.24.7" + "@babel/helper-wrap-function" "^7.25.0" + "@babel/traverse" "^7.25.0" + +"@babel/helper-replace-supers@^7.24.7", "@babel/helper-replace-supers@^7.25.0": + version "7.25.0" + resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.25.0.tgz#ff44deac1c9f619523fe2ca1fd650773792000a9" + integrity sha512-q688zIvQVYtZu+i2PsdIu/uWGRpfxzr5WESsfpShfZECkO+d2o+WROWezCi/Q6kJ0tfPa5+pUGUlfx2HhrA3Bg== + dependencies: + "@babel/helper-member-expression-to-functions" "^7.24.8" + "@babel/helper-optimise-call-expression" "^7.24.7" + "@babel/traverse" "^7.25.0" + +"@babel/helper-simple-access@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.24.7.tgz#bcade8da3aec8ed16b9c4953b74e506b51b5edb3" + integrity sha512-zBAIvbCMh5Ts+b86r/CjU+4XGYIs+R1j951gxI3KmmxBMhCg4oQMsv6ZXQ64XOm/cvzfU1FmoCyt6+owc5QMYg== + dependencies: + "@babel/traverse" "^7.24.7" + "@babel/types" "^7.24.7" + +"@babel/helper-skip-transparent-expression-wrappers@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.24.7.tgz#5f8fa83b69ed5c27adc56044f8be2b3ea96669d9" + integrity sha512-IO+DLT3LQUElMbpzlatRASEyQtfhSE0+m465v++3jyyXeBTBUjtVZg28/gHeV5mrTJqvEKhKroBGAvhW+qPHiQ== + dependencies: + "@babel/traverse" "^7.24.7" + "@babel/types" "^7.24.7" + +"@babel/helper-split-export-declaration@7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.24.7.tgz#83949436890e07fa3d6873c61a96e3bbf692d856" + integrity sha512-oy5V7pD+UvfkEATUKvIjvIAH/xCzfsFVw7ygW2SI6NClZzquT+mwdTfgfdbUiceh6iQO0CHtCPsyze/MZ2YbAA== + dependencies: + "@babel/types" "^7.24.7" + +"@babel/helper-string-parser@^7.24.8": + version "7.24.8" + resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.24.8.tgz#5b3329c9a58803d5df425e5785865881a81ca48d" + integrity sha512-pO9KhhRcuUyGnJWwyEgnRJTSIZHiT+vMD0kPeD+so0l7mxkMT19g3pjY9GTnHySck/hDzq+dtW/4VgnMkippsQ== + "@babel/helper-validator-identifier@^7.24.7": version "7.24.7" resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.24.7.tgz#75b889cfaf9e35c2aaf42cf0d72c8e91719251db" integrity sha512-rR+PBcQ1SMQDDyF6X0wxtG8QyLCgUB0eRAGguqRLfkCA87l7yAP7ehq8SNj96OOGTO8OBV70KhuFYcIkHXOg0w== +"@babel/helper-validator-option@^7.24.8": + version "7.24.8" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.24.8.tgz#3725cdeea8b480e86d34df15304806a06975e33d" + integrity sha512-xb8t9tD1MHLungh/AIoWYN+gVHaB9kwlu8gffXGSt3FFEIT7RjS+xWbc2vUD1UTZdIpKj/ab3rdqJ7ufngyi2Q== + +"@babel/helper-wrap-function@^7.25.0": + version "7.25.0" + resolved "https://registry.yarnpkg.com/@babel/helper-wrap-function/-/helper-wrap-function-7.25.0.tgz#dab12f0f593d6ca48c0062c28bcfb14ebe812f81" + integrity sha512-s6Q1ebqutSiZnEjaofc/UKDyC4SbzV5n5SrA2Gq8UawLycr3i04f1dX4OzoQVnexm6aOCh37SQNYlJ/8Ku+PMQ== + dependencies: + "@babel/template" "^7.25.0" + "@babel/traverse" "^7.25.0" + "@babel/types" "^7.25.0" + +"@babel/helpers@^7.25.0": + version "7.25.6" + resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.25.6.tgz#57ee60141829ba2e102f30711ffe3afab357cc60" + integrity sha512-Xg0tn4HcfTijTwfDwYlvVCl43V6h4KyVVX2aEm4qdO/PC6L2YvzLHFdmxhoeSA3eslcE6+ZVXHgWwopXYLNq4Q== + dependencies: + "@babel/template" "^7.25.0" + "@babel/types" "^7.25.6" + "@babel/highlight@^7.24.7": version "7.24.7" resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.24.7.tgz#a05ab1df134b286558aae0ed41e6c5f731bf409d" @@ -46,126 +415,1408 @@ js-tokens "^4.0.0" picocolors "^1.0.0" +"@babel/parser@^7.23.9", "@babel/parser@^7.25.0", "@babel/parser@^7.25.6": + version "7.25.6" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.25.6.tgz#85660c5ef388cbbf6e3d2a694ee97a38f18afe2f" + integrity sha512-trGdfBdbD0l1ZPmcJ83eNxB9rbEax4ALFTF7fN386TMYbeCQbyme5cOEXQhbGXKebwGaB/J52w1mrklMcbgy6Q== + dependencies: + "@babel/types" "^7.25.6" + +"@babel/plugin-bugfix-firefox-class-in-computed-class-key@^7.25.3": + version "7.25.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-firefox-class-in-computed-class-key/-/plugin-bugfix-firefox-class-in-computed-class-key-7.25.3.tgz#dca427b45a6c0f5c095a1c639dfe2476a3daba7f" + integrity sha512-wUrcsxZg6rqBXG05HG1FPYgsP6EvwF4WpBbxIpWIIYnH8wG0gzx3yZY3dtEHas4sTAOGkbTsc9EGPxwff8lRoA== + dependencies: + "@babel/helper-plugin-utils" "^7.24.8" + "@babel/traverse" "^7.25.3" + +"@babel/plugin-bugfix-safari-class-field-initializer-scope@^7.25.0": + version "7.25.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-safari-class-field-initializer-scope/-/plugin-bugfix-safari-class-field-initializer-scope-7.25.0.tgz#cd0c583e01369ef51676bdb3d7b603e17d2b3f73" + integrity sha512-Bm4bH2qsX880b/3ziJ8KD711LT7z4u8CFudmjqle65AZj/HNUFhEf90dqYv6O86buWvSBmeQDjv0Tn2aF/bIBA== + dependencies: + "@babel/helper-plugin-utils" "^7.24.8" + +"@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@^7.25.0": + version "7.25.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.25.0.tgz#749bde80356b295390954643de7635e0dffabe73" + integrity sha512-lXwdNZtTmeVOOFtwM/WDe7yg1PL8sYhRk/XH0FzbR2HDQ0xC+EnQ/JHeoMYSavtU115tnUk0q9CDyq8si+LMAA== + dependencies: + "@babel/helper-plugin-utils" "^7.24.8" + +"@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.24.7.tgz#e4eabdd5109acc399b38d7999b2ef66fc2022f89" + integrity sha512-+izXIbke1T33mY4MSNnrqhPXDz01WYhEf3yF5NbnUtkiNnm+XBZJl3kNfoK6NKmYlz/D07+l2GWVK/QfDkNCuQ== + dependencies: + "@babel/helper-plugin-utils" "^7.24.7" + "@babel/helper-skip-transparent-expression-wrappers" "^7.24.7" + "@babel/plugin-transform-optional-chaining" "^7.24.7" + +"@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@^7.25.0": + version "7.25.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly/-/plugin-bugfix-v8-static-class-fields-redefine-readonly-7.25.0.tgz#3a82a70e7cb7294ad2559465ebcb871dfbf078fb" + integrity sha512-tggFrk1AIShG/RUQbEwt2Tr/E+ObkfwrPjR6BjbRvsx24+PSjK8zrq0GWPNCjo8qpRx4DuJzlcvWJqlm+0h3kw== + dependencies: + "@babel/helper-plugin-utils" "^7.24.8" + "@babel/traverse" "^7.25.0" + +"@babel/plugin-proposal-private-property-in-object@7.21.0-placeholder-for-preset-env.2": + version "7.21.0-placeholder-for-preset-env.2" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.21.0-placeholder-for-preset-env.2.tgz#7844f9289546efa9febac2de4cfe358a050bd703" + integrity sha512-SOSkfJDddaM7mak6cPEpswyTRnuRltl429hMraQEglW+OkovnCzsiszTmsrlY//qLFjCpQDFRvjdm2wA5pPm9w== + +"@babel/plugin-syntax-async-generators@^7.8.4": + version "7.8.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz#a983fb1aeb2ec3f6ed042a210f640e90e786fe0d" + integrity sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-class-properties@^7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz#b5c987274c4a3a82b89714796931a6b53544ae10" + integrity sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA== + dependencies: + "@babel/helper-plugin-utils" "^7.12.13" + +"@babel/plugin-syntax-class-static-block@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz#195df89b146b4b78b3bf897fd7a257c84659d406" + integrity sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + +"@babel/plugin-syntax-dynamic-import@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz#62bf98b2da3cd21d626154fc96ee5b3cb68eacb3" + integrity sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-export-namespace-from@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-export-namespace-from/-/plugin-syntax-export-namespace-from-7.8.3.tgz#028964a9ba80dbc094c915c487ad7c4e7a66465a" + integrity sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q== + dependencies: + "@babel/helper-plugin-utils" "^7.8.3" + +"@babel/plugin-syntax-import-assertions@^7.24.7": + version "7.25.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.25.6.tgz#bb918905c58711b86f9710d74a3744b6c56573b5" + integrity sha512-aABl0jHw9bZ2karQ/uUD6XP4u0SG22SJrOHFoL6XB1R7dTovOP4TzTlsxOYC5yQ1pdscVK2JTUnF6QL3ARoAiQ== + dependencies: + "@babel/helper-plugin-utils" "^7.24.8" + +"@babel/plugin-syntax-import-attributes@7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.24.7.tgz#b4f9ea95a79e6912480c4b626739f86a076624ca" + integrity sha512-hbX+lKKeUMGihnK8nvKqmXBInriT3GVjzXKFriV3YC6APGxMbP8RZNFwy91+hocLXq90Mta+HshoB31802bb8A== + dependencies: + "@babel/helper-plugin-utils" "^7.24.7" + +"@babel/plugin-syntax-import-attributes@^7.24.7": + version "7.25.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.25.6.tgz#6d4c78f042db0e82fd6436cd65fec5dc78ad2bde" + integrity sha512-sXaDXaJN9SNLymBdlWFA+bjzBhFD617ZaFiY13dGt7TVslVvVgA6fkZOP7Ki3IGElC45lwHdOTrCtKZGVAWeLQ== + dependencies: + "@babel/helper-plugin-utils" "^7.24.8" + +"@babel/plugin-syntax-import-meta@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz#ee601348c370fa334d2207be158777496521fd51" + integrity sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g== + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + +"@babel/plugin-syntax-json-strings@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz#01ca21b668cd8218c9e640cb6dd88c5412b2c96a" + integrity sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-logical-assignment-operators@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz#ca91ef46303530448b906652bac2e9fe9941f699" + integrity sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig== + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + +"@babel/plugin-syntax-nullish-coalescing-operator@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz#167ed70368886081f74b5c36c65a88c03b66d1a9" + integrity sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-numeric-separator@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz#b9b070b3e33570cd9fd07ba7fa91c0dd37b9af97" + integrity sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug== + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + +"@babel/plugin-syntax-object-rest-spread@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz#60e225edcbd98a640332a2e72dd3e66f1af55871" + integrity sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-optional-catch-binding@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz#6111a265bcfb020eb9efd0fdfd7d26402b9ed6c1" + integrity sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-optional-chaining@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz#4f69c2ab95167e0180cd5336613f8c5788f7d48a" + integrity sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-private-property-in-object@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz#0dc6671ec0ea22b6e94a1114f857970cd39de1ad" + integrity sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + +"@babel/plugin-syntax-top-level-await@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz#c1cfdadc35a646240001f06138247b741c34d94c" + integrity sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + +"@babel/plugin-syntax-unicode-sets-regex@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-unicode-sets-regex/-/plugin-syntax-unicode-sets-regex-7.18.6.tgz#d49a3b3e6b52e5be6740022317580234a6a47357" + integrity sha512-727YkEAPwSIQTv5im8QHz3upqp92JTWhidIC81Tdx4VJYIte/VndKf1qKrfnnhPLiPghStWfvC/iFaMCQu7Nqg== + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.18.6" + "@babel/helper-plugin-utils" "^7.18.6" + +"@babel/plugin-transform-arrow-functions@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.24.7.tgz#4f6886c11e423bd69f3ce51dbf42424a5f275514" + integrity sha512-Dt9LQs6iEY++gXUwY03DNFat5C2NbO48jj+j/bSAz6b3HgPs39qcPiYt77fDObIcFwj3/C2ICX9YMwGflUoSHQ== + dependencies: + "@babel/helper-plugin-utils" "^7.24.7" + +"@babel/plugin-transform-async-generator-functions@7.25.0": + version "7.25.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.25.0.tgz#b785cf35d73437f6276b1e30439a57a50747bddf" + integrity sha512-uaIi2FdqzjpAMvVqvB51S42oC2JEVgh0LDsGfZVDysWE8LrJtQC2jvKmOqEYThKyB7bDEb7BP1GYWDm7tABA0Q== + dependencies: + "@babel/helper-plugin-utils" "^7.24.8" + "@babel/helper-remap-async-to-generator" "^7.25.0" + "@babel/plugin-syntax-async-generators" "^7.8.4" + "@babel/traverse" "^7.25.0" + +"@babel/plugin-transform-async-generator-functions@^7.25.0": + version "7.25.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.25.4.tgz#2afd4e639e2d055776c9f091b6c0c180ed8cf083" + integrity sha512-jz8cV2XDDTqjKPwVPJBIjORVEmSGYhdRa8e5k5+vN+uwcjSrSxUaebBRa4ko1jqNF2uxyg8G6XYk30Jv285xzg== + dependencies: + "@babel/helper-plugin-utils" "^7.24.8" + "@babel/helper-remap-async-to-generator" "^7.25.0" + "@babel/plugin-syntax-async-generators" "^7.8.4" + "@babel/traverse" "^7.25.4" + +"@babel/plugin-transform-async-to-generator@7.24.7", "@babel/plugin-transform-async-to-generator@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.24.7.tgz#72a3af6c451d575842a7e9b5a02863414355bdcc" + integrity sha512-SQY01PcJfmQ+4Ash7NE+rpbLFbmqA2GPIgqzxfFTL4t1FKRq4zTms/7htKpoCUI9OcFYgzqfmCdH53s6/jn5fA== + dependencies: + "@babel/helper-module-imports" "^7.24.7" + "@babel/helper-plugin-utils" "^7.24.7" + "@babel/helper-remap-async-to-generator" "^7.24.7" + +"@babel/plugin-transform-block-scoped-functions@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.24.7.tgz#a4251d98ea0c0f399dafe1a35801eaba455bbf1f" + integrity sha512-yO7RAz6EsVQDaBH18IDJcMB1HnrUn2FJ/Jslc/WtPPWcjhpUJXU/rjbwmluzp7v/ZzWcEhTMXELnnsz8djWDwQ== + dependencies: + "@babel/helper-plugin-utils" "^7.24.7" + +"@babel/plugin-transform-block-scoping@^7.25.0": + version "7.25.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.25.0.tgz#23a6ed92e6b006d26b1869b1c91d1b917c2ea2ac" + integrity sha512-yBQjYoOjXlFv9nlXb3f1casSHOZkWr29NX+zChVanLg5Nc157CrbEX9D7hxxtTpuFy7Q0YzmmWfJxzvps4kXrQ== + dependencies: + "@babel/helper-plugin-utils" "^7.24.8" + +"@babel/plugin-transform-class-properties@^7.24.7": + version "7.25.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.25.4.tgz#bae7dbfcdcc2e8667355cd1fb5eda298f05189fd" + integrity sha512-nZeZHyCWPfjkdU5pA/uHiTaDAFUEqkpzf1YoQT2NeSynCGYq9rxfyI3XpQbfx/a0hSnFH6TGlEXvae5Vi7GD8g== + dependencies: + "@babel/helper-create-class-features-plugin" "^7.25.4" + "@babel/helper-plugin-utils" "^7.24.8" + +"@babel/plugin-transform-class-static-block@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.24.7.tgz#c82027ebb7010bc33c116d4b5044fbbf8c05484d" + integrity sha512-HMXK3WbBPpZQufbMG4B46A90PkuuhN9vBCb5T8+VAHqvAqvcLi+2cKoukcpmUYkszLhScU3l1iudhrks3DggRQ== + dependencies: + "@babel/helper-create-class-features-plugin" "^7.24.7" + "@babel/helper-plugin-utils" "^7.24.7" + "@babel/plugin-syntax-class-static-block" "^7.14.5" + +"@babel/plugin-transform-classes@^7.25.0": + version "7.25.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.25.4.tgz#d29dbb6a72d79f359952ad0b66d88518d65ef89a" + integrity sha512-oexUfaQle2pF/b6E0dwsxQtAol9TLSO88kQvym6HHBWFliV2lGdrPieX+WgMRLSJDVzdYywk7jXbLPuO2KLTLg== + dependencies: + "@babel/helper-annotate-as-pure" "^7.24.7" + "@babel/helper-compilation-targets" "^7.25.2" + "@babel/helper-plugin-utils" "^7.24.8" + "@babel/helper-replace-supers" "^7.25.0" + "@babel/traverse" "^7.25.4" + globals "^11.1.0" + +"@babel/plugin-transform-computed-properties@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.24.7.tgz#4cab3214e80bc71fae3853238d13d097b004c707" + integrity sha512-25cS7v+707Gu6Ds2oY6tCkUwsJ9YIDbggd9+cu9jzzDgiNq7hR/8dkzxWfKWnTic26vsI3EsCXNd4iEB6e8esQ== + dependencies: + "@babel/helper-plugin-utils" "^7.24.7" + "@babel/template" "^7.24.7" + +"@babel/plugin-transform-destructuring@^7.24.8": + version "7.24.8" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.24.8.tgz#c828e814dbe42a2718a838c2a2e16a408e055550" + integrity sha512-36e87mfY8TnRxc7yc6M9g9gOB7rKgSahqkIKwLpz4Ppk2+zC2Cy1is0uwtuSG6AE4zlTOUa+7JGz9jCJGLqQFQ== + dependencies: + "@babel/helper-plugin-utils" "^7.24.8" + +"@babel/plugin-transform-dotall-regex@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.24.7.tgz#5f8bf8a680f2116a7207e16288a5f974ad47a7a0" + integrity sha512-ZOA3W+1RRTSWvyqcMJDLqbchh7U4NRGqwRfFSVbOLS/ePIP4vHB5e8T8eXcuqyN1QkgKyj5wuW0lcS85v4CrSw== + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.24.7" + "@babel/helper-plugin-utils" "^7.24.7" + +"@babel/plugin-transform-duplicate-keys@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.24.7.tgz#dd20102897c9a2324e5adfffb67ff3610359a8ee" + integrity sha512-JdYfXyCRihAe46jUIliuL2/s0x0wObgwwiGxw/UbgJBr20gQBThrokO4nYKgWkD7uBaqM7+9x5TU7NkExZJyzw== + dependencies: + "@babel/helper-plugin-utils" "^7.24.7" + +"@babel/plugin-transform-duplicate-named-capturing-groups-regex@^7.25.0": + version "7.25.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-duplicate-named-capturing-groups-regex/-/plugin-transform-duplicate-named-capturing-groups-regex-7.25.0.tgz#809af7e3339466b49c034c683964ee8afb3e2604" + integrity sha512-YLpb4LlYSc3sCUa35un84poXoraOiQucUTTu8X1j18JV+gNa8E0nyUf/CjZ171IRGr4jEguF+vzJU66QZhn29g== + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.25.0" + "@babel/helper-plugin-utils" "^7.24.8" + +"@babel/plugin-transform-dynamic-import@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.24.7.tgz#4d8b95e3bae2b037673091aa09cd33fecd6419f4" + integrity sha512-sc3X26PhZQDb3JhORmakcbvkeInvxz+A8oda99lj7J60QRuPZvNAk9wQlTBS1ZynelDrDmTU4pw1tyc5d5ZMUg== + dependencies: + "@babel/helper-plugin-utils" "^7.24.7" + "@babel/plugin-syntax-dynamic-import" "^7.8.3" + +"@babel/plugin-transform-exponentiation-operator@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.24.7.tgz#b629ee22645f412024297d5245bce425c31f9b0d" + integrity sha512-Rqe/vSc9OYgDajNIK35u7ot+KeCoetqQYFXM4Epf7M7ez3lWlOjrDjrwMei6caCVhfdw+mIKD4cgdGNy5JQotQ== + dependencies: + "@babel/helper-builder-binary-assignment-operator-visitor" "^7.24.7" + "@babel/helper-plugin-utils" "^7.24.7" + +"@babel/plugin-transform-export-namespace-from@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.24.7.tgz#176d52d8d8ed516aeae7013ee9556d540c53f197" + integrity sha512-v0K9uNYsPL3oXZ/7F9NNIbAj2jv1whUEtyA6aujhekLs56R++JDQuzRcP2/z4WX5Vg/c5lE9uWZA0/iUoFhLTA== + dependencies: + "@babel/helper-plugin-utils" "^7.24.7" + "@babel/plugin-syntax-export-namespace-from" "^7.8.3" + +"@babel/plugin-transform-for-of@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.24.7.tgz#f25b33f72df1d8be76399e1b8f3f9d366eb5bc70" + integrity sha512-wo9ogrDG1ITTTBsy46oGiN1dS9A7MROBTcYsfS8DtsImMkHk9JXJ3EWQM6X2SUw4x80uGPlwj0o00Uoc6nEE3g== + dependencies: + "@babel/helper-plugin-utils" "^7.24.7" + "@babel/helper-skip-transparent-expression-wrappers" "^7.24.7" + +"@babel/plugin-transform-function-name@^7.25.1": + version "7.25.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.25.1.tgz#b85e773097526c1a4fc4ba27322748643f26fc37" + integrity sha512-TVVJVdW9RKMNgJJlLtHsKDTydjZAbwIsn6ySBPQaEAUU5+gVvlJt/9nRmqVbsV/IBanRjzWoaAQKLoamWVOUuA== + dependencies: + "@babel/helper-compilation-targets" "^7.24.8" + "@babel/helper-plugin-utils" "^7.24.8" + "@babel/traverse" "^7.25.1" + +"@babel/plugin-transform-json-strings@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.24.7.tgz#f3e9c37c0a373fee86e36880d45b3664cedaf73a" + integrity sha512-2yFnBGDvRuxAaE/f0vfBKvtnvvqU8tGpMHqMNpTN2oWMKIR3NqFkjaAgGwawhqK/pIN2T3XdjGPdaG0vDhOBGw== + dependencies: + "@babel/helper-plugin-utils" "^7.24.7" + "@babel/plugin-syntax-json-strings" "^7.8.3" + +"@babel/plugin-transform-literals@^7.25.2": + version "7.25.2" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-literals/-/plugin-transform-literals-7.25.2.tgz#deb1ad14fc5490b9a65ed830e025bca849d8b5f3" + integrity sha512-HQI+HcTbm9ur3Z2DkO+jgESMAMcYLuN/A7NRw9juzxAezN9AvqvUTnpKP/9kkYANz6u7dFlAyOu44ejuGySlfw== + dependencies: + "@babel/helper-plugin-utils" "^7.24.8" + +"@babel/plugin-transform-logical-assignment-operators@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.24.7.tgz#a58fb6eda16c9dc8f9ff1c7b1ba6deb7f4694cb0" + integrity sha512-4D2tpwlQ1odXmTEIFWy9ELJcZHqrStlzK/dAOWYyxX3zT0iXQB6banjgeOJQXzEc4S0E0a5A+hahxPaEFYftsw== + dependencies: + "@babel/helper-plugin-utils" "^7.24.7" + "@babel/plugin-syntax-logical-assignment-operators" "^7.10.4" + +"@babel/plugin-transform-member-expression-literals@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.24.7.tgz#3b4454fb0e302e18ba4945ba3246acb1248315df" + integrity sha512-T/hRC1uqrzXMKLQ6UCwMT85S3EvqaBXDGf0FaMf4446Qx9vKwlghvee0+uuZcDUCZU5RuNi4781UQ7R308zzBw== + dependencies: + "@babel/helper-plugin-utils" "^7.24.7" + +"@babel/plugin-transform-modules-amd@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.24.7.tgz#65090ed493c4a834976a3ca1cde776e6ccff32d7" + integrity sha512-9+pB1qxV3vs/8Hdmz/CulFB8w2tuu6EB94JZFsjdqxQokwGa9Unap7Bo2gGBGIvPmDIVvQrom7r5m/TCDMURhg== + dependencies: + "@babel/helper-module-transforms" "^7.24.7" + "@babel/helper-plugin-utils" "^7.24.7" + +"@babel/plugin-transform-modules-commonjs@^7.24.8": + version "7.24.8" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.24.8.tgz#ab6421e564b717cb475d6fff70ae7f103536ea3c" + integrity sha512-WHsk9H8XxRs3JXKWFiqtQebdh9b/pTk4EgueygFzYlTKAg0Ud985mSevdNjdXdFBATSKVJGQXP1tv6aGbssLKA== + dependencies: + "@babel/helper-module-transforms" "^7.24.8" + "@babel/helper-plugin-utils" "^7.24.8" + "@babel/helper-simple-access" "^7.24.7" + +"@babel/plugin-transform-modules-systemjs@^7.25.0": + version "7.25.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.25.0.tgz#8f46cdc5f9e5af74f3bd019485a6cbe59685ea33" + integrity sha512-YPJfjQPDXxyQWg/0+jHKj1llnY5f/R6a0p/vP4lPymxLu7Lvl4k2WMitqi08yxwQcCVUUdG9LCUj4TNEgAp3Jw== + dependencies: + "@babel/helper-module-transforms" "^7.25.0" + "@babel/helper-plugin-utils" "^7.24.8" + "@babel/helper-validator-identifier" "^7.24.7" + "@babel/traverse" "^7.25.0" + +"@babel/plugin-transform-modules-umd@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.24.7.tgz#edd9f43ec549099620df7df24e7ba13b5c76efc8" + integrity sha512-3aytQvqJ/h9z4g8AsKPLvD4Zqi2qT+L3j7XoFFu1XBlZWEl2/1kWnhmAbxpLgPrHSY0M6UA02jyTiwUVtiKR6A== + dependencies: + "@babel/helper-module-transforms" "^7.24.7" + "@babel/helper-plugin-utils" "^7.24.7" + +"@babel/plugin-transform-named-capturing-groups-regex@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.24.7.tgz#9042e9b856bc6b3688c0c2e4060e9e10b1460923" + integrity sha512-/jr7h/EWeJtk1U/uz2jlsCioHkZk1JJZVcc8oQsJ1dUlaJD83f4/6Zeh2aHt9BIFokHIsSeDfhUmju0+1GPd6g== + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.24.7" + "@babel/helper-plugin-utils" "^7.24.7" + +"@babel/plugin-transform-new-target@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.24.7.tgz#31ff54c4e0555cc549d5816e4ab39241dfb6ab00" + integrity sha512-RNKwfRIXg4Ls/8mMTza5oPF5RkOW8Wy/WgMAp1/F1yZ8mMbtwXW+HDoJiOsagWrAhI5f57Vncrmr9XeT4CVapA== + dependencies: + "@babel/helper-plugin-utils" "^7.24.7" + +"@babel/plugin-transform-nullish-coalescing-operator@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.24.7.tgz#1de4534c590af9596f53d67f52a92f12db984120" + integrity sha512-Ts7xQVk1OEocqzm8rHMXHlxvsfZ0cEF2yomUqpKENHWMF4zKk175Y4q8H5knJes6PgYad50uuRmt3UJuhBw8pQ== + dependencies: + "@babel/helper-plugin-utils" "^7.24.7" + "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.3" + +"@babel/plugin-transform-numeric-separator@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.24.7.tgz#bea62b538c80605d8a0fac9b40f48e97efa7de63" + integrity sha512-e6q1TiVUzvH9KRvicuxdBTUj4AdKSRwzIyFFnfnezpCfP2/7Qmbb8qbU2j7GODbl4JMkblitCQjKYUaX/qkkwA== + dependencies: + "@babel/helper-plugin-utils" "^7.24.7" + "@babel/plugin-syntax-numeric-separator" "^7.10.4" + +"@babel/plugin-transform-object-rest-spread@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.24.7.tgz#d13a2b93435aeb8a197e115221cab266ba6e55d6" + integrity sha512-4QrHAr0aXQCEFni2q4DqKLD31n2DL+RxcwnNjDFkSG0eNQ/xCavnRkfCUjsyqGC2OviNJvZOF/mQqZBw7i2C5Q== + dependencies: + "@babel/helper-compilation-targets" "^7.24.7" + "@babel/helper-plugin-utils" "^7.24.7" + "@babel/plugin-syntax-object-rest-spread" "^7.8.3" + "@babel/plugin-transform-parameters" "^7.24.7" + +"@babel/plugin-transform-object-super@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.24.7.tgz#66eeaff7830bba945dd8989b632a40c04ed625be" + integrity sha512-A/vVLwN6lBrMFmMDmPPz0jnE6ZGx7Jq7d6sT/Ev4H65RER6pZ+kczlf1DthF5N0qaPHBsI7UXiE8Zy66nmAovg== + dependencies: + "@babel/helper-plugin-utils" "^7.24.7" + "@babel/helper-replace-supers" "^7.24.7" + +"@babel/plugin-transform-optional-catch-binding@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.24.7.tgz#00eabd883d0dd6a60c1c557548785919b6e717b4" + integrity sha512-uLEndKqP5BfBbC/5jTwPxLh9kqPWWgzN/f8w6UwAIirAEqiIVJWWY312X72Eub09g5KF9+Zn7+hT7sDxmhRuKA== + dependencies: + "@babel/helper-plugin-utils" "^7.24.7" + "@babel/plugin-syntax-optional-catch-binding" "^7.8.3" + +"@babel/plugin-transform-optional-chaining@^7.24.7", "@babel/plugin-transform-optional-chaining@^7.24.8": + version "7.24.8" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.24.8.tgz#bb02a67b60ff0406085c13d104c99a835cdf365d" + integrity sha512-5cTOLSMs9eypEy8JUVvIKOu6NgvbJMnpG62VpIHrTmROdQ+L5mDAaI40g25k5vXti55JWNX5jCkq3HZxXBQANw== + dependencies: + "@babel/helper-plugin-utils" "^7.24.8" + "@babel/helper-skip-transparent-expression-wrappers" "^7.24.7" + "@babel/plugin-syntax-optional-chaining" "^7.8.3" + +"@babel/plugin-transform-parameters@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.24.7.tgz#5881f0ae21018400e320fc7eb817e529d1254b68" + integrity sha512-yGWW5Rr+sQOhK0Ot8hjDJuxU3XLRQGflvT4lhlSY0DFvdb3TwKaY26CJzHtYllU0vT9j58hc37ndFPsqT1SrzA== + dependencies: + "@babel/helper-plugin-utils" "^7.24.7" + +"@babel/plugin-transform-private-methods@^7.24.7": + version "7.25.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.25.4.tgz#9bbefbe3649f470d681997e0b64a4b254d877242" + integrity sha512-ao8BG7E2b/URaUQGqN3Tlsg+M3KlHY6rJ1O1gXAEUnZoyNQnvKyH87Kfg+FoxSeyWUB8ISZZsC91C44ZuBFytw== + dependencies: + "@babel/helper-create-class-features-plugin" "^7.25.4" + "@babel/helper-plugin-utils" "^7.24.8" + +"@babel/plugin-transform-private-property-in-object@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.24.7.tgz#4eec6bc701288c1fab5f72e6a4bbc9d67faca061" + integrity sha512-9z76mxwnwFxMyxZWEgdgECQglF2Q7cFLm0kMf8pGwt+GSJsY0cONKj/UuO4bOH0w/uAel3ekS4ra5CEAyJRmDA== + dependencies: + "@babel/helper-annotate-as-pure" "^7.24.7" + "@babel/helper-create-class-features-plugin" "^7.24.7" + "@babel/helper-plugin-utils" "^7.24.7" + "@babel/plugin-syntax-private-property-in-object" "^7.14.5" + +"@babel/plugin-transform-property-literals@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.24.7.tgz#f0d2ed8380dfbed949c42d4d790266525d63bbdc" + integrity sha512-EMi4MLQSHfd2nrCqQEWxFdha2gBCqU4ZcCng4WBGZ5CJL4bBRW0ptdqqDdeirGZcpALazVVNJqRmsO8/+oNCBA== + dependencies: + "@babel/helper-plugin-utils" "^7.24.7" + +"@babel/plugin-transform-regenerator@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.24.7.tgz#021562de4534d8b4b1851759fd7af4e05d2c47f8" + integrity sha512-lq3fvXPdimDrlg6LWBoqj+r/DEWgONuwjuOuQCSYgRroXDH/IdM1C0IZf59fL5cHLpjEH/O6opIRBbqv7ELnuA== + dependencies: + "@babel/helper-plugin-utils" "^7.24.7" + regenerator-transform "^0.15.2" + +"@babel/plugin-transform-reserved-words@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.24.7.tgz#80037fe4fbf031fc1125022178ff3938bb3743a4" + integrity sha512-0DUq0pHcPKbjFZCfTss/pGkYMfy3vFWydkUBd9r0GHpIyfs2eCDENvqadMycRS9wZCXR41wucAfJHJmwA0UmoQ== + dependencies: + "@babel/helper-plugin-utils" "^7.24.7" + +"@babel/plugin-transform-runtime@7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.24.7.tgz#00a5bfaf8c43cf5c8703a8a6e82b59d9c58f38ca" + integrity sha512-YqXjrk4C+a1kZjewqt+Mmu2UuV1s07y8kqcUf4qYLnoqemhR4gRQikhdAhSVJioMjVTu6Mo6pAbaypEA3jY6fw== + dependencies: + "@babel/helper-module-imports" "^7.24.7" + "@babel/helper-plugin-utils" "^7.24.7" + babel-plugin-polyfill-corejs2 "^0.4.10" + babel-plugin-polyfill-corejs3 "^0.10.1" + babel-plugin-polyfill-regenerator "^0.6.1" + semver "^6.3.1" + +"@babel/plugin-transform-shorthand-properties@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.24.7.tgz#85448c6b996e122fa9e289746140aaa99da64e73" + integrity sha512-KsDsevZMDsigzbA09+vacnLpmPH4aWjcZjXdyFKGzpplxhbeB4wYtury3vglQkg6KM/xEPKt73eCjPPf1PgXBA== + dependencies: + "@babel/helper-plugin-utils" "^7.24.7" + +"@babel/plugin-transform-spread@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-spread/-/plugin-transform-spread-7.24.7.tgz#e8a38c0fde7882e0fb8f160378f74bd885cc7bb3" + integrity sha512-x96oO0I09dgMDxJaANcRyD4ellXFLLiWhuwDxKZX5g2rWP1bTPkBSwCYv96VDXVT1bD9aPj8tppr5ITIh8hBng== + dependencies: + "@babel/helper-plugin-utils" "^7.24.7" + "@babel/helper-skip-transparent-expression-wrappers" "^7.24.7" + +"@babel/plugin-transform-sticky-regex@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.24.7.tgz#96ae80d7a7e5251f657b5cf18f1ea6bf926f5feb" + integrity sha512-kHPSIJc9v24zEml5geKg9Mjx5ULpfncj0wRpYtxbvKyTtHCYDkVE3aHQ03FrpEo4gEe2vrJJS1Y9CJTaThA52g== + dependencies: + "@babel/helper-plugin-utils" "^7.24.7" + +"@babel/plugin-transform-template-literals@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.24.7.tgz#a05debb4a9072ae8f985bcf77f3f215434c8f8c8" + integrity sha512-AfDTQmClklHCOLxtGoP7HkeMw56k1/bTQjwsfhL6pppo/M4TOBSq+jjBUBLmV/4oeFg4GWMavIl44ZeCtmmZTw== + dependencies: + "@babel/helper-plugin-utils" "^7.24.7" + +"@babel/plugin-transform-typeof-symbol@^7.24.8": + version "7.24.8" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.24.8.tgz#383dab37fb073f5bfe6e60c654caac309f92ba1c" + integrity sha512-adNTUpDCVnmAE58VEqKlAA6ZBlNkMnWD0ZcW76lyNFN3MJniyGFZfNwERVk8Ap56MCnXztmDr19T4mPTztcuaw== + dependencies: + "@babel/helper-plugin-utils" "^7.24.8" + +"@babel/plugin-transform-unicode-escapes@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.24.7.tgz#2023a82ced1fb4971630a2e079764502c4148e0e" + integrity sha512-U3ap1gm5+4edc2Q/P+9VrBNhGkfnf+8ZqppY71Bo/pzZmXhhLdqgaUl6cuB07O1+AQJtCLfaOmswiNbSQ9ivhw== + dependencies: + "@babel/helper-plugin-utils" "^7.24.7" + +"@babel/plugin-transform-unicode-property-regex@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.24.7.tgz#9073a4cd13b86ea71c3264659590ac086605bbcd" + integrity sha512-uH2O4OV5M9FZYQrwc7NdVmMxQJOCCzFeYudlZSzUAHRFeOujQefa92E74TQDVskNHCzOXoigEuoyzHDhaEaK5w== + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.24.7" + "@babel/helper-plugin-utils" "^7.24.7" + +"@babel/plugin-transform-unicode-regex@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.24.7.tgz#dfc3d4a51127108099b19817c0963be6a2adf19f" + integrity sha512-hlQ96MBZSAXUq7ltkjtu3FJCCSMx/j629ns3hA3pXnBXjanNP0LHi+JpPeA81zaWgVK1VGH95Xuy7u0RyQ8kMg== + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.24.7" + "@babel/helper-plugin-utils" "^7.24.7" + +"@babel/plugin-transform-unicode-sets-regex@^7.24.7": + version "7.25.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.25.4.tgz#be664c2a0697ffacd3423595d5edef6049e8946c" + integrity sha512-qesBxiWkgN1Q+31xUE9RcMk79eOXXDCv6tfyGMRSs4RGlioSg2WVyQAm07k726cSE56pa+Kb0y9epX2qaXzTvA== + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.25.2" + "@babel/helper-plugin-utils" "^7.24.8" + +"@babel/preset-env@7.25.3": + version "7.25.3" + resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.25.3.tgz#0bf4769d84ac51d1073ab4a86f00f30a3a83c67c" + integrity sha512-QsYW7UeAaXvLPX9tdVliMJE7MD7M6MLYVTovRTIwhoYQVFHR1rM4wO8wqAezYi3/BpSD+NzVCZ69R6smWiIi8g== + dependencies: + "@babel/compat-data" "^7.25.2" + "@babel/helper-compilation-targets" "^7.25.2" + "@babel/helper-plugin-utils" "^7.24.8" + "@babel/helper-validator-option" "^7.24.8" + "@babel/plugin-bugfix-firefox-class-in-computed-class-key" "^7.25.3" + "@babel/plugin-bugfix-safari-class-field-initializer-scope" "^7.25.0" + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression" "^7.25.0" + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining" "^7.24.7" + "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly" "^7.25.0" + "@babel/plugin-proposal-private-property-in-object" "7.21.0-placeholder-for-preset-env.2" + "@babel/plugin-syntax-async-generators" "^7.8.4" + "@babel/plugin-syntax-class-properties" "^7.12.13" + "@babel/plugin-syntax-class-static-block" "^7.14.5" + "@babel/plugin-syntax-dynamic-import" "^7.8.3" + "@babel/plugin-syntax-export-namespace-from" "^7.8.3" + "@babel/plugin-syntax-import-assertions" "^7.24.7" + "@babel/plugin-syntax-import-attributes" "^7.24.7" + "@babel/plugin-syntax-import-meta" "^7.10.4" + "@babel/plugin-syntax-json-strings" "^7.8.3" + "@babel/plugin-syntax-logical-assignment-operators" "^7.10.4" + "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.3" + "@babel/plugin-syntax-numeric-separator" "^7.10.4" + "@babel/plugin-syntax-object-rest-spread" "^7.8.3" + "@babel/plugin-syntax-optional-catch-binding" "^7.8.3" + "@babel/plugin-syntax-optional-chaining" "^7.8.3" + "@babel/plugin-syntax-private-property-in-object" "^7.14.5" + "@babel/plugin-syntax-top-level-await" "^7.14.5" + "@babel/plugin-syntax-unicode-sets-regex" "^7.18.6" + "@babel/plugin-transform-arrow-functions" "^7.24.7" + "@babel/plugin-transform-async-generator-functions" "^7.25.0" + "@babel/plugin-transform-async-to-generator" "^7.24.7" + "@babel/plugin-transform-block-scoped-functions" "^7.24.7" + "@babel/plugin-transform-block-scoping" "^7.25.0" + "@babel/plugin-transform-class-properties" "^7.24.7" + "@babel/plugin-transform-class-static-block" "^7.24.7" + "@babel/plugin-transform-classes" "^7.25.0" + "@babel/plugin-transform-computed-properties" "^7.24.7" + "@babel/plugin-transform-destructuring" "^7.24.8" + "@babel/plugin-transform-dotall-regex" "^7.24.7" + "@babel/plugin-transform-duplicate-keys" "^7.24.7" + "@babel/plugin-transform-duplicate-named-capturing-groups-regex" "^7.25.0" + "@babel/plugin-transform-dynamic-import" "^7.24.7" + "@babel/plugin-transform-exponentiation-operator" "^7.24.7" + "@babel/plugin-transform-export-namespace-from" "^7.24.7" + "@babel/plugin-transform-for-of" "^7.24.7" + "@babel/plugin-transform-function-name" "^7.25.1" + "@babel/plugin-transform-json-strings" "^7.24.7" + "@babel/plugin-transform-literals" "^7.25.2" + "@babel/plugin-transform-logical-assignment-operators" "^7.24.7" + "@babel/plugin-transform-member-expression-literals" "^7.24.7" + "@babel/plugin-transform-modules-amd" "^7.24.7" + "@babel/plugin-transform-modules-commonjs" "^7.24.8" + "@babel/plugin-transform-modules-systemjs" "^7.25.0" + "@babel/plugin-transform-modules-umd" "^7.24.7" + "@babel/plugin-transform-named-capturing-groups-regex" "^7.24.7" + "@babel/plugin-transform-new-target" "^7.24.7" + "@babel/plugin-transform-nullish-coalescing-operator" "^7.24.7" + "@babel/plugin-transform-numeric-separator" "^7.24.7" + "@babel/plugin-transform-object-rest-spread" "^7.24.7" + "@babel/plugin-transform-object-super" "^7.24.7" + "@babel/plugin-transform-optional-catch-binding" "^7.24.7" + "@babel/plugin-transform-optional-chaining" "^7.24.8" + "@babel/plugin-transform-parameters" "^7.24.7" + "@babel/plugin-transform-private-methods" "^7.24.7" + "@babel/plugin-transform-private-property-in-object" "^7.24.7" + "@babel/plugin-transform-property-literals" "^7.24.7" + "@babel/plugin-transform-regenerator" "^7.24.7" + "@babel/plugin-transform-reserved-words" "^7.24.7" + "@babel/plugin-transform-shorthand-properties" "^7.24.7" + "@babel/plugin-transform-spread" "^7.24.7" + "@babel/plugin-transform-sticky-regex" "^7.24.7" + "@babel/plugin-transform-template-literals" "^7.24.7" + "@babel/plugin-transform-typeof-symbol" "^7.24.8" + "@babel/plugin-transform-unicode-escapes" "^7.24.7" + "@babel/plugin-transform-unicode-property-regex" "^7.24.7" + "@babel/plugin-transform-unicode-regex" "^7.24.7" + "@babel/plugin-transform-unicode-sets-regex" "^7.24.7" + "@babel/preset-modules" "0.1.6-no-external-plugins" + babel-plugin-polyfill-corejs2 "^0.4.10" + babel-plugin-polyfill-corejs3 "^0.10.4" + babel-plugin-polyfill-regenerator "^0.6.1" + core-js-compat "^3.37.1" + semver "^6.3.1" + +"@babel/preset-modules@0.1.6-no-external-plugins": + version "0.1.6-no-external-plugins" + resolved "https://registry.yarnpkg.com/@babel/preset-modules/-/preset-modules-0.1.6-no-external-plugins.tgz#ccb88a2c49c817236861fee7826080573b8a923a" + integrity sha512-HrcgcIESLm9aIR842yhJ5RWan/gebQUJ6E/E5+rf0y9o6oj7w0Br+sWuL6kEQ/o/AdfvR1Je9jG18/gnpwjEyA== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/types" "^7.4.4" + esutils "^2.0.2" + +"@babel/regjsgen@^0.8.0": + version "0.8.0" + resolved "https://registry.yarnpkg.com/@babel/regjsgen/-/regjsgen-0.8.0.tgz#f0ba69b075e1f05fb2825b7fad991e7adbb18310" + integrity sha512-x/rqGMdzj+fWZvCOYForTghzbtqPDZ5gPwaoNGHdgDfF2QA/XZbCBp4Moo5scrkAMPhB7z26XM/AaHuIJdgauA== + +"@babel/runtime@7.25.0": + version "7.25.0" + resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.25.0.tgz#3af9a91c1b739c569d5d80cc917280919c544ecb" + integrity sha512-7dRy4DwXwtzBrPbZflqxnvfxLF8kdZXPkhymtDeFoFqE6ldzjQFgYTtYIFARcLEYDrqfBfYcZt1WqFxRoyC9Rw== + dependencies: + regenerator-runtime "^0.14.0" + +"@babel/runtime@^7.8.4": + version "7.25.6" + resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.25.6.tgz#9afc3289f7184d8d7f98b099884c26317b9264d2" + integrity sha512-VBj9MYyDb9tuLq7yzqjgzt6Q+IBQLrGZfdjOekyEirZPHxXWoTSGUTMrpsfi58Up73d13NfYLv8HT9vmznjzhQ== + dependencies: + regenerator-runtime "^0.14.0" + +"@babel/template@^7.24.7", "@babel/template@^7.25.0": + version "7.25.0" + resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.25.0.tgz#e733dc3134b4fede528c15bc95e89cb98c52592a" + integrity sha512-aOOgh1/5XzKvg1jvVz7AVrx2piJ2XBi227DHmbY6y+bM9H2FlN+IfecYu4Xl0cNiiVejlsCri89LUsbj8vJD9Q== + dependencies: + "@babel/code-frame" "^7.24.7" + "@babel/parser" "^7.25.0" + "@babel/types" "^7.25.0" + +"@babel/traverse@^7.24.7", "@babel/traverse@^7.24.8", "@babel/traverse@^7.25.0", "@babel/traverse@^7.25.1", "@babel/traverse@^7.25.2", "@babel/traverse@^7.25.3", "@babel/traverse@^7.25.4": + version "7.25.6" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.25.6.tgz#04fad980e444f182ecf1520504941940a90fea41" + integrity sha512-9Vrcx5ZW6UwK5tvqsj0nGpp/XzqthkT0dqIc9g1AdtygFToNtTF67XzYS//dm+SAK9cp3B9R4ZO/46p63SCjlQ== + dependencies: + "@babel/code-frame" "^7.24.7" + "@babel/generator" "^7.25.6" + "@babel/parser" "^7.25.6" + "@babel/template" "^7.25.0" + "@babel/types" "^7.25.6" + debug "^4.3.1" + globals "^11.1.0" + +"@babel/types@^7.24.7", "@babel/types@^7.24.8", "@babel/types@^7.25.0", "@babel/types@^7.25.2", "@babel/types@^7.25.6", "@babel/types@^7.4.4": + version "7.25.6" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.25.6.tgz#893942ddb858f32ae7a004ec9d3a76b3463ef8e6" + integrity sha512-/l42B1qxpG6RdfYf343Uw1vmDjeNhneUXtzhojE7pDgfpEypmRhI6j1kr17XCVv4Cgl9HdAiQY2x0GwKm7rWCw== + dependencies: + "@babel/helper-string-parser" "^7.24.8" + "@babel/helper-validator-identifier" "^7.24.7" + to-fast-properties "^2.0.0" + +"@discoveryjs/json-ext@0.6.1": + version "0.6.1" + resolved "https://registry.yarnpkg.com/@discoveryjs/json-ext/-/json-ext-0.6.1.tgz#593da7a17a31a72a874e313677183334a49b01c9" + integrity sha512-boghen8F0Q8D+0/Q1/1r6DUEieUJ8w2a1gIknExMSHBsJFOr2+0KUfHiVYBvucPwl3+RU5PFBK833FjFCh3BhA== + +"@esbuild/aix-ppc64@0.21.5": + version "0.21.5" + resolved "https://registry.yarnpkg.com/@esbuild/aix-ppc64/-/aix-ppc64-0.21.5.tgz#c7184a326533fcdf1b8ee0733e21c713b975575f" + integrity sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ== + +"@esbuild/aix-ppc64@0.23.0": + version "0.23.0" + resolved "https://registry.yarnpkg.com/@esbuild/aix-ppc64/-/aix-ppc64-0.23.0.tgz#145b74d5e4a5223489cabdc238d8dad902df5259" + integrity sha512-3sG8Zwa5fMcA9bgqB8AfWPQ+HFke6uD3h1s3RIwUNK8EG7a4buxvuFTs3j1IMs2NXAk9F30C/FF4vxRgQCcmoQ== + "@esbuild/aix-ppc64@0.23.1": version "0.23.1" resolved "https://registry.yarnpkg.com/@esbuild/aix-ppc64/-/aix-ppc64-0.23.1.tgz#51299374de171dbd80bb7d838e1cfce9af36f353" integrity sha512-6VhYk1diRqrhBAqpJEdjASR/+WVRtfjpqKuNw11cLiaWpAT/Uu+nokB+UJnevzy/P9C/ty6AOe0dwueMrGh/iQ== +"@esbuild/android-arm64@0.21.5": + version "0.21.5" + resolved "https://registry.yarnpkg.com/@esbuild/android-arm64/-/android-arm64-0.21.5.tgz#09d9b4357780da9ea3a7dfb833a1f1ff439b4052" + integrity sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A== + +"@esbuild/android-arm64@0.23.0": + version "0.23.0" + resolved "https://registry.yarnpkg.com/@esbuild/android-arm64/-/android-arm64-0.23.0.tgz#453bbe079fc8d364d4c5545069e8260228559832" + integrity sha512-EuHFUYkAVfU4qBdyivULuu03FhJO4IJN9PGuABGrFy4vUuzk91P2d+npxHcFdpUnfYKy0PuV+n6bKIpHOB3prQ== + "@esbuild/android-arm64@0.23.1": version "0.23.1" resolved "https://registry.yarnpkg.com/@esbuild/android-arm64/-/android-arm64-0.23.1.tgz#58565291a1fe548638adb9c584237449e5e14018" integrity sha512-xw50ipykXcLstLeWH7WRdQuysJqejuAGPd30vd1i5zSyKK3WE+ijzHmLKxdiCMtH1pHz78rOg0BKSYOSB/2Khw== +"@esbuild/android-arm@0.21.5": + version "0.21.5" + resolved "https://registry.yarnpkg.com/@esbuild/android-arm/-/android-arm-0.21.5.tgz#9b04384fb771926dfa6d7ad04324ecb2ab9b2e28" + integrity sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg== + +"@esbuild/android-arm@0.23.0": + version "0.23.0" + resolved "https://registry.yarnpkg.com/@esbuild/android-arm/-/android-arm-0.23.0.tgz#26c806853aa4a4f7e683e519cd9d68e201ebcf99" + integrity sha512-+KuOHTKKyIKgEEqKbGTK8W7mPp+hKinbMBeEnNzjJGyFcWsfrXjSTNluJHCY1RqhxFurdD8uNXQDei7qDlR6+g== + "@esbuild/android-arm@0.23.1": version "0.23.1" resolved "https://registry.yarnpkg.com/@esbuild/android-arm/-/android-arm-0.23.1.tgz#5eb8c652d4c82a2421e3395b808e6d9c42c862ee" integrity sha512-uz6/tEy2IFm9RYOyvKl88zdzZfwEfKZmnX9Cj1BHjeSGNuGLuMD1kR8y5bteYmwqKm1tj8m4cb/aKEorr6fHWQ== +"@esbuild/android-x64@0.21.5": + version "0.21.5" + resolved "https://registry.yarnpkg.com/@esbuild/android-x64/-/android-x64-0.21.5.tgz#29918ec2db754cedcb6c1b04de8cd6547af6461e" + integrity sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA== + +"@esbuild/android-x64@0.23.0": + version "0.23.0" + resolved "https://registry.yarnpkg.com/@esbuild/android-x64/-/android-x64-0.23.0.tgz#1e51af9a6ac1f7143769f7ee58df5b274ed202e6" + integrity sha512-WRrmKidLoKDl56LsbBMhzTTBxrsVwTKdNbKDalbEZr0tcsBgCLbEtoNthOW6PX942YiYq8HzEnb4yWQMLQuipQ== + "@esbuild/android-x64@0.23.1": version "0.23.1" resolved "https://registry.yarnpkg.com/@esbuild/android-x64/-/android-x64-0.23.1.tgz#ae19d665d2f06f0f48a6ac9a224b3f672e65d517" integrity sha512-nlN9B69St9BwUoB+jkyU090bru8L0NA3yFvAd7k8dNsVH8bi9a8cUAUSEcEEgTp2z3dbEDGJGfP6VUnkQnlReg== +"@esbuild/darwin-arm64@0.21.5": + version "0.21.5" + resolved "https://registry.yarnpkg.com/@esbuild/darwin-arm64/-/darwin-arm64-0.21.5.tgz#e495b539660e51690f3928af50a76fb0a6ccff2a" + integrity sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ== + +"@esbuild/darwin-arm64@0.23.0": + version "0.23.0" + resolved "https://registry.yarnpkg.com/@esbuild/darwin-arm64/-/darwin-arm64-0.23.0.tgz#d996187a606c9534173ebd78c58098a44dd7ef9e" + integrity sha512-YLntie/IdS31H54Ogdn+v50NuoWF5BDkEUFpiOChVa9UnKpftgwzZRrI4J132ETIi+D8n6xh9IviFV3eXdxfow== + "@esbuild/darwin-arm64@0.23.1": version "0.23.1" resolved "https://registry.yarnpkg.com/@esbuild/darwin-arm64/-/darwin-arm64-0.23.1.tgz#05b17f91a87e557b468a9c75e9d85ab10c121b16" integrity sha512-YsS2e3Wtgnw7Wq53XXBLcV6JhRsEq8hkfg91ESVadIrzr9wO6jJDMZnCQbHm1Guc5t/CdDiFSSfWP58FNuvT3Q== +"@esbuild/darwin-x64@0.21.5": + version "0.21.5" + resolved "https://registry.yarnpkg.com/@esbuild/darwin-x64/-/darwin-x64-0.21.5.tgz#c13838fa57372839abdddc91d71542ceea2e1e22" + integrity sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw== + +"@esbuild/darwin-x64@0.23.0": + version "0.23.0" + resolved "https://registry.yarnpkg.com/@esbuild/darwin-x64/-/darwin-x64-0.23.0.tgz#30c8f28a7ef4e32fe46501434ebe6b0912e9e86c" + integrity sha512-IMQ6eme4AfznElesHUPDZ+teuGwoRmVuuixu7sv92ZkdQcPbsNHzutd+rAfaBKo8YK3IrBEi9SLLKWJdEvJniQ== + "@esbuild/darwin-x64@0.23.1": version "0.23.1" resolved "https://registry.yarnpkg.com/@esbuild/darwin-x64/-/darwin-x64-0.23.1.tgz#c58353b982f4e04f0d022284b8ba2733f5ff0931" integrity sha512-aClqdgTDVPSEGgoCS8QDG37Gu8yc9lTHNAQlsztQ6ENetKEO//b8y31MMu2ZaPbn4kVsIABzVLXYLhCGekGDqw== +"@esbuild/freebsd-arm64@0.21.5": + version "0.21.5" + resolved "https://registry.yarnpkg.com/@esbuild/freebsd-arm64/-/freebsd-arm64-0.21.5.tgz#646b989aa20bf89fd071dd5dbfad69a3542e550e" + integrity sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g== + +"@esbuild/freebsd-arm64@0.23.0": + version "0.23.0" + resolved "https://registry.yarnpkg.com/@esbuild/freebsd-arm64/-/freebsd-arm64-0.23.0.tgz#30f4fcec8167c08a6e8af9fc14b66152232e7fb4" + integrity sha512-0muYWCng5vqaxobq6LB3YNtevDFSAZGlgtLoAc81PjUfiFz36n4KMpwhtAd4he8ToSI3TGyuhyx5xmiWNYZFyw== + "@esbuild/freebsd-arm64@0.23.1": version "0.23.1" resolved "https://registry.yarnpkg.com/@esbuild/freebsd-arm64/-/freebsd-arm64-0.23.1.tgz#f9220dc65f80f03635e1ef96cfad5da1f446f3bc" integrity sha512-h1k6yS8/pN/NHlMl5+v4XPfikhJulk4G+tKGFIOwURBSFzE8bixw1ebjluLOjfwtLqY0kewfjLSrO6tN2MgIhA== +"@esbuild/freebsd-x64@0.21.5": + version "0.21.5" + resolved "https://registry.yarnpkg.com/@esbuild/freebsd-x64/-/freebsd-x64-0.21.5.tgz#aa615cfc80af954d3458906e38ca22c18cf5c261" + integrity sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ== + +"@esbuild/freebsd-x64@0.23.0": + version "0.23.0" + resolved "https://registry.yarnpkg.com/@esbuild/freebsd-x64/-/freebsd-x64-0.23.0.tgz#1003a6668fe1f5d4439e6813e5b09a92981bc79d" + integrity sha512-XKDVu8IsD0/q3foBzsXGt/KjD/yTKBCIwOHE1XwiXmrRwrX6Hbnd5Eqn/WvDekddK21tfszBSrE/WMaZh+1buQ== + "@esbuild/freebsd-x64@0.23.1": version "0.23.1" resolved "https://registry.yarnpkg.com/@esbuild/freebsd-x64/-/freebsd-x64-0.23.1.tgz#69bd8511fa013b59f0226d1609ac43f7ce489730" integrity sha512-lK1eJeyk1ZX8UklqFd/3A60UuZ/6UVfGT2LuGo3Wp4/z7eRTRYY+0xOu2kpClP+vMTi9wKOfXi2vjUpO1Ro76g== +"@esbuild/linux-arm64@0.21.5": + version "0.21.5" + resolved "https://registry.yarnpkg.com/@esbuild/linux-arm64/-/linux-arm64-0.21.5.tgz#70ac6fa14f5cb7e1f7f887bcffb680ad09922b5b" + integrity sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q== + +"@esbuild/linux-arm64@0.23.0": + version "0.23.0" + resolved "https://registry.yarnpkg.com/@esbuild/linux-arm64/-/linux-arm64-0.23.0.tgz#3b9a56abfb1410bb6c9138790f062587df3e6e3a" + integrity sha512-j1t5iG8jE7BhonbsEg5d9qOYcVZv/Rv6tghaXM/Ug9xahM0nX/H2gfu6X6z11QRTMT6+aywOMA8TDkhPo8aCGw== + "@esbuild/linux-arm64@0.23.1": version "0.23.1" resolved "https://registry.yarnpkg.com/@esbuild/linux-arm64/-/linux-arm64-0.23.1.tgz#8050af6d51ddb388c75653ef9871f5ccd8f12383" integrity sha512-/93bf2yxencYDnItMYV/v116zff6UyTjo4EtEQjUBeGiVpMmffDNUyD9UN2zV+V3LRV3/on4xdZ26NKzn6754g== +"@esbuild/linux-arm@0.21.5": + version "0.21.5" + resolved "https://registry.yarnpkg.com/@esbuild/linux-arm/-/linux-arm-0.21.5.tgz#fc6fd11a8aca56c1f6f3894f2bea0479f8f626b9" + integrity sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA== + +"@esbuild/linux-arm@0.23.0": + version "0.23.0" + resolved "https://registry.yarnpkg.com/@esbuild/linux-arm/-/linux-arm-0.23.0.tgz#237a8548e3da2c48cd79ae339a588f03d1889aad" + integrity sha512-SEELSTEtOFu5LPykzA395Mc+54RMg1EUgXP+iw2SJ72+ooMwVsgfuwXo5Fn0wXNgWZsTVHwY2cg4Vi/bOD88qw== + "@esbuild/linux-arm@0.23.1": version "0.23.1" resolved "https://registry.yarnpkg.com/@esbuild/linux-arm/-/linux-arm-0.23.1.tgz#ecaabd1c23b701070484990db9a82f382f99e771" integrity sha512-CXXkzgn+dXAPs3WBwE+Kvnrf4WECwBdfjfeYHpMeVxWE0EceB6vhWGShs6wi0IYEqMSIzdOF1XjQ/Mkm5d7ZdQ== +"@esbuild/linux-ia32@0.21.5": + version "0.21.5" + resolved "https://registry.yarnpkg.com/@esbuild/linux-ia32/-/linux-ia32-0.21.5.tgz#3271f53b3f93e3d093d518d1649d6d68d346ede2" + integrity sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg== + +"@esbuild/linux-ia32@0.23.0": + version "0.23.0" + resolved "https://registry.yarnpkg.com/@esbuild/linux-ia32/-/linux-ia32-0.23.0.tgz#4269cd19cb2de5de03a7ccfc8855dde3d284a238" + integrity sha512-P7O5Tkh2NbgIm2R6x1zGJJsnacDzTFcRWZyTTMgFdVit6E98LTxO+v8LCCLWRvPrjdzXHx9FEOA8oAZPyApWUA== + "@esbuild/linux-ia32@0.23.1": version "0.23.1" resolved "https://registry.yarnpkg.com/@esbuild/linux-ia32/-/linux-ia32-0.23.1.tgz#3ed2273214178109741c09bd0687098a0243b333" integrity sha512-VTN4EuOHwXEkXzX5nTvVY4s7E/Krz7COC8xkftbbKRYAl96vPiUssGkeMELQMOnLOJ8k3BY1+ZY52tttZnHcXQ== +"@esbuild/linux-loong64@0.21.5": + version "0.21.5" + resolved "https://registry.yarnpkg.com/@esbuild/linux-loong64/-/linux-loong64-0.21.5.tgz#ed62e04238c57026aea831c5a130b73c0f9f26df" + integrity sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg== + +"@esbuild/linux-loong64@0.23.0": + version "0.23.0" + resolved "https://registry.yarnpkg.com/@esbuild/linux-loong64/-/linux-loong64-0.23.0.tgz#82b568f5658a52580827cc891cb69d2cb4f86280" + integrity sha512-InQwepswq6urikQiIC/kkx412fqUZudBO4SYKu0N+tGhXRWUqAx+Q+341tFV6QdBifpjYgUndV1hhMq3WeJi7A== + "@esbuild/linux-loong64@0.23.1": version "0.23.1" resolved "https://registry.yarnpkg.com/@esbuild/linux-loong64/-/linux-loong64-0.23.1.tgz#a0fdf440b5485c81b0fbb316b08933d217f5d3ac" integrity sha512-Vx09LzEoBa5zDnieH8LSMRToj7ir/Jeq0Gu6qJ/1GcBq9GkfoEAoXvLiW1U9J1qE/Y/Oyaq33w5p2ZWrNNHNEw== +"@esbuild/linux-mips64el@0.21.5": + version "0.21.5" + resolved "https://registry.yarnpkg.com/@esbuild/linux-mips64el/-/linux-mips64el-0.21.5.tgz#e79b8eb48bf3b106fadec1ac8240fb97b4e64cbe" + integrity sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg== + +"@esbuild/linux-mips64el@0.23.0": + version "0.23.0" + resolved "https://registry.yarnpkg.com/@esbuild/linux-mips64el/-/linux-mips64el-0.23.0.tgz#9a57386c926262ae9861c929a6023ed9d43f73e5" + integrity sha512-J9rflLtqdYrxHv2FqXE2i1ELgNjT+JFURt/uDMoPQLcjWQA5wDKgQA4t/dTqGa88ZVECKaD0TctwsUfHbVoi4w== + "@esbuild/linux-mips64el@0.23.1": version "0.23.1" resolved "https://registry.yarnpkg.com/@esbuild/linux-mips64el/-/linux-mips64el-0.23.1.tgz#e11a2806346db8375b18f5e104c5a9d4e81807f6" integrity sha512-nrFzzMQ7W4WRLNUOU5dlWAqa6yVeI0P78WKGUo7lg2HShq/yx+UYkeNSE0SSfSure0SqgnsxPvmAUu/vu0E+3Q== +"@esbuild/linux-ppc64@0.21.5": + version "0.21.5" + resolved "https://registry.yarnpkg.com/@esbuild/linux-ppc64/-/linux-ppc64-0.21.5.tgz#5f2203860a143b9919d383ef7573521fb154c3e4" + integrity sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w== + +"@esbuild/linux-ppc64@0.23.0": + version "0.23.0" + resolved "https://registry.yarnpkg.com/@esbuild/linux-ppc64/-/linux-ppc64-0.23.0.tgz#f3a79fd636ba0c82285d227eb20ed8e31b4444f6" + integrity sha512-cShCXtEOVc5GxU0fM+dsFD10qZ5UpcQ8AM22bYj0u/yaAykWnqXJDpd77ublcX6vdDsWLuweeuSNZk4yUxZwtw== + "@esbuild/linux-ppc64@0.23.1": version "0.23.1" resolved "https://registry.yarnpkg.com/@esbuild/linux-ppc64/-/linux-ppc64-0.23.1.tgz#06a2744c5eaf562b1a90937855b4d6cf7c75ec96" integrity sha512-dKN8fgVqd0vUIjxuJI6P/9SSSe/mB9rvA98CSH2sJnlZ/OCZWO1DJvxj8jvKTfYUdGfcq2dDxoKaC6bHuTlgcw== +"@esbuild/linux-riscv64@0.21.5": + version "0.21.5" + resolved "https://registry.yarnpkg.com/@esbuild/linux-riscv64/-/linux-riscv64-0.21.5.tgz#07bcafd99322d5af62f618cb9e6a9b7f4bb825dc" + integrity sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA== + +"@esbuild/linux-riscv64@0.23.0": + version "0.23.0" + resolved "https://registry.yarnpkg.com/@esbuild/linux-riscv64/-/linux-riscv64-0.23.0.tgz#f9d2ef8356ce6ce140f76029680558126b74c780" + integrity sha512-HEtaN7Y5UB4tZPeQmgz/UhzoEyYftbMXrBCUjINGjh3uil+rB/QzzpMshz3cNUxqXN7Vr93zzVtpIDL99t9aRw== + "@esbuild/linux-riscv64@0.23.1": version "0.23.1" resolved "https://registry.yarnpkg.com/@esbuild/linux-riscv64/-/linux-riscv64-0.23.1.tgz#65b46a2892fc0d1af4ba342af3fe0fa4a8fe08e7" integrity sha512-5AV4Pzp80fhHL83JM6LoA6pTQVWgB1HovMBsLQ9OZWLDqVY8MVobBXNSmAJi//Csh6tcY7e7Lny2Hg1tElMjIA== +"@esbuild/linux-s390x@0.21.5": + version "0.21.5" + resolved "https://registry.yarnpkg.com/@esbuild/linux-s390x/-/linux-s390x-0.21.5.tgz#b7ccf686751d6a3e44b8627ababc8be3ef62d8de" + integrity sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A== + +"@esbuild/linux-s390x@0.23.0": + version "0.23.0" + resolved "https://registry.yarnpkg.com/@esbuild/linux-s390x/-/linux-s390x-0.23.0.tgz#45390f12e802201f38a0229e216a6aed4351dfe8" + integrity sha512-WDi3+NVAuyjg/Wxi+o5KPqRbZY0QhI9TjrEEm+8dmpY9Xir8+HE/HNx2JoLckhKbFopW0RdO2D72w8trZOV+Wg== + "@esbuild/linux-s390x@0.23.1": version "0.23.1" resolved "https://registry.yarnpkg.com/@esbuild/linux-s390x/-/linux-s390x-0.23.1.tgz#e71ea18c70c3f604e241d16e4e5ab193a9785d6f" integrity sha512-9ygs73tuFCe6f6m/Tb+9LtYxWR4c9yg7zjt2cYkjDbDpV/xVn+68cQxMXCjUpYwEkze2RcU/rMnfIXNRFmSoDw== +"@esbuild/linux-x64@0.21.5": + version "0.21.5" + resolved "https://registry.yarnpkg.com/@esbuild/linux-x64/-/linux-x64-0.21.5.tgz#6d8f0c768e070e64309af8004bb94e68ab2bb3b0" + integrity sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ== + +"@esbuild/linux-x64@0.23.0": + version "0.23.0" + resolved "https://registry.yarnpkg.com/@esbuild/linux-x64/-/linux-x64-0.23.0.tgz#c8409761996e3f6db29abcf9b05bee8d7d80e910" + integrity sha512-a3pMQhUEJkITgAw6e0bWA+F+vFtCciMjW/LPtoj99MhVt+Mfb6bbL9hu2wmTZgNd994qTAEw+U/r6k3qHWWaOQ== + "@esbuild/linux-x64@0.23.1": version "0.23.1" resolved "https://registry.yarnpkg.com/@esbuild/linux-x64/-/linux-x64-0.23.1.tgz#d47f97391e80690d4dfe811a2e7d6927ad9eed24" integrity sha512-EV6+ovTsEXCPAp58g2dD68LxoP/wK5pRvgy0J/HxPGB009omFPv3Yet0HiaqvrIrgPTBuC6wCH1LTOY91EO5hQ== +"@esbuild/netbsd-x64@0.21.5": + version "0.21.5" + resolved "https://registry.yarnpkg.com/@esbuild/netbsd-x64/-/netbsd-x64-0.21.5.tgz#bbe430f60d378ecb88decb219c602667387a6047" + integrity sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg== + +"@esbuild/netbsd-x64@0.23.0": + version "0.23.0" + resolved "https://registry.yarnpkg.com/@esbuild/netbsd-x64/-/netbsd-x64-0.23.0.tgz#ba70db0114380d5f6cfb9003f1d378ce989cd65c" + integrity sha512-cRK+YDem7lFTs2Q5nEv/HHc4LnrfBCbH5+JHu6wm2eP+d8OZNoSMYgPZJq78vqQ9g+9+nMuIsAO7skzphRXHyw== + "@esbuild/netbsd-x64@0.23.1": version "0.23.1" resolved "https://registry.yarnpkg.com/@esbuild/netbsd-x64/-/netbsd-x64-0.23.1.tgz#44e743c9778d57a8ace4b72f3c6b839a3b74a653" integrity sha512-aevEkCNu7KlPRpYLjwmdcuNz6bDFiE7Z8XC4CPqExjTvrHugh28QzUXVOZtiYghciKUacNktqxdpymplil1beA== +"@esbuild/openbsd-arm64@0.23.0": + version "0.23.0" + resolved "https://registry.yarnpkg.com/@esbuild/openbsd-arm64/-/openbsd-arm64-0.23.0.tgz#72fc55f0b189f7a882e3cf23f332370d69dfd5db" + integrity sha512-suXjq53gERueVWu0OKxzWqk7NxiUWSUlrxoZK7usiF50C6ipColGR5qie2496iKGYNLhDZkPxBI3erbnYkU0rQ== + "@esbuild/openbsd-arm64@0.23.1": version "0.23.1" resolved "https://registry.yarnpkg.com/@esbuild/openbsd-arm64/-/openbsd-arm64-0.23.1.tgz#05c5a1faf67b9881834758c69f3e51b7dee015d7" integrity sha512-3x37szhLexNA4bXhLrCC/LImN/YtWis6WXr1VESlfVtVeoFJBRINPJ3f0a/6LV8zpikqoUg4hyXw0sFBt5Cr+Q== +"@esbuild/openbsd-x64@0.21.5": + version "0.21.5" + resolved "https://registry.yarnpkg.com/@esbuild/openbsd-x64/-/openbsd-x64-0.21.5.tgz#99d1cf2937279560d2104821f5ccce220cb2af70" + integrity sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow== + +"@esbuild/openbsd-x64@0.23.0": + version "0.23.0" + resolved "https://registry.yarnpkg.com/@esbuild/openbsd-x64/-/openbsd-x64-0.23.0.tgz#b6ae7a0911c18fe30da3db1d6d17a497a550e5d8" + integrity sha512-6p3nHpby0DM/v15IFKMjAaayFhqnXV52aEmv1whZHX56pdkK+MEaLoQWj+H42ssFarP1PcomVhbsR4pkz09qBg== + "@esbuild/openbsd-x64@0.23.1": version "0.23.1" resolved "https://registry.yarnpkg.com/@esbuild/openbsd-x64/-/openbsd-x64-0.23.1.tgz#2e58ae511bacf67d19f9f2dcd9e8c5a93f00c273" integrity sha512-aY2gMmKmPhxfU+0EdnN+XNtGbjfQgwZj43k8G3fyrDM/UdZww6xrWxmDkuz2eCZchqVeABjV5BpildOrUbBTqA== +"@esbuild/sunos-x64@0.21.5": + version "0.21.5" + resolved "https://registry.yarnpkg.com/@esbuild/sunos-x64/-/sunos-x64-0.21.5.tgz#08741512c10d529566baba837b4fe052c8f3487b" + integrity sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg== + +"@esbuild/sunos-x64@0.23.0": + version "0.23.0" + resolved "https://registry.yarnpkg.com/@esbuild/sunos-x64/-/sunos-x64-0.23.0.tgz#58f0d5e55b9b21a086bfafaa29f62a3eb3470ad8" + integrity sha512-BFelBGfrBwk6LVrmFzCq1u1dZbG4zy/Kp93w2+y83Q5UGYF1d8sCzeLI9NXjKyujjBBniQa8R8PzLFAUrSM9OA== + "@esbuild/sunos-x64@0.23.1": version "0.23.1" resolved "https://registry.yarnpkg.com/@esbuild/sunos-x64/-/sunos-x64-0.23.1.tgz#adb022b959d18d3389ac70769cef5a03d3abd403" integrity sha512-RBRT2gqEl0IKQABT4XTj78tpk9v7ehp+mazn2HbUeZl1YMdaGAQqhapjGTCe7uw7y0frDi4gS0uHzhvpFuI1sA== +"@esbuild/win32-arm64@0.21.5": + version "0.21.5" + resolved "https://registry.yarnpkg.com/@esbuild/win32-arm64/-/win32-arm64-0.21.5.tgz#675b7385398411240735016144ab2e99a60fc75d" + integrity sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A== + +"@esbuild/win32-arm64@0.23.0": + version "0.23.0" + resolved "https://registry.yarnpkg.com/@esbuild/win32-arm64/-/win32-arm64-0.23.0.tgz#b858b2432edfad62e945d5c7c9e5ddd0f528ca6d" + integrity sha512-lY6AC8p4Cnb7xYHuIxQ6iYPe6MfO2CC43XXKo9nBXDb35krYt7KGhQnOkRGar5psxYkircpCqfbNDB4uJbS2jQ== + "@esbuild/win32-arm64@0.23.1": version "0.23.1" resolved "https://registry.yarnpkg.com/@esbuild/win32-arm64/-/win32-arm64-0.23.1.tgz#84906f50c212b72ec360f48461d43202f4c8b9a2" integrity sha512-4O+gPR5rEBe2FpKOVyiJ7wNDPA8nGzDuJ6gN4okSA1gEOYZ67N8JPk58tkWtdtPeLz7lBnY6I5L3jdsr3S+A6A== +"@esbuild/win32-ia32@0.21.5": + version "0.21.5" + resolved "https://registry.yarnpkg.com/@esbuild/win32-ia32/-/win32-ia32-0.21.5.tgz#1bfc3ce98aa6ca9a0969e4d2af72144c59c1193b" + integrity sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA== + +"@esbuild/win32-ia32@0.23.0": + version "0.23.0" + resolved "https://registry.yarnpkg.com/@esbuild/win32-ia32/-/win32-ia32-0.23.0.tgz#167ef6ca22a476c6c0c014a58b4f43ae4b80dec7" + integrity sha512-7L1bHlOTcO4ByvI7OXVI5pNN6HSu6pUQq9yodga8izeuB1KcT2UkHaH6118QJwopExPn0rMHIseCTx1CRo/uNA== + "@esbuild/win32-ia32@0.23.1": version "0.23.1" resolved "https://registry.yarnpkg.com/@esbuild/win32-ia32/-/win32-ia32-0.23.1.tgz#5e3eacc515820ff729e90d0cb463183128e82fac" integrity sha512-BcaL0Vn6QwCwre3Y717nVHZbAa4UBEigzFm6VdsVdT/MbZ38xoj1X9HPkZhbmaBGUD1W8vxAfffbDe8bA6AKnQ== +"@esbuild/win32-x64@0.21.5": + version "0.21.5" + resolved "https://registry.yarnpkg.com/@esbuild/win32-x64/-/win32-x64-0.21.5.tgz#acad351d582d157bb145535db2a6ff53dd514b5c" + integrity sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw== + +"@esbuild/win32-x64@0.23.0": + version "0.23.0" + resolved "https://registry.yarnpkg.com/@esbuild/win32-x64/-/win32-x64-0.23.0.tgz#db44a6a08520b5f25bbe409f34a59f2d4bcc7ced" + integrity sha512-Arm+WgUFLUATuoxCJcahGuk6Yj9Pzxd6l11Zb/2aAuv5kWWvvfhLFo2fni4uSK5vzlUdCGZ/BdV5tH8klj8p8g== + "@esbuild/win32-x64@0.23.1": version "0.23.1" resolved "https://registry.yarnpkg.com/@esbuild/win32-x64/-/win32-x64-0.23.1.tgz#81fd50d11e2c32b2d6241470e3185b70c7b30699" integrity sha512-BHpFFeslkWrXWyUPnbKm+xYYVYruCinGcftSBaa8zoF9hZO4BcSCFUvHVTtzpIY6YzUnYtuEhZ+C9iEXjxnasg== +"@inquirer/confirm@3.1.22": + version "3.1.22" + resolved "https://registry.yarnpkg.com/@inquirer/confirm/-/confirm-3.1.22.tgz#23990624c11f60c6f7a5b0558c7505c35076a037" + integrity sha512-gsAKIOWBm2Q87CDfs9fEo7wJT3fwWIJfnDGMn9Qy74gBnNFOACDNfhUzovubbJjWnKLGBln7/NcSmZwj5DuEXg== + dependencies: + "@inquirer/core" "^9.0.10" + "@inquirer/type" "^1.5.2" + +"@inquirer/core@^9.0.10": + version "9.2.1" + resolved "https://registry.yarnpkg.com/@inquirer/core/-/core-9.2.1.tgz#677c49dee399c9063f31e0c93f0f37bddc67add1" + integrity sha512-F2VBt7W/mwqEU4bL0RnHNZmC/OxzNx9cOYxHqnXX3MP6ruYvZUZAW9imgN9+h/uBT/oP8Gh888J2OZSbjSeWcg== + dependencies: + "@inquirer/figures" "^1.0.6" + "@inquirer/type" "^2.0.0" + "@types/mute-stream" "^0.0.4" + "@types/node" "^22.5.5" + "@types/wrap-ansi" "^3.0.0" + ansi-escapes "^4.3.2" + cli-width "^4.1.0" + mute-stream "^1.0.0" + signal-exit "^4.1.0" + strip-ansi "^6.0.1" + wrap-ansi "^6.2.0" + yoctocolors-cjs "^2.1.2" + +"@inquirer/figures@^1.0.6": + version "1.0.6" + resolved "https://registry.yarnpkg.com/@inquirer/figures/-/figures-1.0.6.tgz#1a562f916da39888c56b65b78259d2261bd7d40b" + integrity sha512-yfZzps3Cso2UbM7WlxKwZQh2Hs6plrbjs1QnzQDZhK2DgyCo6D8AaHps9olkNcUFlcYERMqU3uJSp1gmy3s/qQ== + +"@inquirer/type@^1.5.2": + version "1.5.5" + resolved "https://registry.yarnpkg.com/@inquirer/type/-/type-1.5.5.tgz#303ea04ce7ad2e585b921b662b3be36ef7b4f09b" + integrity sha512-MzICLu4yS7V8AA61sANROZ9vT1H3ooca5dSmI1FjZkzq7o/koMsRfQSzRtFo+F3Ao4Sf1C0bpLKejpKB/+j6MA== + dependencies: + mute-stream "^1.0.0" + +"@inquirer/type@^2.0.0": + version "2.0.0" + resolved "https://registry.yarnpkg.com/@inquirer/type/-/type-2.0.0.tgz#08fa513dca2cb6264fe1b0a2fabade051444e3f6" + integrity sha512-XvJRx+2KR3YXyYtPUUy+qd9i7p+GO9Ko6VIIpWlBrpWwXDv8WLFeHTxz35CfQFUiBMLXlGHhGzys7lqit9gWag== + dependencies: + mute-stream "^1.0.0" + +"@isaacs/cliui@^8.0.2": + version "8.0.2" + resolved "https://registry.yarnpkg.com/@isaacs/cliui/-/cliui-8.0.2.tgz#b37667b7bc181c168782259bab42474fbf52b550" + integrity sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA== + dependencies: + string-width "^5.1.2" + string-width-cjs "npm:string-width@^4.2.0" + strip-ansi "^7.0.1" + strip-ansi-cjs "npm:strip-ansi@^6.0.1" + wrap-ansi "^8.1.0" + wrap-ansi-cjs "npm:wrap-ansi@^7.0.0" + +"@istanbuljs/schema@^0.1.3": + version "0.1.3" + resolved "https://registry.yarnpkg.com/@istanbuljs/schema/-/schema-0.1.3.tgz#e45e384e4b8ec16bce2fd903af78450f6bf7ec98" + integrity sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA== + +"@jridgewell/gen-mapping@^0.3.5": + version "0.3.5" + resolved "https://registry.yarnpkg.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz#dcce6aff74bdf6dad1a95802b69b04a2fcb1fb36" + integrity sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg== + dependencies: + "@jridgewell/set-array" "^1.2.1" + "@jridgewell/sourcemap-codec" "^1.4.10" + "@jridgewell/trace-mapping" "^0.3.24" + +"@jridgewell/resolve-uri@^3.1.0": + version "3.1.2" + resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz#7a0ee601f60f99a20c7c7c5ff0c80388c1189bd6" + integrity sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw== + +"@jridgewell/set-array@^1.2.1": + version "1.2.1" + resolved "https://registry.yarnpkg.com/@jridgewell/set-array/-/set-array-1.2.1.tgz#558fb6472ed16a4c850b889530e6b36438c49280" + integrity sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A== + +"@jridgewell/source-map@^0.3.3": + version "0.3.6" + resolved "https://registry.yarnpkg.com/@jridgewell/source-map/-/source-map-0.3.6.tgz#9d71ca886e32502eb9362c9a74a46787c36df81a" + integrity sha512-1ZJTZebgqllO79ue2bm3rIGud/bOe0pP5BjSRCRxxYkEZS8STV7zN84UBbiYu7jy+eCKSnVIUgoWWE/tt+shMQ== + dependencies: + "@jridgewell/gen-mapping" "^0.3.5" + "@jridgewell/trace-mapping" "^0.3.25" + +"@jridgewell/sourcemap-codec@^1.4.10", "@jridgewell/sourcemap-codec@^1.4.14", "@jridgewell/sourcemap-codec@^1.5.0": + version "1.5.0" + resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz#3188bcb273a414b0d215fd22a58540b989b9409a" + integrity sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ== + +"@jridgewell/trace-mapping@^0.3.20", "@jridgewell/trace-mapping@^0.3.24", "@jridgewell/trace-mapping@^0.3.25": + version "0.3.25" + resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz#15f190e98895f3fc23276ee14bc76b675c2e50f0" + integrity sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ== + dependencies: + "@jridgewell/resolve-uri" "^3.1.0" + "@jridgewell/sourcemap-codec" "^1.4.14" + +"@jsonjoy.com/base64@^1.1.1": + version "1.1.2" + resolved "https://registry.yarnpkg.com/@jsonjoy.com/base64/-/base64-1.1.2.tgz#cf8ea9dcb849b81c95f14fc0aaa151c6b54d2578" + integrity sha512-q6XAnWQDIMA3+FTiOYajoYqySkO+JSat0ytXGSuRdq9uXE7o92gzuQwQM14xaCRlBLGq3v5miDGC4vkVTn54xA== + +"@jsonjoy.com/json-pack@^1.0.3": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@jsonjoy.com/json-pack/-/json-pack-1.1.0.tgz#33ca57ee29d12feef540f2139225597469dec894" + integrity sha512-zlQONA+msXPPwHWZMKFVS78ewFczIll5lXiVPwFPCZUsrOKdxc2AvxU1HoNBmMRhqDZUR9HkC3UOm+6pME6Xsg== + dependencies: + "@jsonjoy.com/base64" "^1.1.1" + "@jsonjoy.com/util" "^1.1.2" + hyperdyperid "^1.2.0" + thingies "^1.20.0" + +"@jsonjoy.com/util@^1.1.2", "@jsonjoy.com/util@^1.3.0": + version "1.3.0" + resolved "https://registry.yarnpkg.com/@jsonjoy.com/util/-/util-1.3.0.tgz#e5623885bb5e0c48c1151e4dae422fb03a5887a1" + integrity sha512-Cebt4Vk7k1xHy87kHY7KSPLT77A7Ev7IfOblyLZhtYEhrdQ6fX4EoLq3xOQ3O/DRMEh2ok5nyC180E+ABS8Wmw== + +"@leichtgewicht/ip-codec@^2.0.1": + version "2.0.5" + resolved "https://registry.yarnpkg.com/@leichtgewicht/ip-codec/-/ip-codec-2.0.5.tgz#4fc56c15c580b9adb7dc3c333a134e540b44bfb1" + integrity sha512-Vo+PSpZG2/fmgmiNzYK9qWRh8h/CHrwD0mo1h1DzL4yzHNSfWYujGTYsWGreD000gcgmZ7K4Ys6Tx9TxtsKdDw== + +"@lmdb/lmdb-darwin-arm64@3.0.13": + version "3.0.13" + resolved "https://registry.yarnpkg.com/@lmdb/lmdb-darwin-arm64/-/lmdb-darwin-arm64-3.0.13.tgz#b09af72bde5a9933abfab34dc5c10e5b6c16d4a5" + integrity sha512-uiKPB0Fv6WEEOZjruu9a6wnW/8jrjzlZbxXscMB8kuCJ1k6kHpcBnuvaAWcqhbI7rqX5GKziwWEdD+wi2gNLfA== + +"@lmdb/lmdb-darwin-x64@3.0.13": + version "3.0.13" + resolved "https://registry.yarnpkg.com/@lmdb/lmdb-darwin-x64/-/lmdb-darwin-x64-3.0.13.tgz#bc27aadf475954254b787ef609a9f598adc8ac6b" + integrity sha512-bEVIIfK5mSQoG1R19qA+fJOvCB+0wVGGnXHT3smchBVahYBdlPn2OsZZKzlHWfb1E+PhLBmYfqB5zQXFP7hJig== + +"@lmdb/lmdb-linux-arm64@3.0.13": + version "3.0.13" + resolved "https://registry.yarnpkg.com/@lmdb/lmdb-linux-arm64/-/lmdb-linux-arm64-3.0.13.tgz#fd49c447e1e8304fc4101bb7e6b641f08d69ac28" + integrity sha512-afbVrsMgZ9dUTNUchFpj5VkmJRxvht/u335jUJ7o23YTbNbnpmXif3VKQGCtnjSh+CZaqm6N3CPG8KO3zwyZ1Q== + +"@lmdb/lmdb-linux-arm@3.0.13": + version "3.0.13" + resolved "https://registry.yarnpkg.com/@lmdb/lmdb-linux-arm/-/lmdb-linux-arm-3.0.13.tgz#14ebce383cbc9d51cbe12581dfec3ef8ffc6b685" + integrity sha512-Yml1KlMzOnXj/tnW7yX8U78iAzTk39aILYvCPbqeewAq1kSzl+w59k/fiVkTBfvDi/oW/5YRxL+Fq+Y1Fr1r2Q== + +"@lmdb/lmdb-linux-x64@3.0.13": + version "3.0.13" + resolved "https://registry.yarnpkg.com/@lmdb/lmdb-linux-x64/-/lmdb-linux-x64-3.0.13.tgz#49b9bfcd52df55ccc9e466cf27c0651e5434b320" + integrity sha512-vOtxu0xC0SLdQ2WRXg8Qgd8T32ak4SPqk5zjItRszrJk2BdeXqfGxBJbP7o4aOvSPSmSSv46Lr1EP4HXU8v7Kg== + +"@lmdb/lmdb-win32-x64@3.0.13": + version "3.0.13" + resolved "https://registry.yarnpkg.com/@lmdb/lmdb-win32-x64/-/lmdb-win32-x64-3.0.13.tgz#93bcd6dc24afd1cc60dd88a65b9e4fab32dcf397" + integrity sha512-UCrMJQY/gJnOl3XgbWRZZUvGGBuKy6i0YNSptgMzHBjs+QYDYR1Mt/RLTOPy4fzzves65O1EDmlL//OzEqoLlA== + +"@msgpackr-extract/msgpackr-extract-darwin-arm64@3.0.3": + version "3.0.3" + resolved "https://registry.yarnpkg.com/@msgpackr-extract/msgpackr-extract-darwin-arm64/-/msgpackr-extract-darwin-arm64-3.0.3.tgz#9edec61b22c3082018a79f6d1c30289ddf3d9d11" + integrity sha512-QZHtlVgbAdy2zAqNA9Gu1UpIuI8Xvsd1v8ic6B2pZmeFnFcMWiPLfWXh7TVw4eGEZ/C9TH281KwhVoeQUKbyjw== + +"@msgpackr-extract/msgpackr-extract-darwin-x64@3.0.3": + version "3.0.3" + resolved "https://registry.yarnpkg.com/@msgpackr-extract/msgpackr-extract-darwin-x64/-/msgpackr-extract-darwin-x64-3.0.3.tgz#33677a275204898ad8acbf62734fc4dc0b6a4855" + integrity sha512-mdzd3AVzYKuUmiWOQ8GNhl64/IoFGol569zNRdkLReh6LRLHOXxU4U8eq0JwaD8iFHdVGqSy4IjFL4reoWCDFw== + +"@msgpackr-extract/msgpackr-extract-linux-arm64@3.0.3": + version "3.0.3" + resolved "https://registry.yarnpkg.com/@msgpackr-extract/msgpackr-extract-linux-arm64/-/msgpackr-extract-linux-arm64-3.0.3.tgz#19edf7cdc2e7063ee328403c1d895a86dd28f4bb" + integrity sha512-YxQL+ax0XqBJDZiKimS2XQaf+2wDGVa1enVRGzEvLLVFeqa5kx2bWbtcSXgsxjQB7nRqqIGFIcLteF/sHeVtQg== + +"@msgpackr-extract/msgpackr-extract-linux-arm@3.0.3": + version "3.0.3" + resolved "https://registry.yarnpkg.com/@msgpackr-extract/msgpackr-extract-linux-arm/-/msgpackr-extract-linux-arm-3.0.3.tgz#94fb0543ba2e28766c3fc439cabbe0440ae70159" + integrity sha512-fg0uy/dG/nZEXfYilKoRe7yALaNmHoYeIoJuJ7KJ+YyU2bvY8vPv27f7UKhGRpY6euFYqEVhxCFZgAUNQBM3nw== + +"@msgpackr-extract/msgpackr-extract-linux-x64@3.0.3": + version "3.0.3" + resolved "https://registry.yarnpkg.com/@msgpackr-extract/msgpackr-extract-linux-x64/-/msgpackr-extract-linux-x64-3.0.3.tgz#4a0609ab5fe44d07c9c60a11e4484d3c38bbd6e3" + integrity sha512-cvwNfbP07pKUfq1uH+S6KJ7dT9K8WOE4ZiAcsrSes+UY55E/0jLYc+vq+DO7jlmqRb5zAggExKm0H7O/CBaesg== + +"@msgpackr-extract/msgpackr-extract-win32-x64@3.0.3": + version "3.0.3" + resolved "https://registry.yarnpkg.com/@msgpackr-extract/msgpackr-extract-win32-x64/-/msgpackr-extract-win32-x64-3.0.3.tgz#0aa5502d547b57abfc4ac492de68e2006e417242" + integrity sha512-x0fWaQtYp4E6sktbsdAqnehxDgEc/VwM7uLsRCYWaiGu0ykYdZPiS8zCWdnjHwyiumousxfBm4SO31eXqwEZhQ== + +"@napi-rs/nice-android-arm-eabi@1.0.1": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@napi-rs/nice-android-arm-eabi/-/nice-android-arm-eabi-1.0.1.tgz#9a0cba12706ff56500df127d6f4caf28ddb94936" + integrity sha512-5qpvOu5IGwDo7MEKVqqyAxF90I6aLj4n07OzpARdgDRfz8UbBztTByBp0RC59r3J1Ij8uzYi6jI7r5Lws7nn6w== + +"@napi-rs/nice-android-arm64@1.0.1": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@napi-rs/nice-android-arm64/-/nice-android-arm64-1.0.1.tgz#32fc32e9649bd759d2a39ad745e95766f6759d2f" + integrity sha512-GqvXL0P8fZ+mQqG1g0o4AO9hJjQaeYG84FRfZaYjyJtZZZcMjXW5TwkL8Y8UApheJgyE13TQ4YNUssQaTgTyvA== + +"@napi-rs/nice-darwin-arm64@1.0.1": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@napi-rs/nice-darwin-arm64/-/nice-darwin-arm64-1.0.1.tgz#d3c44c51b94b25a82d45803e2255891e833e787b" + integrity sha512-91k3HEqUl2fsrz/sKkuEkscj6EAj3/eZNCLqzD2AA0TtVbkQi8nqxZCZDMkfklULmxLkMxuUdKe7RvG/T6s2AA== + +"@napi-rs/nice-darwin-x64@1.0.1": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@napi-rs/nice-darwin-x64/-/nice-darwin-x64-1.0.1.tgz#f1b1365a8370c6a6957e90085a9b4873d0e6a957" + integrity sha512-jXnMleYSIR/+TAN/p5u+NkCA7yidgswx5ftqzXdD5wgy/hNR92oerTXHc0jrlBisbd7DpzoaGY4cFD7Sm5GlgQ== + +"@napi-rs/nice-freebsd-x64@1.0.1": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@napi-rs/nice-freebsd-x64/-/nice-freebsd-x64-1.0.1.tgz#4280f081efbe0b46c5165fdaea8b286e55a8f89e" + integrity sha512-j+iJ/ezONXRQsVIB/FJfwjeQXX7A2tf3gEXs4WUGFrJjpe/z2KB7sOv6zpkm08PofF36C9S7wTNuzHZ/Iiccfw== + +"@napi-rs/nice-linux-arm-gnueabihf@1.0.1": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@napi-rs/nice-linux-arm-gnueabihf/-/nice-linux-arm-gnueabihf-1.0.1.tgz#07aec23a9467ed35eb7602af5e63d42c5d7bd473" + integrity sha512-G8RgJ8FYXYkkSGQwywAUh84m946UTn6l03/vmEXBYNJxQJcD+I3B3k5jmjFG/OPiU8DfvxutOP8bi+F89MCV7Q== + +"@napi-rs/nice-linux-arm64-gnu@1.0.1": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@napi-rs/nice-linux-arm64-gnu/-/nice-linux-arm64-gnu-1.0.1.tgz#038a77134cc6df3c48059d5a5e199d6f50fb9a90" + integrity sha512-IMDak59/W5JSab1oZvmNbrms3mHqcreaCeClUjwlwDr0m3BoR09ZiN8cKFBzuSlXgRdZ4PNqCYNeGQv7YMTjuA== + +"@napi-rs/nice-linux-arm64-musl@1.0.1": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@napi-rs/nice-linux-arm64-musl/-/nice-linux-arm64-musl-1.0.1.tgz#715d0906582ba0cff025109f42e5b84ea68c2bcc" + integrity sha512-wG8fa2VKuWM4CfjOjjRX9YLIbysSVV1S3Kgm2Fnc67ap/soHBeYZa6AGMeR5BJAylYRjnoVOzV19Cmkco3QEPw== + +"@napi-rs/nice-linux-ppc64-gnu@1.0.1": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@napi-rs/nice-linux-ppc64-gnu/-/nice-linux-ppc64-gnu-1.0.1.tgz#ac1c8f781c67b0559fa7a1cd4ae3ca2299dc3d06" + integrity sha512-lxQ9WrBf0IlNTCA9oS2jg/iAjQyTI6JHzABV664LLrLA/SIdD+I1i3Mjf7TsnoUbgopBcCuDztVLfJ0q9ubf6Q== + +"@napi-rs/nice-linux-riscv64-gnu@1.0.1": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@napi-rs/nice-linux-riscv64-gnu/-/nice-linux-riscv64-gnu-1.0.1.tgz#b0a430549acfd3920ffd28ce544e2fe17833d263" + integrity sha512-3xs69dO8WSWBb13KBVex+yvxmUeEsdWexxibqskzoKaWx9AIqkMbWmE2npkazJoopPKX2ULKd8Fm9veEn0g4Ig== + +"@napi-rs/nice-linux-s390x-gnu@1.0.1": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@napi-rs/nice-linux-s390x-gnu/-/nice-linux-s390x-gnu-1.0.1.tgz#5b95caf411ad72a965885217db378c4d09733e97" + integrity sha512-lMFI3i9rlW7hgToyAzTaEybQYGbQHDrpRkg+1gJWEpH0PLAQoZ8jiY0IzakLfNWnVda1eTYYlxxFYzW8Rqczkg== + +"@napi-rs/nice-linux-x64-gnu@1.0.1": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@napi-rs/nice-linux-x64-gnu/-/nice-linux-x64-gnu-1.0.1.tgz#a98cdef517549f8c17a83f0236a69418a90e77b7" + integrity sha512-XQAJs7DRN2GpLN6Fb+ZdGFeYZDdGl2Fn3TmFlqEL5JorgWKrQGRUrpGKbgZ25UeZPILuTKJ+OowG2avN8mThBA== + +"@napi-rs/nice-linux-x64-musl@1.0.1": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@napi-rs/nice-linux-x64-musl/-/nice-linux-x64-musl-1.0.1.tgz#5e26843eafa940138aed437c870cca751c8a8957" + integrity sha512-/rodHpRSgiI9o1faq9SZOp/o2QkKQg7T+DK0R5AkbnI/YxvAIEHf2cngjYzLMQSQgUhxym+LFr+UGZx4vK4QdQ== + +"@napi-rs/nice-win32-arm64-msvc@1.0.1": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@napi-rs/nice-win32-arm64-msvc/-/nice-win32-arm64-msvc-1.0.1.tgz#bd62617d02f04aa30ab1e9081363856715f84cd8" + integrity sha512-rEcz9vZymaCB3OqEXoHnp9YViLct8ugF+6uO5McifTedjq4QMQs3DHz35xBEGhH3gJWEsXMUbzazkz5KNM5YUg== + +"@napi-rs/nice-win32-ia32-msvc@1.0.1": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@napi-rs/nice-win32-ia32-msvc/-/nice-win32-ia32-msvc-1.0.1.tgz#b8b7aad552a24836027473d9b9f16edaeabecf18" + integrity sha512-t7eBAyPUrWL8su3gDxw9xxxqNwZzAqKo0Szv3IjVQd1GpXXVkb6vBBQUuxfIYaXMzZLwlxRQ7uzM2vdUE9ULGw== + +"@napi-rs/nice-win32-x64-msvc@1.0.1": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@napi-rs/nice-win32-x64-msvc/-/nice-win32-x64-msvc-1.0.1.tgz#37d8718b8f722f49067713e9f1e85540c9a3dd09" + integrity sha512-JlF+uDcatt3St2ntBG8H02F1mM45i5SF9W+bIKiReVE6wiy3o16oBP/yxt+RZ+N6LbCImJXJ6bXNO2kn9AXicg== + +"@napi-rs/nice@^1.0.1": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@napi-rs/nice/-/nice-1.0.1.tgz#483d3ff31e5661829a1efb4825591a135c3bfa7d" + integrity sha512-zM0mVWSXE0a0h9aKACLwKmD6nHcRiKrPpCfvaKqG1CqDEyjEawId0ocXxVzPMCAm6kkWr2P025msfxXEnt8UGQ== + optionalDependencies: + "@napi-rs/nice-android-arm-eabi" "1.0.1" + "@napi-rs/nice-android-arm64" "1.0.1" + "@napi-rs/nice-darwin-arm64" "1.0.1" + "@napi-rs/nice-darwin-x64" "1.0.1" + "@napi-rs/nice-freebsd-x64" "1.0.1" + "@napi-rs/nice-linux-arm-gnueabihf" "1.0.1" + "@napi-rs/nice-linux-arm64-gnu" "1.0.1" + "@napi-rs/nice-linux-arm64-musl" "1.0.1" + "@napi-rs/nice-linux-ppc64-gnu" "1.0.1" + "@napi-rs/nice-linux-riscv64-gnu" "1.0.1" + "@napi-rs/nice-linux-s390x-gnu" "1.0.1" + "@napi-rs/nice-linux-x64-gnu" "1.0.1" + "@napi-rs/nice-linux-x64-musl" "1.0.1" + "@napi-rs/nice-win32-arm64-msvc" "1.0.1" + "@napi-rs/nice-win32-ia32-msvc" "1.0.1" + "@napi-rs/nice-win32-x64-msvc" "1.0.1" + +"@ngtools/webpack@18.2.6": + version "18.2.6" + resolved "https://registry.yarnpkg.com/@ngtools/webpack/-/webpack-18.2.6.tgz#2fb446299cf869aff7fd4124926b51cc55062aa6" + integrity sha512-7HwOPE1EOgcHnpt4brSiT8G2CcXB50G0+CbCBaKGy4LYCG3Y3mrlzF5Fup9HvMJ6Tzqd62RqzpKKYBiGUT7hxg== + "@nodelib/fs.scandir@2.1.5": version "2.1.5" resolved "https://registry.yarnpkg.com/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz#7619c2eb21b25483f6d167548b4cfd5a7488c3d5" @@ -187,7 +1838,336 @@ "@nodelib/fs.scandir" "2.1.5" fastq "^1.6.0" -"@types/node@^22.7.4": +"@npmcli/fs@^3.1.0": + version "3.1.1" + resolved "https://registry.yarnpkg.com/@npmcli/fs/-/fs-3.1.1.tgz#59cdaa5adca95d135fc00f2bb53f5771575ce726" + integrity sha512-q9CRWjpHCMIh5sVyefoD1cA7PkvILqCZsnSOEUUivORLjxCO/Irmue2DprETiNgEqktDBZaM1Bi+jrarx1XdCg== + dependencies: + semver "^7.3.5" + +"@pkgjs/parseargs@^0.11.0": + version "0.11.0" + resolved "https://registry.yarnpkg.com/@pkgjs/parseargs/-/parseargs-0.11.0.tgz#a77ea742fab25775145434eb1d2328cf5013ac33" + integrity sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg== + +"@rollup/plugin-json@^6.1.0": + version "6.1.0" + resolved "https://registry.yarnpkg.com/@rollup/plugin-json/-/plugin-json-6.1.0.tgz#fbe784e29682e9bb6dee28ea75a1a83702e7b805" + integrity sha512-EGI2te5ENk1coGeADSIwZ7G2Q8CJS2sF120T7jLw4xFw9n7wIOXHo+kIYRAoVpJAN+kmqZSoO3Fp4JtoNF4ReA== + dependencies: + "@rollup/pluginutils" "^5.1.0" + +"@rollup/plugin-node-resolve@^15.2.3": + version "15.3.0" + resolved "https://registry.yarnpkg.com/@rollup/plugin-node-resolve/-/plugin-node-resolve-15.3.0.tgz#efbb35515c9672e541c08d59caba2eff492a55d5" + integrity sha512-9eO5McEICxMzJpDW9OnMYSv4Sta3hmt7VtBFz5zR9273suNOydOyq/FrGeGy+KsTRFm8w0SLVhzig2ILFT63Ag== + dependencies: + "@rollup/pluginutils" "^5.0.1" + "@types/resolve" "1.20.2" + deepmerge "^4.2.2" + is-module "^1.0.0" + resolve "^1.22.1" + +"@rollup/pluginutils@^5.0.1", "@rollup/pluginutils@^5.1.0": + version "5.1.2" + resolved "https://registry.yarnpkg.com/@rollup/pluginutils/-/pluginutils-5.1.2.tgz#d3bc9f0fea4fd4086aaac6aa102f3fa587ce8bd9" + integrity sha512-/FIdS3PyZ39bjZlwqFnWqCOVnW7o963LtKMwQOD0NhQqw22gSr2YY1afu3FxRip4ZCZNsD5jq6Aaz6QV3D/Njw== + dependencies: + "@types/estree" "^1.0.0" + estree-walker "^2.0.2" + picomatch "^2.3.1" + +"@rollup/rollup-android-arm-eabi@4.22.4": + version "4.22.4" + resolved "https://registry.yarnpkg.com/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.22.4.tgz#8b613b9725e8f9479d142970b106b6ae878610d5" + integrity sha512-Fxamp4aEZnfPOcGA8KSNEohV8hX7zVHOemC8jVBoBUHu5zpJK/Eu3uJwt6BMgy9fkvzxDaurgj96F/NiLukF2w== + +"@rollup/rollup-android-arm-eabi@4.22.5": + version "4.22.5" + resolved "https://registry.yarnpkg.com/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.22.5.tgz#e0f5350845090ca09690fe4a472717f3b8aae225" + integrity sha512-SU5cvamg0Eyu/F+kLeMXS7GoahL+OoizlclVFX3l5Ql6yNlywJJ0OuqTzUx0v+aHhPHEB/56CT06GQrRrGNYww== + +"@rollup/rollup-android-arm64@4.22.4": + version "4.22.4" + resolved "https://registry.yarnpkg.com/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.22.4.tgz#654ca1049189132ff602bfcf8df14c18da1f15fb" + integrity sha512-VXoK5UMrgECLYaMuGuVTOx5kcuap1Jm8g/M83RnCHBKOqvPPmROFJGQaZhGccnsFtfXQ3XYa4/jMCJvZnbJBdA== + +"@rollup/rollup-android-arm64@4.22.5": + version "4.22.5" + resolved "https://registry.yarnpkg.com/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.22.5.tgz#08270faef6747e2716d3e978a8bbf479f75fb19a" + integrity sha512-S4pit5BP6E5R5C8S6tgU/drvgjtYW76FBuG6+ibG3tMvlD1h9LHVF9KmlmaUBQ8Obou7hEyS+0w+IR/VtxwNMQ== + +"@rollup/rollup-darwin-arm64@4.22.4": + version "4.22.4" + resolved "https://registry.yarnpkg.com/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.22.4.tgz#6d241d099d1518ef0c2205d96b3fa52e0fe1954b" + integrity sha512-xMM9ORBqu81jyMKCDP+SZDhnX2QEVQzTcC6G18KlTQEzWK8r/oNZtKuZaCcHhnsa6fEeOBionoyl5JsAbE/36Q== + +"@rollup/rollup-darwin-arm64@4.22.5": + version "4.22.5" + resolved "https://registry.yarnpkg.com/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.22.5.tgz#691671133b350661328d42c8dbdedd56dfb97dfd" + integrity sha512-250ZGg4ipTL0TGvLlfACkIxS9+KLtIbn7BCZjsZj88zSg2Lvu3Xdw6dhAhfe/FjjXPVNCtcSp+WZjVsD3a/Zlw== + +"@rollup/rollup-darwin-x64@4.22.4": + version "4.22.4" + resolved "https://registry.yarnpkg.com/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.22.4.tgz#42bd19d292a57ee11734c980c4650de26b457791" + integrity sha512-aJJyYKQwbHuhTUrjWjxEvGnNNBCnmpHDvrb8JFDbeSH3m2XdHcxDd3jthAzvmoI8w/kSjd2y0udT+4okADsZIw== + +"@rollup/rollup-darwin-x64@4.22.5": + version "4.22.5" + resolved "https://registry.yarnpkg.com/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.22.5.tgz#b2ec52a1615f24b1cd40bc8906ae31af81e8a342" + integrity sha512-D8brJEFg5D+QxFcW6jYANu+Rr9SlKtTenmsX5hOSzNYVrK5oLAEMTUgKWYJP+wdKyCdeSwnapLsn+OVRFycuQg== + +"@rollup/rollup-linux-arm-gnueabihf@4.22.4": + version "4.22.4" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.22.4.tgz#f23555ee3d8fe941c5c5fd458cd22b65eb1c2232" + integrity sha512-j63YtCIRAzbO+gC2L9dWXRh5BFetsv0j0va0Wi9epXDgU/XUi5dJKo4USTttVyK7fGw2nPWK0PbAvyliz50SCQ== + +"@rollup/rollup-linux-arm-gnueabihf@4.22.5": + version "4.22.5" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.22.5.tgz#217f01f304808920680bd269002df38e25d9205f" + integrity sha512-PNqXYmdNFyWNg0ma5LdY8wP+eQfdvyaBAojAXgO7/gs0Q/6TQJVXAXe8gwW9URjbS0YAammur0fynYGiWsKlXw== + +"@rollup/rollup-linux-arm-musleabihf@4.22.4": + version "4.22.4" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.22.4.tgz#f3bbd1ae2420f5539d40ac1fde2b38da67779baa" + integrity sha512-dJnWUgwWBX1YBRsuKKMOlXCzh2Wu1mlHzv20TpqEsfdZLb3WoJW2kIEsGwLkroYf24IrPAvOT/ZQ2OYMV6vlrg== + +"@rollup/rollup-linux-arm-musleabihf@4.22.5": + version "4.22.5" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.22.5.tgz#93ac1c5a1e389f4482a2edaeec41fcffee54a930" + integrity sha512-kSSCZOKz3HqlrEuwKd9TYv7vxPYD77vHSUvM2y0YaTGnFc8AdI5TTQRrM1yIp3tXCKrSL9A7JLoILjtad5t8pQ== + +"@rollup/rollup-linux-arm64-gnu@4.22.4": + version "4.22.4" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.22.4.tgz#7abe900120113e08a1f90afb84c7c28774054d15" + integrity sha512-AdPRoNi3NKVLolCN/Sp4F4N1d98c4SBnHMKoLuiG6RXgoZ4sllseuGioszumnPGmPM2O7qaAX/IJdeDU8f26Aw== + +"@rollup/rollup-linux-arm64-gnu@4.22.5": + version "4.22.5" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.22.5.tgz#a7f146787d6041fecc4ecdf1aa72234661ca94a4" + integrity sha512-oTXQeJHRbOnwRnRffb6bmqmUugz0glXaPyspp4gbQOPVApdpRrY/j7KP3lr7M8kTfQTyrBUzFjj5EuHAhqH4/w== + +"@rollup/rollup-linux-arm64-musl@4.22.4": + version "4.22.4" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.22.4.tgz#9e655285c8175cd44f57d6a1e8e5dedfbba1d820" + integrity sha512-Gl0AxBtDg8uoAn5CCqQDMqAx22Wx22pjDOjBdmG0VIWX3qUBHzYmOKh8KXHL4UpogfJ14G4wk16EQogF+v8hmA== + +"@rollup/rollup-linux-arm64-musl@4.22.5": + version "4.22.5" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.22.5.tgz#6a37236189648e678bd564d6e8ca798f42cf42c5" + integrity sha512-qnOTIIs6tIGFKCHdhYitgC2XQ2X25InIbZFor5wh+mALH84qnFHvc+vmWUpyX97B0hNvwNUL4B+MB8vJvH65Fw== + +"@rollup/rollup-linux-powerpc64le-gnu@4.22.4": + version "4.22.4" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.22.4.tgz#9a79ae6c9e9d8fe83d49e2712ecf4302db5bef5e" + integrity sha512-3aVCK9xfWW1oGQpTsYJJPF6bfpWfhbRnhdlyhak2ZiyFLDaayz0EP5j9V1RVLAAxlmWKTDfS9wyRyY3hvhPoOg== + +"@rollup/rollup-linux-powerpc64le-gnu@4.22.5": + version "4.22.5" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.22.5.tgz#5661420dc463bec31ecb2d17d113de858cfcfe2d" + integrity sha512-TMYu+DUdNlgBXING13rHSfUc3Ky5nLPbWs4bFnT+R6Vu3OvXkTkixvvBKk8uO4MT5Ab6lC3U7x8S8El2q5o56w== + +"@rollup/rollup-linux-riscv64-gnu@4.22.4": + version "4.22.4" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.22.4.tgz#67ac70eca4ace8e2942fabca95164e8874ab8128" + integrity sha512-ePYIir6VYnhgv2C5Xe9u+ico4t8sZWXschR6fMgoPUK31yQu7hTEJb7bCqivHECwIClJfKgE7zYsh1qTP3WHUA== + +"@rollup/rollup-linux-riscv64-gnu@4.22.5": + version "4.22.5" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.22.5.tgz#cb00342b7432bdef723aa606281de2f522d6dcf7" + integrity sha512-PTQq1Kz22ZRvuhr3uURH+U/Q/a0pbxJoICGSprNLAoBEkyD3Sh9qP5I0Asn0y0wejXQBbsVMRZRxlbGFD9OK4A== + +"@rollup/rollup-linux-s390x-gnu@4.22.4": + version "4.22.4" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.22.4.tgz#9f883a7440f51a22ed7f99e1d070bd84ea5005fc" + integrity sha512-GqFJ9wLlbB9daxhVlrTe61vJtEY99/xB3C8e4ULVsVfflcpmR6c8UZXjtkMA6FhNONhj2eA5Tk9uAVw5orEs4Q== + +"@rollup/rollup-linux-s390x-gnu@4.22.5": + version "4.22.5" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.22.5.tgz#0708889674dccecccd28e2befccf791e0767fcb7" + integrity sha512-bR5nCojtpuMss6TDEmf/jnBnzlo+6n1UhgwqUvRoe4VIotC7FG1IKkyJbwsT7JDsF2jxR+NTnuOwiGv0hLyDoQ== + +"@rollup/rollup-linux-x64-gnu@4.22.4": + version "4.22.4" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.22.4.tgz#70116ae6c577fe367f58559e2cffb5641a1dd9d0" + integrity sha512-87v0ol2sH9GE3cLQLNEy0K/R0pz1nvg76o8M5nhMR0+Q+BBGLnb35P0fVz4CQxHYXaAOhE8HhlkaZfsdUOlHwg== + +"@rollup/rollup-linux-x64-gnu@4.22.5": + version "4.22.5" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.22.5.tgz#a135b040b21582e91cfed2267ccfc7d589e1dbc6" + integrity sha512-N0jPPhHjGShcB9/XXZQWuWBKZQnC1F36Ce3sDqWpujsGjDz/CQtOL9LgTrJ+rJC8MJeesMWrMWVLKKNR/tMOCA== + +"@rollup/rollup-linux-x64-musl@4.22.4": + version "4.22.4" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.22.4.tgz#f473f88219feb07b0b98b53a7923be716d1d182f" + integrity sha512-UV6FZMUgePDZrFjrNGIWzDo/vABebuXBhJEqrHxrGiU6HikPy0Z3LfdtciIttEUQfuDdCn8fqh7wiFJjCNwO+g== + +"@rollup/rollup-linux-x64-musl@4.22.5": + version "4.22.5" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.22.5.tgz#88395a81a3ab7ee3dc8dc31a73ff62ed3185f34d" + integrity sha512-uBa2e28ohzNNwjr6Uxm4XyaA1M/8aTgfF2T7UIlElLaeXkgpmIJ2EitVNQxjO9xLLLy60YqAgKn/AqSpCUkE9g== + +"@rollup/rollup-win32-arm64-msvc@4.22.4": + version "4.22.4" + resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.22.4.tgz#4349482d17f5d1c58604d1c8900540d676f420e0" + integrity sha512-BjI+NVVEGAXjGWYHz/vv0pBqfGoUH0IGZ0cICTn7kB9PyjrATSkX+8WkguNjWoj2qSr1im/+tTGRaY+4/PdcQw== + +"@rollup/rollup-win32-arm64-msvc@4.22.5": + version "4.22.5" + resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.22.5.tgz#12ee49233b1125f2c1da38392f63b1dbb0c31bba" + integrity sha512-RXT8S1HP8AFN/Kr3tg4fuYrNxZ/pZf1HemC5Tsddc6HzgGnJm0+Lh5rAHJkDuW3StI0ynNXukidROMXYl6ew8w== + +"@rollup/rollup-win32-ia32-msvc@4.22.4": + version "4.22.4" + resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.22.4.tgz#a6fc39a15db618040ec3c2a24c1e26cb5f4d7422" + integrity sha512-SiWG/1TuUdPvYmzmYnmd3IEifzR61Tragkbx9D3+R8mzQqDBz8v+BvZNDlkiTtI9T15KYZhP0ehn3Dld4n9J5g== + +"@rollup/rollup-win32-ia32-msvc@4.22.5": + version "4.22.5" + resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.22.5.tgz#0f987b134c6b3123c22842b33ba0c2b6fb78cc3b" + integrity sha512-ElTYOh50InL8kzyUD6XsnPit7jYCKrphmddKAe1/Ytt74apOxDq5YEcbsiKs0fR3vff3jEneMM+3I7jbqaMyBg== + +"@rollup/rollup-win32-x64-msvc@4.22.4": + version "4.22.4" + resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.22.4.tgz#3dd5d53e900df2a40841882c02e56f866c04d202" + integrity sha512-j8pPKp53/lq9lMXN57S8cFz0MynJk8OWNuUnXct/9KCpKU7DgU3bYMJhwWmcqC0UU29p8Lr0/7KEVcaM6bf47Q== + +"@rollup/rollup-win32-x64-msvc@4.22.5": + version "4.22.5" + resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.22.5.tgz#f2feb149235a5dc1deb5439758f8871255e5a161" + integrity sha512-+lvL/4mQxSV8MukpkKyyvfwhH266COcWlXE/1qxwN08ajovta3459zrjLghYMgDerlzNwLAcFpvU+WWE5y6nAQ== + +"@rollup/wasm-node@^4.18.0": + version "4.22.5" + resolved "https://registry.yarnpkg.com/@rollup/wasm-node/-/wasm-node-4.22.5.tgz#a9c0a54b06be0b83db8c66cfb863aa5a8e38434c" + integrity sha512-42RTxk/g1NFaTRT7yo9T0K1OeJPS7xXAWQdUaajjmPPzZmfWjcms+tns8IQkwSlVrBB3EvE2y/FGwGwHmFAqEg== + dependencies: + "@types/estree" "1.0.6" + optionalDependencies: + fsevents "~2.3.2" + +"@sindresorhus/merge-streams@^2.1.0": + version "2.3.0" + resolved "https://registry.yarnpkg.com/@sindresorhus/merge-streams/-/merge-streams-2.3.0.tgz#719df7fb41766bc143369eaa0dd56d8dc87c9958" + integrity sha512-LtoMMhxAlorcGhmFYI+LhPgbPZCkgP6ra1YL604EeF6U98pLlQ3iWIGMdWSC+vWmPBWBNgmDBAhnAobLROJmwg== + +"@types/body-parser@*": + version "1.19.5" + resolved "https://registry.yarnpkg.com/@types/body-parser/-/body-parser-1.19.5.tgz#04ce9a3b677dc8bd681a17da1ab9835dc9d3ede4" + integrity sha512-fB3Zu92ucau0iQ0JMCFQE7b/dv8Ot07NI3KaZIkIUNXq82k4eBAqUaneXfleGY9JWskeS9y+u0nXMyspcuQrCg== + dependencies: + "@types/connect" "*" + "@types/node" "*" + +"@types/bonjour@^3.5.13": + version "3.5.13" + resolved "https://registry.yarnpkg.com/@types/bonjour/-/bonjour-3.5.13.tgz#adf90ce1a105e81dd1f9c61fdc5afda1bfb92956" + integrity sha512-z9fJ5Im06zvUL548KvYNecEVlA7cVDkGUi6kZusb04mpyEFKCIZJvloCcmpmLaIahDpOQGHaHmG6imtPMmPXGQ== + dependencies: + "@types/node" "*" + +"@types/connect-history-api-fallback@^1.5.4": + version "1.5.4" + resolved "https://registry.yarnpkg.com/@types/connect-history-api-fallback/-/connect-history-api-fallback-1.5.4.tgz#7de71645a103056b48ac3ce07b3520b819c1d5b3" + integrity sha512-n6Cr2xS1h4uAulPRdlw6Jl6s1oG8KrVilPN2yUITEs+K48EzMJJ3W1xy8K5eWuFvjp3R74AOIGSmp2UfBJ8HFw== + dependencies: + "@types/express-serve-static-core" "*" + "@types/node" "*" + +"@types/connect@*": + version "3.4.38" + resolved "https://registry.yarnpkg.com/@types/connect/-/connect-3.4.38.tgz#5ba7f3bc4fbbdeaff8dded952e5ff2cc53f8d858" + integrity sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug== + dependencies: + "@types/node" "*" + +"@types/estree@1.0.5": + version "1.0.5" + resolved "https://registry.yarnpkg.com/@types/estree/-/estree-1.0.5.tgz#a6ce3e556e00fd9895dd872dd172ad0d4bd687f4" + integrity sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw== + +"@types/estree@1.0.6", "@types/estree@^1.0.0", "@types/estree@^1.0.5": + version "1.0.6" + resolved "https://registry.yarnpkg.com/@types/estree/-/estree-1.0.6.tgz#628effeeae2064a1b4e79f78e81d87b7e5fc7b50" + integrity sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw== + +"@types/express-serve-static-core@*", "@types/express-serve-static-core@^5.0.0": + version "5.0.0" + resolved "https://registry.yarnpkg.com/@types/express-serve-static-core/-/express-serve-static-core-5.0.0.tgz#91f06cda1049e8f17eeab364798ed79c97488a1c" + integrity sha512-AbXMTZGt40T+KON9/Fdxx0B2WK5hsgxcfXJLr5bFpZ7b4JCex2WyQPTEKdXqfHiY5nKKBScZ7yCoO6Pvgxfvnw== + dependencies: + "@types/node" "*" + "@types/qs" "*" + "@types/range-parser" "*" + "@types/send" "*" + +"@types/express-serve-static-core@^4.17.33": + version "4.19.6" + resolved "https://registry.yarnpkg.com/@types/express-serve-static-core/-/express-serve-static-core-4.19.6.tgz#e01324c2a024ff367d92c66f48553ced0ab50267" + integrity sha512-N4LZ2xG7DatVqhCZzOGb1Yi5lMbXSZcmdLDe9EzSndPV2HpWYWzRbaerl2n27irrm94EPpprqa8KpskPT085+A== + dependencies: + "@types/node" "*" + "@types/qs" "*" + "@types/range-parser" "*" + "@types/send" "*" + +"@types/express@*": + version "5.0.0" + resolved "https://registry.yarnpkg.com/@types/express/-/express-5.0.0.tgz#13a7d1f75295e90d19ed6e74cab3678488eaa96c" + integrity sha512-DvZriSMehGHL1ZNLzi6MidnsDhUZM/x2pRdDIKdwbUNqqwHxMlRdkxtn6/EPKyqKpHqTl/4nRZsRNLpZxZRpPQ== + dependencies: + "@types/body-parser" "*" + "@types/express-serve-static-core" "^5.0.0" + "@types/qs" "*" + "@types/serve-static" "*" + +"@types/express@^4.17.21": + version "4.17.21" + resolved "https://registry.yarnpkg.com/@types/express/-/express-4.17.21.tgz#c26d4a151e60efe0084b23dc3369ebc631ed192d" + integrity sha512-ejlPM315qwLpaQlQDTjPdsUFSc6ZsP4AN6AlWnogPjQ7CVi7PYF3YVz+CY3jE2pwYf7E/7HlDAN0rV2GxTG0HQ== + dependencies: + "@types/body-parser" "*" + "@types/express-serve-static-core" "^4.17.33" + "@types/qs" "*" + "@types/serve-static" "*" + +"@types/http-errors@*": + version "2.0.4" + resolved "https://registry.yarnpkg.com/@types/http-errors/-/http-errors-2.0.4.tgz#7eb47726c391b7345a6ec35ad7f4de469cf5ba4f" + integrity sha512-D0CFMMtydbJAegzOyHjtiKPLlvnm3iTZyZRSZoLq2mRhDdmLfIWOCYPfQJ4cu2erKghU++QvjcUjp/5h7hESpA== + +"@types/http-proxy@^1.17.10", "@types/http-proxy@^1.17.8": + version "1.17.15" + resolved "https://registry.yarnpkg.com/@types/http-proxy/-/http-proxy-1.17.15.tgz#12118141ce9775a6499ecb4c01d02f90fc839d36" + integrity sha512-25g5atgiVNTIv0LBDTg1H74Hvayx0ajtJPLLcYE3whFv75J0pWNtOBzaXJQgDTmrX1bx5U9YC2w/n65BN1HwRQ== + dependencies: + "@types/node" "*" + +"@types/json-schema@^7.0.8", "@types/json-schema@^7.0.9": + version "7.0.15" + resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.15.tgz#596a1747233694d50f6ad8a7869fcb6f56cf5841" + integrity sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA== + +"@types/mime@^1": + version "1.3.5" + resolved "https://registry.yarnpkg.com/@types/mime/-/mime-1.3.5.tgz#1ef302e01cf7d2b5a0fa526790c9123bf1d06690" + integrity sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w== + +"@types/mute-stream@^0.0.4": + version "0.0.4" + resolved "https://registry.yarnpkg.com/@types/mute-stream/-/mute-stream-0.0.4.tgz#77208e56a08767af6c5e1237be8888e2f255c478" + integrity sha512-CPM9nzrCPPJHQNA9keH9CVkVI+WR5kMa+7XEs5jcGQ0VoAGnLv242w8lIVgwAEfmE4oufJRaTc9PNLQl0ioAow== + dependencies: + "@types/node" "*" + +"@types/node-forge@^1.3.0": + version "1.3.11" + resolved "https://registry.yarnpkg.com/@types/node-forge/-/node-forge-1.3.11.tgz#0972ea538ddb0f4d9c2fa0ec5db5724773a604da" + integrity sha512-FQx220y22OKNTqaByeBGqHWYz4cl94tpcxeFdvBo3wjG6XPBuZ0BNgNZRV5J5TFmmcsJ4IzsLkmGRiQbnYsBEQ== + dependencies: + "@types/node" "*" + +"@types/node@*", "@types/node@^22.5.5", "@types/node@^22.7.4": version "22.7.4" resolved "https://registry.yarnpkg.com/@types/node/-/node-22.7.4.tgz#e35d6f48dca3255ce44256ddc05dee1c23353fcc" integrity sha512-y+NPi1rFzDs1NdQHHToqeiX2TIS79SWEAw9GYhkkx8bD0ChpfqC+n2j5OXOCpzfojBEBt6DnEnnG9MY0zk1XLg== @@ -199,6 +2179,238 @@ resolved "https://registry.yarnpkg.com/@types/parse-json/-/parse-json-4.0.2.tgz#5950e50960793055845e956c427fc2b0d70c5239" integrity sha512-dISoDXWWQwUquiKsyZ4Ng+HX2KsPL7LyHKHQwgGFEA3IaKac4Obd+h2a/a6waisAoepJlBcx9paWqjA8/HVjCw== +"@types/qs@*": + version "6.9.16" + resolved "https://registry.yarnpkg.com/@types/qs/-/qs-6.9.16.tgz#52bba125a07c0482d26747d5d4947a64daf8f794" + integrity sha512-7i+zxXdPD0T4cKDuxCUXJ4wHcsJLwENa6Z3dCu8cfCK743OGy5Nu1RmAGqDPsoTDINVEcdXKRvR/zre+P2Ku1A== + +"@types/range-parser@*": + version "1.2.7" + resolved "https://registry.yarnpkg.com/@types/range-parser/-/range-parser-1.2.7.tgz#50ae4353eaaddc04044279812f52c8c65857dbcb" + integrity sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ== + +"@types/resolve@1.20.2": + version "1.20.2" + resolved "https://registry.yarnpkg.com/@types/resolve/-/resolve-1.20.2.tgz#97d26e00cd4a0423b4af620abecf3e6f442b7975" + integrity sha512-60BCwRFOZCQhDncwQdxxeOEEkbc5dIMccYLwbxsS4TUNeVECQ/pBJ0j09mrHOl/JJvpRPGwO9SvE4nR2Nb/a4Q== + +"@types/retry@0.12.2": + version "0.12.2" + resolved "https://registry.yarnpkg.com/@types/retry/-/retry-0.12.2.tgz#ed279a64fa438bb69f2480eda44937912bb7480a" + integrity sha512-XISRgDJ2Tc5q4TRqvgJtzsRkFYNJzZrhTdtMoGVBttwzzQJkPnS3WWTFc7kuDRoPtPakl+T+OfdEUjYJj7Jbow== + +"@types/send@*": + version "0.17.4" + resolved "https://registry.yarnpkg.com/@types/send/-/send-0.17.4.tgz#6619cd24e7270793702e4e6a4b958a9010cfc57a" + integrity sha512-x2EM6TJOybec7c52BX0ZspPodMsQUd5L6PRwOunVyVUhXiBSKf3AezDL8Dgvgt5o0UfKNfuA0eMLr2wLT4AiBA== + dependencies: + "@types/mime" "^1" + "@types/node" "*" + +"@types/serve-index@^1.9.4": + version "1.9.4" + resolved "https://registry.yarnpkg.com/@types/serve-index/-/serve-index-1.9.4.tgz#e6ae13d5053cb06ed36392110b4f9a49ac4ec898" + integrity sha512-qLpGZ/c2fhSs5gnYsQxtDEq3Oy8SXPClIXkW5ghvAvsNuVSA8k+gCONcUCS/UjLEYvYps+e8uBtfgXgvhwfNug== + dependencies: + "@types/express" "*" + +"@types/serve-static@*", "@types/serve-static@^1.15.5": + version "1.15.7" + resolved "https://registry.yarnpkg.com/@types/serve-static/-/serve-static-1.15.7.tgz#22174bbd74fb97fe303109738e9b5c2f3064f714" + integrity sha512-W8Ym+h8nhuRwaKPaDw34QUkwsGi6Rc4yYqvKFo5rm2FUEhCFbzVWrxXUxuKK8TASjWsysJY0nsmNCGhCOIsrOw== + dependencies: + "@types/http-errors" "*" + "@types/node" "*" + "@types/send" "*" + +"@types/sockjs@^0.3.36": + version "0.3.36" + resolved "https://registry.yarnpkg.com/@types/sockjs/-/sockjs-0.3.36.tgz#ce322cf07bcc119d4cbf7f88954f3a3bd0f67535" + integrity sha512-MK9V6NzAS1+Ud7JV9lJLFqW85VbC9dq3LmwZCuBe4wBDgKC0Kj/jd8Xl+nSviU+Qc3+m7umHHyHg//2KSa0a0Q== + dependencies: + "@types/node" "*" + +"@types/wrap-ansi@^3.0.0": + version "3.0.0" + resolved "https://registry.yarnpkg.com/@types/wrap-ansi/-/wrap-ansi-3.0.0.tgz#18b97a972f94f60a679fd5c796d96421b9abb9fd" + integrity sha512-ltIpx+kM7g/MLRZfkbL7EsCEjfzCcScLpkg37eXEtx5kmrAKBkTJwd1GIAjDSL8wTpM6Hzn5YO4pSb91BEwu1g== + +"@types/ws@^8.5.10": + version "8.5.12" + resolved "https://registry.yarnpkg.com/@types/ws/-/ws-8.5.12.tgz#619475fe98f35ccca2a2f6c137702d85ec247b7e" + integrity sha512-3tPRkv1EtkDpzlgyKyI8pGsGZAGPEaXeu0DOj5DI25Ja91bdAYddYHbADRYVrZMRbfW+1l5YwXVDKohDJNQxkQ== + dependencies: + "@types/node" "*" + +"@vitejs/plugin-basic-ssl@1.1.0": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@vitejs/plugin-basic-ssl/-/plugin-basic-ssl-1.1.0.tgz#8b840305a6b48e8764803435ec0c716fa27d3802" + integrity sha512-wO4Dk/rm8u7RNhOf95ZzcEmC9rYOncYgvq4z3duaJrCgjN8BxAnDVyndanfcJZ0O6XZzHz6Q0hTimxTg8Y9g/A== + +"@webassemblyjs/ast@1.12.1", "@webassemblyjs/ast@^1.12.1": + version "1.12.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/ast/-/ast-1.12.1.tgz#bb16a0e8b1914f979f45864c23819cc3e3f0d4bb" + integrity sha512-EKfMUOPRRUTy5UII4qJDGPpqfwjOmZ5jeGFwid9mnoqIFK+e0vqoi1qH56JpmZSzEL53jKnNzScdmftJyG5xWg== + dependencies: + "@webassemblyjs/helper-numbers" "1.11.6" + "@webassemblyjs/helper-wasm-bytecode" "1.11.6" + +"@webassemblyjs/floating-point-hex-parser@1.11.6": + version "1.11.6" + resolved "https://registry.yarnpkg.com/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.6.tgz#dacbcb95aff135c8260f77fa3b4c5fea600a6431" + integrity sha512-ejAj9hfRJ2XMsNHk/v6Fu2dGS+i4UaXBXGemOfQ/JfQ6mdQg/WXtwleQRLLS4OvfDhv8rYnVwH27YJLMyYsxhw== + +"@webassemblyjs/helper-api-error@1.11.6": + version "1.11.6" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.6.tgz#6132f68c4acd59dcd141c44b18cbebbd9f2fa768" + integrity sha512-o0YkoP4pVu4rN8aTJgAyj9hC2Sv5UlkzCHhxqWj8butaLvnpdc2jOwh4ewE6CX0txSfLn/UYaV/pheS2Txg//Q== + +"@webassemblyjs/helper-buffer@1.12.1": + version "1.12.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-buffer/-/helper-buffer-1.12.1.tgz#6df20d272ea5439bf20ab3492b7fb70e9bfcb3f6" + integrity sha512-nzJwQw99DNDKr9BVCOZcLuJJUlqkJh+kVzVl6Fmq/tI5ZtEyWT1KZMyOXltXLZJmDtvLCDgwsyrkohEtopTXCw== + +"@webassemblyjs/helper-numbers@1.11.6": + version "1.11.6" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.6.tgz#cbce5e7e0c1bd32cf4905ae444ef64cea919f1b5" + integrity sha512-vUIhZ8LZoIWHBohiEObxVm6hwP034jwmc9kuq5GdHZH0wiLVLIPcMCdpJzG4C11cHoQ25TFIQj9kaVADVX7N3g== + dependencies: + "@webassemblyjs/floating-point-hex-parser" "1.11.6" + "@webassemblyjs/helper-api-error" "1.11.6" + "@xtuc/long" "4.2.2" + +"@webassemblyjs/helper-wasm-bytecode@1.11.6": + version "1.11.6" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.6.tgz#bb2ebdb3b83aa26d9baad4c46d4315283acd51e9" + integrity sha512-sFFHKwcmBprO9e7Icf0+gddyWYDViL8bpPjJJl0WHxCdETktXdmtWLGVzoHbqUcY4Be1LkNfwTmXOJUFZYSJdA== + +"@webassemblyjs/helper-wasm-section@1.12.1": + version "1.12.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.12.1.tgz#3da623233ae1a60409b509a52ade9bc22a37f7bf" + integrity sha512-Jif4vfB6FJlUlSbgEMHUyk1j234GTNG9dBJ4XJdOySoj518Xj0oGsNi59cUQF4RRMS9ouBUxDDdyBVfPTypa5g== + dependencies: + "@webassemblyjs/ast" "1.12.1" + "@webassemblyjs/helper-buffer" "1.12.1" + "@webassemblyjs/helper-wasm-bytecode" "1.11.6" + "@webassemblyjs/wasm-gen" "1.12.1" + +"@webassemblyjs/ieee754@1.11.6": + version "1.11.6" + resolved "https://registry.yarnpkg.com/@webassemblyjs/ieee754/-/ieee754-1.11.6.tgz#bb665c91d0b14fffceb0e38298c329af043c6e3a" + integrity sha512-LM4p2csPNvbij6U1f19v6WR56QZ8JcHg3QIJTlSwzFcmx6WSORicYj6I63f9yU1kEUtrpG+kjkiIAkevHpDXrg== + dependencies: + "@xtuc/ieee754" "^1.2.0" + +"@webassemblyjs/leb128@1.11.6": + version "1.11.6" + resolved "https://registry.yarnpkg.com/@webassemblyjs/leb128/-/leb128-1.11.6.tgz#70e60e5e82f9ac81118bc25381a0b283893240d7" + integrity sha512-m7a0FhE67DQXgouf1tbN5XQcdWoNgaAuoULHIfGFIEVKA6tu/edls6XnIlkmS6FrXAquJRPni3ZZKjw6FSPjPQ== + dependencies: + "@xtuc/long" "4.2.2" + +"@webassemblyjs/utf8@1.11.6": + version "1.11.6" + resolved "https://registry.yarnpkg.com/@webassemblyjs/utf8/-/utf8-1.11.6.tgz#90f8bc34c561595fe156603be7253cdbcd0fab5a" + integrity sha512-vtXf2wTQ3+up9Zsg8sa2yWiQpzSsMyXj0qViVP6xKGCUT8p8YJ6HqI7l5eCnWx1T/FYdsv07HQs2wTFbbof/RA== + +"@webassemblyjs/wasm-edit@^1.12.1": + version "1.12.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-edit/-/wasm-edit-1.12.1.tgz#9f9f3ff52a14c980939be0ef9d5df9ebc678ae3b" + integrity sha512-1DuwbVvADvS5mGnXbE+c9NfA8QRcZ6iKquqjjmR10k6o+zzsRVesil54DKexiowcFCPdr/Q0qaMgB01+SQ1u6g== + dependencies: + "@webassemblyjs/ast" "1.12.1" + "@webassemblyjs/helper-buffer" "1.12.1" + "@webassemblyjs/helper-wasm-bytecode" "1.11.6" + "@webassemblyjs/helper-wasm-section" "1.12.1" + "@webassemblyjs/wasm-gen" "1.12.1" + "@webassemblyjs/wasm-opt" "1.12.1" + "@webassemblyjs/wasm-parser" "1.12.1" + "@webassemblyjs/wast-printer" "1.12.1" + +"@webassemblyjs/wasm-gen@1.12.1": + version "1.12.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-gen/-/wasm-gen-1.12.1.tgz#a6520601da1b5700448273666a71ad0a45d78547" + integrity sha512-TDq4Ojh9fcohAw6OIMXqiIcTq5KUXTGRkVxbSo1hQnSy6lAM5GSdfwWeSxpAo0YzgsgF182E/U0mDNhuA0tW7w== + dependencies: + "@webassemblyjs/ast" "1.12.1" + "@webassemblyjs/helper-wasm-bytecode" "1.11.6" + "@webassemblyjs/ieee754" "1.11.6" + "@webassemblyjs/leb128" "1.11.6" + "@webassemblyjs/utf8" "1.11.6" + +"@webassemblyjs/wasm-opt@1.12.1": + version "1.12.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-opt/-/wasm-opt-1.12.1.tgz#9e6e81475dfcfb62dab574ac2dda38226c232bc5" + integrity sha512-Jg99j/2gG2iaz3hijw857AVYekZe2SAskcqlWIZXjji5WStnOpVoat3gQfT/Q5tb2djnCjBtMocY/Su1GfxPBg== + dependencies: + "@webassemblyjs/ast" "1.12.1" + "@webassemblyjs/helper-buffer" "1.12.1" + "@webassemblyjs/wasm-gen" "1.12.1" + "@webassemblyjs/wasm-parser" "1.12.1" + +"@webassemblyjs/wasm-parser@1.12.1", "@webassemblyjs/wasm-parser@^1.12.1": + version "1.12.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-parser/-/wasm-parser-1.12.1.tgz#c47acb90e6f083391e3fa61d113650eea1e95937" + integrity sha512-xikIi7c2FHXysxXe3COrVUPSheuBtpcfhbpFj4gmu7KRLYOzANztwUU0IbsqvMqzuNK2+glRGWCEqZo1WCLyAQ== + dependencies: + "@webassemblyjs/ast" "1.12.1" + "@webassemblyjs/helper-api-error" "1.11.6" + "@webassemblyjs/helper-wasm-bytecode" "1.11.6" + "@webassemblyjs/ieee754" "1.11.6" + "@webassemblyjs/leb128" "1.11.6" + "@webassemblyjs/utf8" "1.11.6" + +"@webassemblyjs/wast-printer@1.12.1": + version "1.12.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wast-printer/-/wast-printer-1.12.1.tgz#bcecf661d7d1abdaf989d8341a4833e33e2b31ac" + integrity sha512-+X4WAlOisVWQMikjbcvY2e0rwPsKQ9F688lksZhBcPycBBuii3O7m8FACbDMWDojpAqvjIncrG8J0XHKyQfVeA== + dependencies: + "@webassemblyjs/ast" "1.12.1" + "@xtuc/long" "4.2.2" + +"@xtuc/ieee754@^1.2.0": + version "1.2.0" + resolved "https://registry.yarnpkg.com/@xtuc/ieee754/-/ieee754-1.2.0.tgz#eef014a3145ae477a1cbc00cd1e552336dceb790" + integrity sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA== + +"@xtuc/long@4.2.2": + version "4.2.2" + resolved "https://registry.yarnpkg.com/@xtuc/long/-/long-4.2.2.tgz#d291c6a4e97989b5c61d9acf396ae4fe133a718d" + integrity sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ== + +accepts@~1.3.4, accepts@~1.3.5, accepts@~1.3.8: + version "1.3.8" + resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.8.tgz#0bf0be125b67014adcb0b0921e62db7bffe16b2e" + integrity sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw== + dependencies: + mime-types "~2.1.34" + negotiator "0.6.3" + +acorn-import-attributes@^1.9.5: + version "1.9.5" + resolved "https://registry.yarnpkg.com/acorn-import-attributes/-/acorn-import-attributes-1.9.5.tgz#7eb1557b1ba05ef18b5ed0ec67591bfab04688ef" + integrity sha512-n02Vykv5uA3eHGM/Z2dQrcD56kL8TyDb2p1+0P83PClMnC/nc+anbQRhIOWnSq4Ke/KvDPrY3C9hDtC/A3eHnQ== + +acorn@^8.7.1, acorn@^8.8.2: + version "8.12.1" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.12.1.tgz#71616bdccbe25e27a54439e0046e89ca76df2248" + integrity sha512-tcpGyI9zbizT9JbV6oYE477V6mTlXvvi0T0G3SNIYE2apm/G5huBa1+K89VGeovbg+jycCrfhl3ADxErOuO6Jg== + +adjust-sourcemap-loader@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/adjust-sourcemap-loader/-/adjust-sourcemap-loader-4.0.0.tgz#fc4a0fd080f7d10471f30a7320f25560ade28c99" + integrity sha512-OXwN5b9pCUXNQHJpwwD2qP40byEmSgzj8B4ydSN0uMNYWiFmJ6x6KwUllMmfk8Rwu/HJDFR7U8ubsWBoN0Xp0A== + dependencies: + loader-utils "^2.0.0" + regex-parser "^2.2.11" + +agent-base@^7.0.2: + version "7.1.1" + resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-7.1.1.tgz#bdbded7dfb096b751a2a087eeeb9664725b2e317" + integrity sha512-H0TSyFNDMomMNJQBn8wFV5YC/2eJ+VXECwOadZJT554xP6cODZHPX3H9QMQECxvrgiSOP1pHjy1sMWQVYJOUOA== + dependencies: + debug "^4.3.4" + aggregate-error@^3.0.0: version "3.1.0" resolved "https://registry.yarnpkg.com/aggregate-error/-/aggregate-error-3.1.0.tgz#92670ff50f5359bdb7a3e0d40d0ec30c5737687a" @@ -207,23 +2419,86 @@ aggregate-error@^3.0.0: clean-stack "^2.0.0" indent-string "^4.0.0" -ansi-colors@^4.1.1: +ajv-formats@3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/ajv-formats/-/ajv-formats-3.0.1.tgz#3d5dc762bca17679c3c2ea7e90ad6b7532309578" + integrity sha512-8iUql50EUR+uUcdRQ3HDqa6EVyo3docL8g5WJ3FNcWmu62IbkGUue/pEyLBW8VGKKucTPgqeks4fIU1DA4yowQ== + dependencies: + ajv "^8.0.0" + +ajv-formats@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/ajv-formats/-/ajv-formats-2.1.1.tgz#6e669400659eb74973bbf2e33327180a0996b520" + integrity sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA== + dependencies: + ajv "^8.0.0" + +ajv-keywords@^3.5.2: + version "3.5.2" + resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-3.5.2.tgz#31f29da5ab6e00d1c2d329acf7b5929614d5014d" + integrity sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ== + +ajv-keywords@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-5.1.0.tgz#69d4d385a4733cdbeab44964a1170a88f87f0e16" + integrity sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw== + dependencies: + fast-deep-equal "^3.1.3" + +ajv@8.17.1, ajv@^8.0.0, ajv@^8.12.0, ajv@^8.9.0: + version "8.17.1" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-8.17.1.tgz#37d9a5c776af6bc92d7f4f9510eba4c0a60d11a6" + integrity sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g== + dependencies: + fast-deep-equal "^3.1.3" + fast-uri "^3.0.1" + json-schema-traverse "^1.0.0" + require-from-string "^2.0.2" + +ajv@^6.12.5: + version "6.12.6" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.6.tgz#baf5a62e802b07d977034586f8c3baf5adf26df4" + integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g== + dependencies: + fast-deep-equal "^3.1.1" + fast-json-stable-stringify "^2.0.0" + json-schema-traverse "^0.4.1" + uri-js "^4.2.2" + +ansi-colors@4.1.3, ansi-colors@^4.1.1, ansi-colors@^4.1.3: version "4.1.3" resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-4.1.3.tgz#37611340eb2243e70cc604cad35d63270d48781b" integrity sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw== -ansi-escapes@^4.3.0: +ansi-escapes@^4.3.0, ansi-escapes@^4.3.2: version "4.3.2" resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-4.3.2.tgz#6b2291d1db7d98b6521d5f1efa42d0f3a9feb65e" integrity sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ== dependencies: - type-fest "^0.21.3" + type-fest "^0.21.3" + +ansi-escapes@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-7.0.0.tgz#00fc19f491bbb18e1d481b97868204f92109bfe7" + integrity sha512-GdYO7a61mR0fOlAsvC9/rIHf7L96sBc6dEWzeOu+KAea5bZyQRPIpojrVoI4AXGJS/ycu/fBTdLrUkA4ODrvjw== + dependencies: + environment "^1.0.0" + +ansi-html-community@^0.0.8: + version "0.0.8" + resolved "https://registry.yarnpkg.com/ansi-html-community/-/ansi-html-community-0.0.8.tgz#69fbc4d6ccbe383f9736934ae34c3f8290f1bf41" + integrity sha512-1APHAyr3+PCamwNw3bXCPp4HFLONZt/yIH0sZp0/469KWNTEy+qN5jQ3GVX6DMZ1UXAi34yVwtTeaG/HpBuuzw== ansi-regex@^5.0.1: version "5.0.1" resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304" integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ== +ansi-regex@^6.0.1: + version "6.1.0" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-6.1.0.tgz#95ec409c69619d6cb1b8b34f14b660ef28ebd654" + integrity sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA== + ansi-styles@^3.2.1: version "3.2.1" resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" @@ -238,6 +2513,11 @@ ansi-styles@^4.0.0, ansi-styles@^4.1.0: dependencies: color-convert "^2.0.1" +ansi-styles@^6.0.0, ansi-styles@^6.1.0, ansi-styles@^6.2.1: + version "6.2.1" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-6.2.1.tgz#0e62320cf99c21afff3b3012192546aacbfb05c5" + integrity sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug== + anymatch@~3.1.2: version "3.1.3" resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.3.tgz#790c58b19ba1720a84205b57c618d5ad8524973e" @@ -246,6 +2526,16 @@ anymatch@~3.1.2: normalize-path "^3.0.0" picomatch "^2.0.4" +argparse@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/argparse/-/argparse-2.0.1.tgz#246f50f3ca78a3240f6c997e8a9bd1eac49e4b38" + integrity sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q== + +array-flatten@1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-1.1.1.tgz#9a5f699051b1e7073328f2a008968b64ea2955d2" + integrity sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg== + array-union@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/array-union/-/array-union-2.1.0.tgz#b798420adbeb1de828d84acd8a2e23d3efe85e8d" @@ -256,11 +2546,122 @@ astral-regex@^2.0.0: resolved "https://registry.yarnpkg.com/astral-regex/-/astral-regex-2.0.0.tgz#483143c567aeed4785759c0865786dc77d7d2e31" integrity sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ== +autoprefixer@10.4.20: + version "10.4.20" + resolved "https://registry.yarnpkg.com/autoprefixer/-/autoprefixer-10.4.20.tgz#5caec14d43976ef42e32dcb4bd62878e96be5b3b" + integrity sha512-XY25y5xSv/wEoqzDyXXME4AFfkZI0P23z6Fs3YgymDnKJkCGOnkL0iTxCa85UTqaSgfcqyf3UA6+c7wUvx/16g== + dependencies: + browserslist "^4.23.3" + caniuse-lite "^1.0.30001646" + fraction.js "^4.3.7" + normalize-range "^0.1.2" + picocolors "^1.0.1" + postcss-value-parser "^4.2.0" + +babel-loader@9.1.3: + version "9.1.3" + resolved "https://registry.yarnpkg.com/babel-loader/-/babel-loader-9.1.3.tgz#3d0e01b4e69760cc694ee306fe16d358aa1c6f9a" + integrity sha512-xG3ST4DglodGf8qSwv0MdeWLhrDsw/32QMdTO5T1ZIp9gQur0HkCyFs7Awskr10JKXFXwpAhiCuYX5oGXnRGbw== + dependencies: + find-cache-dir "^4.0.0" + schema-utils "^4.0.0" + +babel-plugin-polyfill-corejs2@^0.4.10: + version "0.4.11" + resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.11.tgz#30320dfe3ffe1a336c15afdcdafd6fd615b25e33" + integrity sha512-sMEJ27L0gRHShOh5G54uAAPaiCOygY/5ratXuiyb2G46FmlSpc9eFCzYVyDiPxfNbwzA7mYahmjQc5q+CZQ09Q== + dependencies: + "@babel/compat-data" "^7.22.6" + "@babel/helper-define-polyfill-provider" "^0.6.2" + semver "^6.3.1" + +babel-plugin-polyfill-corejs3@^0.10.1, babel-plugin-polyfill-corejs3@^0.10.4: + version "0.10.6" + resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.10.6.tgz#2deda57caef50f59c525aeb4964d3b2f867710c7" + integrity sha512-b37+KR2i/khY5sKmWNVQAnitvquQbNdWy6lJdsr0kmquCKEEUgMKK4SboVM3HtfnZilfjr4MMQ7vY58FVWDtIA== + dependencies: + "@babel/helper-define-polyfill-provider" "^0.6.2" + core-js-compat "^3.38.0" + +babel-plugin-polyfill-regenerator@^0.6.1: + version "0.6.2" + resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.6.2.tgz#addc47e240edd1da1058ebda03021f382bba785e" + integrity sha512-2R25rQZWP63nGwaAswvDazbPXfrM3HwVoBXK6HcqeKrSrL/JqcC/rDcf95l4r7LXLyxDXc8uQDa064GubtCABg== + dependencies: + "@babel/helper-define-polyfill-provider" "^0.6.2" + +balanced-match@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" + integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== + +base64-js@^1.3.1: + version "1.5.1" + resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.5.1.tgz#1b1b440160a5bf7ad40b650f095963481903930a" + integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA== + +batch@0.6.1: + version "0.6.1" + resolved "https://registry.yarnpkg.com/batch/-/batch-0.6.1.tgz#dc34314f4e679318093fc760272525f94bf25c16" + integrity sha512-x+VAiMRL6UPkx+kudNvxTl6hB2XNNCG2r+7wixVfIYwu/2HKRXimwQyaumLjMveWvT2Hkd/cAJw+QBMfJ/EKVw== + +big.js@^5.2.2: + version "5.2.2" + resolved "https://registry.yarnpkg.com/big.js/-/big.js-5.2.2.tgz#65f0af382f578bcdc742bd9c281e9cb2d7768328" + integrity sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ== + binary-extensions@^2.0.0: version "2.3.0" resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.3.0.tgz#f6e14a97858d327252200242d4ccfe522c445522" integrity sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw== +bl@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/bl/-/bl-4.1.0.tgz#451535264182bec2fbbc83a62ab98cf11d9f7b3a" + integrity sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w== + dependencies: + buffer "^5.5.0" + inherits "^2.0.4" + readable-stream "^3.4.0" + +body-parser@1.20.3: + version "1.20.3" + resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.20.3.tgz#1953431221c6fb5cd63c4b36d53fab0928e548c6" + integrity sha512-7rAxByjUMqQ3/bHJy7D6OGXvx/MMc4IqBn/X0fcM1QUcAItpZrBEYhWGem+tzXH90c+G01ypMcYJBO9Y30203g== + dependencies: + bytes "3.1.2" + content-type "~1.0.5" + debug "2.6.9" + depd "2.0.0" + destroy "1.2.0" + http-errors "2.0.0" + iconv-lite "0.4.24" + on-finished "2.4.1" + qs "6.13.0" + raw-body "2.5.2" + type-is "~1.6.18" + unpipe "1.0.0" + +bonjour-service@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/bonjour-service/-/bonjour-service-1.2.1.tgz#eb41b3085183df3321da1264719fbada12478d02" + integrity sha512-oSzCS2zV14bh2kji6vNe7vrpJYCHGvcZnlffFQ1MEoX/WOeQ/teD8SYWKR942OI3INjq8OMNJlbPK5LLLUxFDw== + dependencies: + fast-deep-equal "^3.1.3" + multicast-dns "^7.2.5" + +boolbase@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/boolbase/-/boolbase-1.0.0.tgz#68dff5fbe60c51eb37725ea9e3ed310dcc1e776e" + integrity sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww== + +brace-expansion@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-2.0.1.tgz#1edc459e0f0c548486ecf9fc99f2221364b9a0ae" + integrity sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA== + dependencies: + balanced-match "^1.0.0" + braces@^3.0.3, braces@~3.0.2: version "3.0.3" resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.3.tgz#490332f40919452272d55a8480adc0c441358789" @@ -268,11 +2669,85 @@ braces@^3.0.3, braces@~3.0.2: dependencies: fill-range "^7.1.1" +browserslist@^4.21.10, browserslist@^4.21.5, browserslist@^4.22.1, browserslist@^4.23.0, browserslist@^4.23.1, browserslist@^4.23.3: + version "4.24.0" + resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.24.0.tgz#a1325fe4bc80b64fda169629fc01b3d6cecd38d4" + integrity sha512-Rmb62sR1Zpjql25eSanFGEhAxcFwfA1K0GuQcLoaJBAcENegrQut3hYdhXFF1obQfiDyqIW/cLM5HSJ/9k884A== + dependencies: + caniuse-lite "^1.0.30001663" + electron-to-chromium "^1.5.28" + node-releases "^2.0.18" + update-browserslist-db "^1.1.0" + +buffer-from@^1.0.0: + version "1.1.2" + resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.2.tgz#2b146a6fd72e80b4f55d255f35ed59a3a9a41bd5" + integrity sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ== + +buffer@^5.5.0: + version "5.7.1" + resolved "https://registry.yarnpkg.com/buffer/-/buffer-5.7.1.tgz#ba62e7c13133053582197160851a8f648e99eed0" + integrity sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ== + dependencies: + base64-js "^1.3.1" + ieee754 "^1.1.13" + +bundle-name@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/bundle-name/-/bundle-name-4.1.0.tgz#f3b96b34160d6431a19d7688135af7cfb8797889" + integrity sha512-tjwM5exMg6BGRI+kNmTntNsvdZS1X8BFYS6tnJ2hdH0kVxM6/eVZ2xy+FqStSWvYmtfFMDLIxurorHwDKfDz5Q== + dependencies: + run-applescript "^7.0.0" + +bytes@3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.0.0.tgz#d32815404d689699f85a4ea4fa8755dd13a96048" + integrity sha512-pMhOfFDPiv9t5jjIXkHosWmkSyQbvsgEVNkz0ERHbuLh2T/7j4Mqqpz523Fe8MVY89KC6Sh/QfS2sM+SjgFDcw== + +bytes@3.1.2: + version "3.1.2" + resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.1.2.tgz#8b0beeb98605adf1b128fa4386403c009e0221a5" + integrity sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg== + +cacache@^18.0.0: + version "18.0.4" + resolved "https://registry.yarnpkg.com/cacache/-/cacache-18.0.4.tgz#4601d7578dadb59c66044e157d02a3314682d6a5" + integrity sha512-B+L5iIa9mgcjLbliir2th36yEwPftrzteHYujzsx3dFP/31GCHcIeS8f5MGd80odLOjaOvSpU3EEAmRQptkxLQ== + dependencies: + "@npmcli/fs" "^3.1.0" + fs-minipass "^3.0.0" + glob "^10.2.2" + lru-cache "^10.0.1" + minipass "^7.0.3" + minipass-collect "^2.0.1" + minipass-flush "^1.0.5" + minipass-pipeline "^1.2.4" + p-map "^4.0.0" + ssri "^10.0.0" + tar "^6.1.11" + unique-filename "^3.0.0" + +call-bind@^1.0.7: + version "1.0.7" + resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.7.tgz#06016599c40c56498c18769d2730be242b6fa3b9" + integrity sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w== + dependencies: + es-define-property "^1.0.0" + es-errors "^1.3.0" + function-bind "^1.1.2" + get-intrinsic "^1.2.4" + set-function-length "^1.2.1" + callsites@^3.0.0: version "3.1.0" resolved "https://registry.yarnpkg.com/callsites/-/callsites-3.1.0.tgz#b3630abd8943432f54b3f0519238e33cd7df2f73" integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ== +caniuse-lite@^1.0.30001646, caniuse-lite@^1.0.30001663: + version "1.0.30001664" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001664.tgz#d588d75c9682d3301956b05a3749652a80677df4" + integrity sha512-AmE7k4dXiNKQipgn7a2xg558IRqPN3jMQY/rOsbxDhrd0tyChwbITBfiwtnqz8bi2M5mIWbxAYBvk7W7QBUS2g== + chalk@^2.4.2: version "2.4.2" resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" @@ -282,7 +2757,7 @@ chalk@^2.4.2: escape-string-regexp "^1.0.5" supports-color "^5.3.0" -chalk@^4.0.0: +chalk@^4.0.0, chalk@^4.1.0: version "4.1.2" resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01" integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== @@ -295,7 +2770,7 @@ chalk@^5.3.0: resolved "https://registry.yarnpkg.com/chalk/-/chalk-5.3.0.tgz#67c20a7ebef70e7f3970a01f90fa210cb6860385" integrity sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w== -chokidar@^3.5.3: +"chokidar@>=3.0.0 <4.0.0", chokidar@^3.0.0, chokidar@^3.5.3, chokidar@^3.6.0: version "3.6.0" resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.6.0.tgz#197c6cc669ef2a8dc5e7b4d97ee4e092c3eb0d5b" integrity sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw== @@ -310,6 +2785,23 @@ chokidar@^3.5.3: optionalDependencies: fsevents "~2.3.2" +chokidar@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-4.0.1.tgz#4a6dff66798fb0f72a94f616abbd7e1a19f31d41" + integrity sha512-n8enUVCED/KVRQlab1hr3MVpcVMvxtZjmEa956u+4YijlmQED223XMSYj2tLuKvr4jcCTzNNMpQDUer72MMmzA== + dependencies: + readdirp "^4.0.1" + +chownr@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/chownr/-/chownr-2.0.0.tgz#15bfbe53d2eab4cf70f18a8cd68ebe5b3cb1dece" + integrity sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ== + +chrome-trace-event@^1.0.2: + version "1.0.4" + resolved "https://registry.yarnpkg.com/chrome-trace-event/-/chrome-trace-event-1.0.4.tgz#05bffd7ff928465093314708c93bdfa9bd1f0f5b" + integrity sha512-rNjApaLzuwaOTjCiT8lSDdGN1APCiqkChLMJxJPWLunPAt5fy8xgU9/jNOchV84wfIxrA0lRQB7oCT8jrn/wrQ== + ci-info@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-2.0.0.tgz#67a9e964be31a51e15e5010d58e6f12834002f46" @@ -327,6 +2819,18 @@ cli-cursor@^3.1.0: dependencies: restore-cursor "^3.1.0" +cli-cursor@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-5.0.0.tgz#24a4831ecf5a6b01ddeb32fb71a4b2088b0dce38" + integrity sha512-aCj4O5wKyszjMmDT4tZj93kxyydN/K5zPWSCe6/0AV/AA1pqe5ZBIw0a2ZfPQV7lL5/yb5HsUreJ6UFAF1tEQw== + dependencies: + restore-cursor "^5.0.0" + +cli-spinners@^2.5.0: + version "2.9.2" + resolved "https://registry.yarnpkg.com/cli-spinners/-/cli-spinners-2.9.2.tgz#1773a8f4b9c4d6ac31563df53b3fc1d79462fe41" + integrity sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg== + cli-truncate@2.1.0, cli-truncate@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/cli-truncate/-/cli-truncate-2.1.0.tgz#c39e28bf05edcde5be3b98992a22deed5a2b93c7" @@ -335,6 +2839,42 @@ cli-truncate@2.1.0, cli-truncate@^2.1.0: slice-ansi "^3.0.0" string-width "^4.2.0" +cli-truncate@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/cli-truncate/-/cli-truncate-4.0.0.tgz#6cc28a2924fee9e25ce91e973db56c7066e6172a" + integrity sha512-nPdaFdQ0h/GEigbPClz11D0v/ZJEwxmeVZGeMo3Z5StPtUTkA9o1lD6QwoirYiSDzbcwn2XcjwmCp68W1IS4TA== + dependencies: + slice-ansi "^5.0.0" + string-width "^7.0.0" + +cli-width@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/cli-width/-/cli-width-4.1.0.tgz#42daac41d3c254ef38ad8ac037672130173691c5" + integrity sha512-ouuZd4/dm2Sw5Gmqy6bGyNNNe1qt9RpmxveLSO7KcgsTnU7RXfsw+/bukWGo1abgBiMAic068rclZsO4IWmmxQ== + +cliui@^8.0.1: + version "8.0.1" + resolved "https://registry.yarnpkg.com/cliui/-/cliui-8.0.1.tgz#0c04b075db02cbfe60dc8e6cf2f5486b1a3608aa" + integrity sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ== + dependencies: + string-width "^4.2.0" + strip-ansi "^6.0.1" + wrap-ansi "^7.0.0" + +clone-deep@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/clone-deep/-/clone-deep-4.0.1.tgz#c19fd9bdbbf85942b4fd979c84dcf7d5f07c2387" + integrity sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ== + dependencies: + is-plain-object "^2.0.4" + kind-of "^6.0.2" + shallow-clone "^3.0.0" + +clone@^1.0.2: + version "1.0.4" + resolved "https://registry.yarnpkg.com/clone/-/clone-1.0.4.tgz#da309cc263df15994c688ca902179ca3c7cd7c7e" + integrity sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg== + color-convert@^1.9.0: version "1.9.3" resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8" @@ -364,11 +2904,21 @@ colorette@^1.4.0: resolved "https://registry.yarnpkg.com/colorette/-/colorette-1.4.0.tgz#5190fbb87276259a86ad700bff2c6d6faa3fca40" integrity sha512-Y2oEozpomLn7Q3HFP7dpww7AtMJplbM9lGZP6RDfHqmbeRjiwRg4n6VM6j4KLmRke85uWEI7JqF17f3pqdRA0g== -colorette@^2.0.16: +colorette@^2.0.10, colorette@^2.0.16, colorette@^2.0.20: version "2.0.20" resolved "https://registry.yarnpkg.com/colorette/-/colorette-2.0.20.tgz#9eb793e6833067f7235902fcd3b09917a000a95a" integrity sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w== +commander@^12.0.0: + version "12.1.0" + resolved "https://registry.yarnpkg.com/commander/-/commander-12.1.0.tgz#01423b36f501259fdaac4d0e4d60c96c991585d3" + integrity sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA== + +commander@^2.20.0: + version "2.20.3" + resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.3.tgz#fd485e84c03eb4881c20722ba48035e8531aeb33" + integrity sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ== + commander@^8.2.0: version "8.3.0" resolved "https://registry.yarnpkg.com/commander/-/commander-8.3.0.tgz#4837ea1b2da67b9c616a67afbb0fafee567bca66" @@ -379,11 +2929,109 @@ commander@^9.0.0: resolved "https://registry.yarnpkg.com/commander/-/commander-9.5.0.tgz#bc08d1eb5cedf7ccb797a96199d41c7bc3e60d30" integrity sha512-KRs7WVDKg86PWiuAqhDrAQnTXZKraVcCc6vFdL14qrZ/DcWwuRo7VoiYXalXO7S5GKpqYiVEwCbgFDfxNHKJBQ== +common-path-prefix@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/common-path-prefix/-/common-path-prefix-3.0.0.tgz#7d007a7e07c58c4b4d5f433131a19141b29f11e0" + integrity sha512-QE33hToZseCH3jS0qN96O/bSh3kaw/h+Tq7ngyY9eWDUnTlTNUyqfqvCXioLe5Na5jFsL78ra/wuBU4iuEgd4w== + +commondir@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/commondir/-/commondir-1.0.1.tgz#ddd800da0c66127393cca5950ea968a3aaf1253b" + integrity sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg== + compare-versions@^3.6.0: version "3.6.0" resolved "https://registry.yarnpkg.com/compare-versions/-/compare-versions-3.6.0.tgz#1a5689913685e5a87637b8d3ffca75514ec41d62" integrity sha512-W6Af2Iw1z4CB7q4uU4hv646dW9GQuBM+YpC0UvUCWSD8w90SJjp+ujJuXaEMtAXBtSqGfMPuFOVn4/+FlaqfBA== +compressible@~2.0.16: + version "2.0.18" + resolved "https://registry.yarnpkg.com/compressible/-/compressible-2.0.18.tgz#af53cca6b070d4c3c0750fbd77286a6d7cc46fba" + integrity sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg== + dependencies: + mime-db ">= 1.43.0 < 2" + +compression@^1.7.4: + version "1.7.4" + resolved "https://registry.yarnpkg.com/compression/-/compression-1.7.4.tgz#95523eff170ca57c29a0ca41e6fe131f41e5bb8f" + integrity sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ== + dependencies: + accepts "~1.3.5" + bytes "3.0.0" + compressible "~2.0.16" + debug "2.6.9" + on-headers "~1.0.2" + safe-buffer "5.1.2" + vary "~1.1.2" + +connect-history-api-fallback@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/connect-history-api-fallback/-/connect-history-api-fallback-2.0.0.tgz#647264845251a0daf25b97ce87834cace0f5f1c8" + integrity sha512-U73+6lQFmfiNPrYbXqr6kZ1i1wiRqXnp2nhMsINseWXO8lDau0LGEffJ8kQi4EjLZympVgRdvqjAgiZ1tgzDDA== + +content-disposition@0.5.4: + version "0.5.4" + resolved "https://registry.yarnpkg.com/content-disposition/-/content-disposition-0.5.4.tgz#8b82b4efac82512a02bb0b1dcec9d2c5e8eb5bfe" + integrity sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ== + dependencies: + safe-buffer "5.2.1" + +content-type@~1.0.4, content-type@~1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/content-type/-/content-type-1.0.5.tgz#8b773162656d1d1086784c8f23a54ce6d73d7918" + integrity sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA== + +convert-source-map@^1.5.1, convert-source-map@^1.7.0: + version "1.9.0" + resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.9.0.tgz#7faae62353fb4213366d0ca98358d22e8368b05f" + integrity sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A== + +convert-source-map@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-2.0.0.tgz#4b560f649fc4e918dd0ab75cf4961e8bc882d82a" + integrity sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg== + +cookie-signature@1.0.6: + version "1.0.6" + resolved "https://registry.yarnpkg.com/cookie-signature/-/cookie-signature-1.0.6.tgz#e303a882b342cc3ee8ca513a79999734dab3ae2c" + integrity sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ== + +cookie@0.6.0: + version "0.6.0" + resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.6.0.tgz#2798b04b071b0ecbff0dbb62a505a8efa4e19051" + integrity sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw== + +copy-anything@^2.0.1: + version "2.0.6" + resolved "https://registry.yarnpkg.com/copy-anything/-/copy-anything-2.0.6.tgz#092454ea9584a7b7ad5573062b2a87f5900fc480" + integrity sha512-1j20GZTsvKNkc4BY3NpMOM8tt///wY3FpIzozTOFO2ffuZcV61nojHXVKIy3WM+7ADCy5FVhdZYHYDdgTU0yJw== + dependencies: + is-what "^3.14.1" + +copy-webpack-plugin@12.0.2: + version "12.0.2" + resolved "https://registry.yarnpkg.com/copy-webpack-plugin/-/copy-webpack-plugin-12.0.2.tgz#935e57b8e6183c82f95bd937df658a59f6a2da28" + integrity sha512-SNwdBeHyII+rWvee/bTnAYyO8vfVdcSTud4EIb6jcZ8inLeWucJE0DnxXQBjlQ5zlteuuvooGQy3LIyGxhvlOA== + dependencies: + fast-glob "^3.3.2" + glob-parent "^6.0.1" + globby "^14.0.0" + normalize-path "^3.0.0" + schema-utils "^4.2.0" + serialize-javascript "^6.0.2" + +core-js-compat@^3.37.1, core-js-compat@^3.38.0: + version "3.38.1" + resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.38.1.tgz#2bc7a298746ca5a7bcb9c164bcb120f2ebc09a09" + integrity sha512-JRH6gfXxGmrzF3tZ57lFx97YARxCXPaMzPo6jELZhv88pBH5VXpQ+y0znKGlFnzuaihqhLbefxSJxWJMPtfDzw== + dependencies: + browserslist "^4.23.3" + +core-util-is@~1.0.0: + version "1.0.3" + resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.3.tgz#a6042d3634c2b27e9328f837b965fac83808db85" + integrity sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ== + cosmiconfig@^7.0.0, cosmiconfig@^7.0.1: version "7.1.0" resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-7.1.0.tgz#1443b9afa596b670082ea46cbd8f6a62b84635f6" @@ -395,7 +3043,30 @@ cosmiconfig@^7.0.0, cosmiconfig@^7.0.1: path-type "^4.0.0" yaml "^1.10.0" -cross-spawn@^7.0.3: +cosmiconfig@^9.0.0: + version "9.0.0" + resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-9.0.0.tgz#34c3fc58287b915f3ae905ab6dc3de258b55ad9d" + integrity sha512-itvL5h8RETACmOTFc4UfIyB2RfEHi71Ax6E/PivVxq9NseKbOWpeyHEOIbmAw1rs8Ak0VursQNww7lf7YtUwzg== + dependencies: + env-paths "^2.2.1" + import-fresh "^3.3.0" + js-yaml "^4.1.0" + parse-json "^5.2.0" + +critters@0.0.24: + version "0.0.24" + resolved "https://registry.yarnpkg.com/critters/-/critters-0.0.24.tgz#d20b16c28908d2dae4b9cd4851d4d2c93de98a0b" + integrity sha512-Oyqew0FGM0wYUSNqR0L6AteO5MpMoUU0rhKRieXeiKs+PmRTxiJMyaunYB2KF6fQ3dzChXKCpbFOEJx3OQ1v/Q== + dependencies: + chalk "^4.1.0" + css-select "^5.1.0" + dom-serializer "^2.0.0" + domhandler "^5.0.2" + htmlparser2 "^8.0.2" + postcss "^8.4.23" + postcss-media-query-parser "^0.2.3" + +cross-spawn@^7.0.0, cross-spawn@^7.0.3: version "7.0.3" resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6" integrity sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w== @@ -404,13 +3075,131 @@ cross-spawn@^7.0.3: shebang-command "^2.0.0" which "^2.0.1" -debug@^4.3.2: +css-loader@7.1.2: + version "7.1.2" + resolved "https://registry.yarnpkg.com/css-loader/-/css-loader-7.1.2.tgz#64671541c6efe06b0e22e750503106bdd86880f8" + integrity sha512-6WvYYn7l/XEGN8Xu2vWFt9nVzrCn39vKyTEFf/ExEyoksJjjSZV/0/35XPlMbpnr6VGhZIUg5yJrL8tGfes/FA== + dependencies: + icss-utils "^5.1.0" + postcss "^8.4.33" + postcss-modules-extract-imports "^3.1.0" + postcss-modules-local-by-default "^4.0.5" + postcss-modules-scope "^3.2.0" + postcss-modules-values "^4.0.0" + postcss-value-parser "^4.2.0" + semver "^7.5.4" + +css-select@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/css-select/-/css-select-5.1.0.tgz#b8ebd6554c3637ccc76688804ad3f6a6fdaea8a6" + integrity sha512-nwoRF1rvRRnnCqqY7updORDsuqKzqYJ28+oSMaJMMgOauh3fvwHqMS7EZpIPqK8GL+g9mKxF1vP/ZjSeNjEVHg== + dependencies: + boolbase "^1.0.0" + css-what "^6.1.0" + domhandler "^5.0.2" + domutils "^3.0.1" + nth-check "^2.0.1" + +css-what@^6.1.0: + version "6.1.0" + resolved "https://registry.yarnpkg.com/css-what/-/css-what-6.1.0.tgz#fb5effcf76f1ddea2c81bdfaa4de44e79bac70f4" + integrity sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw== + +cssesc@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/cssesc/-/cssesc-3.0.0.tgz#37741919903b868565e1c09ea747445cd18983ee" + integrity sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg== + +debug@2.6.9: + version "2.6.9" + resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" + integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== + dependencies: + ms "2.0.0" + +debug@4, debug@^4.1.0, debug@^4.1.1, debug@^4.3.1, debug@^4.3.2, debug@^4.3.4: version "4.3.7" resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.7.tgz#87945b4151a011d76d95a198d7111c865c360a52" integrity sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ== dependencies: ms "^2.1.3" +deepmerge@^4.2.2: + version "4.3.1" + resolved "https://registry.yarnpkg.com/deepmerge/-/deepmerge-4.3.1.tgz#44b5f2147cd3b00d4b56137685966f26fd25dd4a" + integrity sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A== + +default-browser-id@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/default-browser-id/-/default-browser-id-5.0.0.tgz#a1d98bf960c15082d8a3fa69e83150ccccc3af26" + integrity sha512-A6p/pu/6fyBcA1TRz/GqWYPViplrftcW2gZC9q79ngNCKAeR/X3gcEdXQHl4KNXV+3wgIJ1CPkJQ3IHM6lcsyA== + +default-browser@^5.2.1: + version "5.2.1" + resolved "https://registry.yarnpkg.com/default-browser/-/default-browser-5.2.1.tgz#7b7ba61204ff3e425b556869ae6d3e9d9f1712cf" + integrity sha512-WY/3TUME0x3KPYdRRxEJJvXRHV4PyPoUsxtZa78lwItwRQRHhd2U9xOscaT/YTf8uCXIAjeJOFBVEh/7FtD8Xg== + dependencies: + bundle-name "^4.1.0" + default-browser-id "^5.0.0" + +default-gateway@^6.0.3: + version "6.0.3" + resolved "https://registry.yarnpkg.com/default-gateway/-/default-gateway-6.0.3.tgz#819494c888053bdb743edbf343d6cdf7f2943a71" + integrity sha512-fwSOJsbbNzZ/CUFpqFBqYfYNLj1NbMPm8MMCIzHjC83iSJRBEGmDUxU+WP661BaBQImeC2yHwXtz+P/O9o+XEg== + dependencies: + execa "^5.0.0" + +defaults@^1.0.3: + version "1.0.4" + resolved "https://registry.yarnpkg.com/defaults/-/defaults-1.0.4.tgz#b0b02062c1e2aa62ff5d9528f0f98baa90978d7a" + integrity sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A== + dependencies: + clone "^1.0.2" + +define-data-property@^1.1.4: + version "1.1.4" + resolved "https://registry.yarnpkg.com/define-data-property/-/define-data-property-1.1.4.tgz#894dc141bb7d3060ae4366f6a0107e68fbe48c5e" + integrity sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A== + dependencies: + es-define-property "^1.0.0" + es-errors "^1.3.0" + gopd "^1.0.1" + +define-lazy-prop@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/define-lazy-prop/-/define-lazy-prop-3.0.0.tgz#dbb19adfb746d7fc6d734a06b72f4a00d021255f" + integrity sha512-N+MeXYoqr3pOgn8xfyRPREN7gHakLYjhsHhWGT3fWAiL4IkAt0iDw14QiiEm2bE30c5XX5q0FtAA3CK5f9/BUg== + +depd@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/depd/-/depd-2.0.0.tgz#b696163cc757560d09cf22cc8fad1571b79e76df" + integrity sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw== + +depd@~1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/depd/-/depd-1.1.2.tgz#9bcd52e14c097763e749b274c4346ed2e560b5a9" + integrity sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ== + +dependency-graph@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/dependency-graph/-/dependency-graph-1.0.0.tgz#bb5e85aec1310bc13b22dbd76e3196c4ee4c10d2" + integrity sha512-cW3gggJ28HZ/LExwxP2B++aiKxhJXMSIt9K48FOXQkm+vuG5gyatXnLsONRJdzO/7VfjDIiaOOa/bs4l464Lwg== + +destroy@1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.2.0.tgz#4803735509ad8be552934c67df614f94e66fa015" + integrity sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg== + +detect-libc@^2.0.1: + version "2.0.3" + resolved "https://registry.yarnpkg.com/detect-libc/-/detect-libc-2.0.3.tgz#f0cd503b40f9939b894697d19ad50895e30cf700" + integrity sha512-bwy0MGW55bG41VqxxypOsdSdGqLwXPI/focwgTYCFMbdUiBAxLg9CFzG08sz2aqzknwiX7Hkl0bQENjg8iLByw== + +detect-node@^2.0.4: + version "2.1.0" + resolved "https://registry.yarnpkg.com/detect-node/-/detect-node-2.1.0.tgz#c9c70775a49c3d03bc2c06d9a73be550f978f8b1" + integrity sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g== + dir-glob@^3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/dir-glob/-/dir-glob-3.0.1.tgz#56dbf73d992a4a93ba1584f4534063fd2e41717f" @@ -418,11 +3207,96 @@ dir-glob@^3.0.1: dependencies: path-type "^4.0.0" +dns-packet@^5.2.2: + version "5.6.1" + resolved "https://registry.yarnpkg.com/dns-packet/-/dns-packet-5.6.1.tgz#ae888ad425a9d1478a0674256ab866de1012cf2f" + integrity sha512-l4gcSouhcgIKRvyy99RNVOgxXiicE+2jZoNmaNmZ6JXiGajBOJAesk1OBlJuM5k2c+eudGdLxDqXuPCKIj6kpw== + dependencies: + "@leichtgewicht/ip-codec" "^2.0.1" + +dom-serializer@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/dom-serializer/-/dom-serializer-2.0.0.tgz#e41b802e1eedf9f6cae183ce5e622d789d7d8e53" + integrity sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg== + dependencies: + domelementtype "^2.3.0" + domhandler "^5.0.2" + entities "^4.2.0" + +domelementtype@^2.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-2.3.0.tgz#5c45e8e869952626331d7aab326d01daf65d589d" + integrity sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw== + +domhandler@^5.0.2, domhandler@^5.0.3: + version "5.0.3" + resolved "https://registry.yarnpkg.com/domhandler/-/domhandler-5.0.3.tgz#cc385f7f751f1d1fc650c21374804254538c7d31" + integrity sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w== + dependencies: + domelementtype "^2.3.0" + +domutils@^3.0.1: + version "3.1.0" + resolved "https://registry.yarnpkg.com/domutils/-/domutils-3.1.0.tgz#c47f551278d3dc4b0b1ab8cbb42d751a6f0d824e" + integrity sha512-H78uMmQtI2AhgDJjWeQmHwJJ2bLPD3GMmO7Zja/ZZh84wkm+4ut+IUnUdRa8uCGX88DiVx1j6FRe1XfxEgjEZA== + dependencies: + dom-serializer "^2.0.0" + domelementtype "^2.3.0" + domhandler "^5.0.3" + +eastasianwidth@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/eastasianwidth/-/eastasianwidth-0.2.0.tgz#696ce2ec0aa0e6ea93a397ffcf24aa7840c827cb" + integrity sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA== + +ee-first@1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" + integrity sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow== + +electron-to-chromium@^1.5.28: + version "1.5.29" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.5.29.tgz#aa592a3caa95d07cc26a66563accf99fa573a1ee" + integrity sha512-PF8n2AlIhCKXQ+gTpiJi0VhcHDb69kYX4MtCiivctc2QD3XuNZ/XIOlbGzt7WAjjEev0TtaH6Cu3arZExm5DOw== + +emoji-regex@^10.3.0: + version "10.4.0" + resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-10.4.0.tgz#03553afea80b3975749cfcb36f776ca268e413d4" + integrity sha512-EC+0oUMY1Rqm4O6LLrgjtYDvcVYTy7chDnM4Q7030tP4Kwj3u/pR6gP9ygnp2CJMK5Gq+9Q2oqmrFJAz01DXjw== + emoji-regex@^8.0.0: version "8.0.0" resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37" integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== +emoji-regex@^9.2.2: + version "9.2.2" + resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-9.2.2.tgz#840c8803b0d8047f4ff0cf963176b32d4ef3ed72" + integrity sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg== + +emojis-list@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/emojis-list/-/emojis-list-3.0.0.tgz#5570662046ad29e2e916e71aae260abdff4f6a78" + integrity sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q== + +encodeurl@~1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.2.tgz#ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59" + integrity sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w== + +encodeurl@~2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-2.0.0.tgz#7b8ea898077d7e409d3ac45474ea38eaf0857a58" + integrity sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg== + +enhanced-resolve@^5.17.1: + version "5.17.1" + resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-5.17.1.tgz#67bfbbcc2f81d511be77d686a90267ef7f898a15" + integrity sha512-LMHl3dXhTcfv8gM4kEzIUeTQ+7fpdA0l2tUf34BddXPkz2A5xJ5L/Pchd5BL6rdccM9QGvu0sWZzK1Z1t4wwyg== + dependencies: + graceful-fs "^4.2.4" + tapable "^2.2.0" + enquirer@^2.3.6: version "2.4.1" resolved "https://registry.yarnpkg.com/enquirer/-/enquirer-2.4.1.tgz#93334b3fbd74fc7097b224ab4a8fb7e40bf4ae56" @@ -431,6 +3305,28 @@ enquirer@^2.3.6: ansi-colors "^4.1.1" strip-ansi "^6.0.1" +entities@^4.2.0, entities@^4.3.0, entities@^4.4.0: + version "4.5.0" + resolved "https://registry.yarnpkg.com/entities/-/entities-4.5.0.tgz#5d268ea5e7113ec74c4d033b79ea5a35a488fb48" + integrity sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw== + +env-paths@^2.2.1: + version "2.2.1" + resolved "https://registry.yarnpkg.com/env-paths/-/env-paths-2.2.1.tgz#420399d416ce1fbe9bc0a07c62fa68d67fd0f8f2" + integrity sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A== + +environment@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/environment/-/environment-1.1.0.tgz#8e86c66b180f363c7ab311787e0259665f45a9f1" + integrity sha512-xUtoPkMggbz0MPyPiIWr1Kp4aeWJjDZ6SMvURhimjdZgsRuDplF5/s9hcgGhyXMhs+6vpnuoiZ2kFiu3FMnS8Q== + +errno@^0.1.1: + version "0.1.8" + resolved "https://registry.yarnpkg.com/errno/-/errno-0.1.8.tgz#8bb3e9c7d463be4976ff888f76b4809ebc2e811f" + integrity sha512-dJ6oBr5SQ1VSd9qkk7ByRgb/1SH4JZjCHSW/mr63/QcXO9zLVxvJ6Oy13nio03rxpSnVDDjFor75SjVeZWPW/A== + dependencies: + prr "~1.0.1" + error-ex@^1.3.1: version "1.3.2" resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.2.tgz#b4ac40648107fdcdcfae242f428bea8a14d4f1bf" @@ -438,7 +3334,88 @@ error-ex@^1.3.1: dependencies: is-arrayish "^0.2.1" -esbuild@~0.23.0: +es-define-property@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/es-define-property/-/es-define-property-1.0.0.tgz#c7faefbdff8b2696cf5f46921edfb77cc4ba3845" + integrity sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ== + dependencies: + get-intrinsic "^1.2.4" + +es-errors@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/es-errors/-/es-errors-1.3.0.tgz#05f75a25dab98e4fb1dcd5e1472c0546d5057c8f" + integrity sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw== + +es-module-lexer@^1.2.1: + version "1.5.4" + resolved "https://registry.yarnpkg.com/es-module-lexer/-/es-module-lexer-1.5.4.tgz#a8efec3a3da991e60efa6b633a7cad6ab8d26b78" + integrity sha512-MVNK56NiMrOwitFB7cqDwq0CQutbw+0BvLshJSse0MUNU+y1FC3bUS/AQg7oUng+/wKrrki7JfmwtVHkVfPLlw== + +esbuild-wasm@0.23.0: + version "0.23.0" + resolved "https://registry.yarnpkg.com/esbuild-wasm/-/esbuild-wasm-0.23.0.tgz#7b09c7bc669b702b440aeb3d5c9210f96766e1b2" + integrity sha512-6jP8UmWy6R6TUUV8bMuC3ZyZ6lZKI56x0tkxyCIqWwRRJ/DgeQKneh/Oid5EoGoPFLrGNkz47ZEtWAYuiY/u9g== + +esbuild@0.23.0: + version "0.23.0" + resolved "https://registry.yarnpkg.com/esbuild/-/esbuild-0.23.0.tgz#de06002d48424d9fdb7eb52dbe8e95927f852599" + integrity sha512-1lvV17H2bMYda/WaFb2jLPeHU3zml2k4/yagNMG8Q/YtfMjCwEUZa2eXXMgZTVSL5q1n4H7sQ0X6CdJDqqeCFA== + optionalDependencies: + "@esbuild/aix-ppc64" "0.23.0" + "@esbuild/android-arm" "0.23.0" + "@esbuild/android-arm64" "0.23.0" + "@esbuild/android-x64" "0.23.0" + "@esbuild/darwin-arm64" "0.23.0" + "@esbuild/darwin-x64" "0.23.0" + "@esbuild/freebsd-arm64" "0.23.0" + "@esbuild/freebsd-x64" "0.23.0" + "@esbuild/linux-arm" "0.23.0" + "@esbuild/linux-arm64" "0.23.0" + "@esbuild/linux-ia32" "0.23.0" + "@esbuild/linux-loong64" "0.23.0" + "@esbuild/linux-mips64el" "0.23.0" + "@esbuild/linux-ppc64" "0.23.0" + "@esbuild/linux-riscv64" "0.23.0" + "@esbuild/linux-s390x" "0.23.0" + "@esbuild/linux-x64" "0.23.0" + "@esbuild/netbsd-x64" "0.23.0" + "@esbuild/openbsd-arm64" "0.23.0" + "@esbuild/openbsd-x64" "0.23.0" + "@esbuild/sunos-x64" "0.23.0" + "@esbuild/win32-arm64" "0.23.0" + "@esbuild/win32-ia32" "0.23.0" + "@esbuild/win32-x64" "0.23.0" + +esbuild@^0.21.3: + version "0.21.5" + resolved "https://registry.yarnpkg.com/esbuild/-/esbuild-0.21.5.tgz#9ca301b120922959b766360d8ac830da0d02997d" + integrity sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw== + optionalDependencies: + "@esbuild/aix-ppc64" "0.21.5" + "@esbuild/android-arm" "0.21.5" + "@esbuild/android-arm64" "0.21.5" + "@esbuild/android-x64" "0.21.5" + "@esbuild/darwin-arm64" "0.21.5" + "@esbuild/darwin-x64" "0.21.5" + "@esbuild/freebsd-arm64" "0.21.5" + "@esbuild/freebsd-x64" "0.21.5" + "@esbuild/linux-arm" "0.21.5" + "@esbuild/linux-arm64" "0.21.5" + "@esbuild/linux-ia32" "0.21.5" + "@esbuild/linux-loong64" "0.21.5" + "@esbuild/linux-mips64el" "0.21.5" + "@esbuild/linux-ppc64" "0.21.5" + "@esbuild/linux-riscv64" "0.21.5" + "@esbuild/linux-s390x" "0.21.5" + "@esbuild/linux-x64" "0.21.5" + "@esbuild/netbsd-x64" "0.21.5" + "@esbuild/openbsd-x64" "0.21.5" + "@esbuild/sunos-x64" "0.21.5" + "@esbuild/win32-arm64" "0.21.5" + "@esbuild/win32-ia32" "0.21.5" + "@esbuild/win32-x64" "0.21.5" + +esbuild@^0.23.0, esbuild@~0.23.0: version "0.23.1" resolved "https://registry.yarnpkg.com/esbuild/-/esbuild-0.23.1.tgz#40fdc3f9265ec0beae6f59824ade1bd3d3d2dab8" integrity sha512-VVNz/9Sa0bs5SELtn3f7qhJCDPCF5oMEl5cO9/SSinpE9hbPVvxbd572HH5AKiP7WD8INO53GgfDDhRjkylHEg== @@ -468,12 +3445,77 @@ esbuild@~0.23.0: "@esbuild/win32-ia32" "0.23.1" "@esbuild/win32-x64" "0.23.1" +escalade@^3.1.1, escalade@^3.2.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.2.0.tgz#011a3f69856ba189dffa7dc8fcce99d2a87903e5" + integrity sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA== + +escape-html@~1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988" + integrity sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow== + escape-string-regexp@^1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" integrity sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg== -execa@^5.1.1: +eslint-scope@5.1.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-5.1.1.tgz#e786e59a66cb92b3f6c1fb0d508aab174848f48c" + integrity sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw== + dependencies: + esrecurse "^4.3.0" + estraverse "^4.1.1" + +esrecurse@^4.3.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.3.0.tgz#7ad7964d679abb28bee72cec63758b1c5d2c9921" + integrity sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag== + dependencies: + estraverse "^5.2.0" + +estraverse@^4.1.1: + version "4.3.0" + resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.3.0.tgz#398ad3f3c5a24948be7725e83d11a7de28cdbd1d" + integrity sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw== + +estraverse@^5.2.0: + version "5.3.0" + resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-5.3.0.tgz#2eea5290702f26ab8fe5370370ff86c965d21123" + integrity sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA== + +estree-walker@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/estree-walker/-/estree-walker-2.0.2.tgz#52f010178c2a4c117a7757cfe942adb7d2da4cac" + integrity sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w== + +esutils@^2.0.2: + version "2.0.3" + resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64" + integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g== + +etag@~1.8.1: + version "1.8.1" + resolved "https://registry.yarnpkg.com/etag/-/etag-1.8.1.tgz#41ae2eeb65efa62268aebfea83ac7d79299b0887" + integrity sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg== + +eventemitter3@^4.0.0: + version "4.0.7" + resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-4.0.7.tgz#2de9b68f6528d5644ef5c59526a1b4a07306169f" + integrity sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw== + +eventemitter3@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-5.0.1.tgz#53f5ffd0a492ac800721bb42c66b841de96423c4" + integrity sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA== + +events@^3.2.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/events/-/events-3.3.0.tgz#31a95ad0a924e2d2c419a813aeb2c4e878ea7400" + integrity sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q== + +execa@^5.0.0, execa@^5.1.1: version "5.1.1" resolved "https://registry.yarnpkg.com/execa/-/execa-5.1.1.tgz#f80ad9cbf4298f7bd1d4c9555c21e93741c411dd" integrity sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg== @@ -488,7 +3530,49 @@ execa@^5.1.1: signal-exit "^3.0.3" strip-final-newline "^2.0.0" -fast-glob@^3.2.9: +express@^4.17.3: + version "4.21.0" + resolved "https://registry.yarnpkg.com/express/-/express-4.21.0.tgz#d57cb706d49623d4ac27833f1cbc466b668eb915" + integrity sha512-VqcNGcj/Id5ZT1LZ/cfihi3ttTn+NJmkli2eZADigjq29qTlWi/hAQ43t/VLPq8+UX06FCEx3ByOYet6ZFblng== + dependencies: + accepts "~1.3.8" + array-flatten "1.1.1" + body-parser "1.20.3" + content-disposition "0.5.4" + content-type "~1.0.4" + cookie "0.6.0" + cookie-signature "1.0.6" + debug "2.6.9" + depd "2.0.0" + encodeurl "~2.0.0" + escape-html "~1.0.3" + etag "~1.8.1" + finalhandler "1.3.1" + fresh "0.5.2" + http-errors "2.0.0" + merge-descriptors "1.0.3" + methods "~1.1.2" + on-finished "2.4.1" + parseurl "~1.3.3" + path-to-regexp "0.1.10" + proxy-addr "~2.0.7" + qs "6.13.0" + range-parser "~1.2.1" + safe-buffer "5.2.1" + send "0.19.0" + serve-static "1.16.2" + setprototypeof "1.2.0" + statuses "2.0.1" + type-is "~1.6.18" + utils-merge "1.0.1" + vary "~1.1.2" + +fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3: + version "3.1.3" + resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525" + integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== + +fast-glob@3.3.2, fast-glob@^3.2.9, fast-glob@^3.3.1, fast-glob@^3.3.2: version "3.3.2" resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.3.2.tgz#a904501e57cfdd2ffcded45e99a54fef55e46129" integrity sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow== @@ -499,6 +3583,16 @@ fast-glob@^3.2.9: merge2 "^1.3.0" micromatch "^4.0.4" +fast-json-stable-stringify@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633" + integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw== + +fast-uri@^3.0.1: + version "3.0.2" + resolved "https://registry.yarnpkg.com/fast-uri/-/fast-uri-3.0.2.tgz#d78b298cf70fd3b752fd951175a3da6a7b48f024" + integrity sha512-GR6f0hD7XXyNJa25Tb9BuIdN0tdr+0BMi6/CJPH3wJO1JjNG3n/VsSw38AwRdKZABm8lGbPfakLRkYzx2V9row== + fastq@^1.6.0: version "1.17.1" resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.17.1.tgz#2a523f07a4e7b1e81a42b91b8bf2254107753b47" @@ -506,6 +3600,13 @@ fastq@^1.6.0: dependencies: reusify "^1.0.4" +faye-websocket@^0.11.3: + version "0.11.4" + resolved "https://registry.yarnpkg.com/faye-websocket/-/faye-websocket-0.11.4.tgz#7f0d9275cfdd86a1c963dc8b65fcc451edcbb1da" + integrity sha512-CzbClwlXAuiRQAlUyfqPgvPoNKTckTPGfwZV4ZdAhVcP2lh9KUxJg2b5GkE7XbjKQ3YJnQ9z6D9ntLAlB+tP8g== + dependencies: + websocket-driver ">=0.5.1" + fill-range@^7.1.1: version "7.1.1" resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.1.1.tgz#44265d3cac07e3ea7dc247516380643754a05292" @@ -513,6 +3614,44 @@ fill-range@^7.1.1: dependencies: to-regex-range "^5.0.1" +finalhandler@1.3.1: + version "1.3.1" + resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-1.3.1.tgz#0c575f1d1d324ddd1da35ad7ece3df7d19088019" + integrity sha512-6BN9trH7bp3qvnrRyzsBz+g3lZxTNZTbVO2EV1CS0WIcDbawYVdYvGflME/9QP0h0pYlCDBCTjYa9nZzMDpyxQ== + dependencies: + debug "2.6.9" + encodeurl "~2.0.0" + escape-html "~1.0.3" + on-finished "2.4.1" + parseurl "~1.3.3" + statuses "2.0.1" + unpipe "~1.0.0" + +find-cache-dir@^3.3.2: + version "3.3.2" + resolved "https://registry.yarnpkg.com/find-cache-dir/-/find-cache-dir-3.3.2.tgz#b30c5b6eff0730731aea9bbd9dbecbd80256d64b" + integrity sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig== + dependencies: + commondir "^1.0.1" + make-dir "^3.0.2" + pkg-dir "^4.1.0" + +find-cache-dir@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/find-cache-dir/-/find-cache-dir-4.0.0.tgz#a30ee0448f81a3990708f6453633c733e2f6eec2" + integrity sha512-9ZonPT4ZAK4a+1pUPVPZJapbi7O5qbbJPdYw/NOQWZZbVLdDTYM3A4R9z/DpAM08IDaFGsvPgiGZ82WEwUDWjg== + dependencies: + common-path-prefix "^3.0.0" + pkg-dir "^7.0.0" + +find-up@^4.0.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/find-up/-/find-up-4.1.0.tgz#97afe7d6cdc0bc5928584b7c8d7b16e8a9aa5d19" + integrity sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw== + dependencies: + locate-path "^5.0.0" + path-exists "^4.0.0" + find-up@^5.0.0: version "5.0.0" resolved "https://registry.yarnpkg.com/find-up/-/find-up-5.0.0.tgz#4c92819ecb7083561e4f4a240a86be5198f536fc" @@ -521,6 +3660,14 @@ find-up@^5.0.0: locate-path "^6.0.0" path-exists "^4.0.0" +find-up@^6.3.0: + version "6.3.0" + resolved "https://registry.yarnpkg.com/find-up/-/find-up-6.3.0.tgz#2abab3d3280b2dc7ac10199ef324c4e002c8c790" + integrity sha512-v2ZsoEuVHYy8ZIlYqwPe/39Cy+cFDzp4dXPaxNvkEuouymu+2Jbz0PxpKarJHYJTmv2HWT3O382qY8l4jMWthw== + dependencies: + locate-path "^7.1.0" + path-exists "^5.0.0" + find-versions@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/find-versions/-/find-versions-4.0.0.tgz#3c57e573bf97769b8cb8df16934b627915da4965" @@ -528,11 +3675,89 @@ find-versions@^4.0.0: dependencies: semver-regex "^3.1.2" +flat@^5.0.2: + version "5.0.2" + resolved "https://registry.yarnpkg.com/flat/-/flat-5.0.2.tgz#8ca6fe332069ffa9d324c327198c598259ceb241" + integrity sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ== + +follow-redirects@^1.0.0: + version "1.15.9" + resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.15.9.tgz#a604fa10e443bf98ca94228d9eebcc2e8a2c8ee1" + integrity sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ== + +foreground-child@^3.1.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/foreground-child/-/foreground-child-3.3.0.tgz#0ac8644c06e431439f8561db8ecf29a7b5519c77" + integrity sha512-Ld2g8rrAyMYFXBhEqMz8ZAHBi4J4uS1i/CxGMDnjyFWddMXLVcDp051DZfu+t7+ab7Wv6SMqpWmyFIj5UbfFvg== + dependencies: + cross-spawn "^7.0.0" + signal-exit "^4.0.1" + +forwarded@0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/forwarded/-/forwarded-0.2.0.tgz#2269936428aad4c15c7ebe9779a84bf0b2a81811" + integrity sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow== + +fraction.js@^4.3.7: + version "4.3.7" + resolved "https://registry.yarnpkg.com/fraction.js/-/fraction.js-4.3.7.tgz#06ca0085157e42fda7f9e726e79fefc4068840f7" + integrity sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew== + +fresh@0.5.2: + version "0.5.2" + resolved "https://registry.yarnpkg.com/fresh/-/fresh-0.5.2.tgz#3d8cadd90d976569fa835ab1f8e4b23a105605a7" + integrity sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q== + +fs-minipass@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/fs-minipass/-/fs-minipass-2.1.0.tgz#7f5036fdbf12c63c169190cbe4199c852271f9fb" + integrity sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg== + dependencies: + minipass "^3.0.0" + +fs-minipass@^3.0.0: + version "3.0.3" + resolved "https://registry.yarnpkg.com/fs-minipass/-/fs-minipass-3.0.3.tgz#79a85981c4dc120065e96f62086bf6f9dc26cc54" + integrity sha512-XUBA9XClHbnJWSfBzjkm6RvPsyg3sryZt06BEQoXcF7EK/xpGaQYJgQKDJSUH5SGZ76Y7pFx1QBnXz09rU5Fbw== + dependencies: + minipass "^7.0.3" + fsevents@~2.3.2, fsevents@~2.3.3: version "2.3.3" resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.3.tgz#cac6407785d03675a2a5e1a5305c697b347d90d6" integrity sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw== +function-bind@^1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.2.tgz#2c02d864d97f3ea6c8830c464cbd11ab6eab7a1c" + integrity sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA== + +gensync@^1.0.0-beta.2: + version "1.0.0-beta.2" + resolved "https://registry.yarnpkg.com/gensync/-/gensync-1.0.0-beta.2.tgz#32a6ee76c3d7f52d46b2b1ae5d93fea8580a25e0" + integrity sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg== + +get-caller-file@^2.0.5: + version "2.0.5" + resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e" + integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== + +get-east-asian-width@^1.0.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/get-east-asian-width/-/get-east-asian-width-1.2.0.tgz#5e6ebd9baee6fb8b7b6bd505221065f0cd91f64e" + integrity sha512-2nk+7SIVb14QrgXFHcm84tD4bKQz0RxPuMT8Ag5KPOq7J5fEmAg0UbXdTOSHqNuHSU28k55qnceesxXRZGzKWA== + +get-intrinsic@^1.1.3, get-intrinsic@^1.2.4: + version "1.2.4" + resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.2.4.tgz#e385f5a4b5227d449c3eabbad05494ef0abbeadd" + integrity sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ== + dependencies: + es-errors "^1.3.0" + function-bind "^1.1.2" + has-proto "^1.0.1" + has-symbols "^1.0.3" + hasown "^2.0.0" + get-own-enumerable-property-symbols@^3.0.0: version "3.0.2" resolved "https://registry.yarnpkg.com/get-own-enumerable-property-symbols/-/get-own-enumerable-property-symbols-3.0.2.tgz#b5fde77f22cbe35f390b4e089922c50bce6ef664" @@ -557,6 +3782,35 @@ glob-parent@^5.1.2, glob-parent@~5.1.2: dependencies: is-glob "^4.0.1" +glob-parent@^6.0.1: + version "6.0.2" + resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-6.0.2.tgz#6d237d99083950c79290f24c7642a3de9a28f9e3" + integrity sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A== + dependencies: + is-glob "^4.0.3" + +glob-to-regexp@^0.4.1: + version "0.4.1" + resolved "https://registry.yarnpkg.com/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz#c75297087c851b9a578bd217dd59a92f59fe546e" + integrity sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw== + +glob@^10.2.2, glob@^10.3.7: + version "10.4.5" + resolved "https://registry.yarnpkg.com/glob/-/glob-10.4.5.tgz#f4d9f0b90ffdbab09c9d77f5f29b4262517b0956" + integrity sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg== + dependencies: + foreground-child "^3.1.0" + jackspeak "^3.1.2" + minimatch "^9.0.4" + minipass "^7.1.2" + package-json-from-dist "^1.0.0" + path-scurry "^1.11.1" + +globals@^11.1.0: + version "11.12.0" + resolved "https://registry.yarnpkg.com/globals/-/globals-11.12.0.tgz#ab8795338868a0babd8525758018c2a7eb95c42e" + integrity sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA== + globby@^11.0.4: version "11.1.0" resolved "https://registry.yarnpkg.com/globby/-/globby-11.1.0.tgz#bd4be98bb042f83d796f7e3811991fbe82a0d34b" @@ -569,15 +3823,164 @@ globby@^11.0.4: merge2 "^1.4.1" slash "^3.0.0" -has-flag@^3.0.0: +globby@^14.0.0: + version "14.0.2" + resolved "https://registry.yarnpkg.com/globby/-/globby-14.0.2.tgz#06554a54ccfe9264e5a9ff8eded46aa1e306482f" + integrity sha512-s3Fq41ZVh7vbbe2PN3nrW7yC7U7MFVc5c98/iTl9c2GawNMKx/J648KQRW6WKkuU8GIbbh2IXfIRQjOZnXcTnw== + dependencies: + "@sindresorhus/merge-streams" "^2.1.0" + fast-glob "^3.3.2" + ignore "^5.2.4" + path-type "^5.0.0" + slash "^5.1.0" + unicorn-magic "^0.1.0" + +gopd@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/gopd/-/gopd-1.0.1.tgz#29ff76de69dac7489b7c0918a5788e56477c332c" + integrity sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA== + dependencies: + get-intrinsic "^1.1.3" + +graceful-fs@^4.1.2, graceful-fs@^4.2.11, graceful-fs@^4.2.4, graceful-fs@^4.2.6: + version "4.2.11" + resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.11.tgz#4183e4e8bf08bb6e05bbb2f7d2e0c8f712ca40e3" + integrity sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ== + +handle-thing@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/handle-thing/-/handle-thing-2.0.1.tgz#857f79ce359580c340d43081cc648970d0bb234e" + integrity sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg== + +has-flag@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" + integrity sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw== + +has-flag@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" + integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== + +has-property-descriptors@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz#963ed7d071dc7bf5f084c5bfbe0d1b6222586854" + integrity sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg== + dependencies: + es-define-property "^1.0.0" + +has-proto@^1.0.1: + version "1.0.3" + resolved "https://registry.yarnpkg.com/has-proto/-/has-proto-1.0.3.tgz#b31ddfe9b0e6e9914536a6ab286426d0214f77fd" + integrity sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q== + +has-symbols@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.3.tgz#bb7b2c4349251dce87b125f7bdf874aa7c8b39f8" + integrity sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A== + +hasown@^2.0.0, hasown@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/hasown/-/hasown-2.0.2.tgz#003eaf91be7adc372e84ec59dc37252cedb80003" + integrity sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ== + dependencies: + function-bind "^1.1.2" + +hpack.js@^2.1.6: + version "2.1.6" + resolved "https://registry.yarnpkg.com/hpack.js/-/hpack.js-2.1.6.tgz#87774c0949e513f42e84575b3c45681fade2a0b2" + integrity sha512-zJxVehUdMGIKsRaNt7apO2Gqp0BdqW5yaiGHXXmbpvxgBYVZnAql+BJb4RO5ad2MgpbZKn5G6nMnegrH1FcNYQ== + dependencies: + inherits "^2.0.1" + obuf "^1.0.0" + readable-stream "^2.0.1" + wbuf "^1.1.0" + +html-entities@^2.4.0: + version "2.5.2" + resolved "https://registry.yarnpkg.com/html-entities/-/html-entities-2.5.2.tgz#201a3cf95d3a15be7099521620d19dfb4f65359f" + integrity sha512-K//PSRMQk4FZ78Kyau+mZurHn3FH0Vwr+H36eE0rPbeYkRRi9YxceYPhuN60UwWorxyKHhqoAJl2OFKa4BVtaA== + +htmlparser2@^8.0.2: + version "8.0.2" + resolved "https://registry.yarnpkg.com/htmlparser2/-/htmlparser2-8.0.2.tgz#f002151705b383e62433b5cf466f5b716edaec21" + integrity sha512-GYdjWKDkbRLkZ5geuHs5NY1puJ+PXwP7+fHPRz06Eirsb9ugf6d8kkXav6ADhcODhFFPMIXyxkxSuMf3D6NCFA== + dependencies: + domelementtype "^2.3.0" + domhandler "^5.0.3" + domutils "^3.0.1" + entities "^4.4.0" + +http-deceiver@^1.2.7: + version "1.2.7" + resolved "https://registry.yarnpkg.com/http-deceiver/-/http-deceiver-1.2.7.tgz#fa7168944ab9a519d337cb0bec7284dc3e723d87" + integrity sha512-LmpOGxTfbpgtGVxJrj5k7asXHCgNZp5nLfp+hWc8QQRqtb7fUy6kRY3BO1h9ddF6yIPYUARgxGOwB42DnxIaNw== + +http-errors@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-2.0.0.tgz#b7774a1486ef73cf7667ac9ae0858c012c57b9d3" + integrity sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ== + dependencies: + depd "2.0.0" + inherits "2.0.4" + setprototypeof "1.2.0" + statuses "2.0.1" + toidentifier "1.0.1" + +http-errors@~1.6.2: + version "1.6.3" + resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.6.3.tgz#8b55680bb4be283a0b5bf4ea2e38580be1d9320d" + integrity sha512-lks+lVC8dgGyh97jxvxeYTWQFvh4uw4yC12gVl63Cg30sjPX4wuGcdkICVXDAESr6OJGjqGA8Iz5mkeN6zlD7A== + dependencies: + depd "~1.1.2" + inherits "2.0.3" + setprototypeof "1.1.0" + statuses ">= 1.4.0 < 2" + +http-parser-js@>=0.5.1: + version "0.5.8" + resolved "https://registry.yarnpkg.com/http-parser-js/-/http-parser-js-0.5.8.tgz#af23090d9ac4e24573de6f6aecc9d84a48bf20e3" + integrity sha512-SGeBX54F94Wgu5RH3X5jsDtf4eHyRogWX1XGT3b4HuW3tQPM4AaBzoUji/4AAJNXCEOWZ5O0DgZmJw1947gD5Q== + +http-proxy-middleware@3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" - integrity sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw== + resolved "https://registry.yarnpkg.com/http-proxy-middleware/-/http-proxy-middleware-3.0.0.tgz#550790357d6f92a9b82ab2d63e07343a791cf26b" + integrity sha512-36AV1fIaI2cWRzHo+rbcxhe3M3jUDCNzc4D5zRl57sEWRAxdXYtw7FSQKYY6PDKssiAKjLYypbssHk+xs/kMXw== + dependencies: + "@types/http-proxy" "^1.17.10" + debug "^4.3.4" + http-proxy "^1.18.1" + is-glob "^4.0.1" + is-plain-obj "^3.0.0" + micromatch "^4.0.5" -has-flag@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" - integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== +http-proxy-middleware@^2.0.3: + version "2.0.6" + resolved "https://registry.yarnpkg.com/http-proxy-middleware/-/http-proxy-middleware-2.0.6.tgz#e1a4dd6979572c7ab5a4e4b55095d1f32a74963f" + integrity sha512-ya/UeJ6HVBYxrgYotAZo1KvPWlgB48kUJLDePFeneHsVujFaW5WNj2NgWCAE//B1Dl02BIfYlpNgBy8Kf8Rjmw== + dependencies: + "@types/http-proxy" "^1.17.8" + http-proxy "^1.18.1" + is-glob "^4.0.1" + is-plain-obj "^3.0.0" + micromatch "^4.0.2" + +http-proxy@^1.18.1: + version "1.18.1" + resolved "https://registry.yarnpkg.com/http-proxy/-/http-proxy-1.18.1.tgz#401541f0534884bbf95260334e72f88ee3976549" + integrity sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ== + dependencies: + eventemitter3 "^4.0.0" + follow-redirects "^1.0.0" + requires-port "^1.0.0" + +https-proxy-agent@7.0.5: + version "7.0.5" + resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-7.0.5.tgz#9e8b5013873299e11fab6fd548405da2d6c602b2" + integrity sha512-1e4Wqeblerz+tMKPIq2EMGiiWW1dIjZOksyHWSUm1rmuvw/how9hBHZ38lAGj5ID4Ik6EdkOw7NmWPy6LAwalw== + dependencies: + agent-base "^7.0.2" + debug "4" human-signals@^2.1.0: version "2.1.0" @@ -600,12 +4003,51 @@ husky@^4.3.8: slash "^3.0.0" which-pm-runs "^1.0.0" -ignore@^5.2.0: +hyperdyperid@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/hyperdyperid/-/hyperdyperid-1.2.0.tgz#59668d323ada92228d2a869d3e474d5a33b69e6b" + integrity sha512-Y93lCzHYgGWdrJ66yIktxiaGULYc6oGiABxhcO5AufBeOyoIdZF7bIfLaOrbM0iGIOXQQgxxRrFEnb+Y6w1n4A== + +iconv-lite@0.4.24: + version "0.4.24" + resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" + integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA== + dependencies: + safer-buffer ">= 2.1.2 < 3" + +iconv-lite@^0.6.3: + version "0.6.3" + resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.6.3.tgz#a52f80bf38da1952eb5c681790719871a1a72501" + integrity sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw== + dependencies: + safer-buffer ">= 2.1.2 < 3.0.0" + +icss-utils@^5.0.0, icss-utils@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/icss-utils/-/icss-utils-5.1.0.tgz#c6be6858abd013d768e98366ae47e25d5887b1ae" + integrity sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA== + +ieee754@^1.1.13: + version "1.2.1" + resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.2.1.tgz#8eb7a10a63fff25d15a57b001586d177d1b0d352" + integrity sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA== + +ignore@^5.2.0, ignore@^5.2.4: version "5.3.2" resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.3.2.tgz#3cd40e729f3643fd87cb04e50bf0eb722bc596f5" integrity sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g== -import-fresh@^3.2.1: +image-size@~0.5.0: + version "0.5.5" + resolved "https://registry.yarnpkg.com/image-size/-/image-size-0.5.5.tgz#09dfd4ab9d20e29eb1c3e80b8990378df9e3cb9c" + integrity sha512-6TDAlDPZxUFCv+fuOkIoXT/V/f3Qbq8e37p+YOiYrUv3v9cc3/6x78VdfPgFVaB9dZYeLUfKgHRebpkm/oP2VQ== + +immutable@^4.0.0: + version "4.3.7" + resolved "https://registry.yarnpkg.com/immutable/-/immutable-4.3.7.tgz#c70145fc90d89fb02021e65c84eb0226e4e5a381" + integrity sha512-1hqclzwYwjRDFLjcFxOM5AYkkG0rpFPpr1RLPMEuGczoS7YA8gLhy8SWXYRAA/XwfEHpfo3cw5JGioS32fnMRw== + +import-fresh@^3.2.1, import-fresh@^3.3.0: version "3.3.0" resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.3.0.tgz#37162c25fcb9ebaa2e6e53d5b4d88ce17d9e0c2b" integrity sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw== @@ -613,11 +4055,43 @@ import-fresh@^3.2.1: parent-module "^1.0.0" resolve-from "^4.0.0" +imurmurhash@^0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" + integrity sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA== + indent-string@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-4.0.0.tgz#624f8f4497d619b2d9768531d58f4122854d7251" integrity sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg== +inherits@2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" + integrity sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw== + +inherits@2.0.4, inherits@^2.0.1, inherits@^2.0.3, inherits@^2.0.4, inherits@~2.0.3: + version "2.0.4" + resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" + integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== + +injection-js@^2.4.0: + version "2.4.0" + resolved "https://registry.yarnpkg.com/injection-js/-/injection-js-2.4.0.tgz#ebe8871b1a349f23294eaa751bbd8209a636e754" + integrity sha512-6jiJt0tCAo9zjHbcwLiPL+IuNe9SQ6a9g0PEzafThW3fOQi0mrmiJGBJvDD6tmhPh8cQHIQtCOrJuBfQME4kPA== + dependencies: + tslib "^2.0.0" + +ipaddr.js@1.9.1: + version "1.9.1" + resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.9.1.tgz#bff38543eeb8984825079ff3a2a8e6cbd46781b3" + integrity sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g== + +ipaddr.js@^2.1.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-2.2.0.tgz#d33fa7bac284f4de7af949638c9d68157c6b92e8" + integrity sha512-Ag3wB2o37wslZS19hZqorUnrnzSkpOVy+IiiDEiTqNubEYpYuHWIf6K4psgN2ZWKExS4xhVCrRVfb/wfW8fWJA== + is-arrayish@^0.2.1: version "0.2.1" resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" @@ -630,6 +4104,18 @@ is-binary-path@~2.1.0: dependencies: binary-extensions "^2.0.0" +is-core-module@^2.13.0: + version "2.15.1" + resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.15.1.tgz#a7363a25bee942fefab0de13bf6aa372c82dcc37" + integrity sha512-z0vtXSwucUJtANQWldhbtbt7BnL0vxiFjIdDLAatwhDYty2bad6s+rijD6Ri4YuYJubLzIJLUidCh09e1djEVQ== + dependencies: + hasown "^2.0.2" + +is-docker@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/is-docker/-/is-docker-3.0.0.tgz#90093aa3106277d8a77a5910dbae71747e15a200" + integrity sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ== + is-extglob@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" @@ -640,13 +4126,47 @@ is-fullwidth-code-point@^3.0.0: resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d" integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== -is-glob@^4.0.1, is-glob@~4.0.1: +is-fullwidth-code-point@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-4.0.0.tgz#fae3167c729e7463f8461ce512b080a49268aa88" + integrity sha512-O4L094N2/dZ7xqVdrXhh9r1KODPJpFms8B5sGdJLPy664AgvXsreZUyCQQNItZRDlYug4xStLjNp/sz3HvBowQ== + +is-fullwidth-code-point@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-5.0.0.tgz#9609efced7c2f97da7b60145ef481c787c7ba704" + integrity sha512-OVa3u9kkBbw7b8Xw5F9P+D/T9X+Z4+JruYVNapTjPYZYUznQ5YfWeFkOj606XYYW8yugTfC8Pj0hYqvi4ryAhA== + dependencies: + get-east-asian-width "^1.0.0" + +is-glob@^4.0.1, is-glob@^4.0.3, is-glob@~4.0.1: version "4.0.3" resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.3.tgz#64f61e42cbbb2eec2071a9dac0b28ba1e65d5084" integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg== dependencies: is-extglob "^2.1.1" +is-inside-container@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-inside-container/-/is-inside-container-1.0.0.tgz#e81fba699662eb31dbdaf26766a61d4814717ea4" + integrity sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA== + dependencies: + is-docker "^3.0.0" + +is-interactive@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-interactive/-/is-interactive-1.0.0.tgz#cea6e6ae5c870a7b0a0004070b7b587e0252912e" + integrity sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w== + +is-module@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-module/-/is-module-1.0.0.tgz#3258fb69f78c14d5b815d664336b4cffb6441591" + integrity sha512-51ypPSPCoTEIN9dy5Oy+h4pShgJmPCygKfyRCISBI+JoWT/2oJvK8QPxmwv7b/p239jXrm9M1mlQbyKJ5A152g== + +is-network-error@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/is-network-error/-/is-network-error-1.1.0.tgz#d26a760e3770226d11c169052f266a4803d9c997" + integrity sha512-tUdRRAnhT+OtCZR/LxZelH/C7QtjtFrTu5tXCA8pl55eTUElUHT+GPYV8MBMBvea/j+NxQqVt3LbWMRir7Gx9g== + is-number@^7.0.0: version "7.0.0" resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" @@ -657,6 +4177,18 @@ is-obj@^1.0.1: resolved "https://registry.yarnpkg.com/is-obj/-/is-obj-1.0.1.tgz#3e4729ac1f5fde025cd7d83a896dab9f4f67db0f" integrity sha512-l4RyHgRqGN4Y3+9JHVrNqO+tN0rV5My76uW5/nuO4K1b6vw5G8d/cmFjP9tRfEsdhZNt0IFdZuK/c2Vr4Nb+Qg== +is-plain-obj@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-3.0.0.tgz#af6f2ea14ac5a646183a5bbdb5baabbc156ad9d7" + integrity sha512-gwsOE28k+23GP1B6vFl1oVh/WOzmawBrKwo5Ev6wMKzPkaXaCDIQKzLnvsA42DRlbVTWorkgTKIviAKCWkfUwA== + +is-plain-object@^2.0.4: + version "2.0.4" + resolved "https://registry.yarnpkg.com/is-plain-object/-/is-plain-object-2.0.4.tgz#2c163b3fafb1b606d9d17928f05c2a1c38e07677" + integrity sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og== + dependencies: + isobject "^3.0.1" + is-regexp@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/is-regexp/-/is-regexp-1.0.0.tgz#fd2d883545c46bac5a633e7b9a09e87fa2cb5069" @@ -667,21 +4199,131 @@ is-stream@^2.0.0: resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-2.0.1.tgz#fac1e3d53b97ad5a9d0ae9cef2389f5810a5c077" integrity sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg== +is-unicode-supported@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz#3f26c76a809593b52bfa2ecb5710ed2779b522a7" + integrity sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw== + +is-what@^3.14.1: + version "3.14.1" + resolved "https://registry.yarnpkg.com/is-what/-/is-what-3.14.1.tgz#e1222f46ddda85dead0fd1c9df131760e77755c1" + integrity sha512-sNxgpk9793nzSs7bA6JQJGeIuRBQhAaNGG77kzYQgMkrID+lS6SlK07K5LaptscDlSaIgH+GPFzf+d75FVxozA== + +is-wsl@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/is-wsl/-/is-wsl-3.1.0.tgz#e1c657e39c10090afcbedec61720f6b924c3cbd2" + integrity sha512-UcVfVfaK4Sc4m7X3dUSoHoozQGBEFeDC+zVo06t98xe8CzHSZZBekNXH+tu0NalHolcJ/QAGqS46Hef7QXBIMw== + dependencies: + is-inside-container "^1.0.0" + +isarray@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" + integrity sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ== + isexe@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" integrity sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw== +isobject@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/isobject/-/isobject-3.0.1.tgz#4e431e92b11a9731636aa1f9c8d1ccbcfdab78df" + integrity sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg== + +istanbul-lib-coverage@^3.2.0: + version "3.2.2" + resolved "https://registry.yarnpkg.com/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.2.tgz#2d166c4b0644d43a39f04bf6c2edd1e585f31756" + integrity sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg== + +istanbul-lib-instrument@6.0.3: + version "6.0.3" + resolved "https://registry.yarnpkg.com/istanbul-lib-instrument/-/istanbul-lib-instrument-6.0.3.tgz#fa15401df6c15874bcb2105f773325d78c666765" + integrity sha512-Vtgk7L/R2JHyyGW07spoFlB8/lpjiOLTjMdms6AFMraYt3BaJauod/NGrfnVG/y4Ix1JEuMRPDPEj2ua+zz1/Q== + dependencies: + "@babel/core" "^7.23.9" + "@babel/parser" "^7.23.9" + "@istanbuljs/schema" "^0.1.3" + istanbul-lib-coverage "^3.2.0" + semver "^7.5.4" + +jackspeak@^3.1.2: + version "3.4.3" + resolved "https://registry.yarnpkg.com/jackspeak/-/jackspeak-3.4.3.tgz#8833a9d89ab4acde6188942bd1c53b6390ed5a8a" + integrity sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw== + dependencies: + "@isaacs/cliui" "^8.0.2" + optionalDependencies: + "@pkgjs/parseargs" "^0.11.0" + +jest-worker@^27.4.5: + version "27.5.1" + resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-27.5.1.tgz#8d146f0900e8973b106b6f73cc1e9a8cb86f8db0" + integrity sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg== + dependencies: + "@types/node" "*" + merge-stream "^2.0.0" + supports-color "^8.0.0" + +jiti@^1.20.0: + version "1.21.6" + resolved "https://registry.yarnpkg.com/jiti/-/jiti-1.21.6.tgz#6c7f7398dd4b3142767f9a168af2f317a428d268" + integrity sha512-2yTgeWTWzMWkHu6Jp9NKgePDaYHbntiwvYuuJLbbN9vl7DC9DvXKOB2BC3ZZ92D3cvV/aflH0osDfwpHepQ53w== + js-tokens@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== -json-parse-even-better-errors@^2.3.0: +js-yaml@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-4.1.0.tgz#c1fb65f8f5017901cdd2c951864ba18458a10602" + integrity sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA== + dependencies: + argparse "^2.0.1" + +jsesc@^2.5.1: + version "2.5.2" + resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-2.5.2.tgz#80564d2e483dacf6e8ef209650a67df3f0c283a4" + integrity sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA== + +jsesc@~0.5.0: + version "0.5.0" + resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-0.5.0.tgz#e7dee66e35d6fc16f710fe91d5cf69f70f08911d" + integrity sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA== + +json-parse-even-better-errors@^2.3.0, json-parse-even-better-errors@^2.3.1: version "2.3.1" resolved "https://registry.yarnpkg.com/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz#7c47805a94319928e05777405dc12e1f7a4ee02d" integrity sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w== +json-schema-traverse@^0.4.1: + version "0.4.1" + resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660" + integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg== + +json-schema-traverse@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz#ae7bcb3656ab77a73ba5c49bf654f38e6b6860e2" + integrity sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug== + +json5@^2.1.2, json5@^2.2.3: + version "2.2.3" + resolved "https://registry.yarnpkg.com/json5/-/json5-2.2.3.tgz#78cd6f1a19bdc12b73db5ad0c61efd66c1e29283" + integrity sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg== + +jsonc-parser@3.3.1, jsonc-parser@^3.2.0: + version "3.3.1" + resolved "https://registry.yarnpkg.com/jsonc-parser/-/jsonc-parser-3.3.1.tgz#f2a524b4f7fd11e3d791e559977ad60b98b798b4" + integrity sha512-HUgH65KyejrUFPvHFPbqOY0rsFip3Bo5wb4ngvdi1EpCYWUQDC5V+Y7mZws+DLkr4M//zQJoanu1SP+87Dv1oQ== + +karma-source-map-support@1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/karma-source-map-support/-/karma-source-map-support-1.4.0.tgz#58526ceccf7e8730e56effd97a4de8d712ac0d6b" + integrity sha512-RsBECncGO17KAoJCYXjv+ckIz+Ii9NCi+9enk+rq6XC81ezYkb4/RHE6CTXdA7IOJqoF3wcaLfVG0CPmE5ca6A== + dependencies: + source-map-support "^0.5.5" + keycloakify@^11.2.2: version "11.2.2" resolved "https://registry.yarnpkg.com/keycloakify/-/keycloakify-11.2.2.tgz#316b562ad3545e304571d37543d69afdf62d552c" @@ -689,6 +4331,48 @@ keycloakify@^11.2.2: dependencies: tsafe "^1.6.6" +kind-of@^6.0.2: + version "6.0.3" + resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.3.tgz#07c05034a6c349fa06e24fa35aa76db4580ce4dd" + integrity sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw== + +launch-editor@^2.6.1: + version "2.9.1" + resolved "https://registry.yarnpkg.com/launch-editor/-/launch-editor-2.9.1.tgz#253f173bd441e342d4344b4dae58291abb425047" + integrity sha512-Gcnl4Bd+hRO9P9icCP/RVVT2o8SFlPXofuCxvA2SaZuH45whSvf5p8x5oih5ftLiVhEI4sp5xDY+R+b3zJBh5w== + dependencies: + picocolors "^1.0.0" + shell-quote "^1.8.1" + +less-loader@12.2.0: + version "12.2.0" + resolved "https://registry.yarnpkg.com/less-loader/-/less-loader-12.2.0.tgz#e1e94522f6abe9e064ef396c29a3151bc6c1b6cc" + integrity sha512-MYUxjSQSBUQmowc0l5nPieOYwMzGPUaTzB6inNW/bdPEG9zOL3eAAD1Qw5ZxSPk7we5dMojHwNODYMV1hq4EVg== + +less@4.2.0, less@^4.2.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/less/-/less-4.2.0.tgz#cbefbfaa14a4cd388e2099b2b51f956e1465c450" + integrity sha512-P3b3HJDBtSzsXUl0im2L7gTO5Ubg8mEN6G8qoTS77iXxXX4Hvu4Qj540PZDvQ8V6DmX6iXo98k7Md0Cm1PrLaA== + dependencies: + copy-anything "^2.0.1" + parse-node-version "^1.0.1" + tslib "^2.3.0" + optionalDependencies: + errno "^0.1.1" + graceful-fs "^4.1.2" + image-size "~0.5.0" + make-dir "^2.1.0" + mime "^1.4.1" + needle "^3.1.0" + source-map "~0.6.0" + +license-webpack-plugin@4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/license-webpack-plugin/-/license-webpack-plugin-4.0.2.tgz#1e18442ed20b754b82f1adeff42249b81d11aec6" + integrity sha512-771TFWFD70G1wLTC4oU2Cw4qvtmNrIw+wRvBtn+okgHl7slJVi7zfNcdmqDL72BojM30VNJ2UHylr1o77U37Jw== + dependencies: + webpack-sources "^3.0.0" + lines-and-columns@^1.1.6: version "1.2.4" resolved "https://registry.yarnpkg.com/lines-and-columns/-/lines-and-columns-1.2.4.tgz#eca284f75d2965079309dc0ad9255abb2ebc1632" @@ -714,6 +4398,18 @@ lint-staged@^11.0.0: stringify-object "3.3.0" supports-color "8.1.1" +listr2@8.2.4: + version "8.2.4" + resolved "https://registry.yarnpkg.com/listr2/-/listr2-8.2.4.tgz#486b51cbdb41889108cb7e2c90eeb44519f5a77f" + integrity sha512-opevsywziHd3zHCVQGAj8zu+Z3yHNkkoYhWIGnq54RrCVwLz0MozotJEDnKsIBLvkfLGN6BLOyAeRrYI0pKA4g== + dependencies: + cli-truncate "^4.0.0" + colorette "^2.0.20" + eventemitter3 "^5.0.1" + log-update "^6.1.0" + rfdc "^1.4.1" + wrap-ansi "^9.0.0" + listr2@^3.12.2: version "3.14.0" resolved "https://registry.yarnpkg.com/listr2/-/listr2-3.14.0.tgz#23101cc62e1375fd5836b248276d1d2b51fdbe9e" @@ -728,6 +4424,50 @@ listr2@^3.12.2: through "^2.3.8" wrap-ansi "^7.0.0" +lmdb@3.0.13: + version "3.0.13" + resolved "https://registry.yarnpkg.com/lmdb/-/lmdb-3.0.13.tgz#5f326ac13cd60c239c481c42b601ebae39935026" + integrity sha512-UGe+BbaSUQtAMZobTb4nHvFMrmvuAQKSeaqAX2meTEQjfsbpl5sxdHD8T72OnwD4GU9uwNhYXIVe4QGs8N9Zyw== + dependencies: + msgpackr "^1.10.2" + node-addon-api "^6.1.0" + node-gyp-build-optional-packages "5.2.2" + ordered-binary "^1.4.1" + weak-lru-cache "^1.2.2" + optionalDependencies: + "@lmdb/lmdb-darwin-arm64" "3.0.13" + "@lmdb/lmdb-darwin-x64" "3.0.13" + "@lmdb/lmdb-linux-arm" "3.0.13" + "@lmdb/lmdb-linux-arm64" "3.0.13" + "@lmdb/lmdb-linux-x64" "3.0.13" + "@lmdb/lmdb-win32-x64" "3.0.13" + +loader-runner@^4.2.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/loader-runner/-/loader-runner-4.3.0.tgz#c1b4a163b99f614830353b16755e7149ac2314e1" + integrity sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg== + +loader-utils@3.3.1: + version "3.3.1" + resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-3.3.1.tgz#735b9a19fd63648ca7adbd31c2327dfe281304e5" + integrity sha512-FMJTLMXfCLMLfJxcX9PFqX5qD88Z5MRGaZCVzfuqeZSPsyiBzs+pahDQjbIWz2QIzPZz0NX9Zy4FX3lmK6YHIg== + +loader-utils@^2.0.0: + version "2.0.4" + resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-2.0.4.tgz#8b5cb38b5c34a9a018ee1fc0e6a066d1dfcc528c" + integrity sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw== + dependencies: + big.js "^5.2.2" + emojis-list "^3.0.0" + json5 "^2.1.2" + +locate-path@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-5.0.0.tgz#1afba396afd676a6d42504d0a67a3a7eb9f62aa0" + integrity sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g== + dependencies: + p-locate "^4.1.0" + locate-path@^6.0.0: version "6.0.0" resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-6.0.0.tgz#55321eb309febbc59c4801d931a72452a681d286" @@ -735,6 +4475,26 @@ locate-path@^6.0.0: dependencies: p-locate "^5.0.0" +locate-path@^7.1.0: + version "7.2.0" + resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-7.2.0.tgz#69cb1779bd90b35ab1e771e1f2f89a202c2a8a8a" + integrity sha512-gvVijfZvn7R+2qyPX8mAuKcFGDf6Nc61GdvGafQsHL0sBIxfKzA+usWn4GFC/bk+QdwPUD4kWFJLhElipq+0VA== + dependencies: + p-locate "^6.0.0" + +lodash.debounce@^4.0.8: + version "4.0.8" + resolved "https://registry.yarnpkg.com/lodash.debounce/-/lodash.debounce-4.0.8.tgz#82d79bff30a67c4005ffd5e2515300ad9ca4d7af" + integrity sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow== + +log-symbols@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-4.1.0.tgz#3fbdbb95b4683ac9fc785111e792e558d4abd503" + integrity sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg== + dependencies: + chalk "^4.1.0" + is-unicode-supported "^0.1.0" + log-update@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/log-update/-/log-update-4.0.0.tgz#589ecd352471f2a1c0c570287543a64dfd20e0a1" @@ -745,6 +4505,71 @@ log-update@^4.0.0: slice-ansi "^4.0.0" wrap-ansi "^6.2.0" +log-update@^6.1.0: + version "6.1.0" + resolved "https://registry.yarnpkg.com/log-update/-/log-update-6.1.0.tgz#1a04ff38166f94647ae1af562f4bd6a15b1b7cd4" + integrity sha512-9ie8ItPR6tjY5uYJh8K/Zrv/RMZ5VOlOWvtZdEHYSTFKZfIBPQa9tOAEeAWhd+AnIneLJ22w5fjOYtoutpWq5w== + dependencies: + ansi-escapes "^7.0.0" + cli-cursor "^5.0.0" + slice-ansi "^7.1.0" + strip-ansi "^7.1.0" + wrap-ansi "^9.0.0" + +lru-cache@^10.0.1, lru-cache@^10.2.0: + version "10.4.3" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-10.4.3.tgz#410fc8a17b70e598013df257c2446b7f3383f119" + integrity sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ== + +lru-cache@^5.1.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-5.1.1.tgz#1da27e6710271947695daf6848e847f01d84b920" + integrity sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w== + dependencies: + yallist "^3.0.2" + +magic-string@0.30.11: + version "0.30.11" + resolved "https://registry.yarnpkg.com/magic-string/-/magic-string-0.30.11.tgz#301a6f93b3e8c2cb13ac1a7a673492c0dfd12954" + integrity sha512-+Wri9p0QHMy+545hKww7YAu5NyzF8iomPL/RQazugQ9+Ez4Ic3mERMd8ZTX5rfK944j+560ZJi8iAwgak1Ac7A== + dependencies: + "@jridgewell/sourcemap-codec" "^1.5.0" + +make-dir@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-2.1.0.tgz#5f0310e18b8be898cc07009295a30ae41e91e6f5" + integrity sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA== + dependencies: + pify "^4.0.1" + semver "^5.6.0" + +make-dir@^3.0.2: + version "3.1.0" + resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-3.1.0.tgz#415e967046b3a7f1d185277d84aa58203726a13f" + integrity sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw== + dependencies: + semver "^6.0.0" + +media-typer@0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748" + integrity sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ== + +memfs@^4.6.0: + version "4.12.0" + resolved "https://registry.yarnpkg.com/memfs/-/memfs-4.12.0.tgz#76570478aee461695fb3336ca3356a7a8cfc26cc" + integrity sha512-74wDsex5tQDSClVkeK1vtxqYCAgCoXxx+K4NSHzgU/muYVYByFqa+0RnrPO9NM6naWm1+G9JmZ0p6QHhXmeYfA== + dependencies: + "@jsonjoy.com/json-pack" "^1.0.3" + "@jsonjoy.com/util" "^1.3.0" + tree-dump "^1.0.1" + tslib "^2.0.0" + +merge-descriptors@1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/merge-descriptors/-/merge-descriptors-1.0.3.tgz#d80319a65f3c7935351e5cfdac8f9318504dbed5" + integrity sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ== + merge-stream@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/merge-stream/-/merge-stream-2.0.0.tgz#52823629a14dd00c9770fb6ad47dc6310f2c1f60" @@ -755,7 +4580,12 @@ merge2@^1.3.0, merge2@^1.4.1: resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.4.1.tgz#4368892f885e907455a6fd7dc55c0c9d404990ae" integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg== -micromatch@^4.0.4: +methods@~1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/methods/-/methods-1.1.2.tgz#5529a4d67654134edcc5266656835b0f851afcee" + integrity sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w== + +micromatch@^4.0.2, micromatch@^4.0.4, micromatch@^4.0.5: version "4.0.8" resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.8.tgz#d66fa18f3a47076789320b9b1af32bd86d9fa202" integrity sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA== @@ -763,26 +4593,266 @@ micromatch@^4.0.4: braces "^3.0.3" picomatch "^2.3.1" +mime-db@1.52.0: + version "1.52.0" + resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.52.0.tgz#bbabcdc02859f4987301c856e3387ce5ec43bf70" + integrity sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg== + +"mime-db@>= 1.43.0 < 2": + version "1.53.0" + resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.53.0.tgz#3cb63cd820fc29896d9d4e8c32ab4fcd74ccb447" + integrity sha512-oHlN/w+3MQ3rba9rqFr6V/ypF10LSkdwUysQL7GkXoTgIWeV+tcXGA852TBxH+gsh8UWoyhR1hKcoMJTuWflpg== + +mime-types@^2.1.27, mime-types@^2.1.31, mime-types@~2.1.17, mime-types@~2.1.24, mime-types@~2.1.34: + version "2.1.35" + resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.35.tgz#381a871b62a734450660ae3deee44813f70d959a" + integrity sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw== + dependencies: + mime-db "1.52.0" + +mime@1.6.0, mime@^1.4.1: + version "1.6.0" + resolved "https://registry.yarnpkg.com/mime/-/mime-1.6.0.tgz#32cd9e5c64553bd58d19a568af452acff04981b1" + integrity sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg== + mimic-fn@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b" integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg== -ms@^2.1.3: +mimic-function@^5.0.0: + version "5.0.1" + resolved "https://registry.yarnpkg.com/mimic-function/-/mimic-function-5.0.1.tgz#acbe2b3349f99b9deaca7fb70e48b83e94e67076" + integrity sha512-VP79XUPxV2CigYP3jWwAUFSku2aKqBH7uTAapFWCBqutsbmDo96KY5o8uh6U+/YSIn5OxJnXp73beVkpqMIGhA== + +mini-css-extract-plugin@2.9.0: + version "2.9.0" + resolved "https://registry.yarnpkg.com/mini-css-extract-plugin/-/mini-css-extract-plugin-2.9.0.tgz#c73a1327ccf466f69026ac22a8e8fd707b78a235" + integrity sha512-Zs1YsZVfemekSZG+44vBsYTLQORkPMwnlv+aehcxK/NLKC+EGhDB39/YePYYqx/sTk6NnYpuqikhSn7+JIevTA== + dependencies: + schema-utils "^4.0.0" + tapable "^2.2.1" + +minimalistic-assert@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz#2e194de044626d4a10e7f7fbc00ce73e83e4d5c7" + integrity sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A== + +minimatch@^9.0.4: + version "9.0.5" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-9.0.5.tgz#d74f9dd6b57d83d8e98cfb82133b03978bc929e5" + integrity sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow== + dependencies: + brace-expansion "^2.0.1" + +minipass-collect@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/minipass-collect/-/minipass-collect-2.0.1.tgz#1621bc77e12258a12c60d34e2276ec5c20680863" + integrity sha512-D7V8PO9oaz7PWGLbCACuI1qEOsq7UKfLotx/C0Aet43fCUB/wfQ7DYeq2oR/svFJGYDHPr38SHATeaj/ZoKHKw== + dependencies: + minipass "^7.0.3" + +minipass-flush@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/minipass-flush/-/minipass-flush-1.0.5.tgz#82e7135d7e89a50ffe64610a787953c4c4cbb373" + integrity sha512-JmQSYYpPUqX5Jyn1mXaRwOda1uQ8HP5KAT/oDSLCzt1BYRhQU0/hDtsB1ufZfEEzMZ9aAVmsBw8+FWsIXlClWw== + dependencies: + minipass "^3.0.0" + +minipass-pipeline@^1.2.4: + version "1.2.4" + resolved "https://registry.yarnpkg.com/minipass-pipeline/-/minipass-pipeline-1.2.4.tgz#68472f79711c084657c067c5c6ad93cddea8214c" + integrity sha512-xuIq7cIOt09RPRJ19gdi4b+RiNvDFYe5JH+ggNvBqGqpQXcru3PcRmOZuHBKWK1Txf9+cQ+HMVN4d6z46LZP7A== + dependencies: + minipass "^3.0.0" + +minipass@^3.0.0: + version "3.3.6" + resolved "https://registry.yarnpkg.com/minipass/-/minipass-3.3.6.tgz#7bba384db3a1520d18c9c0e5251c3444e95dd94a" + integrity sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw== + dependencies: + yallist "^4.0.0" + +minipass@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/minipass/-/minipass-5.0.0.tgz#3e9788ffb90b694a5d0ec94479a45b5d8738133d" + integrity sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ== + +"minipass@^5.0.0 || ^6.0.2 || ^7.0.0", minipass@^7.0.3, minipass@^7.1.2: + version "7.1.2" + resolved "https://registry.yarnpkg.com/minipass/-/minipass-7.1.2.tgz#93a9626ce5e5e66bd4db86849e7515e92340a707" + integrity sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw== + +minizlib@^2.1.1: + version "2.1.2" + resolved "https://registry.yarnpkg.com/minizlib/-/minizlib-2.1.2.tgz#e90d3466ba209b932451508a11ce3d3632145931" + integrity sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg== + dependencies: + minipass "^3.0.0" + yallist "^4.0.0" + +mkdirp@^1.0.3: + version "1.0.4" + resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-1.0.4.tgz#3eb5ed62622756d79a5f0e2a221dfebad75c2f7e" + integrity sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw== + +mrmime@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/mrmime/-/mrmime-2.0.0.tgz#151082a6e06e59a9a39b46b3e14d5cfe92b3abb4" + integrity sha512-eu38+hdgojoyq63s+yTpN4XMBdt5l8HhMhc4VKLO9KM5caLIBvUm4thi7fFaxyTmCKeNnXZ5pAlBwCUnhA09uw== + +ms@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" + integrity sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A== + +ms@2.1.3, ms@^2.1.3: version "2.1.3" resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== +msgpackr-extract@^3.0.2: + version "3.0.3" + resolved "https://registry.yarnpkg.com/msgpackr-extract/-/msgpackr-extract-3.0.3.tgz#e9d87023de39ce714872f9e9504e3c1996d61012" + integrity sha512-P0efT1C9jIdVRefqjzOQ9Xml57zpOXnIuS+csaB4MdZbTdmGDLo8XhzBG1N7aO11gKDDkJvBLULeFTo46wwreA== + dependencies: + node-gyp-build-optional-packages "5.2.2" + optionalDependencies: + "@msgpackr-extract/msgpackr-extract-darwin-arm64" "3.0.3" + "@msgpackr-extract/msgpackr-extract-darwin-x64" "3.0.3" + "@msgpackr-extract/msgpackr-extract-linux-arm" "3.0.3" + "@msgpackr-extract/msgpackr-extract-linux-arm64" "3.0.3" + "@msgpackr-extract/msgpackr-extract-linux-x64" "3.0.3" + "@msgpackr-extract/msgpackr-extract-win32-x64" "3.0.3" + +msgpackr@^1.10.2: + version "1.11.0" + resolved "https://registry.yarnpkg.com/msgpackr/-/msgpackr-1.11.0.tgz#8321d52333048cadc749f56385e3231e65337091" + integrity sha512-I8qXuuALqJe5laEBYoFykChhSXLikZmUhccjGsPuSJ/7uPip2TJ7lwdIQwWSAi0jGZDXv4WOP8Qg65QZRuXxXw== + optionalDependencies: + msgpackr-extract "^3.0.2" + +multicast-dns@^7.2.5: + version "7.2.5" + resolved "https://registry.yarnpkg.com/multicast-dns/-/multicast-dns-7.2.5.tgz#77eb46057f4d7adbd16d9290fa7299f6fa64cced" + integrity sha512-2eznPJP8z2BFLX50tf0LuODrpINqP1RVIm/CObbTcBRITQgmC/TjcREF1NeTBzIcR5XO/ukWo+YHOjBbFwIupg== + dependencies: + dns-packet "^5.2.2" + thunky "^1.0.2" + +mute-stream@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-1.0.0.tgz#e31bd9fe62f0aed23520aa4324ea6671531e013e" + integrity sha512-avsJQhyd+680gKXyG/sQc0nXaC6rBkPOfyHYcFb9+hdkqQkR9bdnkJ0AMZhke0oesPqIO+mFFJ+IdBc7mst4IA== + mylas@^2.1.9: version "2.1.13" resolved "https://registry.yarnpkg.com/mylas/-/mylas-2.1.13.tgz#1e23b37d58fdcc76e15d8a5ed23f9ae9fc0cbdf4" integrity sha512-+MrqnJRtxdF+xngFfUUkIMQrUUL0KsxbADUkn23Z/4ibGg192Q+z+CQyiYwvWTsYjJygmMR8+w3ZDa98Zh6ESg== +nanoid@^3.3.7: + version "3.3.7" + resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.7.tgz#d0c301a691bc8d54efa0a2226ccf3fe2fd656bd8" + integrity sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g== + +needle@^3.1.0: + version "3.3.1" + resolved "https://registry.yarnpkg.com/needle/-/needle-3.3.1.tgz#63f75aec580c2e77e209f3f324e2cdf3d29bd049" + integrity sha512-6k0YULvhpw+RoLNiQCRKOl09Rv1dPLr8hHnVjHqdolKwDrdNyk+Hmrthi4lIGPPz3r39dLx0hsF5s40sZ3Us4Q== + dependencies: + iconv-lite "^0.6.3" + sax "^1.2.4" + +negotiator@0.6.3: + version "0.6.3" + resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.3.tgz#58e323a72fedc0d6f9cd4d31fe49f51479590ccd" + integrity sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg== + +neo-async@^2.6.2: + version "2.6.2" + resolved "https://registry.yarnpkg.com/neo-async/-/neo-async-2.6.2.tgz#b4aafb93e3aeb2d8174ca53cf163ab7d7308305f" + integrity sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw== + +ng-packagr@^18.2.1: + version "18.2.1" + resolved "https://registry.yarnpkg.com/ng-packagr/-/ng-packagr-18.2.1.tgz#ea45f888c5ce1252a3a39cc83431aece18429eb7" + integrity sha512-dy9ZDpZb3QpAz+Y/m8VAu7ctr2VrnRU3gmQwJagnNybVJtCsKn3lZA3IW7Z7GTLoG5IALSPouiCgiB/C8ozv7w== + dependencies: + "@rollup/plugin-json" "^6.1.0" + "@rollup/plugin-node-resolve" "^15.2.3" + "@rollup/wasm-node" "^4.18.0" + ajv "^8.12.0" + ansi-colors "^4.1.3" + browserslist "^4.22.1" + cacache "^18.0.0" + chokidar "^3.5.3" + commander "^12.0.0" + convert-source-map "^2.0.0" + dependency-graph "^1.0.0" + esbuild "^0.23.0" + fast-glob "^3.3.1" + find-cache-dir "^3.3.2" + injection-js "^2.4.0" + jsonc-parser "^3.2.0" + less "^4.2.0" + ora "^5.1.0" + piscina "^4.4.0" + postcss "^8.4.31" + rxjs "^7.8.1" + sass "^1.69.5" + optionalDependencies: + rollup "^4.18.0" + +nice-napi@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/nice-napi/-/nice-napi-1.0.2.tgz#dc0ab5a1eac20ce548802fc5686eaa6bc654927b" + integrity sha512-px/KnJAJZf5RuBGcfD+Sp2pAKq0ytz8j+1NehvgIGFkvtvFrDM3T8E4x/JJODXK9WZow8RRGrbA9QQ3hs+pDhA== + dependencies: + node-addon-api "^3.0.0" + node-gyp-build "^4.2.2" + +node-addon-api@^3.0.0: + version "3.2.1" + resolved "https://registry.yarnpkg.com/node-addon-api/-/node-addon-api-3.2.1.tgz#81325e0a2117789c0128dab65e7e38f07ceba161" + integrity sha512-mmcei9JghVNDYydghQmeDX8KoAm0FAiYyIcUt/N4nhyAipB17pllZQDOJD2fotxABnt4Mdz+dKTO7eftLg4d0A== + +node-addon-api@^6.1.0: + version "6.1.0" + resolved "https://registry.yarnpkg.com/node-addon-api/-/node-addon-api-6.1.0.tgz#ac8470034e58e67d0c6f1204a18ae6995d9c0d76" + integrity sha512-+eawOlIgy680F0kBzPUNFhMZGtJ1YmqM6l4+Crf4IkImjYrO/mqPwRMh352g23uIaQKFItcQ64I7KMaJxHgAVA== + +node-forge@^1: + version "1.3.1" + resolved "https://registry.yarnpkg.com/node-forge/-/node-forge-1.3.1.tgz#be8da2af243b2417d5f646a770663a92b7e9ded3" + integrity sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA== + +node-gyp-build-optional-packages@5.2.2: + version "5.2.2" + resolved "https://registry.yarnpkg.com/node-gyp-build-optional-packages/-/node-gyp-build-optional-packages-5.2.2.tgz#522f50c2d53134d7f3a76cd7255de4ab6c96a3a4" + integrity sha512-s+w+rBWnpTMwSFbaE0UXsRlg7hU4FjekKU4eyAih5T8nJuNZT1nNsskXpxmeqSK9UzkBl6UgRlnKc8hz8IEqOw== + dependencies: + detect-libc "^2.0.1" + +node-gyp-build@^4.2.2: + version "4.8.2" + resolved "https://registry.yarnpkg.com/node-gyp-build/-/node-gyp-build-4.8.2.tgz#4f802b71c1ab2ca16af830e6c1ea7dd1ad9496fa" + integrity sha512-IRUxE4BVsHWXkV/SFOut4qTlagw2aM8T5/vnTsmrHJvVoKueJHRc/JaFND7QDDc61kLYUJ6qlZM3sqTSyx2dTw== + +node-releases@^2.0.18: + version "2.0.18" + resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.18.tgz#f010e8d35e2fe8d6b2944f03f70213ecedc4ca3f" + integrity sha512-d9VeXT4SJ7ZeOqGX6R5EM022wpL+eWPooLI+5UpWn2jCT1aosUQEhQP214x33Wkwx3JQMvIm+tIoVOdodFS40g== + normalize-path@^3.0.0, normalize-path@~3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== +normalize-range@^0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/normalize-range/-/normalize-range-0.1.2.tgz#2d10c06bdfd312ea9777695a4d28439456b75942" + integrity sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA== + npm-run-path@^4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-4.0.1.tgz#b7ecd1e5ed53da8e37a55e1c2269e0b97ed748ea" @@ -790,6 +4860,35 @@ npm-run-path@^4.0.1: dependencies: path-key "^3.0.0" +nth-check@^2.0.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/nth-check/-/nth-check-2.1.1.tgz#c9eab428effce36cd6b92c924bdb000ef1f1ed1d" + integrity sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w== + dependencies: + boolbase "^1.0.0" + +object-inspect@^1.13.1: + version "1.13.2" + resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.13.2.tgz#dea0088467fb991e67af4058147a24824a3043ff" + integrity sha512-IRZSRuzJiynemAXPYtPe5BoI/RESNYR7TYm50MC5Mqbd3Jmw5y790sErYw3V6SryFJD64b74qQQs9wn5Bg/k3g== + +obuf@^1.0.0, obuf@^1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/obuf/-/obuf-1.1.2.tgz#09bea3343d41859ebd446292d11c9d4db619084e" + integrity sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg== + +on-finished@2.4.1, on-finished@^2.4.1: + version "2.4.1" + resolved "https://registry.yarnpkg.com/on-finished/-/on-finished-2.4.1.tgz#58c8c44116e54845ad57f14ab10b03533184ac3f" + integrity sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg== + dependencies: + ee-first "1.1.1" + +on-headers@~1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/on-headers/-/on-headers-1.0.2.tgz#772b0ae6aaa525c399e489adfad90c403eb3c28f" + integrity sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA== + onetime@^5.1.0, onetime@^5.1.2: version "5.1.2" resolved "https://registry.yarnpkg.com/onetime/-/onetime-5.1.2.tgz#d0e96ebb56b07476df1dd9c4806e5237985ca45e" @@ -797,11 +4896,55 @@ onetime@^5.1.0, onetime@^5.1.2: dependencies: mimic-fn "^2.1.0" +onetime@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/onetime/-/onetime-7.0.0.tgz#9f16c92d8c9ef5120e3acd9dd9957cceecc1ab60" + integrity sha512-VXJjc87FScF88uafS3JllDgvAm+c/Slfz06lorj2uAY34rlUu0Nt+v8wreiImcrgAjjIHp1rXpTDlLOGw29WwQ== + dependencies: + mimic-function "^5.0.0" + +open@10.1.0, open@^10.0.3: + version "10.1.0" + resolved "https://registry.yarnpkg.com/open/-/open-10.1.0.tgz#a7795e6e5d519abe4286d9937bb24b51122598e1" + integrity sha512-mnkeQ1qP5Ue2wd+aivTD3NHd/lZ96Lu0jgf0pwktLPtx6cTZiH7tyeGRRHs0zX0rbrahXPnXlUnbeXyaBBuIaw== + dependencies: + default-browser "^5.2.1" + define-lazy-prop "^3.0.0" + is-inside-container "^1.0.0" + is-wsl "^3.1.0" + opencollective-postinstall@^2.0.2: version "2.0.3" resolved "https://registry.yarnpkg.com/opencollective-postinstall/-/opencollective-postinstall-2.0.3.tgz#7a0fff978f6dbfa4d006238fbac98ed4198c3259" integrity sha512-8AV/sCtuzUeTo8gQK5qDZzARrulB3egtLzFgteqB2tcT4Mw7B8Kt7JcDHmltjz6FOAHsvTevk70gZEbhM4ZS9Q== +ora@5.4.1, ora@^5.1.0: + version "5.4.1" + resolved "https://registry.yarnpkg.com/ora/-/ora-5.4.1.tgz#1b2678426af4ac4a509008e5e4ac9e9959db9e18" + integrity sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ== + dependencies: + bl "^4.1.0" + chalk "^4.1.0" + cli-cursor "^3.1.0" + cli-spinners "^2.5.0" + is-interactive "^1.0.0" + is-unicode-supported "^0.1.0" + log-symbols "^4.1.0" + strip-ansi "^6.0.0" + wcwidth "^1.0.1" + +ordered-binary@^1.4.1: + version "1.5.2" + resolved "https://registry.yarnpkg.com/ordered-binary/-/ordered-binary-1.5.2.tgz#2007072bcc4cb3454e250ca8ecc994f092ca03dc" + integrity sha512-JTo+4+4Fw7FreyAvlSLjb1BBVaxEQAacmjD3jjuyPZclpbEghTvQZbXBb2qPd2LeIMxiHwXBZUcpmG2Gl/mDEA== + +p-limit@^2.2.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.3.0.tgz#3dd33c647a214fdfffd835933eb086da0dc21db1" + integrity sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w== + dependencies: + p-try "^2.0.0" + p-limit@^3.0.2: version "3.1.0" resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-3.1.0.tgz#e1daccbe78d0d1388ca18c64fea38e3e57e3706b" @@ -809,6 +4952,20 @@ p-limit@^3.0.2: dependencies: yocto-queue "^0.1.0" +p-limit@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-4.0.0.tgz#914af6544ed32bfa54670b061cafcbd04984b644" + integrity sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ== + dependencies: + yocto-queue "^1.0.0" + +p-locate@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-4.1.0.tgz#a3428bb7088b3a60292f66919278b7c297ad4f07" + integrity sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A== + dependencies: + p-limit "^2.2.0" + p-locate@^5.0.0: version "5.0.0" resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-5.0.0.tgz#83c8315c6785005e3bd021839411c9e110e6d834" @@ -816,6 +4973,13 @@ p-locate@^5.0.0: dependencies: p-limit "^3.0.2" +p-locate@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-6.0.0.tgz#3da9a49d4934b901089dca3302fa65dc5a05c04f" + integrity sha512-wPrq66Llhl7/4AGC6I+cqxT07LhXvWL08LNXz1fENOw0Ap4sRZZ/gZpTTJ5jpurzzzfS2W/Ge9BY3LgLjCShcw== + dependencies: + p-limit "^4.0.0" + p-map@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/p-map/-/p-map-4.0.0.tgz#bb2f95a5eda2ec168ec9274e06a747c3e2904d2b" @@ -823,6 +4987,25 @@ p-map@^4.0.0: dependencies: aggregate-error "^3.0.0" +p-retry@^6.2.0: + version "6.2.0" + resolved "https://registry.yarnpkg.com/p-retry/-/p-retry-6.2.0.tgz#8d6df01af298750009691ce2f9b3ad2d5968f3bd" + integrity sha512-JA6nkq6hKyWLLasXQXUrO4z8BUZGUt/LjlJxx8Gb2+2ntodU/SS63YZ8b0LUTbQ8ZB9iwOfhEPhg4ykKnn2KsA== + dependencies: + "@types/retry" "0.12.2" + is-network-error "^1.0.0" + retry "^0.13.1" + +p-try@^2.0.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/p-try/-/p-try-2.2.0.tgz#cb2868540e313d61de58fafbe35ce9004d5540e6" + integrity sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ== + +package-json-from-dist@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz#4f1471a010827a86f94cfd9b0727e36d267de505" + integrity sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw== + parent-module@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/parent-module/-/parent-module-1.0.1.tgz#691d2709e78c79fae3a156622452d00762caaaa2" @@ -830,7 +5013,7 @@ parent-module@^1.0.0: dependencies: callsites "^3.0.0" -parse-json@^5.0.0: +parse-json@^5.0.0, parse-json@^5.2.0: version "5.2.0" resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-5.2.0.tgz#c76fc66dee54231c962b22bcc8a72cf2f99753cd" integrity sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg== @@ -840,37 +5023,136 @@ parse-json@^5.0.0: json-parse-even-better-errors "^2.3.0" lines-and-columns "^1.1.6" +parse-node-version@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/parse-node-version/-/parse-node-version-1.0.1.tgz#e2b5dbede00e7fa9bc363607f53327e8b073189b" + integrity sha512-3YHlOa/JgH6Mnpr05jP9eDG254US9ek25LyIxZlDItp2iJtwyaXQb57lBYLdT3MowkUFYEV2XXNAYIPlESvJlA== + +parse5-html-rewriting-stream@7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/parse5-html-rewriting-stream/-/parse5-html-rewriting-stream-7.0.0.tgz#e376d3e762d2950ccbb6bb59823fc1d7e9fdac36" + integrity sha512-mazCyGWkmCRWDI15Zp+UiCqMp/0dgEmkZRvhlsqqKYr4SsVm/TvnSpD9fCvqCA2zoWJcfRym846ejWBBHRiYEg== + dependencies: + entities "^4.3.0" + parse5 "^7.0.0" + parse5-sax-parser "^7.0.0" + +parse5-sax-parser@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/parse5-sax-parser/-/parse5-sax-parser-7.0.0.tgz#4c05064254f0488676aca75fb39ca069ec96dee5" + integrity sha512-5A+v2SNsq8T6/mG3ahcz8ZtQ0OUFTatxPbeidoMB7tkJSGDY3tdfl4MHovtLQHkEn5CGxijNWRQHhRQ6IRpXKg== + dependencies: + parse5 "^7.0.0" + +parse5@^7.0.0: + version "7.1.2" + resolved "https://registry.yarnpkg.com/parse5/-/parse5-7.1.2.tgz#0736bebbfd77793823240a23b7fc5e010b7f8e32" + integrity sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw== + dependencies: + entities "^4.4.0" + +parseurl@~1.3.2, parseurl@~1.3.3: + version "1.3.3" + resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.3.tgz#9da19e7bee8d12dff0513ed5b76957793bc2e8d4" + integrity sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ== + path-exists@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-4.0.0.tgz#513bdbe2d3b95d7762e8c1137efa195c6c61b5b3" integrity sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w== +path-exists@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-5.0.0.tgz#a6aad9489200b21fab31e49cf09277e5116fb9e7" + integrity sha512-RjhtfwJOxzcFmNOi6ltcbcu4Iu+FL3zEj83dk4kAS+fVpTxXLO1b38RvJgT/0QwvV/L3aY9TAnyv0EOqW4GoMQ== + path-key@^3.0.0, path-key@^3.1.0: version "3.1.1" resolved "https://registry.yarnpkg.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375" integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== +path-parse@^1.0.7: + version "1.0.7" + resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735" + integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== + +path-scurry@^1.11.1: + version "1.11.1" + resolved "https://registry.yarnpkg.com/path-scurry/-/path-scurry-1.11.1.tgz#7960a668888594a0720b12a911d1a742ab9f11d2" + integrity sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA== + dependencies: + lru-cache "^10.2.0" + minipass "^5.0.0 || ^6.0.2 || ^7.0.0" + +path-to-regexp@0.1.10: + version "0.1.10" + resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-0.1.10.tgz#67e9108c5c0551b9e5326064387de4763c4d5f8b" + integrity sha512-7lf7qcQidTku0Gu3YDPc8DJ1q7OOucfa/BSsIwjuh56VU7katFvuM8hULfkwB3Fns/rsVF7PwPKVw1sl5KQS9w== + path-type@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/path-type/-/path-type-4.0.0.tgz#84ed01c0a7ba380afe09d90a8c180dcd9d03043b" integrity sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw== -picocolors@^1.0.0: +path-type@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/path-type/-/path-type-5.0.0.tgz#14b01ed7aea7ddf9c7c3f46181d4d04f9c785bb8" + integrity sha512-5HviZNaZcfqP95rwpv+1HDgUamezbqdSYTyzjTvwtJSnIH+3vnbmWsItli8OFEndS984VT55M3jduxZbX351gg== + +picocolors@^1.0.0, picocolors@^1.0.1, picocolors@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.1.0.tgz#5358b76a78cde483ba5cef6a9dc9671440b27d59" integrity sha512-TQ92mBOW0l3LeMeyLV6mzy/kWr8lkd/hp3mTg7wYK7zJhuBStmGMBG0BdeDZS/dZx1IukaX6Bk11zcln25o1Aw== +picomatch@4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-4.0.2.tgz#77c742931e8f3b8820946c76cd0c1f13730d1dab" + integrity sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg== + picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.3.1: version "2.3.1" resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42" integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== +pify@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/pify/-/pify-4.0.1.tgz#4b2cd25c50d598735c50292224fd8c6df41e3231" + integrity sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g== + +piscina@4.6.1: + version "4.6.1" + resolved "https://registry.yarnpkg.com/piscina/-/piscina-4.6.1.tgz#4de673b0ff84bf641b31b07b3348669383b51c9a" + integrity sha512-z30AwWGtQE+Apr+2WBZensP2lIvwoaMcOPkQlIEmSGMJNUvaYACylPYrQM6wSdUNJlnDVMSpLv7xTMJqlVshOA== + optionalDependencies: + nice-napi "^1.0.2" + +piscina@^4.4.0: + version "4.7.0" + resolved "https://registry.yarnpkg.com/piscina/-/piscina-4.7.0.tgz#68936fc77128db00541366531330138e366dc851" + integrity sha512-b8hvkpp9zS0zsfa939b/jXbe64Z2gZv0Ha7FYPNUiDIB1y2AtxcOZdfP8xN8HFjUaqQiT9gRlfjAsoL8vdJ1Iw== + optionalDependencies: + "@napi-rs/nice" "^1.0.1" + +pkg-dir@^4.1.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-4.2.0.tgz#f099133df7ede422e81d1d8448270eeb3e4261f3" + integrity sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ== + dependencies: + find-up "^4.0.0" + pkg-dir@^5.0.0: version "5.0.0" resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-5.0.0.tgz#a02d6aebe6ba133a928f74aec20bafdfe6b8e760" integrity sha512-NPE8TDbzl/3YQYY7CSS228s3g2ollTFnc+Qi3tqmqJp9Vg2ovUpixcJEo2HJScN2Ez+kEaal6y70c0ehqJBJeA== dependencies: - find-up "^5.0.0" + find-up "^5.0.0" + +pkg-dir@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-7.0.0.tgz#8f0c08d6df4476756c5ff29b3282d0bab7517d11" + integrity sha512-Ie9z/WINcxxLp27BKOCHGde4ITq9UklYKDzVo1nhk5sqGEXU3FpkwP5GM2voTGJkGd9B3Otl+Q4uwSOeSUtOBA== + dependencies: + find-up "^6.3.0" please-upgrade-node@^3.2.0: version "3.2.0" @@ -886,11 +5168,114 @@ plimit-lit@^1.2.6: dependencies: queue-lit "^1.5.1" +postcss-loader@8.1.1: + version "8.1.1" + resolved "https://registry.yarnpkg.com/postcss-loader/-/postcss-loader-8.1.1.tgz#2822589e7522927344954acb55bbf26e8b195dfe" + integrity sha512-0IeqyAsG6tYiDRCYKQJLAmgQr47DX6N7sFSWvQxt6AcupX8DIdmykuk/o/tx0Lze3ErGHJEp5OSRxrelC6+NdQ== + dependencies: + cosmiconfig "^9.0.0" + jiti "^1.20.0" + semver "^7.5.4" + +postcss-media-query-parser@^0.2.3: + version "0.2.3" + resolved "https://registry.yarnpkg.com/postcss-media-query-parser/-/postcss-media-query-parser-0.2.3.tgz#27b39c6f4d94f81b1a73b8f76351c609e5cef244" + integrity sha512-3sOlxmbKcSHMjlUXQZKQ06jOswE7oVkXPxmZdoB1r5l0q6gTFTQSHxNxOrCccElbW7dxNytifNEo8qidX2Vsig== + +postcss-modules-extract-imports@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/postcss-modules-extract-imports/-/postcss-modules-extract-imports-3.1.0.tgz#b4497cb85a9c0c4b5aabeb759bb25e8d89f15002" + integrity sha512-k3kNe0aNFQDAZGbin48pL2VNidTF0w4/eASDsxlyspobzU3wZQLOGj7L9gfRe0Jo9/4uud09DsjFNH7winGv8Q== + +postcss-modules-local-by-default@^4.0.5: + version "4.0.5" + resolved "https://registry.yarnpkg.com/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.0.5.tgz#f1b9bd757a8edf4d8556e8d0f4f894260e3df78f" + integrity sha512-6MieY7sIfTK0hYfafw1OMEG+2bg8Q1ocHCpoWLqOKj3JXlKu4G7btkmM/B7lFubYkYWmRSPLZi5chid63ZaZYw== + dependencies: + icss-utils "^5.0.0" + postcss-selector-parser "^6.0.2" + postcss-value-parser "^4.1.0" + +postcss-modules-scope@^3.2.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/postcss-modules-scope/-/postcss-modules-scope-3.2.0.tgz#a43d28289a169ce2c15c00c4e64c0858e43457d5" + integrity sha512-oq+g1ssrsZOsx9M96c5w8laRmvEu9C3adDSjI8oTcbfkrTE8hx/zfyobUoWIxaKPO8bt6S62kxpw5GqypEw1QQ== + dependencies: + postcss-selector-parser "^6.0.4" + +postcss-modules-values@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/postcss-modules-values/-/postcss-modules-values-4.0.0.tgz#d7c5e7e68c3bb3c9b27cbf48ca0bb3ffb4602c9c" + integrity sha512-RDxHkAiEGI78gS2ofyvCsu7iycRv7oqw5xMWn9iMoR0N/7mf9D50ecQqUo5BZ9Zh2vH4bCUR/ktCqbB9m8vJjQ== + dependencies: + icss-utils "^5.0.0" + +postcss-selector-parser@^6.0.2, postcss-selector-parser@^6.0.4: + version "6.1.2" + resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-6.1.2.tgz#27ecb41fb0e3b6ba7a1ec84fff347f734c7929de" + integrity sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg== + dependencies: + cssesc "^3.0.0" + util-deprecate "^1.0.2" + +postcss-value-parser@^4.1.0, postcss-value-parser@^4.2.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz#723c09920836ba6d3e5af019f92bc0971c02e514" + integrity sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ== + +postcss@8.4.41: + version "8.4.41" + resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.41.tgz#d6104d3ba272d882fe18fc07d15dc2da62fa2681" + integrity sha512-TesUflQ0WKZqAvg52PWL6kHgLKP6xB6heTOdoYM0Wt2UHyxNa4K25EZZMgKns3BH1RLVbZCREPpLY0rhnNoHVQ== + dependencies: + nanoid "^3.3.7" + picocolors "^1.0.1" + source-map-js "^1.2.0" + +postcss@^8.2.14, postcss@^8.4.23, postcss@^8.4.31, postcss@^8.4.33, postcss@^8.4.43: + version "8.4.47" + resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.47.tgz#5bf6c9a010f3e724c503bf03ef7947dcb0fea365" + integrity sha512-56rxCq7G/XfB4EkXq9Egn5GCqugWvDFjafDOThIdMBsI15iqPqR5r15TfSr1YPYeEI19YeaXMCbY6u88Y76GLQ== + dependencies: + nanoid "^3.3.7" + picocolors "^1.1.0" + source-map-js "^1.2.1" + prettier@^3.2.5: version "3.3.3" resolved "https://registry.yarnpkg.com/prettier/-/prettier-3.3.3.tgz#30c54fe0be0d8d12e6ae61dbb10109ea00d53105" integrity sha512-i2tDNA0O5IrMO757lfrdQZCc2jPNDVntV0m/+4whiDfWaTKfMNgR7Qz0NAeGz/nRqF4m5/6CLzbP4/liHt12Ew== +process-nextick-args@~2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.1.tgz#7820d9b16120cc55ca9ae7792680ae7dba6d7fe2" + integrity sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag== + +proxy-addr@~2.0.7: + version "2.0.7" + resolved "https://registry.yarnpkg.com/proxy-addr/-/proxy-addr-2.0.7.tgz#f19fe69ceab311eeb94b42e70e8c2070f9ba1025" + integrity sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg== + dependencies: + forwarded "0.2.0" + ipaddr.js "1.9.1" + +prr@~1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/prr/-/prr-1.0.1.tgz#d3fc114ba06995a45ec6893f484ceb1d78f5f476" + integrity sha512-yPw4Sng1gWghHQWj0B3ZggWUm4qVbPwPFcRG8KyxiU7J2OHFSoEHKS+EZ3fv5l1t9CyCiop6l/ZYeWbrgoQejw== + +punycode@^2.1.0: + version "2.3.1" + resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.3.1.tgz#027422e2faec0b25e1549c3e1bd8309b9133b6e5" + integrity sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg== + +qs@6.13.0: + version "6.13.0" + resolved "https://registry.yarnpkg.com/qs/-/qs-6.13.0.tgz#6ca3bd58439f7e245655798997787b0d88a51906" + integrity sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg== + dependencies: + side-channel "^1.0.6" + queue-lit@^1.5.1: version "1.5.2" resolved "https://registry.yarnpkg.com/queue-lit/-/queue-lit-1.5.2.tgz#83c24d4f4764802377b05a6e5c73017caf3f8747" @@ -901,6 +5286,55 @@ queue-microtask@^1.2.2: resolved "https://registry.yarnpkg.com/queue-microtask/-/queue-microtask-1.2.3.tgz#4929228bbc724dfac43e0efb058caf7b6cfb6243" integrity sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A== +randombytes@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/randombytes/-/randombytes-2.1.0.tgz#df6f84372f0270dc65cdf6291349ab7a473d4f2a" + integrity sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ== + dependencies: + safe-buffer "^5.1.0" + +range-parser@^1.2.1, range-parser@~1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-1.2.1.tgz#3cf37023d199e1c24d1a55b84800c2f3e6468031" + integrity sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg== + +raw-body@2.5.2: + version "2.5.2" + resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.5.2.tgz#99febd83b90e08975087e8f1f9419a149366b68a" + integrity sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA== + dependencies: + bytes "3.1.2" + http-errors "2.0.0" + iconv-lite "0.4.24" + unpipe "1.0.0" + +readable-stream@^2.0.1: + version "2.3.8" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.8.tgz#91125e8042bba1b9887f49345f6277027ce8be9b" + integrity sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA== + dependencies: + core-util-is "~1.0.0" + inherits "~2.0.3" + isarray "~1.0.0" + process-nextick-args "~2.0.0" + safe-buffer "~5.1.1" + string_decoder "~1.1.1" + util-deprecate "~1.0.1" + +readable-stream@^3.0.6, readable-stream@^3.4.0: + version "3.6.2" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.2.tgz#56a9b36ea965c00c5a93ef31eb111a0f11056967" + integrity sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA== + dependencies: + inherits "^2.0.3" + string_decoder "^1.1.1" + util-deprecate "^1.0.1" + +readdirp@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-4.0.1.tgz#b2fe35f8dca63183cd3b86883ecc8f720ea96ae6" + integrity sha512-GkMg9uOTpIWWKbSsgwb5fA4EavTR+SG/PMPoAY8hkhHfEEY0/vqljY+XHqtDf2cr2IJtoNRDbrrEpZUiZCkYRw== + readdirp@~3.6.0: version "3.6.0" resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.6.0.tgz#74a370bd857116e245b29cc97340cd431a02a6c7" @@ -908,6 +5342,74 @@ readdirp@~3.6.0: dependencies: picomatch "^2.2.1" +reflect-metadata@^0.2.0: + version "0.2.2" + resolved "https://registry.yarnpkg.com/reflect-metadata/-/reflect-metadata-0.2.2.tgz#400c845b6cba87a21f2c65c4aeb158f4fa4d9c5b" + integrity sha512-urBwgfrvVP/eAyXx4hluJivBKzuEbSQs9rKWCrCkbSxNv8mxPcUZKeuoF3Uy4mJl3Lwprp6yy5/39VWigZ4K6Q== + +regenerate-unicode-properties@^10.1.0: + version "10.2.0" + resolved "https://registry.yarnpkg.com/regenerate-unicode-properties/-/regenerate-unicode-properties-10.2.0.tgz#626e39df8c372338ea9b8028d1f99dc3fd9c3db0" + integrity sha512-DqHn3DwbmmPVzeKj9woBadqmXxLvQoQIwu7nopMc72ztvxVmVk2SBhSnx67zuye5TP+lJsb/TBQsjLKhnDf3MA== + dependencies: + regenerate "^1.4.2" + +regenerate@^1.4.2: + version "1.4.2" + resolved "https://registry.yarnpkg.com/regenerate/-/regenerate-1.4.2.tgz#b9346d8827e8f5a32f7ba29637d398b69014848a" + integrity sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A== + +regenerator-runtime@^0.14.0: + version "0.14.1" + resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz#356ade10263f685dda125100cd862c1db895327f" + integrity sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw== + +regenerator-transform@^0.15.2: + version "0.15.2" + resolved "https://registry.yarnpkg.com/regenerator-transform/-/regenerator-transform-0.15.2.tgz#5bbae58b522098ebdf09bca2f83838929001c7a4" + integrity sha512-hfMp2BoF0qOk3uc5V20ALGDS2ddjQaLrdl7xrGXvAIow7qeWRM2VA2HuCHkUKk9slq3VwEwLNK3DFBqDfPGYtg== + dependencies: + "@babel/runtime" "^7.8.4" + +regex-parser@^2.2.11: + version "2.3.0" + resolved "https://registry.yarnpkg.com/regex-parser/-/regex-parser-2.3.0.tgz#4bb61461b1a19b8b913f3960364bb57887f920ee" + integrity sha512-TVILVSz2jY5D47F4mA4MppkBrafEaiUWJO/TcZHEIuI13AqoZMkK1WMA4Om1YkYbTx+9Ki1/tSUXbceyr9saRg== + +regexpu-core@^5.3.1: + version "5.3.2" + resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-5.3.2.tgz#11a2b06884f3527aec3e93dbbf4a3b958a95546b" + integrity sha512-RAM5FlZz+Lhmo7db9L298p2vHP5ZywrVXmVXpmAD9GuL5MPH6t9ROw1iA/wfHkQ76Qe7AaPF0nGuim96/IrQMQ== + dependencies: + "@babel/regjsgen" "^0.8.0" + regenerate "^1.4.2" + regenerate-unicode-properties "^10.1.0" + regjsparser "^0.9.1" + unicode-match-property-ecmascript "^2.0.0" + unicode-match-property-value-ecmascript "^2.1.0" + +regjsparser@^0.9.1: + version "0.9.1" + resolved "https://registry.yarnpkg.com/regjsparser/-/regjsparser-0.9.1.tgz#272d05aa10c7c1f67095b1ff0addae8442fc5709" + integrity sha512-dQUtn90WanSNl+7mQKcXAgZxvUe7Z0SqXlgzv0za4LwiUhyzBC58yQO3liFoUgu8GiJVInAhJjkj1N0EtQ5nkQ== + dependencies: + jsesc "~0.5.0" + +require-directory@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" + integrity sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q== + +require-from-string@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/require-from-string/-/require-from-string-2.0.2.tgz#89a7fdd938261267318eafe14f9c32e598c36909" + integrity sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw== + +requires-port@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/requires-port/-/requires-port-1.0.0.tgz#925d2601d39ac485e091cf0da5c6e694dc3dcaff" + integrity sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ== + resolve-from@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-4.0.0.tgz#4abcd852ad32dd7baabfe9b40e00a36db5f392e6" @@ -918,6 +5420,26 @@ resolve-pkg-maps@^1.0.0: resolved "https://registry.yarnpkg.com/resolve-pkg-maps/-/resolve-pkg-maps-1.0.0.tgz#616b3dc2c57056b5588c31cdf4b3d64db133720f" integrity sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw== +resolve-url-loader@5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/resolve-url-loader/-/resolve-url-loader-5.0.0.tgz#ee3142fb1f1e0d9db9524d539cfa166e9314f795" + integrity sha512-uZtduh8/8srhBoMx//5bwqjQ+rfYOUq8zC9NrMUGtjBiGTtFJM42s58/36+hTqeqINcnYe08Nj3LkK9lW4N8Xg== + dependencies: + adjust-sourcemap-loader "^4.0.0" + convert-source-map "^1.7.0" + loader-utils "^2.0.0" + postcss "^8.2.14" + source-map "0.6.1" + +resolve@^1.14.2, resolve@^1.22.1: + version "1.22.8" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.8.tgz#b6c87a9f2aa06dfab52e3d70ac8cde321fa5a48d" + integrity sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw== + dependencies: + is-core-module "^2.13.0" + path-parse "^1.0.7" + supports-preserve-symlinks-flag "^1.0.0" + restore-cursor@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-3.1.0.tgz#39f67c54b3a7a58cea5236d95cf0034239631f7e" @@ -926,16 +5448,91 @@ restore-cursor@^3.1.0: onetime "^5.1.0" signal-exit "^3.0.2" +restore-cursor@^5.0.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-5.1.0.tgz#0766d95699efacb14150993f55baf0953ea1ebe7" + integrity sha512-oMA2dcrw6u0YfxJQXm342bFKX/E4sG9rbTzO9ptUcR/e8A33cHuvStiYOwH7fszkZlZ1z/ta9AAoPk2F4qIOHA== + dependencies: + onetime "^7.0.0" + signal-exit "^4.1.0" + +retry@^0.13.1: + version "0.13.1" + resolved "https://registry.yarnpkg.com/retry/-/retry-0.13.1.tgz#185b1587acf67919d63b357349e03537b2484658" + integrity sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg== + reusify@^1.0.4: version "1.0.4" resolved "https://registry.yarnpkg.com/reusify/-/reusify-1.0.4.tgz#90da382b1e126efc02146e90845a88db12925d76" integrity sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw== -rfdc@^1.3.0: +rfdc@^1.3.0, rfdc@^1.4.1: version "1.4.1" resolved "https://registry.yarnpkg.com/rfdc/-/rfdc-1.4.1.tgz#778f76c4fb731d93414e8f925fbecf64cce7f6ca" integrity sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA== +rimraf@^5.0.5: + version "5.0.10" + resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-5.0.10.tgz#23b9843d3dc92db71f96e1a2ce92e39fd2a8221c" + integrity sha512-l0OE8wL34P4nJH/H2ffoaniAokM2qSmrtXHmlpvYr5AVVX8msAyW0l8NVJFDxlSK4u3Uh/f41cQheDVdnYijwQ== + dependencies: + glob "^10.3.7" + +rollup@4.22.4: + version "4.22.4" + resolved "https://registry.yarnpkg.com/rollup/-/rollup-4.22.4.tgz#4135a6446671cd2a2453e1ad42a45d5973ec3a0f" + integrity sha512-vD8HJ5raRcWOyymsR6Z3o6+RzfEPCnVLMFJ6vRslO1jt4LO6dUo5Qnpg7y4RkZFM2DMe3WUirkI5c16onjrc6A== + dependencies: + "@types/estree" "1.0.5" + optionalDependencies: + "@rollup/rollup-android-arm-eabi" "4.22.4" + "@rollup/rollup-android-arm64" "4.22.4" + "@rollup/rollup-darwin-arm64" "4.22.4" + "@rollup/rollup-darwin-x64" "4.22.4" + "@rollup/rollup-linux-arm-gnueabihf" "4.22.4" + "@rollup/rollup-linux-arm-musleabihf" "4.22.4" + "@rollup/rollup-linux-arm64-gnu" "4.22.4" + "@rollup/rollup-linux-arm64-musl" "4.22.4" + "@rollup/rollup-linux-powerpc64le-gnu" "4.22.4" + "@rollup/rollup-linux-riscv64-gnu" "4.22.4" + "@rollup/rollup-linux-s390x-gnu" "4.22.4" + "@rollup/rollup-linux-x64-gnu" "4.22.4" + "@rollup/rollup-linux-x64-musl" "4.22.4" + "@rollup/rollup-win32-arm64-msvc" "4.22.4" + "@rollup/rollup-win32-ia32-msvc" "4.22.4" + "@rollup/rollup-win32-x64-msvc" "4.22.4" + fsevents "~2.3.2" + +rollup@^4.18.0, rollup@^4.20.0: + version "4.22.5" + resolved "https://registry.yarnpkg.com/rollup/-/rollup-4.22.5.tgz#d5108cc470249417e50492456253884d19f5d40f" + integrity sha512-WoinX7GeQOFMGznEcWA1WrTQCd/tpEbMkc3nuMs9BT0CPjMdSjPMTVClwWd4pgSQwJdP65SK9mTCNvItlr5o7w== + dependencies: + "@types/estree" "1.0.6" + optionalDependencies: + "@rollup/rollup-android-arm-eabi" "4.22.5" + "@rollup/rollup-android-arm64" "4.22.5" + "@rollup/rollup-darwin-arm64" "4.22.5" + "@rollup/rollup-darwin-x64" "4.22.5" + "@rollup/rollup-linux-arm-gnueabihf" "4.22.5" + "@rollup/rollup-linux-arm-musleabihf" "4.22.5" + "@rollup/rollup-linux-arm64-gnu" "4.22.5" + "@rollup/rollup-linux-arm64-musl" "4.22.5" + "@rollup/rollup-linux-powerpc64le-gnu" "4.22.5" + "@rollup/rollup-linux-riscv64-gnu" "4.22.5" + "@rollup/rollup-linux-s390x-gnu" "4.22.5" + "@rollup/rollup-linux-x64-gnu" "4.22.5" + "@rollup/rollup-linux-x64-musl" "4.22.5" + "@rollup/rollup-win32-arm64-msvc" "4.22.5" + "@rollup/rollup-win32-ia32-msvc" "4.22.5" + "@rollup/rollup-win32-x64-msvc" "4.22.5" + fsevents "~2.3.2" + +run-applescript@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/run-applescript/-/run-applescript-7.0.0.tgz#e5a553c2bffd620e169d276c1cd8f1b64778fbeb" + integrity sha512-9by4Ij99JUr/MCFBUkDKLWK3G9HVXmabKz9U5MlIAIuvuzkiOicRYs8XJLxX+xahD+mLiiCYDqF9dKAgtzKP1A== + run-parallel@^1.1.9: version "1.2.0" resolved "https://registry.yarnpkg.com/run-parallel/-/run-parallel-1.2.0.tgz#66d1368da7bdf921eb9d95bd1a9229e7f21a43ee" @@ -943,13 +5540,90 @@ run-parallel@^1.1.9: dependencies: queue-microtask "^1.2.2" -rxjs@^7.5.1, rxjs@^7.8.1: +rxjs@7.8.1, rxjs@^7.5.1, rxjs@^7.8.1: version "7.8.1" resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-7.8.1.tgz#6f6f3d99ea8044291efd92e7c7fcf562c4057543" integrity sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg== dependencies: tslib "^2.1.0" +safe-buffer@5.1.2, safe-buffer@~5.1.0, safe-buffer@~5.1.1: + version "5.1.2" + resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" + integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== + +safe-buffer@5.2.1, safe-buffer@>=5.1.0, safe-buffer@^5.1.0, safe-buffer@~5.2.0: + version "5.2.1" + resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" + integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== + +"safer-buffer@>= 2.1.2 < 3", "safer-buffer@>= 2.1.2 < 3.0.0": + version "2.1.2" + resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" + integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== + +sass-loader@16.0.0: + version "16.0.0" + resolved "https://registry.yarnpkg.com/sass-loader/-/sass-loader-16.0.0.tgz#9b8d497e24bc176dc368df2b5b9e90b4ad24bf4e" + integrity sha512-n13Z+3rU9A177dk4888czcVFiC8CL9dii4qpXWUg3YIIgZEvi9TCFKjOQcbK0kJM7DJu9VucrZFddvNfYCPwtw== + dependencies: + neo-async "^2.6.2" + +sass@1.77.6: + version "1.77.6" + resolved "https://registry.yarnpkg.com/sass/-/sass-1.77.6.tgz#898845c1348078c2e6d1b64f9ee06b3f8bd489e4" + integrity sha512-ByXE1oLD79GVq9Ht1PeHWCPMPB8XHpBuz1r85oByKHjZY6qV6rWnQovQzXJXuQ/XyE1Oj3iPk3lo28uzaRA2/Q== + dependencies: + chokidar ">=3.0.0 <4.0.0" + immutable "^4.0.0" + source-map-js ">=0.6.2 <2.0.0" + +sass@^1.69.5: + version "1.79.4" + resolved "https://registry.yarnpkg.com/sass/-/sass-1.79.4.tgz#f9c45af35fbeb53d2c386850ec842098d9935267" + integrity sha512-K0QDSNPXgyqO4GZq2HO5Q70TLxTH6cIT59RdoCHMivrC8rqzaTw5ab9prjz9KUN1El4FLXrBXJhik61JR4HcGg== + dependencies: + chokidar "^4.0.0" + immutable "^4.0.0" + source-map-js ">=0.6.2 <2.0.0" + +sax@^1.2.4: + version "1.4.1" + resolved "https://registry.yarnpkg.com/sax/-/sax-1.4.1.tgz#44cc8988377f126304d3b3fc1010c733b929ef0f" + integrity sha512-+aWOz7yVScEGoKNd4PA10LZ8sk0A/z5+nXQG5giUO5rprX9jgYsTdov9qCchZiPIZezbZH+jRut8nPodFAX4Jg== + +schema-utils@^3.1.1, schema-utils@^3.2.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-3.3.0.tgz#f50a88877c3c01652a15b622ae9e9795df7a60fe" + integrity sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg== + dependencies: + "@types/json-schema" "^7.0.8" + ajv "^6.12.5" + ajv-keywords "^3.5.2" + +schema-utils@^4.0.0, schema-utils@^4.2.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-4.2.0.tgz#70d7c93e153a273a805801882ebd3bff20d89c8b" + integrity sha512-L0jRsrPpjdckP3oPug3/VxNKt2trR8TcabrM6FOAAlvC/9Phcmm+cuAgTlxBqdBR1WJx7Naj9WHw+aOmheSVbw== + dependencies: + "@types/json-schema" "^7.0.9" + ajv "^8.9.0" + ajv-formats "^2.1.1" + ajv-keywords "^5.1.0" + +select-hose@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/select-hose/-/select-hose-2.0.0.tgz#625d8658f865af43ec962bfc376a37359a4994ca" + integrity sha512-mEugaLK+YfkijB4fx0e6kImuJdCIt2LxCRcbEYPqRGCs4F2ogyfZU5IAZRdjCP8JPq2AtdNoC/Dux63d9Kiryg== + +selfsigned@^2.4.1: + version "2.4.1" + resolved "https://registry.yarnpkg.com/selfsigned/-/selfsigned-2.4.1.tgz#560d90565442a3ed35b674034cec4e95dceb4ae0" + integrity sha512-th5B4L2U+eGLq1TVh7zNRGBapioSORUeymIydxgFpwww9d2qyKvtuPU2jJuHvYAwwqi2Y596QBL3eEqcPEYL8Q== + dependencies: + "@types/node-forge" "^1.3.0" + node-forge "^1" + semver-compare@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/semver-compare/-/semver-compare-1.0.0.tgz#0dee216a1c941ab37e9efb1788f6afc5ff5537fc" @@ -960,6 +5634,99 @@ semver-regex@^3.1.2: resolved "https://registry.yarnpkg.com/semver-regex/-/semver-regex-3.1.4.tgz#13053c0d4aa11d070a2f2872b6b1e3ae1e1971b4" integrity sha512-6IiqeZNgq01qGf0TId0t3NvKzSvUsjcpdEO3AQNeIjR6A2+ckTnQlDpl4qu1bjRv0RzN3FP9hzFmws3lKqRWkA== +semver@7.6.3, semver@^7.0.0, semver@^7.3.5, semver@^7.5.4: + version "7.6.3" + resolved "https://registry.yarnpkg.com/semver/-/semver-7.6.3.tgz#980f7b5550bc175fb4dc09403085627f9eb33143" + integrity sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A== + +semver@^5.6.0: + version "5.7.2" + resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.2.tgz#48d55db737c3287cd4835e17fa13feace1c41ef8" + integrity sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g== + +semver@^6.0.0, semver@^6.3.1: + version "6.3.1" + resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.1.tgz#556d2ef8689146e46dcea4bfdd095f3434dffcb4" + integrity sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA== + +send@0.19.0: + version "0.19.0" + resolved "https://registry.yarnpkg.com/send/-/send-0.19.0.tgz#bbc5a388c8ea6c048967049dbeac0e4a3f09d7f8" + integrity sha512-dW41u5VfLXu8SJh5bwRmyYUbAoSB3c9uQh6L8h/KtsFREPWpbX1lrljJo186Jc4nmci/sGUZ9a0a0J2zgfq2hw== + dependencies: + debug "2.6.9" + depd "2.0.0" + destroy "1.2.0" + encodeurl "~1.0.2" + escape-html "~1.0.3" + etag "~1.8.1" + fresh "0.5.2" + http-errors "2.0.0" + mime "1.6.0" + ms "2.1.3" + on-finished "2.4.1" + range-parser "~1.2.1" + statuses "2.0.1" + +serialize-javascript@^6.0.1, serialize-javascript@^6.0.2: + version "6.0.2" + resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-6.0.2.tgz#defa1e055c83bf6d59ea805d8da862254eb6a6c2" + integrity sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g== + dependencies: + randombytes "^2.1.0" + +serve-index@^1.9.1: + version "1.9.1" + resolved "https://registry.yarnpkg.com/serve-index/-/serve-index-1.9.1.tgz#d3768d69b1e7d82e5ce050fff5b453bea12a9239" + integrity sha512-pXHfKNP4qujrtteMrSBb0rc8HJ9Ms/GrXwcUtUtD5s4ewDJI8bT3Cz2zTVRMKtri49pLx2e0Ya8ziP5Ya2pZZw== + dependencies: + accepts "~1.3.4" + batch "0.6.1" + debug "2.6.9" + escape-html "~1.0.3" + http-errors "~1.6.2" + mime-types "~2.1.17" + parseurl "~1.3.2" + +serve-static@1.16.2: + version "1.16.2" + resolved "https://registry.yarnpkg.com/serve-static/-/serve-static-1.16.2.tgz#b6a5343da47f6bdd2673848bf45754941e803296" + integrity sha512-VqpjJZKadQB/PEbEwvFdO43Ax5dFBZ2UECszz8bQ7pi7wt//PWe1P6MN7eCnjsatYtBT6EuiClbjSWP2WrIoTw== + dependencies: + encodeurl "~2.0.0" + escape-html "~1.0.3" + parseurl "~1.3.3" + send "0.19.0" + +set-function-length@^1.2.1: + version "1.2.2" + resolved "https://registry.yarnpkg.com/set-function-length/-/set-function-length-1.2.2.tgz#aac72314198eaed975cf77b2c3b6b880695e5449" + integrity sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg== + dependencies: + define-data-property "^1.1.4" + es-errors "^1.3.0" + function-bind "^1.1.2" + get-intrinsic "^1.2.4" + gopd "^1.0.1" + has-property-descriptors "^1.0.2" + +setprototypeof@1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.1.0.tgz#d0bd85536887b6fe7c0d818cb962d9d91c54e656" + integrity sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ== + +setprototypeof@1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.2.0.tgz#66c9a24a73f9fc28cbe66b09fed3d33dcaf1b424" + integrity sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw== + +shallow-clone@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/shallow-clone/-/shallow-clone-3.0.1.tgz#8f2981ad92531f55035b01fb230769a40e02efa3" + integrity sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA== + dependencies: + kind-of "^6.0.2" + shebang-command@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-2.0.0.tgz#ccd0af4f8835fbdc265b82461aaf0c36663f34ea" @@ -972,16 +5739,41 @@ shebang-regex@^3.0.0: resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172" integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== +shell-quote@^1.8.1: + version "1.8.1" + resolved "https://registry.yarnpkg.com/shell-quote/-/shell-quote-1.8.1.tgz#6dbf4db75515ad5bac63b4f1894c3a154c766680" + integrity sha512-6j1W9l1iAs/4xYBI1SYOVZyFcCis9b4KCLQ8fgAGG07QvzaRLVVRQvAy85yNmmZSjYjg4MWh4gNvlPujU/5LpA== + +side-channel@^1.0.6: + version "1.0.6" + resolved "https://registry.yarnpkg.com/side-channel/-/side-channel-1.0.6.tgz#abd25fb7cd24baf45466406b1096b7831c9215f2" + integrity sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA== + dependencies: + call-bind "^1.0.7" + es-errors "^1.3.0" + get-intrinsic "^1.2.4" + object-inspect "^1.13.1" + signal-exit@^3.0.2, signal-exit@^3.0.3: version "3.0.7" resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.7.tgz#a9a1767f8af84155114eaabd73f99273c8f59ad9" integrity sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ== +signal-exit@^4.0.1, signal-exit@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-4.1.0.tgz#952188c1cbd546070e2dd20d0f41c0ae0530cb04" + integrity sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw== + slash@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/slash/-/slash-3.0.0.tgz#6539be870c165adbd5240220dbe361f1bc4d4634" integrity sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q== +slash@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/slash/-/slash-5.1.0.tgz#be3adddcdf09ac38eebe8dcdc7b1a57a75b095ce" + integrity sha512-ZA6oR3T/pEyuqwMgAKT0/hAv8oAXckzbkmR0UkUosQ+Mc4RxGoJkRmwHgHufaenlyAgE1Mxgpdcrf75y6XcnDg== + slice-ansi@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-3.0.0.tgz#31ddc10930a1b7e0b67b08c96c2f49b77a789787" @@ -1000,12 +5792,117 @@ slice-ansi@^4.0.0: astral-regex "^2.0.0" is-fullwidth-code-point "^3.0.0" +slice-ansi@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-5.0.0.tgz#b73063c57aa96f9cd881654b15294d95d285c42a" + integrity sha512-FC+lgizVPfie0kkhqUScwRu1O/lF6NOgJmlCgK+/LYxDCTk8sGelYaHDhFcDN+Sn3Cv+3VSa4Byeo+IMCzpMgQ== + dependencies: + ansi-styles "^6.0.0" + is-fullwidth-code-point "^4.0.0" + +slice-ansi@^7.1.0: + version "7.1.0" + resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-7.1.0.tgz#cd6b4655e298a8d1bdeb04250a433094b347b9a9" + integrity sha512-bSiSngZ/jWeX93BqeIAbImyTbEihizcwNjFoRUIY/T1wWQsfsm2Vw1agPKylXvQTU7iASGdHhyqRlqQzfz+Htg== + dependencies: + ansi-styles "^6.2.1" + is-fullwidth-code-point "^5.0.0" + +sockjs@^0.3.24: + version "0.3.24" + resolved "https://registry.yarnpkg.com/sockjs/-/sockjs-0.3.24.tgz#c9bc8995f33a111bea0395ec30aa3206bdb5ccce" + integrity sha512-GJgLTZ7vYb/JtPSSZ10hsOYIvEYsjbNU+zPdIHcUaWVNUEPivzxku31865sSSud0Da0W4lEeOPlmw93zLQchuQ== + dependencies: + faye-websocket "^0.11.3" + uuid "^8.3.2" + websocket-driver "^0.7.4" + +"source-map-js@>=0.6.2 <2.0.0", source-map-js@^1.0.2, source-map-js@^1.2.0, source-map-js@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/source-map-js/-/source-map-js-1.2.1.tgz#1ce5650fddd87abc099eda37dcff024c2667ae46" + integrity sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA== + +source-map-loader@5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/source-map-loader/-/source-map-loader-5.0.0.tgz#f593a916e1cc54471cfc8851b905c8a845fc7e38" + integrity sha512-k2Dur7CbSLcAH73sBcIkV5xjPV4SzqO1NJ7+XaQl8if3VODDUj3FNchNGpqgJSKbvUfJuhVdv8K2Eu8/TNl2eA== + dependencies: + iconv-lite "^0.6.3" + source-map-js "^1.0.2" + +source-map-support@0.5.21, source-map-support@^0.5.5, source-map-support@~0.5.20: + version "0.5.21" + resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.21.tgz#04fe7c7f9e1ed2d662233c28cb2b35b9f63f6e4f" + integrity sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w== + dependencies: + buffer-from "^1.0.0" + source-map "^0.6.0" + +source-map@0.6.1, source-map@^0.6.0, source-map@~0.6.0: + version "0.6.1" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" + integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== + +source-map@0.7.4: + version "0.7.4" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.7.4.tgz#a9bbe705c9d8846f4e08ff6765acf0f1b0898656" + integrity sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA== + +spdy-transport@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/spdy-transport/-/spdy-transport-3.0.0.tgz#00d4863a6400ad75df93361a1608605e5dcdcf31" + integrity sha512-hsLVFE5SjA6TCisWeJXFKniGGOpBgMLmerfO2aCyCU5s7nJ/rpAepqmFifv/GCbSbueEeAJJnmSQ2rKC/g8Fcw== + dependencies: + debug "^4.1.0" + detect-node "^2.0.4" + hpack.js "^2.1.6" + obuf "^1.1.2" + readable-stream "^3.0.6" + wbuf "^1.7.3" + +spdy@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/spdy/-/spdy-4.0.2.tgz#b74f466203a3eda452c02492b91fb9e84a27677b" + integrity sha512-r46gZQZQV+Kl9oItvl1JZZqJKGr+oEkB08A6BzkiR7593/7IbtuncXHd2YoYeTsG4157ZssMu9KYvUHLcjcDoA== + dependencies: + debug "^4.1.0" + handle-thing "^2.0.0" + http-deceiver "^1.2.7" + select-hose "^2.0.0" + spdy-transport "^3.0.0" + +ssri@^10.0.0: + version "10.0.6" + resolved "https://registry.yarnpkg.com/ssri/-/ssri-10.0.6.tgz#a8aade2de60ba2bce8688e3fa349bad05c7dc1e5" + integrity sha512-MGrFH9Z4NP9Iyhqn16sDtBpRRNJ0Y2hNa6D65h736fVSaPCHr4DM4sWUNvVaSuC+0OBGhwsrydQwmgfg5LncqQ== + dependencies: + minipass "^7.0.3" + +statuses@2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/statuses/-/statuses-2.0.1.tgz#55cb000ccf1d48728bd23c685a063998cf1a1b63" + integrity sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ== + +"statuses@>= 1.4.0 < 2": + version "1.5.0" + resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.5.0.tgz#161c7dac177659fd9811f43771fa99381478628c" + integrity sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA== + string-argv@0.3.1: version "0.3.1" resolved "https://registry.yarnpkg.com/string-argv/-/string-argv-0.3.1.tgz#95e2fbec0427ae19184935f816d74aaa4c5c19da" integrity sha512-a1uQGz7IyVy9YwhqjZIZu1c8JO8dNIe20xBmSS6qu9kv++k3JGzCVmprbNN5Kn+BgzD5E7YYwg1CcjuJMRNsvg== -string-width@^4.1.0, string-width@^4.2.0: +"string-width-cjs@npm:string-width@^4.2.0": + version "4.2.3" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" + integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== + dependencies: + emoji-regex "^8.0.0" + is-fullwidth-code-point "^3.0.0" + strip-ansi "^6.0.1" + +string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3: version "4.2.3" resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== @@ -1014,6 +5911,38 @@ string-width@^4.1.0, string-width@^4.2.0: is-fullwidth-code-point "^3.0.0" strip-ansi "^6.0.1" +string-width@^5.0.1, string-width@^5.1.2: + version "5.1.2" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-5.1.2.tgz#14f8daec6d81e7221d2a357e668cab73bdbca794" + integrity sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA== + dependencies: + eastasianwidth "^0.2.0" + emoji-regex "^9.2.2" + strip-ansi "^7.0.1" + +string-width@^7.0.0: + version "7.2.0" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-7.2.0.tgz#b5bb8e2165ce275d4d43476dd2700ad9091db6dc" + integrity sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ== + dependencies: + emoji-regex "^10.3.0" + get-east-asian-width "^1.0.0" + strip-ansi "^7.1.0" + +string_decoder@^1.1.1: + version "1.3.0" + resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.3.0.tgz#42f114594a46cf1a8e30b0a84f56c78c3edac21e" + integrity sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA== + dependencies: + safe-buffer "~5.2.0" + +string_decoder@~1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.1.1.tgz#9cf1611ba62685d7030ae9e4ba34149c3af03fc8" + integrity sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg== + dependencies: + safe-buffer "~5.1.0" + stringify-object@3.3.0: version "3.3.0" resolved "https://registry.yarnpkg.com/stringify-object/-/stringify-object-3.3.0.tgz#703065aefca19300d3ce88af4f5b3956d7556629" @@ -1023,6 +5952,13 @@ stringify-object@3.3.0: is-obj "^1.0.1" is-regexp "^1.0.0" +"strip-ansi-cjs@npm:strip-ansi@^6.0.1": + version "6.0.1" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" + integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== + dependencies: + ansi-regex "^5.0.1" + strip-ansi@^6.0.0, strip-ansi@^6.0.1: version "6.0.1" resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" @@ -1030,12 +5966,19 @@ strip-ansi@^6.0.0, strip-ansi@^6.0.1: dependencies: ansi-regex "^5.0.1" +strip-ansi@^7.0.1, strip-ansi@^7.1.0: + version "7.1.0" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-7.1.0.tgz#d5b6568ca689d8561370b0707685d22434faff45" + integrity sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ== + dependencies: + ansi-regex "^6.0.1" + strip-final-newline@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/strip-final-newline/-/strip-final-newline-2.0.0.tgz#89b852fb2fcbe936f6f4b3187afb0a12c1ab58ad" integrity sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA== -supports-color@8.1.1: +supports-color@8.1.1, supports-color@^8.0.0: version "8.1.1" resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-8.1.1.tgz#cd6fc17e28500cff56c1b86c0a7fd4a54a73005c" integrity sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q== @@ -1056,11 +5999,79 @@ supports-color@^7.1.0: dependencies: has-flag "^4.0.0" +supports-preserve-symlinks-flag@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz#6eda4bd344a3c94aea376d4cc31bc77311039e09" + integrity sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w== + +tapable@^2.1.1, tapable@^2.2.0, tapable@^2.2.1: + version "2.2.1" + resolved "https://registry.yarnpkg.com/tapable/-/tapable-2.2.1.tgz#1967a73ef4060a82f12ab96af86d52fdb76eeca0" + integrity sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ== + +tar@^6.1.11: + version "6.2.1" + resolved "https://registry.yarnpkg.com/tar/-/tar-6.2.1.tgz#717549c541bc3c2af15751bea94b1dd068d4b03a" + integrity sha512-DZ4yORTwrbTj/7MZYq2w+/ZFdI6OZ/f9SFHR+71gIVUZhOQPHzVCLpvRnPgyaMpfWxxk/4ONva3GQSyNIKRv6A== + dependencies: + chownr "^2.0.0" + fs-minipass "^2.0.0" + minipass "^5.0.0" + minizlib "^2.1.1" + mkdirp "^1.0.3" + yallist "^4.0.0" + +terser-webpack-plugin@^5.3.10: + version "5.3.10" + resolved "https://registry.yarnpkg.com/terser-webpack-plugin/-/terser-webpack-plugin-5.3.10.tgz#904f4c9193c6fd2a03f693a2150c62a92f40d199" + integrity sha512-BKFPWlPDndPs+NGGCr1U59t0XScL5317Y0UReNrHaw9/FwhPENlq6bfgs+4yPfyP51vqC1bQ4rp1EfXW5ZSH9w== + dependencies: + "@jridgewell/trace-mapping" "^0.3.20" + jest-worker "^27.4.5" + schema-utils "^3.1.1" + serialize-javascript "^6.0.1" + terser "^5.26.0" + +terser@5.31.6: + version "5.31.6" + resolved "https://registry.yarnpkg.com/terser/-/terser-5.31.6.tgz#c63858a0f0703988d0266a82fcbf2d7ba76422b1" + integrity sha512-PQ4DAriWzKj+qgehQ7LK5bQqCFNMmlhjR2PFFLuqGCpuCAauxemVBWwWOxo3UIwWQx8+Pr61Df++r76wDmkQBg== + dependencies: + "@jridgewell/source-map" "^0.3.3" + acorn "^8.8.2" + commander "^2.20.0" + source-map-support "~0.5.20" + +terser@^5.26.0: + version "5.34.1" + resolved "https://registry.yarnpkg.com/terser/-/terser-5.34.1.tgz#af40386bdbe54af0d063e0670afd55c3105abeb6" + integrity sha512-FsJZ7iZLd/BXkz+4xrRTGJ26o/6VTjQytUk8b8OxkwcD2I+79VPJlz7qss1+zE7h8GNIScFqXcDyJ/KqBYZFVA== + dependencies: + "@jridgewell/source-map" "^0.3.3" + acorn "^8.8.2" + commander "^2.20.0" + source-map-support "~0.5.20" + +thingies@^1.20.0: + version "1.21.0" + resolved "https://registry.yarnpkg.com/thingies/-/thingies-1.21.0.tgz#e80fbe58fd6fdaaab8fad9b67bd0a5c943c445c1" + integrity sha512-hsqsJsFMsV+aD4s3CWKk85ep/3I9XzYV/IXaSouJMYIoDlgyi11cBhsqYe9/geRfB0YIikBQg6raRaM+nIMP9g== + through@^2.3.8: version "2.3.8" resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" integrity sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg== +thunky@^1.0.2: + version "1.1.0" + resolved "https://registry.yarnpkg.com/thunky/-/thunky-1.1.0.tgz#5abaf714a9405db0504732bbccd2cedd9ef9537d" + integrity sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA== + +to-fast-properties@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-2.0.0.tgz#dc5e698cbd079265bc73e0377681a4e4e83f616e" + integrity sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog== + to-regex-range@^5.0.1: version "5.0.1" resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4" @@ -1068,10 +6079,25 @@ to-regex-range@^5.0.1: dependencies: is-number "^7.0.0" +toidentifier@1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/toidentifier/-/toidentifier-1.0.1.tgz#3be34321a88a820ed1bd80dfaa33e479fbb8dd35" + integrity sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA== + +tree-dump@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/tree-dump/-/tree-dump-1.0.2.tgz#c460d5921caeb197bde71d0e9a7b479848c5b8ac" + integrity sha512-dpev9ABuLWdEubk+cIaI9cHwRNNDjkBBLXTwI4UCUFdQ5xXKqNXoK4FEciw/vxf+NQ7Cb7sGUyeUtORvHIdRXQ== + +tree-kill@1.2.2: + version "1.2.2" + resolved "https://registry.yarnpkg.com/tree-kill/-/tree-kill-1.2.2.tgz#4ca09a9092c88b73a7cdc5e8a01b507b0790a0cc" + integrity sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A== + tsafe@^1.6.6: - version "1.6.6" - resolved "https://registry.yarnpkg.com/tsafe/-/tsafe-1.6.6.tgz#fd93e64d6eb13ef83ed1650669cc24bad4f5df9f" - integrity sha512-gzkapsdbMNwBnTIjgO758GujLCj031IgHK/PKr2mrmkCSJMhSOR5FeOuSxKLMUoYc0vAA4RGEYYbjt/v6afD3g== + version "1.7.2" + resolved "https://registry.yarnpkg.com/tsafe/-/tsafe-1.7.2.tgz#0f63d414876287ad01b135f832722f93e22da374" + integrity sha512-dAPfQLhCfCRre5qs+Z5Q2a7s2CV7RxffZUmvj7puGaePYjECzWREJFd3w4XSFe/T5tbxgowfItA/JSSZ6Ma3dA== tsc-alias@^1.8.10: version "1.8.10" @@ -1085,7 +6111,12 @@ tsc-alias@^1.8.10: normalize-path "^3.0.0" plimit-lit "^1.2.6" -tslib@^2.1.0, tslib@^2.3.0: +tslib@2.6.3: + version "2.6.3" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.6.3.tgz#0438f810ad7a9edcde7a241c3d80db693c8cbfe0" + integrity sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ== + +tslib@^2.0.0, tslib@^2.1.0, tslib@^2.3.0, tslib@^2.7.0: version "2.7.0" resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.7.0.tgz#d9b40c5c40ab59e8738f297df3087bf1a2690c01" integrity sha512-gLXCKdN1/j47AiHiOkJN69hJmcbGTHI0ImLmbYLHykhgeN0jVGola9yVjFgzCUklsZQMW55o+dW7IXv3RCXDzA== @@ -1105,16 +6136,269 @@ type-fest@^0.21.3: resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.21.3.tgz#d260a24b0198436e133fa26a524a6d65fa3b2e37" integrity sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w== -typescript@^4.9.4: - version "4.9.5" - resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.9.5.tgz#095979f9bcc0d09da324d58d03ce8f8374cbe65a" - integrity sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g== +type-is@~1.6.18: + version "1.6.18" + resolved "https://registry.yarnpkg.com/type-is/-/type-is-1.6.18.tgz#4e552cd05df09467dcbc4ef739de89f2cf37c131" + integrity sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g== + dependencies: + media-typer "0.3.0" + mime-types "~2.1.24" + +typed-assert@^1.0.8: + version "1.0.9" + resolved "https://registry.yarnpkg.com/typed-assert/-/typed-assert-1.0.9.tgz#8af9d4f93432c4970ec717e3006f33f135b06213" + integrity sha512-KNNZtayBCtmnNmbo5mG47p1XsCyrx6iVqomjcZnec/1Y5GGARaxPs6r49RnSPeUP3YjNYiU9sQHAtY4BBvnZwg== + +typescript@~5.4.0: + version "5.4.5" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.4.5.tgz#42ccef2c571fdbd0f6718b1d1f5e6e5ef006f611" + integrity sha512-vcI4UpRgg81oIRUFwR0WSIHKt11nJ7SAVlYNIu+QpqeyXP+gpQJy/Z4+F0aGxSE4MqwjyXvW/TzgkLAx2AGHwQ== undici-types@~6.19.2: version "6.19.8" resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-6.19.8.tgz#35111c9d1437ab83a7cdc0abae2f26d88eda0a02" integrity sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw== +unicode-canonical-property-names-ecmascript@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.1.tgz#cb3173fe47ca743e228216e4a3ddc4c84d628cc2" + integrity sha512-dA8WbNeb2a6oQzAQ55YlT5vQAWGV9WXOsi3SskE3bcCdM0P4SDd+24zS/OCacdRq5BkdsRj9q3Pg6YyQoxIGqg== + +unicode-match-property-ecmascript@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-2.0.0.tgz#54fd16e0ecb167cf04cf1f756bdcc92eba7976c3" + integrity sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q== + dependencies: + unicode-canonical-property-names-ecmascript "^2.0.0" + unicode-property-aliases-ecmascript "^2.0.0" + +unicode-match-property-value-ecmascript@^2.1.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.2.0.tgz#a0401aee72714598f739b68b104e4fe3a0cb3c71" + integrity sha512-4IehN3V/+kkr5YeSSDDQG8QLqO26XpL2XP3GQtqwlT/QYSECAwFztxVHjlbh0+gjJ3XmNLS0zDsbgs9jWKExLg== + +unicode-property-aliases-ecmascript@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.1.0.tgz#43d41e3be698bd493ef911077c9b131f827e8ccd" + integrity sha512-6t3foTQI9qne+OZoVQB/8x8rk2k1eVy1gRXhV3oFQ5T6R1dqQ1xtin3XqSlx3+ATBkliTaR/hHyJBm+LVPNM8w== + +unicorn-magic@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/unicorn-magic/-/unicorn-magic-0.1.0.tgz#1bb9a51c823aaf9d73a8bfcd3d1a23dde94b0ce4" + integrity sha512-lRfVq8fE8gz6QMBuDM6a+LO3IAzTi05H6gCVaUpir2E1Rwpo4ZUog45KpNXKC/Mn3Yb9UDuHumeFTo9iV/D9FQ== + +unique-filename@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/unique-filename/-/unique-filename-3.0.0.tgz#48ba7a5a16849f5080d26c760c86cf5cf05770ea" + integrity sha512-afXhuC55wkAmZ0P18QsVE6kp8JaxrEokN2HGIoIVv2ijHQd419H0+6EigAFcIzXeMIkcIkNBpB3L/DXB3cTS/g== + dependencies: + unique-slug "^4.0.0" + +unique-slug@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/unique-slug/-/unique-slug-4.0.0.tgz#6bae6bb16be91351badd24cdce741f892a6532e3" + integrity sha512-WrcA6AyEfqDX5bWige/4NQfPZMtASNVxdmWR76WESYQVAACSgWcR6e9i0mofqqBxYFtL4oAxPIptY73/0YE1DQ== + dependencies: + imurmurhash "^0.1.4" + +unpipe@1.0.0, unpipe@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec" + integrity sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ== + +update-browserslist-db@^1.1.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/update-browserslist-db/-/update-browserslist-db-1.1.1.tgz#80846fba1d79e82547fb661f8d141e0945755fe5" + integrity sha512-R8UzCaa9Az+38REPiJ1tXlImTJXlVfgHZsglwBD/k6nj76ctsH1E3q4doGrukiLQd3sGQYu56r5+lo5r94l29A== + dependencies: + escalade "^3.2.0" + picocolors "^1.1.0" + +uri-js@^4.2.2: + version "4.4.1" + resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.4.1.tgz#9b1a52595225859e55f669d928f88c6c57f2a77e" + integrity sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg== + dependencies: + punycode "^2.1.0" + +util-deprecate@^1.0.1, util-deprecate@^1.0.2, util-deprecate@~1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" + integrity sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw== + +utils-merge@1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/utils-merge/-/utils-merge-1.0.1.tgz#9f95710f50a267947b2ccc124741c1028427e713" + integrity sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA== + +uuid@^8.3.2: + version "8.3.2" + resolved "https://registry.yarnpkg.com/uuid/-/uuid-8.3.2.tgz#80d5b5ced271bb9af6c445f21a1a04c606cefbe2" + integrity sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg== + +vary@~1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/vary/-/vary-1.1.2.tgz#2299f02c6ded30d4a5961b0b9f74524a18f634fc" + integrity sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg== + +vite@5.4.6: + version "5.4.6" + resolved "https://registry.yarnpkg.com/vite/-/vite-5.4.6.tgz#85a93a1228a7fb5a723ca1743e337a2588ed008f" + integrity sha512-IeL5f8OO5nylsgzd9tq4qD2QqI0k2CQLGrWD0rCN0EQJZpBK5vJAx0I+GDkMOXxQX/OfFHMuLIx6ddAxGX/k+Q== + dependencies: + esbuild "^0.21.3" + postcss "^8.4.43" + rollup "^4.20.0" + optionalDependencies: + fsevents "~2.3.3" + +watchpack@2.4.1: + version "2.4.1" + resolved "https://registry.yarnpkg.com/watchpack/-/watchpack-2.4.1.tgz#29308f2cac150fa8e4c92f90e0ec954a9fed7fff" + integrity sha512-8wrBCMtVhqcXP2Sup1ctSkga6uc2Bx0IIvKyT7yTFier5AXHooSI+QyQQAtTb7+E0IUCCKyTFmXqdqgum2XWGg== + dependencies: + glob-to-regexp "^0.4.1" + graceful-fs "^4.1.2" + +watchpack@^2.4.1: + version "2.4.2" + resolved "https://registry.yarnpkg.com/watchpack/-/watchpack-2.4.2.tgz#2feeaed67412e7c33184e5a79ca738fbd38564da" + integrity sha512-TnbFSbcOCcDgjZ4piURLCbJ3nJhznVh9kw6F6iokjiFPl8ONxe9A6nMDVXDiNbrSfLILs6vB07F7wLBrwPYzJw== + dependencies: + glob-to-regexp "^0.4.1" + graceful-fs "^4.1.2" + +wbuf@^1.1.0, wbuf@^1.7.3: + version "1.7.3" + resolved "https://registry.yarnpkg.com/wbuf/-/wbuf-1.7.3.tgz#c1d8d149316d3ea852848895cb6a0bfe887b87df" + integrity sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA== + dependencies: + minimalistic-assert "^1.0.0" + +wcwidth@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/wcwidth/-/wcwidth-1.0.1.tgz#f0b0dcf915bc5ff1528afadb2c0e17b532da2fe8" + integrity sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg== + dependencies: + defaults "^1.0.3" + +weak-lru-cache@^1.2.2: + version "1.2.2" + resolved "https://registry.yarnpkg.com/weak-lru-cache/-/weak-lru-cache-1.2.2.tgz#fdbb6741f36bae9540d12f480ce8254060dccd19" + integrity sha512-DEAoo25RfSYMuTGc9vPJzZcZullwIqRDSI9LOy+fkCJPi6hykCnfKaXTuPBDuXAUcqHXyOgFtHNp/kB2FjYHbw== + +webpack-dev-middleware@7.4.2, webpack-dev-middleware@^7.1.0: + version "7.4.2" + resolved "https://registry.yarnpkg.com/webpack-dev-middleware/-/webpack-dev-middleware-7.4.2.tgz#40e265a3d3d26795585cff8207630d3a8ff05877" + integrity sha512-xOO8n6eggxnwYpy1NlzUKpvrjfJTvae5/D6WOK0S2LSo7vjmo5gCM1DbLUmFqrMTJP+W/0YZNctm7jasWvLuBA== + dependencies: + colorette "^2.0.10" + memfs "^4.6.0" + mime-types "^2.1.31" + on-finished "^2.4.1" + range-parser "^1.2.1" + schema-utils "^4.0.0" + +webpack-dev-server@5.0.4: + version "5.0.4" + resolved "https://registry.yarnpkg.com/webpack-dev-server/-/webpack-dev-server-5.0.4.tgz#cb6ea47ff796b9251ec49a94f24a425e12e3c9b8" + integrity sha512-dljXhUgx3HqKP2d8J/fUMvhxGhzjeNVarDLcbO/EWMSgRizDkxHQDZQaLFL5VJY9tRBj2Gz+rvCEYYvhbqPHNA== + dependencies: + "@types/bonjour" "^3.5.13" + "@types/connect-history-api-fallback" "^1.5.4" + "@types/express" "^4.17.21" + "@types/serve-index" "^1.9.4" + "@types/serve-static" "^1.15.5" + "@types/sockjs" "^0.3.36" + "@types/ws" "^8.5.10" + ansi-html-community "^0.0.8" + bonjour-service "^1.2.1" + chokidar "^3.6.0" + colorette "^2.0.10" + compression "^1.7.4" + connect-history-api-fallback "^2.0.0" + default-gateway "^6.0.3" + express "^4.17.3" + graceful-fs "^4.2.6" + html-entities "^2.4.0" + http-proxy-middleware "^2.0.3" + ipaddr.js "^2.1.0" + launch-editor "^2.6.1" + open "^10.0.3" + p-retry "^6.2.0" + rimraf "^5.0.5" + schema-utils "^4.2.0" + selfsigned "^2.4.1" + serve-index "^1.9.1" + sockjs "^0.3.24" + spdy "^4.0.2" + webpack-dev-middleware "^7.1.0" + ws "^8.16.0" + +webpack-merge@6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/webpack-merge/-/webpack-merge-6.0.1.tgz#50c776868e080574725abc5869bd6e4ef0a16c6a" + integrity sha512-hXXvrjtx2PLYx4qruKl+kyRSLc52V+cCvMxRjmKwoA+CBbbF5GfIBtR6kCvl0fYGqTUPKB+1ktVmTHqMOzgCBg== + dependencies: + clone-deep "^4.0.1" + flat "^5.0.2" + wildcard "^2.0.1" + +webpack-sources@^3.0.0, webpack-sources@^3.2.3: + version "3.2.3" + resolved "https://registry.yarnpkg.com/webpack-sources/-/webpack-sources-3.2.3.tgz#2d4daab8451fd4b240cc27055ff6a0c2ccea0cde" + integrity sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w== + +webpack-subresource-integrity@5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/webpack-subresource-integrity/-/webpack-subresource-integrity-5.1.0.tgz#8b7606b033c6ccac14e684267cb7fb1f5c2a132a" + integrity sha512-sacXoX+xd8r4WKsy9MvH/q/vBtEHr86cpImXwyg74pFIpERKt6FmB8cXpeuh0ZLgclOlHI4Wcll7+R5L02xk9Q== + dependencies: + typed-assert "^1.0.8" + +webpack@5.94.0: + version "5.94.0" + resolved "https://registry.yarnpkg.com/webpack/-/webpack-5.94.0.tgz#77a6089c716e7ab90c1c67574a28da518a20970f" + integrity sha512-KcsGn50VT+06JH/iunZJedYGUJS5FGjow8wb9c0v5n1Om8O1g4L6LjtfxwlXIATopoQu+vOXXa7gYisWxCoPyg== + dependencies: + "@types/estree" "^1.0.5" + "@webassemblyjs/ast" "^1.12.1" + "@webassemblyjs/wasm-edit" "^1.12.1" + "@webassemblyjs/wasm-parser" "^1.12.1" + acorn "^8.7.1" + acorn-import-attributes "^1.9.5" + browserslist "^4.21.10" + chrome-trace-event "^1.0.2" + enhanced-resolve "^5.17.1" + es-module-lexer "^1.2.1" + eslint-scope "5.1.1" + events "^3.2.0" + glob-to-regexp "^0.4.1" + graceful-fs "^4.2.11" + json-parse-even-better-errors "^2.3.1" + loader-runner "^4.2.0" + mime-types "^2.1.27" + neo-async "^2.6.2" + schema-utils "^3.2.0" + tapable "^2.1.1" + terser-webpack-plugin "^5.3.10" + watchpack "^2.4.1" + webpack-sources "^3.2.3" + +websocket-driver@>=0.5.1, websocket-driver@^0.7.4: + version "0.7.4" + resolved "https://registry.yarnpkg.com/websocket-driver/-/websocket-driver-0.7.4.tgz#89ad5295bbf64b480abcba31e4953aca706f5760" + integrity sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg== + dependencies: + http-parser-js ">=0.5.1" + safe-buffer ">=5.1.0" + websocket-extensions ">=0.1.1" + +websocket-extensions@>=0.1.1: + version "0.1.4" + resolved "https://registry.yarnpkg.com/websocket-extensions/-/websocket-extensions-0.1.4.tgz#7f8473bc839dfd87608adb95d7eb075211578a42" + integrity sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg== + which-pm-runs@^1.0.0: version "1.1.0" resolved "https://registry.yarnpkg.com/which-pm-runs/-/which-pm-runs-1.1.0.tgz#35ccf7b1a0fce87bd8b92a478c9d045785d3bf35" @@ -1127,6 +6411,20 @@ which@^2.0.1: dependencies: isexe "^2.0.0" +wildcard@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/wildcard/-/wildcard-2.0.1.tgz#5ab10d02487198954836b6349f74fff961e10f67" + integrity sha512-CC1bOL87PIWSBhDcTrdeLo6eGT7mCFtrg0uIJtqJUFyK+eJnzl8A1niH56uu7KMa5XFrtiV+AQuHO3n7DsHnLQ== + +"wrap-ansi-cjs@npm:wrap-ansi@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" + integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== + dependencies: + ansi-styles "^4.0.0" + string-width "^4.1.0" + strip-ansi "^6.0.0" + wrap-ansi@^6.2.0: version "6.2.0" resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-6.2.0.tgz#e9393ba07102e6c91a3b221478f0257cd2856e53" @@ -1145,16 +6443,82 @@ wrap-ansi@^7.0.0: string-width "^4.1.0" strip-ansi "^6.0.0" +wrap-ansi@^8.1.0: + version "8.1.0" + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-8.1.0.tgz#56dc22368ee570face1b49819975d9b9a5ead214" + integrity sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ== + dependencies: + ansi-styles "^6.1.0" + string-width "^5.0.1" + strip-ansi "^7.0.1" + +wrap-ansi@^9.0.0: + version "9.0.0" + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-9.0.0.tgz#1a3dc8b70d85eeb8398ddfb1e4a02cd186e58b3e" + integrity sha512-G8ura3S+3Z2G+mkgNRq8dqaFZAuxfsxpBB8OCTGRTCtp+l/v9nbFNmCUP1BZMts3G1142MsZfn6eeUKrr4PD1Q== + dependencies: + ansi-styles "^6.2.1" + string-width "^7.0.0" + strip-ansi "^7.1.0" + +ws@^8.16.0: + version "8.18.0" + resolved "https://registry.yarnpkg.com/ws/-/ws-8.18.0.tgz#0d7505a6eafe2b0e712d232b42279f53bc289bbc" + integrity sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw== + +y18n@^5.0.5: + version "5.0.8" + resolved "https://registry.yarnpkg.com/y18n/-/y18n-5.0.8.tgz#7f4934d0f7ca8c56f95314939ddcd2dd91ce1d55" + integrity sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA== + +yallist@^3.0.2: + version "3.1.1" + resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.1.1.tgz#dbb7daf9bfd8bac9ab45ebf602b8cbad0d5d08fd" + integrity sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g== + +yallist@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72" + integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A== + yaml@^1.10.0: version "1.10.2" resolved "https://registry.yarnpkg.com/yaml/-/yaml-1.10.2.tgz#2301c5ffbf12b467de8da2333a459e29e7920e4b" integrity sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg== +yargs-parser@^21.1.1: + version "21.1.1" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-21.1.1.tgz#9096bceebf990d21bb31fa9516e0ede294a77d35" + integrity sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw== + +yargs@^17.2.1: + version "17.7.2" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-17.7.2.tgz#991df39aca675a192b816e1e0363f9d75d2aa269" + integrity sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w== + dependencies: + cliui "^8.0.1" + escalade "^3.1.1" + get-caller-file "^2.0.5" + require-directory "^2.1.1" + string-width "^4.2.3" + y18n "^5.0.5" + yargs-parser "^21.1.1" + yocto-queue@^0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-0.1.0.tgz#0294eb3dee05028d31ee1a5fa2c556a6aaf10a1b" integrity sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q== +yocto-queue@^1.0.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-1.1.1.tgz#fef65ce3ac9f8a32ceac5a634f74e17e5b232110" + integrity sha512-b4JR1PFR10y1mKjhHY9LaGo6tmrgjit7hxVIeAmyMw3jegXR4dhYqLaQF5zMXZxY7tLpMyJeLjr1C4rLmkVe8g== + +yoctocolors-cjs@^2.1.2: + version "2.1.2" + resolved "https://registry.yarnpkg.com/yoctocolors-cjs/-/yoctocolors-cjs-2.1.2.tgz#f4b905a840a37506813a7acaa28febe97767a242" + integrity sha512-cYVsTjKl8b+FrnidjibDWskAv7UKOfcwaVZdp/it9n1s9fU3IkgDbhdIRKCW4JDsAlECJY0ytoVPT3sK6kideA== + zone.js@^0.14.0: version "0.14.10" resolved "https://registry.yarnpkg.com/zone.js/-/zone.js-0.14.10.tgz#23b8b29687c6bffece996e5ee5b854050e7775c8" From 63cd2d91fa9b3d7d6c7cb2f494b16a96a14c6efe Mon Sep 17 00:00:00 2001 From: Joseph Garrone Date: Mon, 30 Sep 2024 05:26:57 +0200 Subject: [PATCH 10/64] Working angular build --- scripts/build/main.ts | 43 ++++++++++++++++++++++++++++++++----------- src/__all.ts | 1 - 2 files changed, 32 insertions(+), 12 deletions(-) delete mode 100644 src/__all.ts diff --git a/scripts/build/main.ts b/scripts/build/main.ts index c6291bb1..d21836eb 100644 --- a/scripts/build/main.ts +++ b/scripts/build/main.ts @@ -4,6 +4,7 @@ import { transformCodebase } from "../tools/transformCodebase"; import chalk from "chalk"; import { run } from "../shared/run"; import { getThisCodebaseRootDirPath } from "../tools/getThisCodebaseRootDirPath"; +import { crawl } from "../tools/crawl"; (async () => { console.log(chalk.cyan("Building Keycloakify...")); @@ -25,17 +26,41 @@ import { getThisCodebaseRootDirPath } from "../tools/getThisCodebaseRootDirPath" destDirPath: angularWorkspaceDirPath }); + const srcDirPath_workspace = pathJoin( + angularWorkspaceDirPath, + "projects", + "keycloakify-angular", + "src" + ); + transformCodebase({ srcDirPath: pathJoin(getThisCodebaseRootDirPath(), "src"), - destDirPath: pathJoin( - angularWorkspaceDirPath, - "projects", - "keycloakify-angular", - "src" - ) + destDirPath: srcDirPath_workspace }); - //run(`yarn`, { cwd: angularWorkspaceDirPath }); + { + const typescriptFilesRelativeFilePaths = crawl({ + dirPath: pathJoin(getThisCodebaseRootDirPath(), "src"), + returnedPathsType: "relative to dirPath" + }).filter(relativePath => relativePath.endsWith(".ts")); + + fs.writeFileSync( + pathJoin(srcDirPath_workspace, "public-api.ts"), + Buffer.from( + typescriptFilesRelativeFilePaths + .map( + (relativeFilePath, i) => + `export * as e${i} from "./${relativeFilePath.replace(/\.ts$/, "")}";` + ) + .join("\n") + ) + ); + + if (Date.now() > 0) { + process.exit(0); + } + } + run(`yarn build`, { cwd: angularWorkspaceDirPath }); const angularDistDirPath = pathJoin( @@ -77,10 +102,6 @@ import { getThisCodebaseRootDirPath } from "../tools/getThisCodebaseRootDirPath" }); fs.rmSync(angularWorkspaceDirPath, { recursive: true, force: true }); - - if (Date.now() > 0) { - process.exit(0); - } } /* diff --git a/src/__all.ts b/src/__all.ts deleted file mode 100644 index c40e51b1..00000000 --- a/src/__all.ts +++ /dev/null @@ -1 +0,0 @@ -export * as e0 from "./login/components/textarea-tag/textarea-tag.component"; From b7b9c8c713995390c3d2d08900fecdc1193a2542 Mon Sep 17 00:00:00 2001 From: Joseph Garrone Date: Mon, 30 Sep 2024 05:42:13 +0200 Subject: [PATCH 11/64] add example story --- .prettierrc.json | 2 +- scripts/build/main.ts | 92 ++--- scripts/link-in-app.ts | 62 +-- scripts/link-in-starter.ts | 32 +- scripts/shared/cacheDirPath.ts | 10 +- scripts/shared/run.ts | 6 +- scripts/shared/startRebuildOnSrcChange.ts | 30 +- scripts/tools/Deferred.ts | 6 +- scripts/tools/SemVer.ts | 22 +- scripts/tools/StatefulObservable.ts | 2 +- scripts/tools/crawl.ts | 10 +- scripts/tools/fs.existsAsync.ts | 4 +- scripts/tools/fs.rm.ts | 8 +- scripts/tools/fs.rmSync.ts | 8 +- scripts/tools/getThisCodebaseRootDirPath.ts | 8 +- .../tools/partitionPromiseSettledResults.ts | 2 +- scripts/tools/transformCodebase.ts | 14 +- scripts/tools/waitForDebounce.ts | 4 +- src/lib/i18n.ts | 4 +- src/lib/models/index.ts | 2 +- .../keycloakify-angular.providers.ts | 36 +- src/lib/public-api.ts | 10 +- src/lib/services/i18n.service.ts | 4 +- src/lib/services/index.ts | 4 +- src/lib/services/resource-injector.service.ts | 14 +- src/login/DefaultPage.ts | 152 ++++---- src/login/KcContext.ts | 2 +- .../classes/component-reference.class.ts | 2 +- ...uttons-multi-valued-attribute.component.ts | 22 +- .../field-errors/field-errors.component.ts | 18 +- .../group-label/group-label.component.ts | 24 +- src/login/components/index.ts | 22 +- .../input-field-by-type.component.ts | 30 +- .../input-tag-selects.component.ts | 52 +-- .../input-tag/input-tag.component.ts | 40 +- .../logout-other-sessions.component.ts | 16 +- .../password-wrapper.component.ts | 22 +- .../select-tag/select-tag.component.ts | 32 +- .../textarea-tag/textarea-tag.component.ts | 28 +- .../user-profile-form-fields.component.ts | 32 +- src/login/containers/template.component.ts | 38 +- src/login/directives/attributes.directive.ts | 4 +- src/login/directives/index.ts | 4 +- src/login/directives/kc-class.directive.ts | 22 +- src/login/i18n.ts | 4 +- src/login/pages/code/code.component.ts | 22 +- .../delete-account-confirm.component.ts | 22 +- .../delete-credential.component.ts | 22 +- src/login/pages/error/error.component.ts | 22 +- .../frontchannel-logout.component.ts | 22 +- .../idp-review-user-profile.component.ts | 28 +- src/login/pages/info/info.component.ts | 30 +- .../login-config-totp.component.ts | 32 +- ...gin-idp-link-confirm-override.component.ts | 22 +- .../login-idp-link-confirm.component.ts | 22 +- .../login-idp-link-email.component.ts | 22 +- .../login-oauth-grant.component.ts | 26 +- ...auth2-device-verify-user-code.component.ts | 22 +- .../pages/login-otp/login-otp.component.ts | 26 +- .../login-page-expired.component.ts | 20 +- ...keys-conditional-authenticate.component.ts | 42 +-- .../login-password.component.ts | 28 +- ...in-recovery-authn-code-config.component.ts | 26 +- ...gin-recovery-authn-code-input.component.ts | 26 +- .../login-reset-otp.component.ts | 24 +- .../login-reset-password.component.ts | 26 +- .../login-update-password.component.ts | 32 +- .../login-update-profile.component.ts | 26 +- .../login-username.component.ts | 28 +- .../login-verify-email.component.ts | 22 +- .../login-x509-info.component.ts | 22 +- src/login/pages/login/login.component.ts | 32 +- .../logout-confirm.component.ts | 22 +- .../pages/register/register.component.ts | 34 +- .../saml-post-form.component.ts | 26 +- .../select-authenticator.component.ts | 26 +- src/login/pages/terms/terms.component.ts | 22 +- .../update-email/update-email.component.ts | 28 +- .../webauthn-authenticate.component.ts | 42 +-- .../webauthn-error.component.ts | 30 +- .../webauthn-register.component.ts | 40 +- src/login/pipes/advanced-msg-str.pipe.ts | 8 +- src/login/pipes/index.ts | 12 +- src/login/pipes/input-type.pipe.ts | 8 +- src/login/pipes/kc-sanitize.pipe.ts | 16 +- src/login/pipes/msg-str.pipe.ts | 10 +- src/login/pipes/to-array.pipe.ts | 4 +- src/login/pipes/to-number.pipe.ts | 6 +- src/login/services/index.ts | 4 +- .../login-resource-injector.service.ts | 22 +- .../services/user-profile-form.service.ts | 356 +++++++++--------- stories/login/pages/login/login.stories.ts | 146 +++++++ 92 files changed, 1321 insertions(+), 1197 deletions(-) create mode 100644 stories/login/pages/login/login.stories.ts diff --git a/.prettierrc.json b/.prettierrc.json index 9a629901..5620c63b 100644 --- a/.prettierrc.json +++ b/.prettierrc.json @@ -3,7 +3,7 @@ "tabWidth": 4, "useTabs": false, "semi": true, - "singleQuote": false, + "singleQuote": true, "trailingComma": "none", "bracketSpacing": true, "arrowParens": "avoid", diff --git a/scripts/build/main.ts b/scripts/build/main.ts index d21836eb..6863b9e4 100644 --- a/scripts/build/main.ts +++ b/scripts/build/main.ts @@ -1,79 +1,75 @@ -import * as fs from "fs"; -import { join as pathJoin, basename as pathBasename } from "path"; -import { transformCodebase } from "../tools/transformCodebase"; -import chalk from "chalk"; -import { run } from "../shared/run"; -import { getThisCodebaseRootDirPath } from "../tools/getThisCodebaseRootDirPath"; -import { crawl } from "../tools/crawl"; +import * as fs from 'fs'; +import { join as pathJoin, basename as pathBasename } from 'path'; +import { transformCodebase } from '../tools/transformCodebase'; +import chalk from 'chalk'; +import { run } from '../shared/run'; +import { getThisCodebaseRootDirPath } from '../tools/getThisCodebaseRootDirPath'; +import { crawl } from '../tools/crawl'; (async () => { - console.log(chalk.cyan("Building Keycloakify...")); + console.log(chalk.cyan('Building Keycloakify...')); const startTime = Date.now(); - const distDirPath = pathJoin(getThisCodebaseRootDirPath(), "dist"); + const distDirPath = pathJoin(getThisCodebaseRootDirPath(), 'dist'); if (fs.existsSync(distDirPath)) { fs.rmSync(distDirPath, { recursive: true, force: true }); } - // Compile for angular + // tsc + angular JIT { - const angularWorkspaceDirPath = pathJoin(distDirPath, "workspace"); + const angularWorkspaceDirPath = pathJoin(distDirPath, 'workspace'); transformCodebase({ - srcDirPath: pathJoin(__dirname, "workspace"), + srcDirPath: pathJoin(__dirname, 'workspace'), destDirPath: angularWorkspaceDirPath }); const srcDirPath_workspace = pathJoin( angularWorkspaceDirPath, - "projects", - "keycloakify-angular", - "src" + 'projects', + 'keycloakify-angular', + 'src' ); transformCodebase({ - srcDirPath: pathJoin(getThisCodebaseRootDirPath(), "src"), + srcDirPath: pathJoin(getThisCodebaseRootDirPath(), 'src'), destDirPath: srcDirPath_workspace }); { const typescriptFilesRelativeFilePaths = crawl({ - dirPath: pathJoin(getThisCodebaseRootDirPath(), "src"), - returnedPathsType: "relative to dirPath" - }).filter(relativePath => relativePath.endsWith(".ts")); + dirPath: pathJoin(getThisCodebaseRootDirPath(), 'src'), + returnedPathsType: 'relative to dirPath' + }).filter(relativePath => relativePath.endsWith('.ts')); fs.writeFileSync( - pathJoin(srcDirPath_workspace, "public-api.ts"), + pathJoin(srcDirPath_workspace, 'public-api.ts'), Buffer.from( typescriptFilesRelativeFilePaths .map( (relativeFilePath, i) => - `export * as e${i} from "./${relativeFilePath.replace(/\.ts$/, "")}";` + `export * as e${i} from "./${relativeFilePath.replace(/\.ts$/, '')}";` ) - .join("\n") + .join('\n') ) ); - - if (Date.now() > 0) { - process.exit(0); - } } run(`yarn build`, { cwd: angularWorkspaceDirPath }); const angularDistDirPath = pathJoin( angularWorkspaceDirPath, - "dist", - "keycloakify-angular" + 'dist', + 'keycloakify-angular' ); transformCodebase({ - srcDirPath: pathJoin(angularDistDirPath, "esm2022"), + srcDirPath: pathJoin(angularDistDirPath, 'esm2022'), destDirPath: distDirPath, transformSourceCode: ({ fileRelativePath, sourceCode }) => { - if (pathBasename(fileRelativePath) === "keycloakify-angular.mjs") { + if (pathBasename(fileRelativePath) === 'keycloakify-angular.mjs') { return undefined; } @@ -85,15 +81,15 @@ import { crawl } from "../tools/crawl"; srcDirPath: angularDistDirPath, destDirPath: distDirPath, transformSourceCode: ({ fileRelativePath, sourceCode }) => { - if (fileRelativePath.startsWith("esm2022")) { + if (fileRelativePath.startsWith('esm2022')) { return undefined; } - if (fileRelativePath.startsWith("fesm2022")) { + if (fileRelativePath.startsWith('fesm2022')) { return undefined; } - if (!fileRelativePath.endsWith(".d.ts")) { + if (!fileRelativePath.endsWith('.d.ts')) { return undefined; } @@ -104,47 +100,29 @@ import { crawl } from "../tools/crawl"; fs.rmSync(angularWorkspaceDirPath, { recursive: true, force: true }); } - /* - run(`npx tsc -p ${join("src", "tsconfig.json")}`); - - transformCodebase({ - srcDirPath: join("src"), - destDirPath: join("dist"), - transformSourceCode: ({ fileRelativePath, sourceCode }) => { - if (!fileRelativePath.endsWith(".html")) { - return undefined; - } - - return { modifiedSourceCode: sourceCode }; - } - }); - */ - - run(`npx tsc-alias -p ${pathJoin("src", "tsconfig.json")}`); + run(`npx tsc-alias -p ${pathJoin('src', 'tsconfig.json')}`); { - const dirBasename = "src"; + const dirBasename = 'src'; - const destDirPath = pathJoin("dist", dirBasename); + const destDirPath = pathJoin('dist', dirBasename); fs.rmSync(destDirPath, { recursive: true, force: true }); fs.cpSync(dirBasename, destDirPath, { recursive: true }); } - /* transformCodebase({ - srcDirPath: join("stories"), - destDirPath: join("dist", "stories"), + srcDirPath: pathJoin(getThisCodebaseRootDirPath(), 'stories'), + destDirPath: pathJoin(getThisCodebaseRootDirPath(), 'dist', 'stories'), transformSourceCode: ({ fileRelativePath, sourceCode }) => { - if (!fileRelativePath.endsWith(".stories.tsx")) { + if (!fileRelativePath.endsWith('.stories.tsx')) { return undefined; } return { modifiedSourceCode: sourceCode }; } }); - */ console.log( chalk.green(`✓ built in ${((Date.now() - startTime) / 1000).toFixed(2)}s`) diff --git a/scripts/link-in-app.ts b/scripts/link-in-app.ts index 340d37ed..25b786ea 100644 --- a/scripts/link-in-app.ts +++ b/scripts/link-in-app.ts @@ -1,15 +1,15 @@ -import { execSync } from "child_process"; -import { join as pathJoin, relative as pathRelative } from "path"; -import { getThisCodebaseRootDirPath } from "./tools/getThisCodebaseRootDirPath"; -import * as fs from "fs"; -import * as os from "os"; +import { execSync } from 'child_process'; +import { join as pathJoin, relative as pathRelative } from 'path'; +import { getThisCodebaseRootDirPath } from './tools/getThisCodebaseRootDirPath'; +import * as fs from 'fs'; +import * as os from 'os'; -const singletonDependencies: string[] = ["keycloakify", "rxjs", "zone.js"]; +const singletonDependencies: string[] = ['keycloakify', 'rxjs', 'zone.js']; // For example [ "@emotion" ] it's more convenient than // having to list every sub emotion packages (@emotion/css @emotion/utils ...) // in singletonDependencies -const namespaceSingletonDependencies: string[] = ["@angular"]; +const namespaceSingletonDependencies: string[] = ['@angular']; const rootDirPath = getThisCodebaseRootDirPath(); @@ -17,7 +17,7 @@ const commonThirdPartyDeps = [ ...namespaceSingletonDependencies .map(namespaceModuleName => fs - .readdirSync(pathJoin(rootDirPath, "node_modules", namespaceModuleName)) + .readdirSync(pathJoin(rootDirPath, 'node_modules', namespaceModuleName)) .map(submoduleName => `${namespaceModuleName}/${submoduleName}`) ) .reduce((prev, curr) => [...prev, ...curr], []), @@ -27,8 +27,8 @@ const commonThirdPartyDeps = [ //NOTE: This is only required because of: https://github.com/garronej/ts-ci/blob/c0e207b9677523d4ec97fe672ddd72ccbb3c1cc4/README.md?plain=1#L54-L58 { let modifiedPackageJsonContent = fs - .readFileSync(pathJoin(rootDirPath, "package.json")) - .toString("utf8"); + .readFileSync(pathJoin(rootDirPath, 'package.json')) + .toString('utf8'); modifiedPackageJsonContent = (() => { const o = JSON.parse(modifiedPackageJsonContent); @@ -45,18 +45,18 @@ const commonThirdPartyDeps = [ .replace(/"!\.\/dist\//g, '"!./'); modifiedPackageJsonContent = JSON.stringify( - { ...JSON.parse(modifiedPackageJsonContent), version: "0.0.0" }, + { ...JSON.parse(modifiedPackageJsonContent), version: '0.0.0' }, null, 4 ); fs.writeFileSync( - pathJoin(rootDirPath, "dist", "package.json"), - Buffer.from(modifiedPackageJsonContent, "utf8") + pathJoin(rootDirPath, 'dist', 'package.json'), + Buffer.from(modifiedPackageJsonContent, 'utf8') ); } -const yarnGlobalDirPath = pathJoin(rootDirPath, ".yarn_home"); +const yarnGlobalDirPath = pathJoin(rootDirPath, '.yarn_home'); fs.rmSync(yarnGlobalDirPath, { recursive: true, force: true }); fs.mkdirSync(yarnGlobalDirPath); @@ -65,18 +65,18 @@ const execYarnLink = (params: { targetModuleName?: string; cwd: string }) => { const { targetModuleName, cwd } = params; const cmd = [ - "yarn", - "link", - ...(targetModuleName !== undefined ? [targetModuleName] : ["--no-bin-links"]) - ].join(" "); + 'yarn', + 'link', + ...(targetModuleName !== undefined ? [targetModuleName] : ['--no-bin-links']) + ].join(' '); - console.log(`$ cd ${pathRelative(rootDirPath, cwd) || "."} && ${cmd}`); + console.log(`$ cd ${pathRelative(rootDirPath, cwd) || '.'} && ${cmd}`); execSync(cmd, { cwd, env: { ...process.env, - ...(os.platform() === "win32" + ...(os.platform() === 'win32' ? { USERPROFILE: yarnGlobalDirPath } : { HOME: yarnGlobalDirPath }) } @@ -88,7 +88,7 @@ const testAppPaths = (() => { return testAppNames .map(testAppName => { - const testAppPath = pathJoin(rootDirPath, "..", testAppName); + const testAppPath = pathJoin(rootDirPath, '..', testAppName); if (fs.existsSync(testAppPath)) { return testAppPath; @@ -104,13 +104,13 @@ const testAppPaths = (() => { })(); if (testAppPaths.length === 0) { - console.error("No test app to link into!"); + console.error('No test app to link into!'); process.exit(-1); } -testAppPaths.forEach(testAppPath => execSync("yarn install", { cwd: testAppPath })); +testAppPaths.forEach(testAppPath => execSync('yarn install', { cwd: testAppPath })); -console.log("=== Linking common dependencies ==="); +console.log('=== Linking common dependencies ==='); const total = commonThirdPartyDeps.length; let current = 0; @@ -123,9 +123,9 @@ commonThirdPartyDeps.forEach(commonThirdPartyDep => { const localInstallPath = pathJoin( ...[ rootDirPath, - "node_modules", - ...(commonThirdPartyDep.startsWith("@") - ? commonThirdPartyDep.split("/") + 'node_modules', + ...(commonThirdPartyDep.startsWith('@') + ? commonThirdPartyDep.split('/') : [commonThirdPartyDep]) ] ); @@ -142,16 +142,16 @@ commonThirdPartyDeps.forEach(commonThirdPartyDep => ) ); -console.log("=== Linking in house dependencies ==="); +console.log('=== Linking in house dependencies ==='); -execYarnLink({ cwd: pathJoin(rootDirPath, "dist") }); +execYarnLink({ cwd: pathJoin(rootDirPath, 'dist') }); testAppPaths.forEach(testAppPath => execYarnLink({ cwd: testAppPath, targetModuleName: JSON.parse( - fs.readFileSync(pathJoin(rootDirPath, "package.json")).toString("utf8") - )["name"] + fs.readFileSync(pathJoin(rootDirPath, 'package.json')).toString('utf8') + )['name'] }) ); diff --git a/scripts/link-in-starter.ts b/scripts/link-in-starter.ts index 4b41e14d..89ff4b2f 100644 --- a/scripts/link-in-starter.ts +++ b/scripts/link-in-starter.ts @@ -1,11 +1,11 @@ -import * as fs from "fs"; -import { join } from "path"; -import { startRebuildOnSrcChange } from "./shared/startRebuildOnSrcChange"; -import { crawl } from "../src/bin/tools/crawl"; -import { run } from "./shared/run"; +import * as fs from 'fs'; +import { join } from 'path'; +import { startRebuildOnSrcChange } from './shared/startRebuildOnSrcChange'; +import { crawl } from '../src/bin/tools/crawl'; +import { run } from './shared/run'; { - const dirPath = "node_modules"; + const dirPath = 'node_modules'; try { fs.rmSync(dirPath, { recursive: true, force: true }); @@ -15,12 +15,12 @@ import { run } from "./shared/run"; crawl({ dirPath, - returnedPathsType: "absolute" + returnedPathsType: 'absolute' }).forEach(filePath => { try { fs.rmSync(filePath, { force: true }); } catch (error) { - if (filePath.endsWith(".exe")) { + if (filePath.endsWith('.exe')) { return; } throw error; @@ -29,21 +29,21 @@ import { run } from "./shared/run"; } } -fs.rmSync("dist", { recursive: true, force: true }); -fs.rmSync(".yarn_home", { recursive: true, force: true }); +fs.rmSync('dist', { recursive: true, force: true }); +fs.rmSync('.yarn_home', { recursive: true, force: true }); -run("yarn install"); -run("yarn build"); +run('yarn install'); +run('yarn build'); -const starterName = "keycloakify-starter"; +const starterName = 'keycloakify-starter'; -fs.rmSync(join("..", starterName, "node_modules"), { +fs.rmSync(join('..', starterName, 'node_modules'), { recursive: true, force: true }); -run("yarn install", { cwd: join("..", starterName) }); +run('yarn install', { cwd: join('..', starterName) }); -run(`npx tsx ${join("scripts", "link-in-app.ts")} ${starterName}`); +run(`npx tsx ${join('scripts', 'link-in-app.ts')} ${starterName}`); startRebuildOnSrcChange(); diff --git a/scripts/shared/cacheDirPath.ts b/scripts/shared/cacheDirPath.ts index 004b824b..eefd6b76 100644 --- a/scripts/shared/cacheDirPath.ts +++ b/scripts/shared/cacheDirPath.ts @@ -1,9 +1,9 @@ -import { join as pathJoin } from "path"; -import { getThisCodebaseRootDirPath } from "../tools/getThisCodebaseRootDirPath"; +import { join as pathJoin } from 'path'; +import { getThisCodebaseRootDirPath } from '../tools/getThisCodebaseRootDirPath'; export const cacheDirPath = pathJoin( getThisCodebaseRootDirPath(), - "node_modules", - ".cache", - "scripts" + 'node_modules', + '.cache', + 'scripts' ); diff --git a/scripts/shared/run.ts b/scripts/shared/run.ts index 6276a150..e8deb85a 100644 --- a/scripts/shared/run.ts +++ b/scripts/shared/run.ts @@ -1,8 +1,8 @@ -import * as child_process from "child_process"; -import chalk from "chalk"; +import * as child_process from 'child_process'; +import chalk from 'chalk'; export function run(command: string, options?: { cwd: string }) { console.log(chalk.grey(`$ ${command}`)); - child_process.execSync(command, { stdio: "inherit", ...options }); + child_process.execSync(command, { stdio: 'inherit', ...options }); } diff --git a/scripts/shared/startRebuildOnSrcChange.ts b/scripts/shared/startRebuildOnSrcChange.ts index 5cccc0c2..93766aae 100644 --- a/scripts/shared/startRebuildOnSrcChange.ts +++ b/scripts/shared/startRebuildOnSrcChange.ts @@ -1,36 +1,36 @@ -import * as child_process from "child_process"; -import { waitForDebounceFactory } from "../tools/waitForDebounce"; -import chokidar from "chokidar"; -import * as runExclusive from "run-exclusive"; -import { Deferred } from "evt/tools/Deferred"; -import chalk from "chalk"; +import * as child_process from 'child_process'; +import { waitForDebounceFactory } from '../tools/waitForDebounce'; +import chokidar from 'chokidar'; +import * as runExclusive from 'run-exclusive'; +import { Deferred } from 'evt/tools/Deferred'; +import chalk from 'chalk'; export function startRebuildOnSrcChange() { const { waitForDebounce } = waitForDebounceFactory({ delay: 400 }); const runYarnBuild = runExclusive.build(async () => { - console.log(chalk.green("Running `yarn build`")); + console.log(chalk.green('Running `yarn build`')); const dCompleted = new Deferred(); - const child = child_process.spawn("yarn", ["build"], { shell: true }); + const child = child_process.spawn('yarn', ['build'], { shell: true }); - child.stdout.on("data", data => process.stdout.write(data)); + child.stdout.on('data', data => process.stdout.write(data)); - child.stderr.on("data", data => process.stderr.write(data)); + child.stderr.on('data', data => process.stderr.write(data)); - child.on("exit", () => dCompleted.resolve()); + child.on('exit', () => dCompleted.resolve()); await dCompleted.pr; - console.log("\n\n"); + console.log('\n\n'); }); - console.log(chalk.green("Watching for changes in src/")); + console.log(chalk.green('Watching for changes in src/')); chokidar - .watch(["src", "stories"], { ignoreInitial: true }) - .on("all", async (event, path) => { + .watch(['src', 'stories'], { ignoreInitial: true }) + .on('all', async (event, path) => { console.log(chalk.bold(`${event}: ${path}`)); await waitForDebounce(); diff --git a/scripts/tools/Deferred.ts b/scripts/tools/Deferred.ts index 06510a16..add82110 100644 --- a/scripts/tools/Deferred.ts +++ b/scripts/tools/Deferred.ts @@ -1,4 +1,4 @@ -import { overwriteReadonlyProp } from "tsafe/lab/overwriteReadonlyProp"; +import { overwriteReadonlyProp } from 'tsafe/lab/overwriteReadonlyProp'; export class Deferred { public readonly pr: Promise; @@ -13,12 +13,12 @@ export class Deferred { this.pr = new Promise((resolve_, reject_) => { resolve = value => { - overwriteReadonlyProp(this, "isPending", false); + overwriteReadonlyProp(this, 'isPending', false); resolve_(value); }; reject = error => { - overwriteReadonlyProp(this, "isPending", false); + overwriteReadonlyProp(this, 'isPending', false); reject_(error); }; }); diff --git a/scripts/tools/SemVer.ts b/scripts/tools/SemVer.ts index 5a7b3d93..41be29af 100644 --- a/scripts/tools/SemVer.ts +++ b/scripts/tools/SemVer.ts @@ -7,7 +7,7 @@ export type SemVer = { }; export namespace SemVer { - const bumpTypes = ["major", "minor", "patch", "rc", "no bump"] as const; + const bumpTypes = ['major', 'minor', 'patch', 'rc', 'no bump'] as const; export type BumpType = (typeof bumpTypes)[number]; @@ -20,7 +20,7 @@ export namespace SemVer { throw new Error(`${versionStr} is not a valid semantic version`); } - const semVer: Omit = { + const semVer: Omit = { major: parseInt(match[1]), minor: parseInt(match[2]), patch: (() => { @@ -36,7 +36,7 @@ export namespace SemVer { const initialStr = stringify(semVer); - Object.defineProperty(semVer, "parsedFrom", { + Object.defineProperty(semVer, 'parsedFrom', { enumerable: true, get: function () { const currentStr = stringify(this); @@ -54,9 +54,9 @@ export namespace SemVer { return semVer as any; } - export function stringify(v: Omit): string { + export function stringify(v: Omit): string { return `${v.major}.${v.minor}.${v.patch}${ - v.rc === undefined ? "" : `-rc.${v.rc}` + v.rc === undefined ? '' : `-rc.${v.rc}` }`; } @@ -71,7 +71,7 @@ export namespace SemVer { const sign = (diff: number): -1 | 0 | 1 => (diff === 0 ? 0 : diff < 0 ? -1 : 1); const noUndefined = (n: number | undefined) => n ?? Infinity; - for (const level of ["major", "minor", "patch", "rc"] as const) { + for (const level of ['major', 'minor', 'patch', 'rc'] as const) { if (noUndefined(v1[level]) !== noUndefined(v2[level])) { return sign(noUndefined(v1[level]) - noUndefined(v2[level])); } @@ -89,13 +89,13 @@ export namespace SemVer { export function bumpType(params: { versionBehind: string | SemVer; versionAhead: string | SemVer; - }): BumpType | "no bump" { + }): BumpType | 'no bump' { const versionAhead = - typeof params.versionAhead === "string" + typeof params.versionAhead === 'string' ? parse(params.versionAhead) : params.versionAhead; const versionBehind = - typeof params.versionBehind === "string" + typeof params.versionBehind === 'string' ? parse(params.versionBehind) : params.versionBehind; @@ -107,12 +107,12 @@ export namespace SemVer { ); } - for (const level of ["major", "minor", "patch", "rc"] as const) { + for (const level of ['major', 'minor', 'patch', 'rc'] as const) { if (versionBehind[level] !== versionAhead[level]) { return level; } } - return "no bump"; + return 'no bump'; } } diff --git a/scripts/tools/StatefulObservable.ts b/scripts/tools/StatefulObservable.ts index 7b43b5a4..6bba7927 100644 --- a/scripts/tools/StatefulObservable.ts +++ b/scripts/tools/StatefulObservable.ts @@ -47,7 +47,7 @@ export function createStatefulObservable( }; } }, - "current", + 'current', { enumerable: true, get, diff --git a/scripts/tools/crawl.ts b/scripts/tools/crawl.ts index 86ba2078..2ec9f990 100644 --- a/scripts/tools/crawl.ts +++ b/scripts/tools/crawl.ts @@ -1,5 +1,5 @@ -import * as fs from "fs"; -import { join as pathJoin, relative as pathRelative } from "path"; +import * as fs from 'fs'; +import { join as pathJoin, relative as pathRelative } from 'path'; const crawlRec = (dirPath: string, filePaths: string[]) => { for (const basename of fs.readdirSync(dirPath)) { @@ -18,7 +18,7 @@ const crawlRec = (dirPath: string, filePaths: string[]) => { /** List all files in a given directory return paths relative to the dir_path */ export function crawl(params: { dirPath: string; - returnedPathsType: "absolute" | "relative to dirPath"; + returnedPathsType: 'absolute' | 'relative to dirPath'; }): string[] { const { dirPath, returnedPathsType } = params; @@ -27,9 +27,9 @@ export function crawl(params: { crawlRec(dirPath, filePaths); switch (returnedPathsType) { - case "absolute": + case 'absolute': return filePaths; - case "relative to dirPath": + case 'relative to dirPath': return filePaths.map(filePath => pathRelative(dirPath, filePath)); } } diff --git a/scripts/tools/fs.existsAsync.ts b/scripts/tools/fs.existsAsync.ts index 359caabd..a595e789 100644 --- a/scripts/tools/fs.existsAsync.ts +++ b/scripts/tools/fs.existsAsync.ts @@ -1,11 +1,11 @@ -import * as fs from "fs/promises"; +import * as fs from 'fs/promises'; export async function existsAsync(path: string) { try { await fs.stat(path); return true; } catch (error) { - if ((error as Error & { code: string }).code === "ENOENT") return false; + if ((error as Error & { code: string }).code === 'ENOENT') return false; throw error; } } diff --git a/scripts/tools/fs.rm.ts b/scripts/tools/fs.rm.ts index 4dd28c2b..36e5fc60 100644 --- a/scripts/tools/fs.rm.ts +++ b/scripts/tools/fs.rm.ts @@ -1,13 +1,13 @@ -import * as fs from "fs/promises"; -import { join as pathJoin } from "path"; -import { SemVer } from "./SemVer"; +import * as fs from 'fs/promises'; +import { join as pathJoin } from 'path'; +import { SemVer } from './SemVer'; /** * Polyfill of fs.rm(dirPath, { "recursive": true }) * For older version of Node */ export async function rm(dirPath: string, options: { recursive: true; force?: true }) { - if (SemVer.compare(SemVer.parse(process.version), SemVer.parse("14.14.0")) > 0) { + if (SemVer.compare(SemVer.parse(process.version), SemVer.parse('14.14.0')) > 0) { return fs.rm(dirPath, options); } diff --git a/scripts/tools/fs.rmSync.ts b/scripts/tools/fs.rmSync.ts index 866063f8..beedbd5e 100644 --- a/scripts/tools/fs.rmSync.ts +++ b/scripts/tools/fs.rmSync.ts @@ -1,13 +1,13 @@ -import * as fs from "fs"; -import { join as pathJoin } from "path"; -import { SemVer } from "./SemVer"; +import * as fs from 'fs'; +import { join as pathJoin } from 'path'; +import { SemVer } from './SemVer'; /** * Polyfill of fs.rmSync(dirPath, { "recursive": true }) * For older version of Node */ export function rmSync(dirPath: string, options: { recursive: true; force?: true }) { - if (SemVer.compare(SemVer.parse(process.version), SemVer.parse("14.14.0")) > 0) { + if (SemVer.compare(SemVer.parse(process.version), SemVer.parse('14.14.0')) > 0) { fs.rmSync(dirPath, options); return; } diff --git a/scripts/tools/getThisCodebaseRootDirPath.ts b/scripts/tools/getThisCodebaseRootDirPath.ts index f880ffc9..e99ff951 100644 --- a/scripts/tools/getThisCodebaseRootDirPath.ts +++ b/scripts/tools/getThisCodebaseRootDirPath.ts @@ -1,11 +1,11 @@ -import * as fs from "fs"; -import * as path from "path"; +import * as fs from 'fs'; +import * as path from 'path'; function getThisCodebaseRootDirPath_rec(dirPath: string): string { - if (fs.existsSync(path.join(dirPath, "package.json"))) { + if (fs.existsSync(path.join(dirPath, 'package.json'))) { return dirPath; } - return getThisCodebaseRootDirPath_rec(path.join(dirPath, "..")); + return getThisCodebaseRootDirPath_rec(path.join(dirPath, '..')); } let result: string | undefined = undefined; diff --git a/scripts/tools/partitionPromiseSettledResults.ts b/scripts/tools/partitionPromiseSettledResults.ts index c682790b..f377089f 100644 --- a/scripts/tools/partitionPromiseSettledResults.ts +++ b/scripts/tools/partitionPromiseSettledResults.ts @@ -6,7 +6,7 @@ export function partitionPromiseSettledResults() { [successes, failures]: PromiseSettledAndPartitioned, item: PromiseSettledResult ) => - item.status === "rejected" + item.status === 'rejected' ? ([ successes, [item.reason, ...failures] diff --git a/scripts/tools/transformCodebase.ts b/scripts/tools/transformCodebase.ts index 94957244..4268984b 100644 --- a/scripts/tools/transformCodebase.ts +++ b/scripts/tools/transformCodebase.ts @@ -1,7 +1,7 @@ -import * as fs from "fs"; -import * as path from "path"; -import { crawl } from "./crawl"; -import { rmSync } from "../tools/fs.rmSync"; +import * as fs from 'fs'; +import * as path from 'path'; +import { crawl } from './crawl'; +import { rmSync } from '../tools/fs.rmSync'; type TransformSourceCode = (params: { sourceCode: Buffer; @@ -26,10 +26,10 @@ export function transformCodebase(params: { }) { const { srcDirPath, transformSourceCode } = params; - const isTargetSameAsSource = path.relative(srcDirPath, params.destDirPath) === ""; + const isTargetSameAsSource = path.relative(srcDirPath, params.destDirPath) === ''; const destDirPath = isTargetSameAsSource - ? path.join(srcDirPath, "..", "tmp_xOsPdkPsTdzPs34sOkHs") + ? path.join(srcDirPath, '..', 'tmp_xOsPdkPsTdzPs34sOkHs') : params.destDirPath; fs.mkdirSync(destDirPath, { @@ -38,7 +38,7 @@ export function transformCodebase(params: { for (const fileRelativePath of crawl({ dirPath: srcDirPath, - returnedPathsType: "relative to dirPath" + returnedPathsType: 'relative to dirPath' })) { const filePath = path.join(srcDirPath, fileRelativePath); const destFilePath = path.join(destDirPath, fileRelativePath); diff --git a/scripts/tools/waitForDebounce.ts b/scripts/tools/waitForDebounce.ts index b53bf9e3..adf5b1f0 100644 --- a/scripts/tools/waitForDebounce.ts +++ b/scripts/tools/waitForDebounce.ts @@ -1,5 +1,5 @@ -import { Deferred } from "./Deferred"; -import { createStatefulObservable } from "./StatefulObservable"; +import { Deferred } from './Deferred'; +import { createStatefulObservable } from './StatefulObservable'; export function waitForDebounceFactory(params: { delay: number }) { const { delay } = params; diff --git a/src/lib/i18n.ts b/src/lib/i18n.ts index 53f76ea5..bdac5c77 100644 --- a/src/lib/i18n.ts +++ b/src/lib/i18n.ts @@ -1,7 +1,7 @@ /* eslint-disable @typescript-eslint/no-unused-vars */ -import { i18nBuilder as accountI18nBuilder } from "keycloakify/account/i18n/noJsx"; -import { i18nBuilder as loginI18nBuilder } from "keycloakify/login/i18n/noJsx"; +import { i18nBuilder as accountI18nBuilder } from 'keycloakify/account/i18n/noJsx'; +import { i18nBuilder as loginI18nBuilder } from 'keycloakify/login/i18n/noJsx'; const { ofTypeI18n: I18nlogin } = loginI18nBuilder.build(); const { ofTypeI18n: I18nAccount } = accountI18nBuilder.build(); diff --git a/src/lib/models/index.ts b/src/lib/models/index.ts index faa6ffa9..462e4dc1 100644 --- a/src/lib/models/index.ts +++ b/src/lib/models/index.ts @@ -1 +1 @@ -export * from "./script.model"; +export * from './script.model'; diff --git a/src/lib/providers/keycloakify-angular.providers.ts b/src/lib/providers/keycloakify-angular.providers.ts index 699a7c5f..e2e95afc 100644 --- a/src/lib/providers/keycloakify-angular.providers.ts +++ b/src/lib/providers/keycloakify-angular.providers.ts @@ -1,30 +1,30 @@ -import { DOCUMENT } from "@angular/common"; +import { DOCUMENT } from '@angular/common'; import { APP_INITIALIZER, InjectionToken, LOCALE_ID, makeEnvironmentProviders -} from "@angular/core"; -import { I18n } from "../i18n"; -import { I18nService } from "../services"; +} from '@angular/core'; +import { I18n } from '../i18n'; +import { I18nService } from '../services'; -export const I18N = new InjectionToken("i18n"); -export const KC_CONTEXT = new InjectionToken("keycloak context"); -export const USE_DEFAULT_CSS = new InjectionToken("use default css"); -export const CLASSES = new InjectionToken<{ [key in ClassKey]?: string }>("classes"); +export const I18N = new InjectionToken('i18n'); +export const KC_CONTEXT = new InjectionToken('keycloak context'); +export const USE_DEFAULT_CSS = new InjectionToken('use default css'); +export const CLASSES = new InjectionToken<{ [key in ClassKey]?: string }>('classes'); export const DO_MAKE_USER_CONFIRM_PASSWORD = new InjectionToken( - "doMakeUserConfirmPassword" + 'doMakeUserConfirmPassword' ); type ClassKey = - | import("keycloakify/login/lib/kcClsx").ClassKey - | import("keycloakify/account/lib/kcClsx").ClassKey; + | import('keycloakify/login/lib/kcClsx').ClassKey + | import('keycloakify/account/lib/kcClsx').ClassKey; type KcContextLike = - | import("keycloakify/login/i18n/noJsx").KcContextLike - | import("keycloakify/account/i18n/noJsx").KcContextLike; + | import('keycloakify/login/i18n/noJsx').KcContextLike + | import('keycloakify/account/i18n/noJsx').KcContextLike; type KcContext = - | import("keycloakify/login/KcContext").KcContext - | import("keycloakify/account/KcContext").KcContext; + | import('keycloakify/login/KcContext').KcContext + | import('keycloakify/account/KcContext').KcContext; export type KeycloakifyAngularConfig = { doMakeUserConfirmPassword?: boolean; @@ -49,7 +49,7 @@ export const provideKeycloakifyAngular = (config: KeycloakifyAngularConfig) => { provide: LOCALE_ID, useFactory: (document: Document) => { - return document.documentElement.lang ?? "en"; + return document.documentElement.lang ?? 'en'; }, deps: [DOCUMENT] }, @@ -58,7 +58,7 @@ export const provideKeycloakifyAngular = (config: KeycloakifyAngularConfig) => multi: true, useFactory: ( - i18nService: I18nService["i18n"]>, + i18nService: I18nService['i18n']>, kcContext: KcContext ) => async () => { @@ -83,7 +83,7 @@ export const provideKeycloakifyAngular = (config: KeycloakifyAngularConfig) => { provide: I18N, useFactory: ( - i18nService: I18nService["i18n"]> + i18nService: I18nService['i18n']> ) => { return i18nService.i18n; }, diff --git a/src/lib/public-api.ts b/src/lib/public-api.ts index f0e713b9..9f22ab71 100644 --- a/src/lib/public-api.ts +++ b/src/lib/public-api.ts @@ -1,5 +1,5 @@ -import { KcContext as KcAccountContext } from "keycloakify/account/KcContext"; -import { KcContext as KcLoginContext } from "keycloakify/login/KcContext"; +import { KcContext as KcAccountContext } from 'keycloakify/account/KcContext'; +import { KcContext as KcLoginContext } from 'keycloakify/login/KcContext'; declare global { interface Window { @@ -7,6 +7,6 @@ declare global { } } -export * from "./models"; -export * from "./providers/keycloakify-angular.providers"; -export * from "./services"; +export * from './models'; +export * from './providers/keycloakify-angular.providers'; +export * from './services'; diff --git a/src/lib/services/i18n.service.ts b/src/lib/services/i18n.service.ts index 2862c0e5..4a78228f 100644 --- a/src/lib/services/i18n.service.ts +++ b/src/lib/services/i18n.service.ts @@ -1,5 +1,5 @@ -import { Injectable } from "@angular/core"; -@Injectable({ providedIn: "root" }) +import { Injectable } from '@angular/core'; +@Injectable({ providedIn: 'root' }) export class I18nService { i18n!: T; } diff --git a/src/lib/services/index.ts b/src/lib/services/index.ts index 939a6a8b..4e7b77e0 100644 --- a/src/lib/services/index.ts +++ b/src/lib/services/index.ts @@ -1,2 +1,2 @@ -export * from "./resource-injector.service"; -export * from "./i18n.service"; +export * from './resource-injector.service'; +export * from './i18n.service'; diff --git a/src/lib/services/resource-injector.service.ts b/src/lib/services/resource-injector.service.ts index 29877ba5..91783947 100644 --- a/src/lib/services/resource-injector.service.ts +++ b/src/lib/services/resource-injector.service.ts @@ -1,9 +1,9 @@ -import { inject, Injectable, Renderer2, RendererFactory2 } from "@angular/core"; -import { Observable } from "rxjs"; -import { Script } from "../models/script.model"; +import { inject, Injectable, Renderer2, RendererFactory2 } from '@angular/core'; +import { Observable } from 'rxjs'; +import { Script } from '../models/script.model'; @Injectable({ - providedIn: "root" + providedIn: 'root' }) export class ResourceInjectorService { private renderer: Renderer2 = inject(RendererFactory2).createRenderer(null, null); @@ -17,8 +17,8 @@ export class ResourceInjectorService { console.debug(`stylesheet: ${url} already loaded`); return; } - const link = document.createElement("link"); - link.rel = "stylesheet"; + const link = document.createElement('link'); + link.rel = 'stylesheet'; link.href = url; link.onload = () => { @@ -39,7 +39,7 @@ export class ResourceInjectorService { console.debug(`script: ${src} already injected`); return; } - const script = document.createElement("script"); + const script = document.createElement('script'); script.type = type; if (src) script.src = src; if (textContent) script.textContent = textContent; diff --git a/src/login/DefaultPage.ts b/src/login/DefaultPage.ts index 09d7e00a..612060f6 100644 --- a/src/login/DefaultPage.ts +++ b/src/login/DefaultPage.ts @@ -1,9 +1,9 @@ -import { Type } from "@angular/core"; -import { ClassKey } from "keycloakify/login/lib/kcClsx"; -import { KcContext } from "keycloakify/login/KcContext"; +import { Type } from '@angular/core'; +import { ClassKey } from 'keycloakify/login/lib/kcClsx'; +import { KcContext } from 'keycloakify/login/KcContext'; const DefaultPage = async ( - pageId: KcContext["pageId"], + pageId: KcContext['pageId'], doMakeUserConfirmPassword = true, doUseDefaultCss = true, classes: { [key in ClassKey]?: string } = {} @@ -15,185 +15,185 @@ const DefaultPage = async ( }> => { let ComponentBootstrapPromise; switch (pageId) { - case "login.ftl": + case 'login.ftl': ComponentBootstrapPromise = import( - "@keycloakify/angular/login/pages/login/login.component" + '@keycloakify/angular/login/pages/login/login.component' ).then(c => c.LoginComponent); break; - case "login-username.ftl": + case 'login-username.ftl': ComponentBootstrapPromise = import( - "@keycloakify/angular/login/pages/login-username/login-username.component" + '@keycloakify/angular/login/pages/login-username/login-username.component' ).then(c => c.LoginUsernameComponent); break; - case "login-password.ftl": + case 'login-password.ftl': ComponentBootstrapPromise = import( - "@keycloakify/angular/login/pages/login-password/login-password.component" + '@keycloakify/angular/login/pages/login-password/login-password.component' ).then(c => c.LoginPasswordComponent); break; - case "webauthn-authenticate.ftl": + case 'webauthn-authenticate.ftl': ComponentBootstrapPromise = import( - "@keycloakify/angular/login/pages/webauthn-authenticate/webauthn-authenticate.component" + '@keycloakify/angular/login/pages/webauthn-authenticate/webauthn-authenticate.component' ).then(c => c.WebauthnAuthenticateComponent); break; - case "webauthn-register.ftl": + case 'webauthn-register.ftl': ComponentBootstrapPromise = import( - "@keycloakify/angular/login/pages/webauthn-register/webauthn-register.component" + '@keycloakify/angular/login/pages/webauthn-register/webauthn-register.component' ).then(c => c.WebauthnRegisterComponent); break; - case "register.ftl": + case 'register.ftl': ComponentBootstrapPromise = import( - "@keycloakify/angular/login/pages/register/register.component" + '@keycloakify/angular/login/pages/register/register.component' ).then(c => c.RegisterComponent); break; - case "info.ftl": + case 'info.ftl': ComponentBootstrapPromise = import( - "@keycloakify/angular/login/pages/info/info.component" + '@keycloakify/angular/login/pages/info/info.component' ).then(c => c.InfoComponent); break; - case "error.ftl": + case 'error.ftl': ComponentBootstrapPromise = import( - "@keycloakify/angular/login/pages/error/error.component" + '@keycloakify/angular/login/pages/error/error.component' ).then(c => c.ErrorComponent); break; - case "login-reset-password.ftl": + case 'login-reset-password.ftl': ComponentBootstrapPromise = import( - "@keycloakify/angular/login/pages/login-reset-password/login-reset-password.component" + '@keycloakify/angular/login/pages/login-reset-password/login-reset-password.component' ).then(c => c.LoginResetPasswordComponent); break; - case "login-verify-email.ftl": + case 'login-verify-email.ftl': ComponentBootstrapPromise = import( - "@keycloakify/angular/login/pages/login-verify-email/login-verify-email.component" + '@keycloakify/angular/login/pages/login-verify-email/login-verify-email.component' ).then(c => c.LoginVerifyEmailComponent); break; - case "terms.ftl": + case 'terms.ftl': ComponentBootstrapPromise = import( - "@keycloakify/angular/login/pages/terms/terms.component" + '@keycloakify/angular/login/pages/terms/terms.component' ).then(c => c.TermsComponent); break; - case "login-oauth2-device-verify-user-code.ftl": + case 'login-oauth2-device-verify-user-code.ftl': ComponentBootstrapPromise = import( - "@keycloakify/angular/login/pages/login-oauth2-device-verify-user-code/login-oauth2-device-verify-user-code.component" + '@keycloakify/angular/login/pages/login-oauth2-device-verify-user-code/login-oauth2-device-verify-user-code.component' ).then(c => c.LoginOauth2DeviceVerifyUserCodeComponent); break; - case "login-oauth-grant.ftl": + case 'login-oauth-grant.ftl': ComponentBootstrapPromise = import( - "@keycloakify/angular/login/pages/login-oauth-grant/login-oauth-grant.component" + '@keycloakify/angular/login/pages/login-oauth-grant/login-oauth-grant.component' ).then(c => c.LoginOauthGrantComponent); break; - case "login-otp.ftl": + case 'login-otp.ftl': ComponentBootstrapPromise = import( - "@keycloakify/angular/login/pages/login-otp/login-otp.component" + '@keycloakify/angular/login/pages/login-otp/login-otp.component' ).then(c => c.LoginOtpComponent); break; - case "login-update-profile.ftl": + case 'login-update-profile.ftl': ComponentBootstrapPromise = import( - "@keycloakify/angular/login/pages/login-update-profile/login-update-profile.component" + '@keycloakify/angular/login/pages/login-update-profile/login-update-profile.component' ).then(c => c.LoginUpdateProfileComponent); break; - case "login-update-password.ftl": + case 'login-update-password.ftl': ComponentBootstrapPromise = import( - "@keycloakify/angular/login/pages/login-update-password/login-update-password.component" + '@keycloakify/angular/login/pages/login-update-password/login-update-password.component' ).then(c => c.LoginUpdatePasswordComponent); break; - case "login-idp-link-confirm.ftl": + case 'login-idp-link-confirm.ftl': ComponentBootstrapPromise = import( - "@keycloakify/angular/login/pages/login-idp-link-confirm/login-idp-link-confirm.component" + '@keycloakify/angular/login/pages/login-idp-link-confirm/login-idp-link-confirm.component' ).then(c => c.LoginIdpLinkConfirmComponent); break; - case "login-idp-link-email.ftl": + case 'login-idp-link-email.ftl': ComponentBootstrapPromise = import( - "@keycloakify/angular/login/pages/login-idp-link-email/login-idp-link-email.component" + '@keycloakify/angular/login/pages/login-idp-link-email/login-idp-link-email.component' ).then(c => c.LoginIdpLinkEmailComponent); break; - case "login-page-expired.ftl": + case 'login-page-expired.ftl': ComponentBootstrapPromise = import( - "@keycloakify/angular/login/pages/login-page-expired/login-page-expired.component" + '@keycloakify/angular/login/pages/login-page-expired/login-page-expired.component' ).then(c => c.LoginPageExpiredComponent); break; - case "login-config-totp.ftl": + case 'login-config-totp.ftl': ComponentBootstrapPromise = import( - "@keycloakify/angular/login/pages/login-config-totp/login-config-totp.component" + '@keycloakify/angular/login/pages/login-config-totp/login-config-totp.component' ).then(c => c.LoginConfigTotpComponent); break; - case "logout-confirm.ftl": + case 'logout-confirm.ftl': ComponentBootstrapPromise = import( - "@keycloakify/angular/login/pages/logout-confirm/logout-confirm.component" + '@keycloakify/angular/login/pages/logout-confirm/logout-confirm.component' ).then(c => c.LogoutConfirmComponent); break; - case "idp-review-user-profile.ftl": + case 'idp-review-user-profile.ftl': ComponentBootstrapPromise = import( - "@keycloakify/angular/login/pages/idp-review-user-profile/idp-review-user-profile.component" + '@keycloakify/angular/login/pages/idp-review-user-profile/idp-review-user-profile.component' ).then(c => c.IdpReviewUserProfileComponent); break; - case "update-email.ftl": + case 'update-email.ftl': ComponentBootstrapPromise = import( - "@keycloakify/angular/login/pages/update-email/update-email.component" + '@keycloakify/angular/login/pages/update-email/update-email.component' ).then(c => c.UpdateEmailComponent); break; - case "select-authenticator.ftl": + case 'select-authenticator.ftl': ComponentBootstrapPromise = import( - "@keycloakify/angular/login/pages/select-authenticator/select-authenticator.component" + '@keycloakify/angular/login/pages/select-authenticator/select-authenticator.component' ).then(c => c.SelectAuthenticatorComponent); break; - case "saml-post-form.ftl": + case 'saml-post-form.ftl': ComponentBootstrapPromise = import( - "@keycloakify/angular/login/pages/saml-post-form/saml-post-form.component" + '@keycloakify/angular/login/pages/saml-post-form/saml-post-form.component' ).then(c => c.SamlPostFormComponent); break; - case "delete-credential.ftl": + case 'delete-credential.ftl': ComponentBootstrapPromise = import( - "@keycloakify/angular/login/pages/delete-credential/delete-credential.component" + '@keycloakify/angular/login/pages/delete-credential/delete-credential.component' ).then(c => c.DeleteCredentialComponent); break; - case "code.ftl": + case 'code.ftl': ComponentBootstrapPromise = import( - "@keycloakify/angular/login/pages/code/code.component" + '@keycloakify/angular/login/pages/code/code.component' ).then(c => c.CodeComponent); break; - case "delete-account-confirm.ftl": + case 'delete-account-confirm.ftl': ComponentBootstrapPromise = import( - "@keycloakify/angular/login/pages/delete-account-confirm/delete-account-confirm.component" + '@keycloakify/angular/login/pages/delete-account-confirm/delete-account-confirm.component' ).then(c => c.DeleteAccountConfirmComponent); break; - case "frontchannel-logout.ftl": + case 'frontchannel-logout.ftl': ComponentBootstrapPromise = import( - "@keycloakify/angular/login/pages/frontchannel-logout/frontchannel-logout.component" + '@keycloakify/angular/login/pages/frontchannel-logout/frontchannel-logout.component' ).then(c => c.FrontchannelLogoutComponent); break; - case "login-recovery-authn-code-config.ftl": + case 'login-recovery-authn-code-config.ftl': ComponentBootstrapPromise = import( - "@keycloakify/angular/login/pages/login-recovery-authn-code-config/login-recovery-authn-code-config.component" + '@keycloakify/angular/login/pages/login-recovery-authn-code-config/login-recovery-authn-code-config.component' ).then(c => c.LoginRecoveryAuthnCodeConfigComponent); break; - case "login-recovery-authn-code-input.ftl": + case 'login-recovery-authn-code-input.ftl': ComponentBootstrapPromise = import( - "@keycloakify/angular/login/pages/login-recovery-authn-code-input/login-recovery-authn-code-input.component" + '@keycloakify/angular/login/pages/login-recovery-authn-code-input/login-recovery-authn-code-input.component' ).then(c => c.LoginRecoveryAuthnCodeInputComponent); break; - case "login-reset-otp.ftl": + case 'login-reset-otp.ftl': ComponentBootstrapPromise = import( - "@keycloakify/angular/login/pages/login-reset-otp/login-reset-otp.component" + '@keycloakify/angular/login/pages/login-reset-otp/login-reset-otp.component' ).then(c => c.LoginResetOtpComponent); break; - case "login-x509-info.ftl": + case 'login-x509-info.ftl': ComponentBootstrapPromise = import( - "@keycloakify/angular/login/pages/login-x509-info/login-x509-info.component" + '@keycloakify/angular/login/pages/login-x509-info/login-x509-info.component' ).then(c => c.LoginX509InfoComponent); break; - case "webauthn-error.ftl": + case 'webauthn-error.ftl': ComponentBootstrapPromise = import( - "@keycloakify/angular/login/pages/webauthn-error/webauthn-error.component" + '@keycloakify/angular/login/pages/webauthn-error/webauthn-error.component' ).then(c => c.WebauthnErrorComponent); break; - case "login-passkeys-conditional-authenticate.ftl": + case 'login-passkeys-conditional-authenticate.ftl': ComponentBootstrapPromise = import( - "@keycloakify/angular/login/pages/login-passkeys-conditional-authenticate/login-passkeys-conditional-authenticate.component" + '@keycloakify/angular/login/pages/login-passkeys-conditional-authenticate/login-passkeys-conditional-authenticate.component' ).then(c => c.LoginPasskeysConditionalAuthenticateComponent); break; - case "login-idp-link-confirm-override.ftl": + case 'login-idp-link-confirm-override.ftl': ComponentBootstrapPromise = import( - "@keycloakify/angular/login/pages/login-idp-link-confirm-override/login-idp-link-confirm-override.component" + '@keycloakify/angular/login/pages/login-idp-link-confirm-override/login-idp-link-confirm-override.component' ).then(c => c.LoginIdpLinkConfirmOverrideComponent); break; } diff --git a/src/login/KcContext.ts b/src/login/KcContext.ts index d8e0aefa..34a1cec4 100644 --- a/src/login/KcContext.ts +++ b/src/login/KcContext.ts @@ -1 +1 @@ -export type { KcContext } from "keycloakify/login/KcContext"; +export type { KcContext } from 'keycloakify/login/KcContext'; diff --git a/src/login/classes/component-reference.class.ts b/src/login/classes/component-reference.class.ts index 453cc8c8..ff7fe22e 100644 --- a/src/login/classes/component-reference.class.ts +++ b/src/login/classes/component-reference.class.ts @@ -1,4 +1,4 @@ -import { ClassKey } from "keycloakify/login/lib/kcClsx"; +import { ClassKey } from 'keycloakify/login/lib/kcClsx'; export abstract class ComponentReference { doUseDefaultCss: boolean | undefined; classes: Partial> | undefined; diff --git a/src/login/components/add-remove-buttons-multi-valued-attribute/add-remove-buttons-multi-valued-attribute.component.ts b/src/login/components/add-remove-buttons-multi-valued-attribute/add-remove-buttons-multi-valued-attribute.component.ts index 1b1127fb..c4e3995d 100644 --- a/src/login/components/add-remove-buttons-multi-valued-attribute/add-remove-buttons-multi-valued-attribute.component.ts +++ b/src/login/components/add-remove-buttons-multi-valued-attribute/add-remove-buttons-multi-valued-attribute.component.ts @@ -4,10 +4,10 @@ import { computed, input, output -} from "@angular/core"; -import { Attribute } from "keycloakify/login/KcContext"; -import { MsgStrPipe } from "@keycloakify/angular/login/pipes/msg-str.pipe"; -import { FormAction } from "@keycloakify/angular/login/services/user-profile-form.service"; +} from '@angular/core'; +import { Attribute } from 'keycloakify/login/KcContext'; +import { MsgStrPipe } from '@keycloakify/angular/login/pipes/msg-str.pipe'; +import { FormAction } from '@keycloakify/angular/login/services/user-profile-form.service'; @Component({ standalone: true, @@ -19,8 +19,8 @@ import { FormAction } from "@keycloakify/angular/login/services/user-profile-for ` ], imports: [MsgStrPipe], - selector: "kc-add-remove-buttons-multi-valued-attribute", - templateUrl: "add-remove-buttons-multi-valued-attribute.component.html", + selector: 'kc-add-remove-buttons-multi-valued-attribute', + templateUrl: 'add-remove-buttons-multi-valued-attribute.component.html', changeDetection: ChangeDetectionStrategy.OnPush }) export class AddRemoveButtonsMultiValuedAttributeComponent { @@ -58,16 +58,16 @@ export class AddRemoveButtonsMultiValuedAttributeComponent { onAdd() { this.dispatchFormAction.emit({ - action: "update", - name: this.attribute()?.name ?? "", - valueOrValues: [...(this.values() ?? []), ""] + action: 'update', + name: this.attribute()?.name ?? '', + valueOrValues: [...(this.values() ?? []), ''] }); } onRemove() { this.dispatchFormAction.emit({ - action: "update", - name: this.attribute()?.name ?? "", + action: 'update', + name: this.attribute()?.name ?? '', valueOrValues: (this.values() ?? []).filter((_, i) => i !== this.fieldIndex()) }); } diff --git a/src/login/components/field-errors/field-errors.component.ts b/src/login/components/field-errors/field-errors.component.ts index eea0297c..8f4f61c4 100644 --- a/src/login/components/field-errors/field-errors.component.ts +++ b/src/login/components/field-errors/field-errors.component.ts @@ -4,13 +4,13 @@ import { forwardRef, inject, input -} from "@angular/core"; -import { CLASSES, USE_DEFAULT_CSS } from "@keycloakify/angular/lib/public-api"; -import { Attribute } from "keycloakify/login/KcContext"; -import { ClassKey } from "keycloakify/login/lib/kcClsx"; -import { ComponentReference } from "@keycloakify/angular/login/classes/component-reference.class"; -import { KcClassDirective } from "@keycloakify/angular/login/directives/kc-class.directive"; -import { FormFieldError } from "@keycloakify/angular/login/services/user-profile-form.service"; +} from '@angular/core'; +import { CLASSES, USE_DEFAULT_CSS } from '@keycloakify/angular/lib/public-api'; +import { Attribute } from 'keycloakify/login/KcContext'; +import { ClassKey } from 'keycloakify/login/lib/kcClsx'; +import { ComponentReference } from '@keycloakify/angular/login/classes/component-reference.class'; +import { KcClassDirective } from '@keycloakify/angular/login/directives/kc-class.directive'; +import { FormFieldError } from '@keycloakify/angular/login/services/user-profile-form.service'; @Component({ standalone: true, @@ -22,8 +22,8 @@ import { FormFieldError } from "@keycloakify/angular/login/services/user-profile ` ], imports: [KcClassDirective], - selector: "kc-field-errors", - templateUrl: "field-errors.component.html", + selector: 'kc-field-errors', + templateUrl: 'field-errors.component.html', changeDetection: ChangeDetectionStrategy.OnPush, providers: [ { diff --git a/src/login/components/group-label/group-label.component.ts b/src/login/components/group-label/group-label.component.ts index 2402d888..bab6aab5 100644 --- a/src/login/components/group-label/group-label.component.ts +++ b/src/login/components/group-label/group-label.component.ts @@ -5,14 +5,14 @@ import { forwardRef, inject, input -} from "@angular/core"; -import { CLASSES, USE_DEFAULT_CSS } from "@keycloakify/angular/lib/public-api"; -import { Attribute } from "keycloakify/login/KcContext"; -import { ClassKey } from "keycloakify/login/lib/kcClsx"; -import { ComponentReference } from "@keycloakify/angular/login/classes/component-reference.class"; -import { AttributesDirective } from "@keycloakify/angular/login/directives/attributes.directive"; -import { KcClassDirective } from "@keycloakify/angular/login/directives/kc-class.directive"; -import { AdvancedMsgStrPipe } from "@keycloakify/angular/login/pipes/advanced-msg-str.pipe"; +} from '@angular/core'; +import { CLASSES, USE_DEFAULT_CSS } from '@keycloakify/angular/lib/public-api'; +import { Attribute } from 'keycloakify/login/KcContext'; +import { ClassKey } from 'keycloakify/login/lib/kcClsx'; +import { ComponentReference } from '@keycloakify/angular/login/classes/component-reference.class'; +import { AttributesDirective } from '@keycloakify/angular/login/directives/attributes.directive'; +import { KcClassDirective } from '@keycloakify/angular/login/directives/kc-class.directive'; +import { AdvancedMsgStrPipe } from '@keycloakify/angular/login/pipes/advanced-msg-str.pipe'; @Component({ standalone: true, @@ -24,8 +24,8 @@ import { AdvancedMsgStrPipe } from "@keycloakify/angular/login/pipes/advanced-ms ` ], imports: [KcClassDirective, AttributesDirective, AdvancedMsgStrPipe], - selector: "kc-group-label", - templateUrl: "group-label.component.html", + selector: 'kc-group-label', + templateUrl: 'group-label.component.html', changeDetection: ChangeDetectionStrategy.OnPush, providers: [ { @@ -43,8 +43,8 @@ export class GroupLabelComponent extends ComponentReference { const attribute = this.attribute(); const groupName = this.groupName(); if (attribute?.group?.name !== groupName) { - return attribute?.group?.name ?? ""; + return attribute?.group?.name ?? ''; } - return ""; + return ''; }); } diff --git a/src/login/components/index.ts b/src/login/components/index.ts index d2d64094..33bcf2b8 100644 --- a/src/login/components/index.ts +++ b/src/login/components/index.ts @@ -1,11 +1,11 @@ -export * from "./add-remove-buttons-multi-valued-attribute/add-remove-buttons-multi-valued-attribute.component"; -export * from "./field-errors/field-errors.component"; -export * from "./group-label/group-label.component"; -export * from "./input-field-by-type/input-field-by-type.component"; -export * from "./input-tag/input-tag.component"; -export * from "./input-tag-selects/input-tag-selects.component"; -export * from "./logout-other-sessions/logout-other-sessions.component"; -export * from "./password-wrapper/password-wrapper.component"; -export * from "./select-tag/select-tag.component"; -export * from "./textarea-tag/textarea-tag.component"; -export * from "./user-profile-form-fields/user-profile-form-fields.component"; +export * from './add-remove-buttons-multi-valued-attribute/add-remove-buttons-multi-valued-attribute.component'; +export * from './field-errors/field-errors.component'; +export * from './group-label/group-label.component'; +export * from './input-field-by-type/input-field-by-type.component'; +export * from './input-tag/input-tag.component'; +export * from './input-tag-selects/input-tag-selects.component'; +export * from './logout-other-sessions/logout-other-sessions.component'; +export * from './password-wrapper/password-wrapper.component'; +export * from './select-tag/select-tag.component'; +export * from './textarea-tag/textarea-tag.component'; +export * from './user-profile-form-fields/user-profile-form-fields.component'; diff --git a/src/login/components/input-field-by-type/input-field-by-type.component.ts b/src/login/components/input-field-by-type/input-field-by-type.component.ts index be603a8d..64f00afb 100644 --- a/src/login/components/input-field-by-type/input-field-by-type.component.ts +++ b/src/login/components/input-field-by-type/input-field-by-type.component.ts @@ -6,21 +6,21 @@ import { inject, input, output -} from "@angular/core"; -import { CLASSES, USE_DEFAULT_CSS } from "@keycloakify/angular/lib/public-api"; -import { Attribute } from "keycloakify/login/KcContext"; -import { ClassKey } from "keycloakify/login/lib/kcClsx"; -import { ComponentReference } from "@keycloakify/angular/login/classes/component-reference.class"; -import { ToArrayPipe } from "@keycloakify/angular/login/pipes/to-array.pipe"; +} from '@angular/core'; +import { CLASSES, USE_DEFAULT_CSS } from '@keycloakify/angular/lib/public-api'; +import { Attribute } from 'keycloakify/login/KcContext'; +import { ClassKey } from 'keycloakify/login/lib/kcClsx'; +import { ComponentReference } from '@keycloakify/angular/login/classes/component-reference.class'; +import { ToArrayPipe } from '@keycloakify/angular/login/pipes/to-array.pipe'; import { FormAction, FormFieldError -} from "@keycloakify/angular/login/services/user-profile-form.service"; -import { InputTagSelectsComponent } from "@keycloakify/angular/login/components/input-tag-selects/input-tag-selects.component"; -import { InputTagComponent } from "@keycloakify/angular/login/components/input-tag/input-tag.component"; -import { PasswordWrapperComponent } from "@keycloakify/angular/login/components/password-wrapper/password-wrapper.component"; -import { SelectTagComponent } from "@keycloakify/angular/login/components/select-tag/select-tag.component"; -import { TextareaTagComponent } from "@keycloakify/angular/login/components/textarea-tag/textarea-tag.component"; +} from '@keycloakify/angular/login/services/user-profile-form.service'; +import { InputTagSelectsComponent } from '@keycloakify/angular/login/components/input-tag-selects/input-tag-selects.component'; +import { InputTagComponent } from '@keycloakify/angular/login/components/input-tag/input-tag.component'; +import { PasswordWrapperComponent } from '@keycloakify/angular/login/components/password-wrapper/password-wrapper.component'; +import { SelectTagComponent } from '@keycloakify/angular/login/components/select-tag/select-tag.component'; +import { TextareaTagComponent } from '@keycloakify/angular/login/components/textarea-tag/textarea-tag.component'; @Component({ standalone: true, @@ -39,8 +39,8 @@ import { TextareaTagComponent } from "@keycloakify/angular/login/components/text InputTagComponent, PasswordWrapperComponent ], - selector: "kc-input-field-by-type", - templateUrl: "input-field-by-type.component.html", + selector: 'kc-input-field-by-type', + templateUrl: 'input-field-by-type.component.html', changeDetection: ChangeDetectionStrategy.OnPush, providers: [ { @@ -61,7 +61,7 @@ export class InputFieldByTypeComponent extends ComponentReference { const attribute: Attribute = this.attribute() ?? ({} as Attribute); return { ...attribute, - annotations: { ...(attribute.annotations ?? {}), inputType: "password" } + annotations: { ...(attribute.annotations ?? {}), inputType: 'password' } }; }); } diff --git a/src/login/components/input-tag-selects/input-tag-selects.component.ts b/src/login/components/input-tag-selects/input-tag-selects.component.ts index 00dba4a8..2e5fa052 100644 --- a/src/login/components/input-tag-selects/input-tag-selects.component.ts +++ b/src/login/components/input-tag-selects/input-tag-selects.component.ts @@ -7,17 +7,17 @@ import { input, output, Signal -} from "@angular/core"; -import { CLASSES, USE_DEFAULT_CSS } from "@keycloakify/angular/lib/public-api"; -import { Attribute } from "keycloakify/login/KcContext"; -import { ClassKey } from "keycloakify/login/lib/kcClsx"; -import { ComponentReference } from "@keycloakify/angular/login/classes/component-reference.class"; -import { KcClassDirective } from "@keycloakify/angular/login/directives/kc-class.directive"; -import { AdvancedMsgStrPipe } from "@keycloakify/angular/login/pipes/advanced-msg-str.pipe"; +} from '@angular/core'; +import { CLASSES, USE_DEFAULT_CSS } from '@keycloakify/angular/lib/public-api'; +import { Attribute } from 'keycloakify/login/KcContext'; +import { ClassKey } from 'keycloakify/login/lib/kcClsx'; +import { ComponentReference } from '@keycloakify/angular/login/classes/component-reference.class'; +import { KcClassDirective } from '@keycloakify/angular/login/directives/kc-class.directive'; +import { AdvancedMsgStrPipe } from '@keycloakify/angular/login/pipes/advanced-msg-str.pipe'; import { FormAction, FormFieldError -} from "@keycloakify/angular/login/services/user-profile-form.service"; +} from '@keycloakify/angular/login/services/user-profile-form.service'; @Component({ standalone: true, @@ -29,8 +29,8 @@ import { ` ], imports: [KcClassDirective, AdvancedMsgStrPipe], - selector: "kc-input-tag-selects", - templateUrl: "input-tag-selects.component.html", + selector: 'kc-input-tag-selects', + templateUrl: 'input-tag-selects.component.html', changeDetection: ChangeDetectionStrategy.OnPush, providers: [ { @@ -48,7 +48,7 @@ export class InputTagSelectsComponent extends ComponentReference { override classes = inject>>(CLASSES); context: Signal<{ - inputType: "radio" | "checkbox"; + inputType: 'radio' | 'checkbox'; classDiv: ClassKey; classInput: ClassKey; classLabel: ClassKey; @@ -57,19 +57,19 @@ export class InputTagSelectsComponent extends ComponentReference { if (attribute) { const { inputType } = attribute.annotations; switch (inputType) { - case "select-radiobuttons": + case 'select-radiobuttons': return { - inputType: "radio", - classDiv: "kcInputClassRadio", - classInput: "kcInputClassRadioInput", - classLabel: "kcInputClassRadioLabel" + inputType: 'radio', + classDiv: 'kcInputClassRadio', + classInput: 'kcInputClassRadioInput', + classLabel: 'kcInputClassRadioLabel' }; - case "multiselect-checkboxes": + case 'multiselect-checkboxes': return { - inputType: "checkbox", - classDiv: "kcInputClassCheckbox", - classInput: "kcInputClassCheckboxInput", - classLabel: "kcInputClassCheckboxLabel" + inputType: 'checkbox', + classDiv: 'kcInputClassCheckbox', + classInput: 'kcInputClassCheckboxInput', + classLabel: 'kcInputClassCheckboxLabel' }; } } @@ -120,8 +120,8 @@ export class InputTagSelectsComponent extends ComponentReference { const valueOrValues = this.valueOrValues(); const isChecked = (event.target as HTMLInputElement).checked; this.dispatchFormAction.emit({ - action: "update", - name: this.attribute()?.name ?? "", + action: 'update', + name: this.attribute()?.name ?? '', valueOrValues: (() => { if (valueOrValues instanceof Array) { const newValues = [...valueOrValues]; @@ -135,15 +135,15 @@ export class InputTagSelectsComponent extends ComponentReference { return newValues; } - return (event.target as HTMLInputElement)?.checked ? option : ""; + return (event.target as HTMLInputElement)?.checked ? option : ''; })() }); } onBlur() { this.dispatchFormAction.emit({ - action: "focus lost", - name: this.attribute()?.name ?? "", + action: 'focus lost', + name: this.attribute()?.name ?? '', fieldIndex: undefined }); } diff --git a/src/login/components/input-tag/input-tag.component.ts b/src/login/components/input-tag/input-tag.component.ts index 5135e600..ff315bbe 100644 --- a/src/login/components/input-tag/input-tag.component.ts +++ b/src/login/components/input-tag/input-tag.component.ts @@ -6,23 +6,23 @@ import { inject, input, output -} from "@angular/core"; -import { CLASSES, USE_DEFAULT_CSS } from "@keycloakify/angular/lib/public-api"; -import { Attribute } from "keycloakify/login/KcContext"; -import { ClassKey } from "keycloakify/login/lib/kcClsx"; -import { ComponentReference } from "@keycloakify/angular/login/classes/component-reference.class"; -import { AttributesDirective } from "@keycloakify/angular/login/directives/attributes.directive"; -import { KcClassDirective } from "@keycloakify/angular/login/directives/kc-class.directive"; -import { AdvancedMsgStrPipe } from "@keycloakify/angular/login/pipes/advanced-msg-str.pipe"; -import { InputTypePipe } from "@keycloakify/angular/login/pipes/input-type.pipe"; -import { ToArrayPipe } from "@keycloakify/angular/login/pipes/to-array.pipe"; -import { ToNumberPipe } from "@keycloakify/angular/login/pipes/to-number.pipe"; +} from '@angular/core'; +import { CLASSES, USE_DEFAULT_CSS } from '@keycloakify/angular/lib/public-api'; +import { Attribute } from 'keycloakify/login/KcContext'; +import { ClassKey } from 'keycloakify/login/lib/kcClsx'; +import { ComponentReference } from '@keycloakify/angular/login/classes/component-reference.class'; +import { AttributesDirective } from '@keycloakify/angular/login/directives/attributes.directive'; +import { KcClassDirective } from '@keycloakify/angular/login/directives/kc-class.directive'; +import { AdvancedMsgStrPipe } from '@keycloakify/angular/login/pipes/advanced-msg-str.pipe'; +import { InputTypePipe } from '@keycloakify/angular/login/pipes/input-type.pipe'; +import { ToArrayPipe } from '@keycloakify/angular/login/pipes/to-array.pipe'; +import { ToNumberPipe } from '@keycloakify/angular/login/pipes/to-number.pipe'; import { FormAction, FormFieldError -} from "@keycloakify/angular/login/services/user-profile-form.service"; -import { AddRemoveButtonsMultiValuedAttributeComponent } from "@keycloakify/angular/login/components/add-remove-buttons-multi-valued-attribute/add-remove-buttons-multi-valued-attribute.component"; -import { FieldErrorsComponent } from "@keycloakify/angular/login/components/field-errors/field-errors.component"; +} from '@keycloakify/angular/login/services/user-profile-form.service'; +import { AddRemoveButtonsMultiValuedAttributeComponent } from '@keycloakify/angular/login/components/add-remove-buttons-multi-valued-attribute/add-remove-buttons-multi-valued-attribute.component'; +import { FieldErrorsComponent } from '@keycloakify/angular/login/components/field-errors/field-errors.component'; @Component({ standalone: true, @@ -43,8 +43,8 @@ import { FieldErrorsComponent } from "@keycloakify/angular/login/components/fiel AddRemoveButtonsMultiValuedAttributeComponent, AdvancedMsgStrPipe ], - selector: "kc-input-tag", - templateUrl: "input-tag.component.html", + selector: 'kc-input-tag', + templateUrl: 'input-tag.component.html', changeDetection: ChangeDetectionStrategy.OnPush, providers: [ { @@ -78,8 +78,8 @@ export class InputTagComponent extends ComponentReference { onChange(event: Event) { const valueOrValues = this.valueOrValues(); this.dispatchFormAction.emit({ - action: "update", - name: this.attribute()?.name ?? "", + action: 'update', + name: this.attribute()?.name ?? '', valueOrValues: (() => { if (this.fieldIndex !== undefined) { if (valueOrValues instanceof Array) { @@ -100,8 +100,8 @@ export class InputTagComponent extends ComponentReference { onBlur() { this.dispatchFormAction.emit({ - action: "focus lost", - name: this.attribute()?.name ?? "", + action: 'focus lost', + name: this.attribute()?.name ?? '', fieldIndex: this.fieldIndex() }); } diff --git a/src/login/components/logout-other-sessions/logout-other-sessions.component.ts b/src/login/components/logout-other-sessions/logout-other-sessions.component.ts index 978ef2b8..d715cf28 100644 --- a/src/login/components/logout-other-sessions/logout-other-sessions.component.ts +++ b/src/login/components/logout-other-sessions/logout-other-sessions.component.ts @@ -1,12 +1,12 @@ -import { ChangeDetectionStrategy, Component, forwardRef, inject } from "@angular/core"; -import { CLASSES, USE_DEFAULT_CSS } from "@keycloakify/angular/lib/public-api"; -import { ClassKey } from "keycloakify/login/lib/kcClsx"; -import { ComponentReference } from "@keycloakify/angular/login/classes/component-reference.class"; -import { KcClassDirective } from "@keycloakify/angular/login/directives/kc-class.directive"; -import { MsgStrPipe } from "@keycloakify/angular/login/pipes/msg-str.pipe"; +import { ChangeDetectionStrategy, Component, forwardRef, inject } from '@angular/core'; +import { CLASSES, USE_DEFAULT_CSS } from '@keycloakify/angular/lib/public-api'; +import { ClassKey } from 'keycloakify/login/lib/kcClsx'; +import { ComponentReference } from '@keycloakify/angular/login/classes/component-reference.class'; +import { KcClassDirective } from '@keycloakify/angular/login/directives/kc-class.directive'; +import { MsgStrPipe } from '@keycloakify/angular/login/pipes/msg-str.pipe'; @Component({ - selector: "kc-logout-other-sessions", + selector: 'kc-logout-other-sessions', styles: [ ` :host { @@ -17,7 +17,7 @@ import { MsgStrPipe } from "@keycloakify/angular/login/pipes/msg-str.pipe"; standalone: true, imports: [KcClassDirective, MsgStrPipe], changeDetection: ChangeDetectionStrategy.OnPush, - templateUrl: "./logout-other-sessions.component.html", + templateUrl: './logout-other-sessions.component.html', providers: [ { provide: ComponentReference, diff --git a/src/login/components/password-wrapper/password-wrapper.component.ts b/src/login/components/password-wrapper/password-wrapper.component.ts index def92350..0f9d372c 100644 --- a/src/login/components/password-wrapper/password-wrapper.component.ts +++ b/src/login/components/password-wrapper/password-wrapper.component.ts @@ -1,4 +1,4 @@ -import { AsyncPipe } from "@angular/common"; +import { AsyncPipe } from '@angular/common'; import { ChangeDetectionStrategy, Component, @@ -8,15 +8,15 @@ import { Renderer2, signal, WritableSignal -} from "@angular/core"; -import { CLASSES, USE_DEFAULT_CSS } from "@keycloakify/angular/lib/public-api"; -import { ClassKey } from "keycloakify/login/lib/kcClsx"; -import { ComponentReference } from "@keycloakify/angular/login/classes/component-reference.class"; -import { KcClassDirective } from "@keycloakify/angular/login/directives/kc-class.directive"; -import { MsgStrPipe } from "@keycloakify/angular/login/pipes/msg-str.pipe"; +} from '@angular/core'; +import { CLASSES, USE_DEFAULT_CSS } from '@keycloakify/angular/lib/public-api'; +import { ClassKey } from 'keycloakify/login/lib/kcClsx'; +import { ComponentReference } from '@keycloakify/angular/login/classes/component-reference.class'; +import { KcClassDirective } from '@keycloakify/angular/login/directives/kc-class.directive'; +import { MsgStrPipe } from '@keycloakify/angular/login/pipes/msg-str.pipe'; @Component({ - selector: "kc-password-wrapper", + selector: 'kc-password-wrapper', styles: [ ` :host { @@ -27,7 +27,7 @@ import { MsgStrPipe } from "@keycloakify/angular/login/pipes/msg-str.pipe"; standalone: true, changeDetection: ChangeDetectionStrategy.OnPush, imports: [KcClassDirective, AsyncPipe, MsgStrPipe], - templateUrl: "./password-wrapper.component.html", + templateUrl: './password-wrapper.component.html', providers: [ { provide: ComponentReference, @@ -53,8 +53,8 @@ export class PasswordWrapperComponent extends ComponentReference { if (input) { this.renderer.setProperty( input, - "type", - this.isPasswordRevealed() ? "text" : "password" + 'type', + this.isPasswordRevealed() ? 'text' : 'password' ); } } diff --git a/src/login/components/select-tag/select-tag.component.ts b/src/login/components/select-tag/select-tag.component.ts index 5dbccba1..414551ba 100644 --- a/src/login/components/select-tag/select-tag.component.ts +++ b/src/login/components/select-tag/select-tag.component.ts @@ -6,18 +6,18 @@ import { inject, input, output -} from "@angular/core"; -import { CLASSES, USE_DEFAULT_CSS } from "@keycloakify/angular/lib/public-api"; -import { Attribute } from "keycloakify/login/KcContext"; -import { ClassKey } from "keycloakify/login/lib/kcClsx"; -import { ComponentReference } from "@keycloakify/angular/login/classes/component-reference.class"; -import { KcClassDirective } from "@keycloakify/angular/login/directives/kc-class.directive"; -import { AdvancedMsgStrPipe } from "@keycloakify/angular/login/pipes/advanced-msg-str.pipe"; -import { ToNumberPipe } from "@keycloakify/angular/login/pipes/to-number.pipe"; +} from '@angular/core'; +import { CLASSES, USE_DEFAULT_CSS } from '@keycloakify/angular/lib/public-api'; +import { Attribute } from 'keycloakify/login/KcContext'; +import { ClassKey } from 'keycloakify/login/lib/kcClsx'; +import { ComponentReference } from '@keycloakify/angular/login/classes/component-reference.class'; +import { KcClassDirective } from '@keycloakify/angular/login/directives/kc-class.directive'; +import { AdvancedMsgStrPipe } from '@keycloakify/angular/login/pipes/advanced-msg-str.pipe'; +import { ToNumberPipe } from '@keycloakify/angular/login/pipes/to-number.pipe'; import { FormAction, FormFieldError -} from "@keycloakify/angular/login/services/user-profile-form.service"; +} from '@keycloakify/angular/login/services/user-profile-form.service'; @Component({ standalone: true, @@ -29,8 +29,8 @@ import { ` ], imports: [KcClassDirective, ToNumberPipe, AdvancedMsgStrPipe], - selector: "kc-select-tag", - templateUrl: "select-tag.component.html", + selector: 'kc-select-tag', + templateUrl: 'select-tag.component.html', changeDetection: ChangeDetectionStrategy.OnPush, providers: [ { @@ -48,7 +48,7 @@ export class SelectTagComponent extends ComponentReference { override classes = inject>>(CLASSES); isMultiple = computed(() => { - return this.attribute()?.annotations?.inputType === "multiselect"; + return this.attribute()?.annotations?.inputType === 'multiselect'; }); options = computed(() => { @@ -85,8 +85,8 @@ export class SelectTagComponent extends ComponentReference { onChange(event: Event) { this.dispatchFormAction.emit({ - action: "update", - name: this.attribute()?.name ?? "", + action: 'update', + name: this.attribute()?.name ?? '', valueOrValues: (() => { if (this.isMultiple()) { return Array.from( @@ -101,8 +101,8 @@ export class SelectTagComponent extends ComponentReference { onBlur() { this.dispatchFormAction.emit({ - action: "focus lost", - name: this.attribute()?.name ?? "", + action: 'focus lost', + name: this.attribute()?.name ?? '', fieldIndex: undefined }); } diff --git a/src/login/components/textarea-tag/textarea-tag.component.ts b/src/login/components/textarea-tag/textarea-tag.component.ts index 56673ea6..b7eca271 100644 --- a/src/login/components/textarea-tag/textarea-tag.component.ts +++ b/src/login/components/textarea-tag/textarea-tag.component.ts @@ -5,17 +5,17 @@ import { inject, input, output -} from "@angular/core"; -import { CLASSES, USE_DEFAULT_CSS } from "@keycloakify/angular/lib/public-api"; -import { Attribute } from "keycloakify/login/KcContext"; -import { ClassKey } from "keycloakify/login/lib/kcClsx"; -import { ComponentReference } from "@keycloakify/angular/login/classes/component-reference.class"; -import { KcClassDirective } from "@keycloakify/angular/login/directives/kc-class.directive"; -import { ToNumberPipe } from "@keycloakify/angular/login/pipes/to-number.pipe"; +} from '@angular/core'; +import { CLASSES, USE_DEFAULT_CSS } from '@keycloakify/angular/lib/public-api'; +import { Attribute } from 'keycloakify/login/KcContext'; +import { ClassKey } from 'keycloakify/login/lib/kcClsx'; +import { ComponentReference } from '@keycloakify/angular/login/classes/component-reference.class'; +import { KcClassDirective } from '@keycloakify/angular/login/directives/kc-class.directive'; +import { ToNumberPipe } from '@keycloakify/angular/login/pipes/to-number.pipe'; import { FormAction, FormFieldError -} from "@keycloakify/angular/login/services/user-profile-form.service"; +} from '@keycloakify/angular/login/services/user-profile-form.service'; @Component({ standalone: true, @@ -27,8 +27,8 @@ import { ` ], imports: [KcClassDirective, ToNumberPipe], - selector: "kc-textarea-tag", - templateUrl: "textarea-tag.component.html", + selector: 'kc-textarea-tag', + templateUrl: 'textarea-tag.component.html', changeDetection: ChangeDetectionStrategy.OnPush, providers: [ { @@ -47,16 +47,16 @@ export class TextareaTagComponent extends ComponentReference { onChange(event: Event) { this.dispatchFormAction.emit({ - action: "update", - name: this.attribute()?.name ?? "", + action: 'update', + name: this.attribute()?.name ?? '', valueOrValues: (event.target as HTMLTextAreaElement).value }); } onBlur() { this.dispatchFormAction.emit({ - action: "focus lost", - name: this.attribute()?.name ?? "", + action: 'focus lost', + name: this.attribute()?.name ?? '', fieldIndex: undefined }); } diff --git a/src/login/components/user-profile-form-fields/user-profile-form-fields.component.ts b/src/login/components/user-profile-form-fields/user-profile-form-fields.component.ts index 1d5b396f..1cd33a81 100644 --- a/src/login/components/user-profile-form-fields/user-profile-form-fields.component.ts +++ b/src/login/components/user-profile-form-fields/user-profile-form-fields.component.ts @@ -1,4 +1,4 @@ -import { NgTemplateOutlet } from "@angular/common"; +import { NgTemplateOutlet } from '@angular/common'; import { ChangeDetectionStrategy, Component, @@ -8,25 +8,25 @@ import { inject, output, TemplateRef -} from "@angular/core"; +} from '@angular/core'; import { DO_MAKE_USER_CONFIRM_PASSWORD, KC_CONTEXT, CLASSES, USE_DEFAULT_CSS -} from "@keycloakify/angular/lib/public-api"; -import { ClassKey } from "keycloakify/login/lib/kcClsx"; -import { KcContext } from "keycloakify/login/KcContext"; -import { ComponentReference } from "@keycloakify/angular/login/classes/component-reference.class"; -import { KcClassDirective } from "@keycloakify/angular/login/directives/kc-class.directive"; -import { AdvancedMsgStrPipe } from "@keycloakify/angular/login/pipes/advanced-msg-str.pipe"; +} from '@keycloakify/angular/lib/public-api'; +import { ClassKey } from 'keycloakify/login/lib/kcClsx'; +import { KcContext } from 'keycloakify/login/KcContext'; +import { ComponentReference } from '@keycloakify/angular/login/classes/component-reference.class'; +import { KcClassDirective } from '@keycloakify/angular/login/directives/kc-class.directive'; +import { AdvancedMsgStrPipe } from '@keycloakify/angular/login/pipes/advanced-msg-str.pipe'; import { FormAction, UserProfileFormService -} from "@keycloakify/angular/login/services/user-profile-form.service"; -import { FieldErrorsComponent } from "@keycloakify/angular/login/components/field-errors/field-errors.component"; -import { GroupLabelComponent } from "@keycloakify/angular/login/components/group-label/group-label.component"; -import { InputFieldByTypeComponent } from "@keycloakify/angular/login/components/input-field-by-type/input-field-by-type.component"; +} from '@keycloakify/angular/login/services/user-profile-form.service'; +import { FieldErrorsComponent } from '@keycloakify/angular/login/components/field-errors/field-errors.component'; +import { GroupLabelComponent } from '@keycloakify/angular/login/components/group-label/group-label.component'; +import { InputFieldByTypeComponent } from '@keycloakify/angular/login/components/input-field-by-type/input-field-by-type.component'; @Component({ standalone: true, @@ -45,8 +45,8 @@ import { InputFieldByTypeComponent } from "@keycloakify/angular/login/components NgTemplateOutlet, AdvancedMsgStrPipe ], - selector: "kc-user-profile-form-fields", - templateUrl: "user-profile-form-fields.component.html", + selector: 'kc-user-profile-form-fields', + templateUrl: 'user-profile-form-fields.component.html', changeDetection: ChangeDetectionStrategy.OnPush, providers: [ UserProfileFormService, @@ -67,8 +67,8 @@ export class UserProfileFormFieldsComponent extends ComponentReference { formState = this.userProfileFormService.formState; - @ContentChild("beforField") beforeField: TemplateRef | undefined; - @ContentChild("afterField") afterField: TemplateRef | undefined; + @ContentChild('beforField') beforeField: TemplateRef | undefined; + @ContentChild('afterField') afterField: TemplateRef | undefined; constructor() { super(); diff --git a/src/login/containers/template.component.ts b/src/login/containers/template.component.ts index bee991f9..78447d27 100644 --- a/src/login/containers/template.component.ts +++ b/src/login/containers/template.component.ts @@ -1,4 +1,4 @@ -import { AsyncPipe, NgTemplateOutlet } from "@angular/common"; +import { AsyncPipe, NgTemplateOutlet } from '@angular/common'; import { ChangeDetectionStrategy, Component, @@ -7,27 +7,27 @@ import { input, OnInit, Renderer2 -} from "@angular/core"; -import { Meta, Title } from "@angular/platform-browser"; +} from '@angular/core'; +import { Meta, Title } from '@angular/platform-browser'; import { CLASSES, I18N, KC_CONTEXT, USE_DEFAULT_CSS -} from "@keycloakify/angular/lib/public-api"; -import type { I18n } from "@keycloakify/angular/login/i18n"; -import { KcContext } from "keycloakify/login/KcContext/KcContext"; -import { ClassKey, getKcClsx } from "keycloakify/login/lib/kcClsx"; -import { Observable } from "rxjs"; -import { ComponentReference } from "@keycloakify/angular/login/classes/component-reference.class"; -import { KcClassDirective } from "@keycloakify/angular/login/directives/kc-class.directive"; -import { KcSanitizePipe } from "@keycloakify/angular/login/pipes"; -import { MsgStrPipe } from "@keycloakify/angular/login/pipes/msg-str.pipe"; -import { LoginResourceInjectorService } from "@keycloakify/angular/login/services/login-resource-injector.service"; +} from '@keycloakify/angular/lib/public-api'; +import type { I18n } from '@keycloakify/angular/login/i18n'; +import { KcContext } from 'keycloakify/login/KcContext/KcContext'; +import { ClassKey, getKcClsx } from 'keycloakify/login/lib/kcClsx'; +import { Observable } from 'rxjs'; +import { ComponentReference } from '@keycloakify/angular/login/classes/component-reference.class'; +import { KcClassDirective } from '@keycloakify/angular/login/directives/kc-class.directive'; +import { KcSanitizePipe } from '@keycloakify/angular/login/pipes'; +import { MsgStrPipe } from '@keycloakify/angular/login/pipes/msg-str.pipe'; +import { LoginResourceInjectorService } from '@keycloakify/angular/login/services/login-resource-injector.service'; @Component({ - selector: "kc-login-template", - templateUrl: "./template.component.html", + selector: 'kc-login-template', + templateUrl: './template.component.html', standalone: true, imports: [AsyncPipe, KcSanitizePipe, NgTemplateOutlet, KcClassDirective, MsgStrPipe], changeDetection: ChangeDetectionStrategy.OnPush, @@ -60,7 +60,7 @@ export class TemplateComponent extends ComponentReference implements OnInit { super(); this.title.setTitle( this.documentTitle() ?? - this.i18n.msgStr("loginTitle", this.kcContext.realm.displayName) + this.i18n.msgStr('loginTitle', this.kcContext.realm.displayName) ); this.isReadyToRender$ = this.loginResourceInjectorService.injectResource( this.doUseDefaultCss @@ -76,8 +76,8 @@ export class TemplateComponent extends ComponentReference implements OnInit { doUseDefaultCss: this.doUseDefaultCss, classes: this.classes }).kcClsx; - const kcBodyClass = this.bodyClassName() ?? kcClsx("kcBodyClass"); - const kcHtmlClass = kcClsx("kcHtmlClass"); + const kcBodyClass = this.bodyClassName() ?? kcClsx('kcBodyClass'); + const kcHtmlClass = kcClsx('kcHtmlClass'); const kcBodyClasses = kcBodyClass.split(/\s+/); const kcHtmlClasses = kcHtmlClass.split(/\s+/); kcBodyClasses.forEach(klass => { @@ -89,6 +89,6 @@ export class TemplateComponent extends ComponentReference implements OnInit { } tryAnotherWay() { - document.forms["kc-select-try-another-way-form" as never].submit(); + document.forms['kc-select-try-another-way-form' as never].submit(); } } diff --git a/src/login/directives/attributes.directive.ts b/src/login/directives/attributes.directive.ts index dfb7f68c..ab6b4811 100644 --- a/src/login/directives/attributes.directive.ts +++ b/src/login/directives/attributes.directive.ts @@ -1,6 +1,6 @@ -import { Directive, effect, ElementRef, inject, input, Renderer2 } from "@angular/core"; +import { Directive, effect, ElementRef, inject, input, Renderer2 } from '@angular/core'; -@Directive({ selector: "[kcAttributes]", standalone: true }) +@Directive({ selector: '[kcAttributes]', standalone: true }) export class AttributesDirective { kcAttributes = input>(); readonly #el = inject>(ElementRef); diff --git a/src/login/directives/index.ts b/src/login/directives/index.ts index 97e90126..f9f8d151 100644 --- a/src/login/directives/index.ts +++ b/src/login/directives/index.ts @@ -1,2 +1,2 @@ -export * from "./attributes.directive"; -export * from "./kc-class.directive"; +export * from './attributes.directive'; +export * from './kc-class.directive'; diff --git a/src/login/directives/kc-class.directive.ts b/src/login/directives/kc-class.directive.ts index 80e92da4..817aec91 100644 --- a/src/login/directives/kc-class.directive.ts +++ b/src/login/directives/kc-class.directive.ts @@ -9,10 +9,10 @@ import { isDevMode, Renderer2, ɵstringify as stringify -} from "@angular/core"; -import { ClassKey } from "keycloakify/login/lib/kcClsx"; -import { getKcClsx } from "keycloakify/login/lib/kcClsx"; -import { ComponentReference } from "../classes/component-reference.class"; +} from '@angular/core'; +import { ClassKey } from 'keycloakify/login/lib/kcClsx'; +import { getKcClsx } from 'keycloakify/login/lib/kcClsx'; +import { ComponentReference } from '../classes/component-reference.class'; interface CssClassState { // PERF: could use a bit mask to represent state as all fields are boolean flags @@ -35,7 +35,7 @@ type NgClassSupportedTypes = | null | undefined; -@Directive({ selector: "[kcClass]", standalone: true }) +@Directive({ selector: '[kcClass]', standalone: true }) export class KcClassDirective implements DoCheck { private initialClasses: string[] = []; private rawClass: NgClassSupportedTypes; @@ -46,22 +46,22 @@ export class KcClassDirective implements DoCheck { readonly #el = inject(ElementRef); readonly #host = inject(ComponentReference); // eslint-disable-next-line @angular-eslint/no-input-rename - @Input("class") + @Input('class') set klass(value: string) { this.initialClasses = value != null ? value.trim().split(/\s+/) : []; } // eslint-disable-next-line @angular-eslint/no-input-rename - @Input("ngClass") + @Input('ngClass') set ngClass(value: string | NgClassSupportedTypes) { - this.rawClass = typeof value === "string" ? value.trim().split(/\s+/) : value; + this.rawClass = typeof value === 'string' ? value.trim().split(/\s+/) : value; } // eslint-disable-next-line @angular-eslint/no-input-rename - @Input("kcClass") + @Input('kcClass') set kcClass(value: ClassKey | KcClassSupportedTypes) { this.rawKcClass = - typeof value === "string" ? (value.trim().split(/\s+/) as ClassKey[]) : value; + typeof value === 'string' ? (value.trim().split(/\s+/) as ClassKey[]) : value; } ngDoCheck(): void { @@ -146,7 +146,7 @@ export class KcClassDirective implements DoCheck { private _toggleClass(klass: string, enabled: boolean): void { if (isDevMode()) { - if (typeof klass !== "string") { + if (typeof klass !== 'string') { throw new Error( `NgClass can only toggle CSS classes expressed as strings, got ${stringify(klass)}` ); diff --git a/src/login/i18n.ts b/src/login/i18n.ts index c088260b..1f9871ae 100644 --- a/src/login/i18n.ts +++ b/src/login/i18n.ts @@ -1,4 +1,4 @@ -import type { GenericI18n_noJsx } from "keycloakify/login/i18n/noJsx/GenericI18n_noJsx"; -import { MessageKey as MessageKey_defaultSet } from "keycloakify/login/i18n/messages_defaultSet/types"; +import type { GenericI18n_noJsx } from 'keycloakify/login/i18n/noJsx/GenericI18n_noJsx'; +import { MessageKey as MessageKey_defaultSet } from 'keycloakify/login/i18n/messages_defaultSet/types'; /** INTERNAL: DO NOT IMPORT THIS */ export type I18n = GenericI18n_noJsx; diff --git a/src/login/pages/code/code.component.ts b/src/login/pages/code/code.component.ts index 1300d9b5..af8f707a 100644 --- a/src/login/pages/code/code.component.ts +++ b/src/login/pages/code/code.component.ts @@ -1,21 +1,21 @@ -import { ChangeDetectionStrategy, Component, forwardRef, inject } from "@angular/core"; +import { ChangeDetectionStrategy, Component, forwardRef, inject } from '@angular/core'; import { CLASSES, KC_CONTEXT, USE_DEFAULT_CSS -} from "@keycloakify/angular/lib/public-api"; -import { ClassKey } from "keycloakify/login/lib/kcClsx"; -import { KcContext } from "keycloakify/login/KcContext"; -import { ComponentReference } from "@keycloakify/angular/login/classes/component-reference.class"; -import { TemplateComponent } from "@keycloakify/angular/login/containers/template.component"; -import { KcClassDirective } from "@keycloakify/angular/login/directives/kc-class.directive"; -import { MsgStrPipe } from "@keycloakify/angular/login/pipes/msg-str.pipe"; +} from '@keycloakify/angular/lib/public-api'; +import { ClassKey } from 'keycloakify/login/lib/kcClsx'; +import { KcContext } from 'keycloakify/login/KcContext'; +import { ComponentReference } from '@keycloakify/angular/login/classes/component-reference.class'; +import { TemplateComponent } from '@keycloakify/angular/login/containers/template.component'; +import { KcClassDirective } from '@keycloakify/angular/login/directives/kc-class.directive'; +import { MsgStrPipe } from '@keycloakify/angular/login/pipes/msg-str.pipe'; @Component({ standalone: true, imports: [MsgStrPipe, TemplateComponent, KcClassDirective], - selector: "kc-root", - templateUrl: "code.component.html", + selector: 'kc-root', + templateUrl: 'code.component.html', changeDetection: ChangeDetectionStrategy.OnPush, providers: [ { @@ -25,7 +25,7 @@ import { MsgStrPipe } from "@keycloakify/angular/login/pipes/msg-str.pipe"; ] }) export class CodeComponent extends ComponentReference { - kcContext = inject>(KC_CONTEXT); + kcContext = inject>(KC_CONTEXT); override doUseDefaultCss = inject(USE_DEFAULT_CSS); override classes = inject>>(CLASSES); } diff --git a/src/login/pages/delete-account-confirm/delete-account-confirm.component.ts b/src/login/pages/delete-account-confirm/delete-account-confirm.component.ts index 30a6d65f..99112020 100644 --- a/src/login/pages/delete-account-confirm/delete-account-confirm.component.ts +++ b/src/login/pages/delete-account-confirm/delete-account-confirm.component.ts @@ -1,21 +1,21 @@ -import { ChangeDetectionStrategy, Component, forwardRef, inject } from "@angular/core"; +import { ChangeDetectionStrategy, Component, forwardRef, inject } from '@angular/core'; import { CLASSES, KC_CONTEXT, USE_DEFAULT_CSS -} from "@keycloakify/angular/lib/public-api"; -import { ClassKey } from "keycloakify/login/lib/kcClsx"; -import { KcContext } from "keycloakify/login/KcContext"; -import { ComponentReference } from "@keycloakify/angular/login/classes/component-reference.class"; -import { TemplateComponent } from "@keycloakify/angular/login/containers/template.component"; -import { KcClassDirective } from "@keycloakify/angular/login/directives"; -import { MsgStrPipe } from "@keycloakify/angular/login/pipes/msg-str.pipe"; +} from '@keycloakify/angular/lib/public-api'; +import { ClassKey } from 'keycloakify/login/lib/kcClsx'; +import { KcContext } from 'keycloakify/login/KcContext'; +import { ComponentReference } from '@keycloakify/angular/login/classes/component-reference.class'; +import { TemplateComponent } from '@keycloakify/angular/login/containers/template.component'; +import { KcClassDirective } from '@keycloakify/angular/login/directives'; +import { MsgStrPipe } from '@keycloakify/angular/login/pipes/msg-str.pipe'; @Component({ standalone: true, imports: [TemplateComponent, MsgStrPipe, KcClassDirective], - selector: "kc-root", - templateUrl: "delete-account-confirm.component.html", + selector: 'kc-root', + templateUrl: 'delete-account-confirm.component.html', changeDetection: ChangeDetectionStrategy.OnPush, providers: [ { @@ -26,7 +26,7 @@ import { MsgStrPipe } from "@keycloakify/angular/login/pipes/msg-str.pipe"; }) export class DeleteAccountConfirmComponent extends ComponentReference { kcContext = - inject>(KC_CONTEXT); + inject>(KC_CONTEXT); override doUseDefaultCss = inject(USE_DEFAULT_CSS); override classes = inject>>(CLASSES); } diff --git a/src/login/pages/delete-credential/delete-credential.component.ts b/src/login/pages/delete-credential/delete-credential.component.ts index d15b9388..bfe35234 100644 --- a/src/login/pages/delete-credential/delete-credential.component.ts +++ b/src/login/pages/delete-credential/delete-credential.component.ts @@ -4,24 +4,24 @@ import { forwardRef, inject, input -} from "@angular/core"; +} from '@angular/core'; import { CLASSES, KC_CONTEXT, USE_DEFAULT_CSS -} from "@keycloakify/angular/lib/public-api"; -import { ClassKey } from "keycloakify/login/lib/kcClsx"; -import { KcContext } from "keycloakify/login/KcContext"; -import { ComponentReference } from "@keycloakify/angular/login/classes/component-reference.class"; -import { TemplateComponent } from "@keycloakify/angular/login/containers/template.component"; -import { KcClassDirective } from "@keycloakify/angular/login/directives/kc-class.directive"; -import { MsgStrPipe } from "@keycloakify/angular/login/pipes/msg-str.pipe"; +} from '@keycloakify/angular/lib/public-api'; +import { ClassKey } from 'keycloakify/login/lib/kcClsx'; +import { KcContext } from 'keycloakify/login/KcContext'; +import { ComponentReference } from '@keycloakify/angular/login/classes/component-reference.class'; +import { TemplateComponent } from '@keycloakify/angular/login/containers/template.component'; +import { KcClassDirective } from '@keycloakify/angular/login/directives/kc-class.directive'; +import { MsgStrPipe } from '@keycloakify/angular/login/pipes/msg-str.pipe'; @Component({ standalone: true, imports: [MsgStrPipe, TemplateComponent, KcClassDirective], - selector: "kc-root", - templateUrl: "delete-credential.component.html", + selector: 'kc-root', + templateUrl: 'delete-credential.component.html', changeDetection: ChangeDetectionStrategy.OnPush, providers: [ { @@ -32,7 +32,7 @@ import { MsgStrPipe } from "@keycloakify/angular/login/pipes/msg-str.pipe"; }) export class DeleteCredentialComponent extends ComponentReference { kcContext = - inject>(KC_CONTEXT); + inject>(KC_CONTEXT); override doUseDefaultCss = inject(USE_DEFAULT_CSS); override classes = inject>>(CLASSES); displayRequiredFields = input(false); diff --git a/src/login/pages/error/error.component.ts b/src/login/pages/error/error.component.ts index 7f61d544..0b84b9e1 100644 --- a/src/login/pages/error/error.component.ts +++ b/src/login/pages/error/error.component.ts @@ -1,21 +1,21 @@ -import { ChangeDetectionStrategy, Component, forwardRef, inject } from "@angular/core"; +import { ChangeDetectionStrategy, Component, forwardRef, inject } from '@angular/core'; import { CLASSES, KC_CONTEXT, USE_DEFAULT_CSS -} from "@keycloakify/angular/lib/public-api"; -import { ClassKey } from "keycloakify/login/lib/kcClsx"; -import { KcContext } from "keycloakify/login/KcContext"; -import { ComponentReference } from "@keycloakify/angular/login/classes/component-reference.class"; -import { TemplateComponent } from "@keycloakify/angular/login/containers/template.component"; -import { KcSanitizePipe } from "@keycloakify/angular/login/pipes/kc-sanitize.pipe"; -import { MsgStrPipe } from "@keycloakify/angular/login/pipes/msg-str.pipe"; +} from '@keycloakify/angular/lib/public-api'; +import { ClassKey } from 'keycloakify/login/lib/kcClsx'; +import { KcContext } from 'keycloakify/login/KcContext'; +import { ComponentReference } from '@keycloakify/angular/login/classes/component-reference.class'; +import { TemplateComponent } from '@keycloakify/angular/login/containers/template.component'; +import { KcSanitizePipe } from '@keycloakify/angular/login/pipes/kc-sanitize.pipe'; +import { MsgStrPipe } from '@keycloakify/angular/login/pipes/msg-str.pipe'; @Component({ standalone: true, imports: [TemplateComponent, MsgStrPipe, KcSanitizePipe], - selector: "kc-root", - templateUrl: "error.component.html", + selector: 'kc-root', + templateUrl: 'error.component.html', changeDetection: ChangeDetectionStrategy.OnPush, providers: [ { @@ -25,7 +25,7 @@ import { MsgStrPipe } from "@keycloakify/angular/login/pipes/msg-str.pipe"; ] }) export class ErrorComponent extends ComponentReference { - kcContext = inject>(KC_CONTEXT); + kcContext = inject>(KC_CONTEXT); override doUseDefaultCss = inject(USE_DEFAULT_CSS); override classes = inject>>(CLASSES); } diff --git a/src/login/pages/frontchannel-logout/frontchannel-logout.component.ts b/src/login/pages/frontchannel-logout/frontchannel-logout.component.ts index d99e0299..03a84917 100644 --- a/src/login/pages/frontchannel-logout/frontchannel-logout.component.ts +++ b/src/login/pages/frontchannel-logout/frontchannel-logout.component.ts @@ -5,24 +5,24 @@ import { inject, input, OnInit -} from "@angular/core"; +} from '@angular/core'; import { CLASSES, KC_CONTEXT, USE_DEFAULT_CSS -} from "@keycloakify/angular/lib/public-api"; -import { ClassKey } from "keycloakify/login/lib/kcClsx"; -import { KcContext } from "keycloakify/login/KcContext"; -import { ComponentReference } from "@keycloakify/angular/login/classes/component-reference.class"; -import { TemplateComponent } from "@keycloakify/angular/login/containers/template.component"; -import { KcSanitizePipe } from "@keycloakify/angular/login/pipes/kc-sanitize.pipe"; -import { MsgStrPipe } from "@keycloakify/angular/login/pipes/msg-str.pipe"; +} from '@keycloakify/angular/lib/public-api'; +import { ClassKey } from 'keycloakify/login/lib/kcClsx'; +import { KcContext } from 'keycloakify/login/KcContext'; +import { ComponentReference } from '@keycloakify/angular/login/classes/component-reference.class'; +import { TemplateComponent } from '@keycloakify/angular/login/containers/template.component'; +import { KcSanitizePipe } from '@keycloakify/angular/login/pipes/kc-sanitize.pipe'; +import { MsgStrPipe } from '@keycloakify/angular/login/pipes/msg-str.pipe'; @Component({ standalone: true, imports: [TemplateComponent, MsgStrPipe, KcSanitizePipe], - selector: "kc-root", - templateUrl: "frontchannel-logout.component.html", + selector: 'kc-root', + templateUrl: 'frontchannel-logout.component.html', changeDetection: ChangeDetectionStrategy.OnPush, providers: [ { @@ -33,7 +33,7 @@ import { MsgStrPipe } from "@keycloakify/angular/login/pipes/msg-str.pipe"; }) export class FrontchannelLogoutComponent extends ComponentReference implements OnInit { kcContext = - inject>(KC_CONTEXT); + inject>(KC_CONTEXT); override doUseDefaultCss = inject(USE_DEFAULT_CSS); override classes = inject>>(CLASSES); displayRequiredFields = input(false); diff --git a/src/login/pages/idp-review-user-profile/idp-review-user-profile.component.ts b/src/login/pages/idp-review-user-profile/idp-review-user-profile.component.ts index 2c23d778..d6ab5aff 100644 --- a/src/login/pages/idp-review-user-profile/idp-review-user-profile.component.ts +++ b/src/login/pages/idp-review-user-profile/idp-review-user-profile.component.ts @@ -5,19 +5,19 @@ import { inject, input, signal -} from "@angular/core"; +} from '@angular/core'; import { CLASSES, KC_CONTEXT, USE_DEFAULT_CSS -} from "@keycloakify/angular/lib/public-api"; -import { ClassKey } from "keycloakify/login/lib/kcClsx"; -import { KcContext } from "keycloakify/login/KcContext"; -import { ComponentReference } from "@keycloakify/angular/login/classes/component-reference.class"; -import { UserProfileFormFieldsComponent } from "@keycloakify/angular/login/components/user-profile-form-fields/user-profile-form-fields.component"; -import { TemplateComponent } from "@keycloakify/angular/login/containers/template.component"; -import { KcClassDirective } from "@keycloakify/angular/login/directives/kc-class.directive"; -import { MsgStrPipe } from "@keycloakify/angular/login/pipes/msg-str.pipe"; +} from '@keycloakify/angular/lib/public-api'; +import { ClassKey } from 'keycloakify/login/lib/kcClsx'; +import { KcContext } from 'keycloakify/login/KcContext'; +import { ComponentReference } from '@keycloakify/angular/login/classes/component-reference.class'; +import { UserProfileFormFieldsComponent } from '@keycloakify/angular/login/components/user-profile-form-fields/user-profile-form-fields.component'; +import { TemplateComponent } from '@keycloakify/angular/login/containers/template.component'; +import { KcClassDirective } from '@keycloakify/angular/login/directives/kc-class.directive'; +import { MsgStrPipe } from '@keycloakify/angular/login/pipes/msg-str.pipe'; @Component({ standalone: true, @@ -27,8 +27,8 @@ import { MsgStrPipe } from "@keycloakify/angular/login/pipes/msg-str.pipe"; UserProfileFormFieldsComponent, KcClassDirective ], - selector: "kc-root", - templateUrl: "idp-review-user-profile.component.html", + selector: 'kc-root', + templateUrl: 'idp-review-user-profile.component.html', changeDetection: ChangeDetectionStrategy.OnPush, providers: [ { @@ -39,7 +39,7 @@ import { MsgStrPipe } from "@keycloakify/angular/login/pipes/msg-str.pipe"; }) export class IdpReviewUserProfileComponent extends ComponentReference { kcContext = - inject>(KC_CONTEXT); + inject>(KC_CONTEXT); displayRequiredFields = input(true); documentTitle = input(); bodyClassName = input(); @@ -47,9 +47,9 @@ export class IdpReviewUserProfileComponent extends ComponentReference { override classes = inject>>(CLASSES); isFormSubmittable = signal(false); displayInfo: boolean = false; - displayMessage: boolean = !this.kcContext?.messagesPerField?.existsError("global"); + displayMessage: boolean = !this.kcContext?.messagesPerField?.existsError('global'); onCallback() { - (document.getElementById("kc-register-form") as HTMLFormElement).submit(); + (document.getElementById('kc-register-form') as HTMLFormElement).submit(); } } diff --git a/src/login/pages/info/info.component.ts b/src/login/pages/info/info.component.ts index d698ddea..e7df1a30 100644 --- a/src/login/pages/info/info.component.ts +++ b/src/login/pages/info/info.component.ts @@ -4,25 +4,25 @@ import { forwardRef, inject, input -} from "@angular/core"; +} from '@angular/core'; import { CLASSES, KC_CONTEXT, USE_DEFAULT_CSS -} from "@keycloakify/angular/lib/public-api"; -import { ClassKey } from "keycloakify/login/lib/kcClsx"; -import { KcContext } from "keycloakify/login/KcContext"; -import { ComponentReference } from "@keycloakify/angular/login/classes/component-reference.class"; -import { TemplateComponent } from "@keycloakify/angular/login/containers/template.component"; -import { AdvancedMsgStrPipe } from "@keycloakify/angular/login/pipes/advanced-msg-str.pipe"; -import { KcSanitizePipe } from "@keycloakify/angular/login/pipes/kc-sanitize.pipe"; -import { MsgStrPipe } from "@keycloakify/angular/login/pipes/msg-str.pipe"; +} from '@keycloakify/angular/lib/public-api'; +import { ClassKey } from 'keycloakify/login/lib/kcClsx'; +import { KcContext } from 'keycloakify/login/KcContext'; +import { ComponentReference } from '@keycloakify/angular/login/classes/component-reference.class'; +import { TemplateComponent } from '@keycloakify/angular/login/containers/template.component'; +import { AdvancedMsgStrPipe } from '@keycloakify/angular/login/pipes/advanced-msg-str.pipe'; +import { KcSanitizePipe } from '@keycloakify/angular/login/pipes/kc-sanitize.pipe'; +import { MsgStrPipe } from '@keycloakify/angular/login/pipes/msg-str.pipe'; @Component({ standalone: true, imports: [TemplateComponent, MsgStrPipe, KcSanitizePipe, AdvancedMsgStrPipe], - selector: "kc-root", - templateUrl: "info.component.html", + selector: 'kc-root', + templateUrl: 'info.component.html', changeDetection: ChangeDetectionStrategy.OnPush, providers: [ AdvancedMsgStrPipe, @@ -35,7 +35,7 @@ import { MsgStrPipe } from "@keycloakify/angular/login/pipes/msg-str.pipe"; ] }) export class InfoComponent extends ComponentReference { - kcContext = inject>(KC_CONTEXT); + kcContext = inject>(KC_CONTEXT); advancedMsgStr = inject(AdvancedMsgStrPipe); kcSanitize = inject(KcSanitizePipe); msgStr = inject(MsgStrPipe); @@ -50,15 +50,15 @@ export class InfoComponent extends ComponentReference { get infoMessage() { let html = this.kcContext.message.summary; if (this.kcContext.requiredActions) { - html += ""; + html += ''; html += this.kcContext.requiredActions .map(requiredAction => this.advancedMsgStr.transform(`requiredAction.${requiredAction}`) ) - .join(", "); + .join(', '); - html += ""; + html += ''; } return html; } diff --git a/src/login/pages/login-config-totp/login-config-totp.component.ts b/src/login/pages/login-config-totp/login-config-totp.component.ts index 2b64dbac..f7524155 100644 --- a/src/login/pages/login-config-totp/login-config-totp.component.ts +++ b/src/login/pages/login-config-totp/login-config-totp.component.ts @@ -4,21 +4,21 @@ import { forwardRef, inject, input -} from "@angular/core"; +} from '@angular/core'; import { CLASSES, KC_CONTEXT, USE_DEFAULT_CSS -} from "@keycloakify/angular/lib/public-api"; -import { ClassKey } from "keycloakify/login/lib/kcClsx"; -import { KcContext } from "keycloakify/login/KcContext"; -import { ComponentReference } from "@keycloakify/angular/login/classes/component-reference.class"; -import { LogoutOtherSessionsComponent } from "@keycloakify/angular/login/components/logout-other-sessions/logout-other-sessions.component"; -import { TemplateComponent } from "@keycloakify/angular/login/containers/template.component"; -import { KcClassDirective } from "@keycloakify/angular/login/directives/kc-class.directive"; -import { AdvancedMsgStrPipe } from "@keycloakify/angular/login/pipes/advanced-msg-str.pipe"; -import { KcSanitizePipe } from "@keycloakify/angular/login/pipes/kc-sanitize.pipe"; -import { MsgStrPipe } from "@keycloakify/angular/login/pipes/msg-str.pipe"; +} from '@keycloakify/angular/lib/public-api'; +import { ClassKey } from 'keycloakify/login/lib/kcClsx'; +import { KcContext } from 'keycloakify/login/KcContext'; +import { ComponentReference } from '@keycloakify/angular/login/classes/component-reference.class'; +import { LogoutOtherSessionsComponent } from '@keycloakify/angular/login/components/logout-other-sessions/logout-other-sessions.component'; +import { TemplateComponent } from '@keycloakify/angular/login/containers/template.component'; +import { KcClassDirective } from '@keycloakify/angular/login/directives/kc-class.directive'; +import { AdvancedMsgStrPipe } from '@keycloakify/angular/login/pipes/advanced-msg-str.pipe'; +import { KcSanitizePipe } from '@keycloakify/angular/login/pipes/kc-sanitize.pipe'; +import { MsgStrPipe } from '@keycloakify/angular/login/pipes/msg-str.pipe'; @Component({ standalone: true, @@ -30,8 +30,8 @@ import { MsgStrPipe } from "@keycloakify/angular/login/pipes/msg-str.pipe"; KcSanitizePipe, LogoutOtherSessionsComponent ], - selector: "kc-root", - templateUrl: "login-config-totp.component.html", + selector: 'kc-root', + templateUrl: 'login-config-totp.component.html', changeDetection: ChangeDetectionStrategy.OnPush, providers: [ { @@ -42,7 +42,7 @@ import { MsgStrPipe } from "@keycloakify/angular/login/pipes/msg-str.pipe"; }) export class LoginConfigTotpComponent extends ComponentReference { kcContext = - inject>(KC_CONTEXT); + inject>(KC_CONTEXT); override doUseDefaultCss = inject(USE_DEFAULT_CSS); override classes = inject>>(CLASSES); @@ -51,7 +51,7 @@ export class LoginConfigTotpComponent extends ComponentReference { bodyClassName = input(); displayInfo: boolean = false; displayMessage: boolean = this.kcContext.messagesPerField.existsError( - "totp", - "userLabel" + 'totp', + 'userLabel' ); } diff --git a/src/login/pages/login-idp-link-confirm-override/login-idp-link-confirm-override.component.ts b/src/login/pages/login-idp-link-confirm-override/login-idp-link-confirm-override.component.ts index 757575ba..85b3bd28 100644 --- a/src/login/pages/login-idp-link-confirm-override/login-idp-link-confirm-override.component.ts +++ b/src/login/pages/login-idp-link-confirm-override/login-idp-link-confirm-override.component.ts @@ -4,24 +4,24 @@ import { forwardRef, inject, input -} from "@angular/core"; +} from '@angular/core'; import { CLASSES, KC_CONTEXT, USE_DEFAULT_CSS -} from "@keycloakify/angular/lib/public-api"; -import { ClassKey } from "keycloakify/login/lib/kcClsx"; -import { KcContext } from "keycloakify/login/KcContext"; -import { ComponentReference } from "@keycloakify/angular/login/classes/component-reference.class"; -import { TemplateComponent } from "@keycloakify/angular/login/containers/template.component"; -import { KcClassDirective } from "@keycloakify/angular/login/directives/kc-class.directive"; -import { MsgStrPipe } from "@keycloakify/angular/login/pipes/msg-str.pipe"; +} from '@keycloakify/angular/lib/public-api'; +import { ClassKey } from 'keycloakify/login/lib/kcClsx'; +import { KcContext } from 'keycloakify/login/KcContext'; +import { ComponentReference } from '@keycloakify/angular/login/classes/component-reference.class'; +import { TemplateComponent } from '@keycloakify/angular/login/containers/template.component'; +import { KcClassDirective } from '@keycloakify/angular/login/directives/kc-class.directive'; +import { MsgStrPipe } from '@keycloakify/angular/login/pipes/msg-str.pipe'; @Component({ standalone: true, imports: [KcClassDirective, TemplateComponent, MsgStrPipe], - selector: "kc-root", - templateUrl: "login-idp-link-confirm-override.component.html", + selector: 'kc-root', + templateUrl: 'login-idp-link-confirm-override.component.html', changeDetection: ChangeDetectionStrategy.OnPush, providers: [ { @@ -32,7 +32,7 @@ import { MsgStrPipe } from "@keycloakify/angular/login/pipes/msg-str.pipe"; }) export class LoginIdpLinkConfirmOverrideComponent extends ComponentReference { kcContext = - inject>( + inject>( KC_CONTEXT ); override doUseDefaultCss = inject(USE_DEFAULT_CSS); diff --git a/src/login/pages/login-idp-link-confirm/login-idp-link-confirm.component.ts b/src/login/pages/login-idp-link-confirm/login-idp-link-confirm.component.ts index 0f69111b..7462dd66 100644 --- a/src/login/pages/login-idp-link-confirm/login-idp-link-confirm.component.ts +++ b/src/login/pages/login-idp-link-confirm/login-idp-link-confirm.component.ts @@ -4,24 +4,24 @@ import { forwardRef, inject, input -} from "@angular/core"; +} from '@angular/core'; import { CLASSES, KC_CONTEXT, USE_DEFAULT_CSS -} from "@keycloakify/angular/lib/public-api"; -import { ClassKey } from "keycloakify/login/lib/kcClsx"; -import { KcContext } from "keycloakify/login/KcContext"; -import { ComponentReference } from "@keycloakify/angular/login/classes/component-reference.class"; -import { TemplateComponent } from "@keycloakify/angular/login/containers/template.component"; -import { KcClassDirective } from "@keycloakify/angular/login/directives/kc-class.directive"; -import { MsgStrPipe } from "@keycloakify/angular/login/pipes/msg-str.pipe"; +} from '@keycloakify/angular/lib/public-api'; +import { ClassKey } from 'keycloakify/login/lib/kcClsx'; +import { KcContext } from 'keycloakify/login/KcContext'; +import { ComponentReference } from '@keycloakify/angular/login/classes/component-reference.class'; +import { TemplateComponent } from '@keycloakify/angular/login/containers/template.component'; +import { KcClassDirective } from '@keycloakify/angular/login/directives/kc-class.directive'; +import { MsgStrPipe } from '@keycloakify/angular/login/pipes/msg-str.pipe'; @Component({ standalone: true, imports: [TemplateComponent, MsgStrPipe, KcClassDirective], - selector: "kc-root", - templateUrl: "login-idp-link-confirm.component.html", + selector: 'kc-root', + templateUrl: 'login-idp-link-confirm.component.html', changeDetection: ChangeDetectionStrategy.OnPush, providers: [ { @@ -32,7 +32,7 @@ import { MsgStrPipe } from "@keycloakify/angular/login/pipes/msg-str.pipe"; }) export class LoginIdpLinkConfirmComponent extends ComponentReference { kcContext = - inject>(KC_CONTEXT); + inject>(KC_CONTEXT); override doUseDefaultCss = inject(USE_DEFAULT_CSS); override classes = inject>>(CLASSES); displayRequiredFields = input(false); diff --git a/src/login/pages/login-idp-link-email/login-idp-link-email.component.ts b/src/login/pages/login-idp-link-email/login-idp-link-email.component.ts index e9aa7049..f2d3872f 100644 --- a/src/login/pages/login-idp-link-email/login-idp-link-email.component.ts +++ b/src/login/pages/login-idp-link-email/login-idp-link-email.component.ts @@ -4,24 +4,24 @@ import { forwardRef, inject, input -} from "@angular/core"; +} from '@angular/core'; import { CLASSES, KC_CONTEXT, USE_DEFAULT_CSS -} from "@keycloakify/angular/lib/public-api"; -import { ClassKey } from "keycloakify/login/lib/kcClsx"; -import { KcContext } from "keycloakify/login/KcContext"; -import { ComponentReference } from "@keycloakify/angular/login/classes/component-reference.class"; -import { TemplateComponent } from "@keycloakify/angular/login/containers/template.component"; -import { KcClassDirective } from "@keycloakify/angular/login/directives/kc-class.directive"; -import { MsgStrPipe } from "@keycloakify/angular/login/pipes/msg-str.pipe"; +} from '@keycloakify/angular/lib/public-api'; +import { ClassKey } from 'keycloakify/login/lib/kcClsx'; +import { KcContext } from 'keycloakify/login/KcContext'; +import { ComponentReference } from '@keycloakify/angular/login/classes/component-reference.class'; +import { TemplateComponent } from '@keycloakify/angular/login/containers/template.component'; +import { KcClassDirective } from '@keycloakify/angular/login/directives/kc-class.directive'; +import { MsgStrPipe } from '@keycloakify/angular/login/pipes/msg-str.pipe'; @Component({ standalone: true, imports: [TemplateComponent, MsgStrPipe, KcClassDirective], - selector: "kc-root", - templateUrl: "login-idp-link-email.component.html", + selector: 'kc-root', + templateUrl: 'login-idp-link-email.component.html', changeDetection: ChangeDetectionStrategy.OnPush, providers: [ { @@ -32,7 +32,7 @@ import { MsgStrPipe } from "@keycloakify/angular/login/pipes/msg-str.pipe"; }) export class LoginIdpLinkEmailComponent extends ComponentReference { kcContext = - inject>(KC_CONTEXT); + inject>(KC_CONTEXT); override doUseDefaultCss = inject(USE_DEFAULT_CSS); override classes = inject>>(CLASSES); displayRequiredFields = input(false); diff --git a/src/login/pages/login-oauth-grant/login-oauth-grant.component.ts b/src/login/pages/login-oauth-grant/login-oauth-grant.component.ts index bb9a79b7..bb4ade0c 100644 --- a/src/login/pages/login-oauth-grant/login-oauth-grant.component.ts +++ b/src/login/pages/login-oauth-grant/login-oauth-grant.component.ts @@ -4,25 +4,25 @@ import { forwardRef, inject, input -} from "@angular/core"; +} from '@angular/core'; import { CLASSES, KC_CONTEXT, USE_DEFAULT_CSS -} from "@keycloakify/angular/lib/public-api"; -import { ClassKey } from "keycloakify/login/lib/kcClsx"; -import { KcContext } from "keycloakify/login/KcContext"; -import { ComponentReference } from "@keycloakify/angular/login/classes/component-reference.class"; -import { TemplateComponent } from "@keycloakify/angular/login/containers/template.component"; -import { KcClassDirective } from "@keycloakify/angular/login/directives/kc-class.directive"; -import { AdvancedMsgStrPipe } from "@keycloakify/angular/login/pipes/advanced-msg-str.pipe"; -import { MsgStrPipe } from "@keycloakify/angular/login/pipes/msg-str.pipe"; +} from '@keycloakify/angular/lib/public-api'; +import { ClassKey } from 'keycloakify/login/lib/kcClsx'; +import { KcContext } from 'keycloakify/login/KcContext'; +import { ComponentReference } from '@keycloakify/angular/login/classes/component-reference.class'; +import { TemplateComponent } from '@keycloakify/angular/login/containers/template.component'; +import { KcClassDirective } from '@keycloakify/angular/login/directives/kc-class.directive'; +import { AdvancedMsgStrPipe } from '@keycloakify/angular/login/pipes/advanced-msg-str.pipe'; +import { MsgStrPipe } from '@keycloakify/angular/login/pipes/msg-str.pipe'; @Component({ standalone: true, imports: [KcClassDirective, TemplateComponent, MsgStrPipe, AdvancedMsgStrPipe], - selector: "kc-root", - templateUrl: "login-oauth-grant.component.html", + selector: 'kc-root', + templateUrl: 'login-oauth-grant.component.html', changeDetection: ChangeDetectionStrategy.OnPush, providers: [ { @@ -33,12 +33,12 @@ import { MsgStrPipe } from "@keycloakify/angular/login/pipes/msg-str.pipe"; }) export class LoginOauthGrantComponent extends ComponentReference { kcContext = - inject>(KC_CONTEXT); + inject>(KC_CONTEXT); override doUseDefaultCss = inject(USE_DEFAULT_CSS); override classes = inject>>(CLASSES); displayRequiredFields = input(false); documentTitle = input(); - bodyClassName = input("oauth"); + bodyClassName = input('oauth'); displayInfo: boolean = false; displayMessage: boolean = false; } diff --git a/src/login/pages/login-oauth2-device-verify-user-code/login-oauth2-device-verify-user-code.component.ts b/src/login/pages/login-oauth2-device-verify-user-code/login-oauth2-device-verify-user-code.component.ts index f560c24c..eb2fa7ef 100644 --- a/src/login/pages/login-oauth2-device-verify-user-code/login-oauth2-device-verify-user-code.component.ts +++ b/src/login/pages/login-oauth2-device-verify-user-code/login-oauth2-device-verify-user-code.component.ts @@ -4,24 +4,24 @@ import { forwardRef, inject, input -} from "@angular/core"; +} from '@angular/core'; import { CLASSES, KC_CONTEXT, USE_DEFAULT_CSS -} from "@keycloakify/angular/lib/public-api"; -import { ClassKey } from "keycloakify/login/lib/kcClsx"; -import { KcContext } from "keycloakify/login/KcContext"; -import { ComponentReference } from "@keycloakify/angular/login/classes/component-reference.class"; -import { TemplateComponent } from "@keycloakify/angular/login/containers/template.component"; -import { KcClassDirective } from "@keycloakify/angular/login/directives/kc-class.directive"; -import { MsgStrPipe } from "@keycloakify/angular/login/pipes/msg-str.pipe"; +} from '@keycloakify/angular/lib/public-api'; +import { ClassKey } from 'keycloakify/login/lib/kcClsx'; +import { KcContext } from 'keycloakify/login/KcContext'; +import { ComponentReference } from '@keycloakify/angular/login/classes/component-reference.class'; +import { TemplateComponent } from '@keycloakify/angular/login/containers/template.component'; +import { KcClassDirective } from '@keycloakify/angular/login/directives/kc-class.directive'; +import { MsgStrPipe } from '@keycloakify/angular/login/pipes/msg-str.pipe'; @Component({ standalone: true, imports: [TemplateComponent, MsgStrPipe, KcClassDirective], - selector: "kc-root", - templateUrl: "login-oauth2-device-verify-user-code.component.html", + selector: 'kc-root', + templateUrl: 'login-oauth2-device-verify-user-code.component.html', changeDetection: ChangeDetectionStrategy.OnPush, providers: [ { @@ -33,7 +33,7 @@ import { MsgStrPipe } from "@keycloakify/angular/login/pipes/msg-str.pipe"; export class LoginOauth2DeviceVerifyUserCodeComponent extends ComponentReference { kcContext = inject< - Extract + Extract >(KC_CONTEXT); override doUseDefaultCss = inject(USE_DEFAULT_CSS); override classes = inject>>(CLASSES); diff --git a/src/login/pages/login-otp/login-otp.component.ts b/src/login/pages/login-otp/login-otp.component.ts index aad6cea9..824d4612 100644 --- a/src/login/pages/login-otp/login-otp.component.ts +++ b/src/login/pages/login-otp/login-otp.component.ts @@ -4,25 +4,25 @@ import { forwardRef, inject, input -} from "@angular/core"; +} from '@angular/core'; import { CLASSES, KC_CONTEXT, USE_DEFAULT_CSS -} from "@keycloakify/angular/lib/public-api"; -import { ClassKey } from "keycloakify/login/lib/kcClsx"; -import { KcContext } from "keycloakify/login/KcContext"; -import { ComponentReference } from "@keycloakify/angular/login/classes/component-reference.class"; -import { TemplateComponent } from "@keycloakify/angular/login/containers/template.component"; -import { KcClassDirective } from "@keycloakify/angular/login/directives/kc-class.directive"; -import { KcSanitizePipe } from "@keycloakify/angular/login/pipes/kc-sanitize.pipe"; -import { MsgStrPipe } from "@keycloakify/angular/login/pipes/msg-str.pipe"; +} from '@keycloakify/angular/lib/public-api'; +import { ClassKey } from 'keycloakify/login/lib/kcClsx'; +import { KcContext } from 'keycloakify/login/KcContext'; +import { ComponentReference } from '@keycloakify/angular/login/classes/component-reference.class'; +import { TemplateComponent } from '@keycloakify/angular/login/containers/template.component'; +import { KcClassDirective } from '@keycloakify/angular/login/directives/kc-class.directive'; +import { KcSanitizePipe } from '@keycloakify/angular/login/pipes/kc-sanitize.pipe'; +import { MsgStrPipe } from '@keycloakify/angular/login/pipes/msg-str.pipe'; @Component({ standalone: true, imports: [TemplateComponent, KcClassDirective, MsgStrPipe, KcSanitizePipe], - selector: "kc-root", - templateUrl: "login-otp.component.html", + selector: 'kc-root', + templateUrl: 'login-otp.component.html', changeDetection: ChangeDetectionStrategy.OnPush, providers: [ { @@ -32,12 +32,12 @@ import { MsgStrPipe } from "@keycloakify/angular/login/pipes/msg-str.pipe"; ] }) export class LoginOtpComponent extends ComponentReference { - kcContext = inject>(KC_CONTEXT); + kcContext = inject>(KC_CONTEXT); override doUseDefaultCss = inject(USE_DEFAULT_CSS); override classes = inject>>(CLASSES); displayRequiredFields = input(false); documentTitle = input(); bodyClassName = input(); displayInfo: boolean = false; - displayMessage: boolean = this.kcContext.messagesPerField.existsError("totp"); + displayMessage: boolean = this.kcContext.messagesPerField.existsError('totp'); } diff --git a/src/login/pages/login-page-expired/login-page-expired.component.ts b/src/login/pages/login-page-expired/login-page-expired.component.ts index c7eeee25..983d7bd1 100644 --- a/src/login/pages/login-page-expired/login-page-expired.component.ts +++ b/src/login/pages/login-page-expired/login-page-expired.component.ts @@ -4,23 +4,23 @@ import { forwardRef, inject, input -} from "@angular/core"; +} from '@angular/core'; import { CLASSES, KC_CONTEXT, USE_DEFAULT_CSS -} from "@keycloakify/angular/lib/public-api"; -import { ClassKey } from "keycloakify/login/lib/kcClsx"; -import { KcContext } from "keycloakify/login/KcContext"; -import { ComponentReference } from "@keycloakify/angular/login/classes/component-reference.class"; -import { TemplateComponent } from "@keycloakify/angular/login/containers/template.component"; -import { MsgStrPipe } from "@keycloakify/angular/login/pipes/msg-str.pipe"; +} from '@keycloakify/angular/lib/public-api'; +import { ClassKey } from 'keycloakify/login/lib/kcClsx'; +import { KcContext } from 'keycloakify/login/KcContext'; +import { ComponentReference } from '@keycloakify/angular/login/classes/component-reference.class'; +import { TemplateComponent } from '@keycloakify/angular/login/containers/template.component'; +import { MsgStrPipe } from '@keycloakify/angular/login/pipes/msg-str.pipe'; @Component({ standalone: true, imports: [TemplateComponent, MsgStrPipe], - selector: "kc-root", - templateUrl: "login-page-expired.component.html", + selector: 'kc-root', + templateUrl: 'login-page-expired.component.html', changeDetection: ChangeDetectionStrategy.OnPush, providers: [ { @@ -31,7 +31,7 @@ import { MsgStrPipe } from "@keycloakify/angular/login/pipes/msg-str.pipe"; }) export class LoginPageExpiredComponent extends ComponentReference { kcContext = - inject>(KC_CONTEXT); + inject>(KC_CONTEXT); override doUseDefaultCss = inject(USE_DEFAULT_CSS); override classes = inject>>(CLASSES); displayRequiredFields = input(false); diff --git a/src/login/pages/login-passkeys-conditional-authenticate/login-passkeys-conditional-authenticate.component.ts b/src/login/pages/login-passkeys-conditional-authenticate/login-passkeys-conditional-authenticate.component.ts index f55f8f18..1346db20 100644 --- a/src/login/pages/login-passkeys-conditional-authenticate/login-passkeys-conditional-authenticate.component.ts +++ b/src/login/pages/login-passkeys-conditional-authenticate/login-passkeys-conditional-authenticate.component.ts @@ -1,25 +1,25 @@ -import { ChangeDetectionStrategy, Component, forwardRef, inject } from "@angular/core"; +import { ChangeDetectionStrategy, Component, forwardRef, inject } from '@angular/core'; import { CLASSES, KC_CONTEXT, USE_DEFAULT_CSS -} from "@keycloakify/angular/lib/public-api"; -import { Script } from "@keycloakify/angular/lib/models"; -import { ClassKey } from "keycloakify/login/lib/kcClsx"; -import { KcContext } from "keycloakify/login/KcContext"; -import { getKcClsx } from "keycloakify/login/lib/kcClsx"; -import { ComponentReference } from "@keycloakify/angular/login/classes/component-reference.class"; -import { TemplateComponent } from "@keycloakify/angular/login/containers/template.component"; -import { KcClassDirective } from "@keycloakify/angular/login/directives/kc-class.directive"; -import { AdvancedMsgStrPipe } from "@keycloakify/angular/login/pipes/advanced-msg-str.pipe"; -import { MsgStrPipe } from "@keycloakify/angular/login/pipes/msg-str.pipe"; -import { LoginResourceInjectorService } from "@keycloakify/angular/login/services"; +} from '@keycloakify/angular/lib/public-api'; +import { Script } from '@keycloakify/angular/lib/models'; +import { ClassKey } from 'keycloakify/login/lib/kcClsx'; +import { KcContext } from 'keycloakify/login/KcContext'; +import { getKcClsx } from 'keycloakify/login/lib/kcClsx'; +import { ComponentReference } from '@keycloakify/angular/login/classes/component-reference.class'; +import { TemplateComponent } from '@keycloakify/angular/login/containers/template.component'; +import { KcClassDirective } from '@keycloakify/angular/login/directives/kc-class.directive'; +import { AdvancedMsgStrPipe } from '@keycloakify/angular/login/pipes/advanced-msg-str.pipe'; +import { MsgStrPipe } from '@keycloakify/angular/login/pipes/msg-str.pipe'; +import { LoginResourceInjectorService } from '@keycloakify/angular/login/services'; @Component({ standalone: true, imports: [TemplateComponent, MsgStrPipe, KcClassDirective, AdvancedMsgStrPipe], - selector: "kc-root", - templateUrl: "login-passkeys-conditional-authenticate.component.html", + selector: 'kc-root', + templateUrl: 'login-passkeys-conditional-authenticate.component.html', changeDetection: ChangeDetectionStrategy.OnPush, providers: [ MsgStrPipe, @@ -32,7 +32,7 @@ import { LoginResourceInjectorService } from "@keycloakify/angular/login/service export class LoginPasskeysConditionalAuthenticateComponent extends ComponentReference { kcContext = inject< - Extract + Extract >(KC_CONTEXT); loginResourceInjectorService = inject(LoginResourceInjectorService); msgStr = inject(MsgStrPipe); @@ -40,7 +40,7 @@ export class LoginPasskeysConditionalAuthenticateComponent extends ComponentRefe override classes = inject>>(CLASSES); displayInfo: boolean = true; - authButtonId = "authenticateWebAuthnButton"; + authButtonId = 'authenticateWebAuthnButton'; constructor() { super(); @@ -55,8 +55,8 @@ export class LoginPasskeysConditionalAuthenticateComponent extends ComponentRefe } = this.kcContext; const scripts: Script[] = [ { - type: "module", - id: "LoginRecoveryAuthnCodeConfig", + type: 'module', + id: 'LoginRecoveryAuthnCodeConfig', textContent: ` import { authenticateByWebAuthn } from "${url.resourcesPath}/js/webauthnAuthenticate.js"; import { initAuthenticate } from "${url.resourcesPath}/js/passkeysConditionalAuth.js"; @@ -72,13 +72,13 @@ export class LoginPasskeysConditionalAuthenticateComponent extends ComponentRefe authButton.addEventListener("click", () => { authenticateByWebAuthn({ ...input, - errmsg : ${JSON.stringify(this.msgStr.transform("webauthn-unsupported-browser-text"))} + errmsg : ${JSON.stringify(this.msgStr.transform('webauthn-unsupported-browser-text'))} }); }); initAuthenticate({ ...input, - errmsg : ${JSON.stringify(this.msgStr.transform("passkey-unsupported-browser-text"))} + errmsg : ${JSON.stringify(this.msgStr.transform('passkey-unsupported-browser-text'))} }); ` } @@ -94,7 +94,7 @@ export class LoginPasskeysConditionalAuthenticateComponent extends ComponentRefe // eslint-disable-next-line @typescript-eslint/no-explicit-any const className = kcClsx(iconClass as any); if (className === iconClass) { - return kcClsx("kcWebAuthnDefaultIcon"); + return kcClsx('kcWebAuthnDefaultIcon'); } return className; } diff --git a/src/login/pages/login-password/login-password.component.ts b/src/login/pages/login-password/login-password.component.ts index 473fdedc..e64016b7 100644 --- a/src/login/pages/login-password/login-password.component.ts +++ b/src/login/pages/login-password/login-password.component.ts @@ -5,20 +5,20 @@ import { inject, input, signal -} from "@angular/core"; +} from '@angular/core'; import { CLASSES, KC_CONTEXT, USE_DEFAULT_CSS -} from "@keycloakify/angular/lib/public-api"; -import { ClassKey } from "keycloakify/login/lib/kcClsx"; -import { KcContext } from "keycloakify/login/KcContext"; -import { ComponentReference } from "@keycloakify/angular/login/classes/component-reference.class"; -import { PasswordWrapperComponent } from "@keycloakify/angular/login/components/password-wrapper/password-wrapper.component"; -import { TemplateComponent } from "@keycloakify/angular/login/containers/template.component"; -import { KcClassDirective } from "@keycloakify/angular/login/directives/kc-class.directive"; -import { KcSanitizePipe } from "@keycloakify/angular/login/pipes/kc-sanitize.pipe"; -import { MsgStrPipe } from "@keycloakify/angular/login/pipes/msg-str.pipe"; +} from '@keycloakify/angular/lib/public-api'; +import { ClassKey } from 'keycloakify/login/lib/kcClsx'; +import { KcContext } from 'keycloakify/login/KcContext'; +import { ComponentReference } from '@keycloakify/angular/login/classes/component-reference.class'; +import { PasswordWrapperComponent } from '@keycloakify/angular/login/components/password-wrapper/password-wrapper.component'; +import { TemplateComponent } from '@keycloakify/angular/login/containers/template.component'; +import { KcClassDirective } from '@keycloakify/angular/login/directives/kc-class.directive'; +import { KcSanitizePipe } from '@keycloakify/angular/login/pipes/kc-sanitize.pipe'; +import { MsgStrPipe } from '@keycloakify/angular/login/pipes/msg-str.pipe'; @Component({ standalone: true, @@ -29,8 +29,8 @@ import { MsgStrPipe } from "@keycloakify/angular/login/pipes/msg-str.pipe"; PasswordWrapperComponent, KcSanitizePipe ], - selector: "kc-root", - templateUrl: "login-password.component.html", + selector: 'kc-root', + templateUrl: 'login-password.component.html', changeDetection: ChangeDetectionStrategy.OnPush, providers: [ { @@ -40,14 +40,14 @@ import { MsgStrPipe } from "@keycloakify/angular/login/pipes/msg-str.pipe"; ] }) export class LoginPasswordComponent extends ComponentReference { - kcContext = inject>(KC_CONTEXT); + kcContext = inject>(KC_CONTEXT); override doUseDefaultCss = inject(USE_DEFAULT_CSS); override classes = inject>>(CLASSES); displayRequiredFields = input(false); documentTitle = input(); bodyClassName = input(); displayInfo = false; - displayMessage = this.kcContext.messagesPerField.existsError("password"); + displayMessage = this.kcContext.messagesPerField.existsError('password'); isLoginButtonDisabled = signal(false); } diff --git a/src/login/pages/login-recovery-authn-code-config/login-recovery-authn-code-config.component.ts b/src/login/pages/login-recovery-authn-code-config/login-recovery-authn-code-config.component.ts index 8b2a880e..5367082b 100644 --- a/src/login/pages/login-recovery-authn-code-config/login-recovery-authn-code-config.component.ts +++ b/src/login/pages/login-recovery-authn-code-config/login-recovery-authn-code-config.component.ts @@ -5,19 +5,19 @@ import { inject, input, signal -} from "@angular/core"; +} from '@angular/core'; import { CLASSES, KC_CONTEXT, USE_DEFAULT_CSS -} from "@keycloakify/angular/lib/public-api"; -import { ClassKey } from "keycloakify/login/lib/kcClsx"; -import { KcContext } from "keycloakify/login/KcContext"; -import { ComponentReference } from "@keycloakify/angular/login/classes/component-reference.class"; -import { LogoutOtherSessionsComponent } from "@keycloakify/angular/login/components/logout-other-sessions/logout-other-sessions.component"; -import { TemplateComponent } from "@keycloakify/angular/login/containers/template.component"; -import { KcClassDirective } from "@keycloakify/angular/login/directives"; -import { MsgStrPipe } from "@keycloakify/angular/login/pipes/msg-str.pipe"; +} from '@keycloakify/angular/lib/public-api'; +import { ClassKey } from 'keycloakify/login/lib/kcClsx'; +import { KcContext } from 'keycloakify/login/KcContext'; +import { ComponentReference } from '@keycloakify/angular/login/classes/component-reference.class'; +import { LogoutOtherSessionsComponent } from '@keycloakify/angular/login/components/logout-other-sessions/logout-other-sessions.component'; +import { TemplateComponent } from '@keycloakify/angular/login/containers/template.component'; +import { KcClassDirective } from '@keycloakify/angular/login/directives'; +import { MsgStrPipe } from '@keycloakify/angular/login/pipes/msg-str.pipe'; @Component({ standalone: true, @@ -27,8 +27,8 @@ import { MsgStrPipe } from "@keycloakify/angular/login/pipes/msg-str.pipe"; KcClassDirective, LogoutOtherSessionsComponent ], - selector: "kc-root", - templateUrl: "login-recovery-authn-code-config.component.html", + selector: 'kc-root', + templateUrl: 'login-recovery-authn-code-config.component.html', changeDetection: ChangeDetectionStrategy.OnPush, providers: [ { @@ -39,7 +39,7 @@ import { MsgStrPipe } from "@keycloakify/angular/login/pipes/msg-str.pipe"; }) export class LoginRecoveryAuthnCodeConfigComponent extends ComponentReference { kcContext = - inject>( + inject>( KC_CONTEXT ); override doUseDefaultCss = inject(USE_DEFAULT_CSS); @@ -51,5 +51,5 @@ export class LoginRecoveryAuthnCodeConfigComponent extends ComponentReference { displayMessage: boolean = false; toggleRecoveryCodesConfirmation = signal(false); - olRecoveryCodesListId = "kc-recovery-codes-list"; + olRecoveryCodesListId = 'kc-recovery-codes-list'; } diff --git a/src/login/pages/login-recovery-authn-code-input/login-recovery-authn-code-input.component.ts b/src/login/pages/login-recovery-authn-code-input/login-recovery-authn-code-input.component.ts index 505f1664..9ed180db 100644 --- a/src/login/pages/login-recovery-authn-code-input/login-recovery-authn-code-input.component.ts +++ b/src/login/pages/login-recovery-authn-code-input/login-recovery-authn-code-input.component.ts @@ -4,25 +4,25 @@ import { forwardRef, inject, input -} from "@angular/core"; +} from '@angular/core'; import { CLASSES, KC_CONTEXT, USE_DEFAULT_CSS -} from "@keycloakify/angular/lib/public-api"; -import { ClassKey } from "keycloakify/login/lib/kcClsx"; -import { KcContext } from "keycloakify/login/KcContext"; -import { ComponentReference } from "@keycloakify/angular/login/classes/component-reference.class"; -import { TemplateComponent } from "@keycloakify/angular/login/containers/template.component"; -import { KcClassDirective } from "@keycloakify/angular/login/directives"; -import { KcSanitizePipe } from "@keycloakify/angular/login/pipes/kc-sanitize.pipe"; -import { MsgStrPipe } from "@keycloakify/angular/login/pipes/msg-str.pipe"; +} from '@keycloakify/angular/lib/public-api'; +import { ClassKey } from 'keycloakify/login/lib/kcClsx'; +import { KcContext } from 'keycloakify/login/KcContext'; +import { ComponentReference } from '@keycloakify/angular/login/classes/component-reference.class'; +import { TemplateComponent } from '@keycloakify/angular/login/containers/template.component'; +import { KcClassDirective } from '@keycloakify/angular/login/directives'; +import { KcSanitizePipe } from '@keycloakify/angular/login/pipes/kc-sanitize.pipe'; +import { MsgStrPipe } from '@keycloakify/angular/login/pipes/msg-str.pipe'; @Component({ standalone: true, imports: [TemplateComponent, MsgStrPipe, KcClassDirective, KcSanitizePipe], - selector: "kc-root", - templateUrl: "login-recovery-authn-code-input.component.html", + selector: 'kc-root', + templateUrl: 'login-recovery-authn-code-input.component.html', changeDetection: ChangeDetectionStrategy.OnPush, providers: [ { @@ -33,7 +33,7 @@ import { MsgStrPipe } from "@keycloakify/angular/login/pipes/msg-str.pipe"; }) export class LoginRecoveryAuthnCodeInputComponent extends ComponentReference { kcContext = - inject>( + inject>( KC_CONTEXT ); override doUseDefaultCss = inject(USE_DEFAULT_CSS); @@ -43,5 +43,5 @@ export class LoginRecoveryAuthnCodeInputComponent extends ComponentReference { bodyClassName = input(); displayInfo: boolean = false; displayMessage: boolean = - this.kcContext.messagesPerField.existsError("recoveryCodeInput"); + this.kcContext.messagesPerField.existsError('recoveryCodeInput'); } diff --git a/src/login/pages/login-reset-otp/login-reset-otp.component.ts b/src/login/pages/login-reset-otp/login-reset-otp.component.ts index 01f71ad2..b6338807 100644 --- a/src/login/pages/login-reset-otp/login-reset-otp.component.ts +++ b/src/login/pages/login-reset-otp/login-reset-otp.component.ts @@ -4,24 +4,24 @@ import { forwardRef, inject, input -} from "@angular/core"; +} from '@angular/core'; import { CLASSES, KC_CONTEXT, USE_DEFAULT_CSS -} from "@keycloakify/angular/lib/public-api"; -import { ClassKey } from "keycloakify/login/lib/kcClsx"; -import { KcContext } from "keycloakify/login/KcContext"; -import { ComponentReference } from "@keycloakify/angular/login/classes/component-reference.class"; -import { TemplateComponent } from "@keycloakify/angular/login/containers/template.component"; -import { KcClassDirective } from "@keycloakify/angular/login/directives"; -import { MsgStrPipe } from "@keycloakify/angular/login/pipes/msg-str.pipe"; +} from '@keycloakify/angular/lib/public-api'; +import { ClassKey } from 'keycloakify/login/lib/kcClsx'; +import { KcContext } from 'keycloakify/login/KcContext'; +import { ComponentReference } from '@keycloakify/angular/login/classes/component-reference.class'; +import { TemplateComponent } from '@keycloakify/angular/login/containers/template.component'; +import { KcClassDirective } from '@keycloakify/angular/login/directives'; +import { MsgStrPipe } from '@keycloakify/angular/login/pipes/msg-str.pipe'; @Component({ standalone: true, imports: [KcClassDirective, MsgStrPipe, TemplateComponent], - selector: "kc-root", - templateUrl: "login-reset-otp.component.html", + selector: 'kc-root', + templateUrl: 'login-reset-otp.component.html', changeDetection: ChangeDetectionStrategy.OnPush, providers: [ { @@ -31,12 +31,12 @@ import { MsgStrPipe } from "@keycloakify/angular/login/pipes/msg-str.pipe"; ] }) export class LoginResetOtpComponent extends ComponentReference { - kcContext = inject>(KC_CONTEXT); + kcContext = inject>(KC_CONTEXT); override doUseDefaultCss = inject(USE_DEFAULT_CSS); override classes = inject>>(CLASSES); displayRequiredFields = input(false); documentTitle = input(); bodyClassName = input(); displayInfo: boolean = false; - displayMessage: boolean = this.kcContext.messagesPerField.existsError("totp"); + displayMessage: boolean = this.kcContext.messagesPerField.existsError('totp'); } diff --git a/src/login/pages/login-reset-password/login-reset-password.component.ts b/src/login/pages/login-reset-password/login-reset-password.component.ts index 9992a474..5320a199 100644 --- a/src/login/pages/login-reset-password/login-reset-password.component.ts +++ b/src/login/pages/login-reset-password/login-reset-password.component.ts @@ -4,25 +4,25 @@ import { forwardRef, inject, input -} from "@angular/core"; +} from '@angular/core'; import { CLASSES, KC_CONTEXT, USE_DEFAULT_CSS -} from "@keycloakify/angular/lib/public-api"; -import { ClassKey } from "keycloakify/login/lib/kcClsx"; -import { KcContext } from "keycloakify/login/KcContext"; -import { ComponentReference } from "@keycloakify/angular/login/classes/component-reference.class"; -import { TemplateComponent } from "@keycloakify/angular/login/containers/template.component"; -import { KcClassDirective } from "@keycloakify/angular/login/directives"; -import { KcSanitizePipe } from "@keycloakify/angular/login/pipes/kc-sanitize.pipe"; -import { MsgStrPipe } from "@keycloakify/angular/login/pipes/msg-str.pipe"; +} from '@keycloakify/angular/lib/public-api'; +import { ClassKey } from 'keycloakify/login/lib/kcClsx'; +import { KcContext } from 'keycloakify/login/KcContext'; +import { ComponentReference } from '@keycloakify/angular/login/classes/component-reference.class'; +import { TemplateComponent } from '@keycloakify/angular/login/containers/template.component'; +import { KcClassDirective } from '@keycloakify/angular/login/directives'; +import { KcSanitizePipe } from '@keycloakify/angular/login/pipes/kc-sanitize.pipe'; +import { MsgStrPipe } from '@keycloakify/angular/login/pipes/msg-str.pipe'; @Component({ standalone: true, imports: [TemplateComponent, MsgStrPipe, KcClassDirective, KcSanitizePipe], - selector: "kc-root", - templateUrl: "login-reset-password.component.html", + selector: 'kc-root', + templateUrl: 'login-reset-password.component.html', changeDetection: ChangeDetectionStrategy.OnPush, providers: [ { @@ -33,12 +33,12 @@ import { MsgStrPipe } from "@keycloakify/angular/login/pipes/msg-str.pipe"; }) export class LoginResetPasswordComponent extends ComponentReference { kcContext = - inject>(KC_CONTEXT); + inject>(KC_CONTEXT); override doUseDefaultCss = inject(USE_DEFAULT_CSS); override classes = inject>>(CLASSES); displayRequiredFields = input(false); documentTitle = input(); bodyClassName = input(); displayInfo: boolean = false; - displayMessage: boolean = this.kcContext.messagesPerField.existsError("username"); + displayMessage: boolean = this.kcContext.messagesPerField.existsError('username'); } diff --git a/src/login/pages/login-update-password/login-update-password.component.ts b/src/login/pages/login-update-password/login-update-password.component.ts index 37602c20..685c97ce 100644 --- a/src/login/pages/login-update-password/login-update-password.component.ts +++ b/src/login/pages/login-update-password/login-update-password.component.ts @@ -4,21 +4,21 @@ import { forwardRef, inject, input -} from "@angular/core"; +} from '@angular/core'; import { CLASSES, KC_CONTEXT, USE_DEFAULT_CSS -} from "@keycloakify/angular/lib/public-api"; -import { ClassKey } from "keycloakify/login/lib/kcClsx"; -import { KcContext } from "keycloakify/login/KcContext"; -import { ComponentReference } from "@keycloakify/angular/login/classes/component-reference.class"; -import { LogoutOtherSessionsComponent } from "@keycloakify/angular/login/components/logout-other-sessions/logout-other-sessions.component"; -import { PasswordWrapperComponent } from "@keycloakify/angular/login/components/password-wrapper/password-wrapper.component"; -import { TemplateComponent } from "@keycloakify/angular/login/containers/template.component"; -import { KcClassDirective } from "@keycloakify/angular/login/directives"; -import { KcSanitizePipe } from "@keycloakify/angular/login/pipes/kc-sanitize.pipe"; -import { MsgStrPipe } from "@keycloakify/angular/login/pipes/msg-str.pipe"; +} from '@keycloakify/angular/lib/public-api'; +import { ClassKey } from 'keycloakify/login/lib/kcClsx'; +import { KcContext } from 'keycloakify/login/KcContext'; +import { ComponentReference } from '@keycloakify/angular/login/classes/component-reference.class'; +import { LogoutOtherSessionsComponent } from '@keycloakify/angular/login/components/logout-other-sessions/logout-other-sessions.component'; +import { PasswordWrapperComponent } from '@keycloakify/angular/login/components/password-wrapper/password-wrapper.component'; +import { TemplateComponent } from '@keycloakify/angular/login/containers/template.component'; +import { KcClassDirective } from '@keycloakify/angular/login/directives'; +import { KcSanitizePipe } from '@keycloakify/angular/login/pipes/kc-sanitize.pipe'; +import { MsgStrPipe } from '@keycloakify/angular/login/pipes/msg-str.pipe'; @Component({ standalone: true, @@ -30,8 +30,8 @@ import { MsgStrPipe } from "@keycloakify/angular/login/pipes/msg-str.pipe"; KcSanitizePipe, LogoutOtherSessionsComponent ], - selector: "kc-root", - templateUrl: "login-update-password.component.html", + selector: 'kc-root', + templateUrl: 'login-update-password.component.html', changeDetection: ChangeDetectionStrategy.OnPush, providers: [ { @@ -42,7 +42,7 @@ import { MsgStrPipe } from "@keycloakify/angular/login/pipes/msg-str.pipe"; }) export class LoginUpdatePasswordComponent extends ComponentReference { kcContext = - inject>(KC_CONTEXT); + inject>(KC_CONTEXT); override doUseDefaultCss = inject(USE_DEFAULT_CSS); override classes = inject>>(CLASSES); displayRequiredFields = input(false); @@ -50,7 +50,7 @@ export class LoginUpdatePasswordComponent extends ComponentReference { bodyClassName = input(); displayInfo = false; displayMessage = !this.kcContext.messagesPerField.existsError( - "password", - "password-confirm" + 'password', + 'password-confirm' ); } diff --git a/src/login/pages/login-update-profile/login-update-profile.component.ts b/src/login/pages/login-update-profile/login-update-profile.component.ts index f55c3c53..7c1165a8 100644 --- a/src/login/pages/login-update-profile/login-update-profile.component.ts +++ b/src/login/pages/login-update-profile/login-update-profile.component.ts @@ -5,19 +5,19 @@ import { inject, input, signal -} from "@angular/core"; +} from '@angular/core'; import { CLASSES, KC_CONTEXT, USE_DEFAULT_CSS -} from "@keycloakify/angular/lib/public-api"; -import { ClassKey } from "keycloakify/login/lib/kcClsx"; -import { KcContext } from "keycloakify/login/KcContext"; -import { ComponentReference } from "@keycloakify/angular/login/classes/component-reference.class"; -import { UserProfileFormFieldsComponent } from "@keycloakify/angular/login/components/user-profile-form-fields/user-profile-form-fields.component"; -import { TemplateComponent } from "@keycloakify/angular/login/containers/template.component"; -import { KcClassDirective } from "@keycloakify/angular/login/directives"; -import { MsgStrPipe } from "@keycloakify/angular/login/pipes/msg-str.pipe"; +} from '@keycloakify/angular/lib/public-api'; +import { ClassKey } from 'keycloakify/login/lib/kcClsx'; +import { KcContext } from 'keycloakify/login/KcContext'; +import { ComponentReference } from '@keycloakify/angular/login/classes/component-reference.class'; +import { UserProfileFormFieldsComponent } from '@keycloakify/angular/login/components/user-profile-form-fields/user-profile-form-fields.component'; +import { TemplateComponent } from '@keycloakify/angular/login/containers/template.component'; +import { KcClassDirective } from '@keycloakify/angular/login/directives'; +import { MsgStrPipe } from '@keycloakify/angular/login/pipes/msg-str.pipe'; @Component({ standalone: true, @@ -27,8 +27,8 @@ import { MsgStrPipe } from "@keycloakify/angular/login/pipes/msg-str.pipe"; MsgStrPipe, UserProfileFormFieldsComponent ], - selector: "kc-root", - templateUrl: "login-update-profile.component.html", + selector: 'kc-root', + templateUrl: 'login-update-profile.component.html', changeDetection: ChangeDetectionStrategy.OnPush, providers: [ { @@ -39,14 +39,14 @@ import { MsgStrPipe } from "@keycloakify/angular/login/pipes/msg-str.pipe"; }) export class LoginUpdateProfileComponent extends ComponentReference { kcContext = - inject>(KC_CONTEXT); + inject>(KC_CONTEXT); override doUseDefaultCss = inject(USE_DEFAULT_CSS); override classes = inject>>(CLASSES); displayRequiredFields = input(true); documentTitle = input(); bodyClassName = input(); displayInfo: boolean = false; - displayMessage: boolean = this.kcContext.messagesPerField.exists("global"); + displayMessage: boolean = this.kcContext.messagesPerField.exists('global'); isFormSubmittable = signal(false); } diff --git a/src/login/pages/login-username/login-username.component.ts b/src/login/pages/login-username/login-username.component.ts index 2ced42b3..4c901911 100644 --- a/src/login/pages/login-username/login-username.component.ts +++ b/src/login/pages/login-username/login-username.component.ts @@ -1,4 +1,4 @@ -import { AsyncPipe, NgClass } from "@angular/common"; +import { AsyncPipe, NgClass } from '@angular/common'; import { ChangeDetectionStrategy, Component, @@ -6,23 +6,23 @@ import { inject, input, signal -} from "@angular/core"; +} from '@angular/core'; import { CLASSES, KC_CONTEXT, USE_DEFAULT_CSS -} from "@keycloakify/angular/lib/public-api"; -import { ClassKey } from "keycloakify/login/lib/kcClsx"; -import { KcContext } from "keycloakify/login/KcContext"; -import { ComponentReference } from "@keycloakify/angular/login/classes/component-reference.class"; -import { TemplateComponent } from "@keycloakify/angular/login/containers/template.component"; -import { KcClassDirective } from "@keycloakify/angular/login/directives/kc-class.directive"; -import { KcSanitizePipe } from "@keycloakify/angular/login/pipes/kc-sanitize.pipe"; -import { MsgStrPipe } from "@keycloakify/angular/login/pipes/msg-str.pipe"; +} from '@keycloakify/angular/lib/public-api'; +import { ClassKey } from 'keycloakify/login/lib/kcClsx'; +import { KcContext } from 'keycloakify/login/KcContext'; +import { ComponentReference } from '@keycloakify/angular/login/classes/component-reference.class'; +import { TemplateComponent } from '@keycloakify/angular/login/containers/template.component'; +import { KcClassDirective } from '@keycloakify/angular/login/directives/kc-class.directive'; +import { KcSanitizePipe } from '@keycloakify/angular/login/pipes/kc-sanitize.pipe'; +import { MsgStrPipe } from '@keycloakify/angular/login/pipes/msg-str.pipe'; @Component({ - selector: "kc-root", - templateUrl: "./login-username.component.html", + selector: 'kc-root', + templateUrl: './login-username.component.html', standalone: true, changeDetection: ChangeDetectionStrategy.OnPush, imports: [ @@ -41,7 +41,7 @@ import { MsgStrPipe } from "@keycloakify/angular/login/pipes/msg-str.pipe"; ] }) export class LoginUsernameComponent extends ComponentReference { - kcContext = inject>(KC_CONTEXT); + kcContext = inject>(KC_CONTEXT); displayRequiredFields = input(false); documentTitle = input(); bodyClassName = input(); @@ -52,5 +52,5 @@ export class LoginUsernameComponent extends ComponentReference { !!this.kcContext?.realm?.password && !!this.kcContext?.realm?.registrationAllowed && !this.kcContext?.registrationDisabled; - displayMessage: boolean = !this.kcContext?.messagesPerField?.existsError("username"); + displayMessage: boolean = !this.kcContext?.messagesPerField?.existsError('username'); } diff --git a/src/login/pages/login-verify-email/login-verify-email.component.ts b/src/login/pages/login-verify-email/login-verify-email.component.ts index f530da48..1521d681 100644 --- a/src/login/pages/login-verify-email/login-verify-email.component.ts +++ b/src/login/pages/login-verify-email/login-verify-email.component.ts @@ -4,24 +4,24 @@ import { forwardRef, inject, input -} from "@angular/core"; +} from '@angular/core'; import { CLASSES, KC_CONTEXT, USE_DEFAULT_CSS -} from "@keycloakify/angular/lib/public-api"; -import { ClassKey } from "keycloakify/login/lib/kcClsx"; -import { KcContext } from "keycloakify/login/KcContext"; -import { ComponentReference } from "@keycloakify/angular/login/classes/component-reference.class"; -import { TemplateComponent } from "@keycloakify/angular/login/containers/template.component"; -import { KcClassDirective } from "@keycloakify/angular/login/directives"; -import { MsgStrPipe } from "@keycloakify/angular/login/pipes/msg-str.pipe"; +} from '@keycloakify/angular/lib/public-api'; +import { ClassKey } from 'keycloakify/login/lib/kcClsx'; +import { KcContext } from 'keycloakify/login/KcContext'; +import { ComponentReference } from '@keycloakify/angular/login/classes/component-reference.class'; +import { TemplateComponent } from '@keycloakify/angular/login/containers/template.component'; +import { KcClassDirective } from '@keycloakify/angular/login/directives'; +import { MsgStrPipe } from '@keycloakify/angular/login/pipes/msg-str.pipe'; @Component({ standalone: true, imports: [KcClassDirective, TemplateComponent, MsgStrPipe], - selector: "kc-root", - templateUrl: "login-verify-email.component.html", + selector: 'kc-root', + templateUrl: 'login-verify-email.component.html', changeDetection: ChangeDetectionStrategy.OnPush, providers: [ { @@ -32,7 +32,7 @@ import { MsgStrPipe } from "@keycloakify/angular/login/pipes/msg-str.pipe"; }) export class LoginVerifyEmailComponent extends ComponentReference { kcContext = - inject>(KC_CONTEXT); + inject>(KC_CONTEXT); override doUseDefaultCss = inject(USE_DEFAULT_CSS); override classes = inject>>(CLASSES); displayRequiredFields = input(false); diff --git a/src/login/pages/login-x509-info/login-x509-info.component.ts b/src/login/pages/login-x509-info/login-x509-info.component.ts index d8062a2d..b3daeef7 100644 --- a/src/login/pages/login-x509-info/login-x509-info.component.ts +++ b/src/login/pages/login-x509-info/login-x509-info.component.ts @@ -4,24 +4,24 @@ import { forwardRef, inject, input -} from "@angular/core"; +} from '@angular/core'; import { CLASSES, KC_CONTEXT, USE_DEFAULT_CSS -} from "@keycloakify/angular/lib/public-api"; -import { ClassKey } from "keycloakify/login/lib/kcClsx"; -import { KcContext } from "keycloakify/login/KcContext"; -import { ComponentReference } from "@keycloakify/angular/login/classes/component-reference.class"; -import { TemplateComponent } from "@keycloakify/angular/login/containers/template.component"; -import { KcClassDirective } from "@keycloakify/angular/login/directives"; -import { MsgStrPipe } from "@keycloakify/angular/login/pipes/msg-str.pipe"; +} from '@keycloakify/angular/lib/public-api'; +import { ClassKey } from 'keycloakify/login/lib/kcClsx'; +import { KcContext } from 'keycloakify/login/KcContext'; +import { ComponentReference } from '@keycloakify/angular/login/classes/component-reference.class'; +import { TemplateComponent } from '@keycloakify/angular/login/containers/template.component'; +import { KcClassDirective } from '@keycloakify/angular/login/directives'; +import { MsgStrPipe } from '@keycloakify/angular/login/pipes/msg-str.pipe'; @Component({ standalone: true, imports: [TemplateComponent, MsgStrPipe, KcClassDirective], - selector: "kc-root", - templateUrl: "login-x509-info.component.html", + selector: 'kc-root', + templateUrl: 'login-x509-info.component.html', changeDetection: ChangeDetectionStrategy.OnPush, providers: [ { @@ -31,7 +31,7 @@ import { MsgStrPipe } from "@keycloakify/angular/login/pipes/msg-str.pipe"; ] }) export class LoginX509InfoComponent extends ComponentReference { - kcContext = inject>(KC_CONTEXT); + kcContext = inject>(KC_CONTEXT); override doUseDefaultCss = inject(USE_DEFAULT_CSS); override classes = inject>>(CLASSES); displayRequiredFields = input(false); diff --git a/src/login/pages/login/login.component.ts b/src/login/pages/login/login.component.ts index ed714050..8c2b4e60 100644 --- a/src/login/pages/login/login.component.ts +++ b/src/login/pages/login/login.component.ts @@ -1,4 +1,4 @@ -import { AsyncPipe, NgClass } from "@angular/common"; +import { AsyncPipe, NgClass } from '@angular/common'; import { ChangeDetectionStrategy, Component, @@ -6,24 +6,24 @@ import { inject, input, signal -} from "@angular/core"; +} from '@angular/core'; import { CLASSES, KC_CONTEXT, USE_DEFAULT_CSS -} from "@keycloakify/angular/lib/public-api"; -import { ClassKey } from "keycloakify/login/lib/kcClsx"; -import { KcContext } from "keycloakify/login/KcContext"; -import { ComponentReference } from "@keycloakify/angular/login/classes/component-reference.class"; -import { PasswordWrapperComponent } from "@keycloakify/angular/login/components/password-wrapper/password-wrapper.component"; -import { TemplateComponent } from "@keycloakify/angular/login/containers/template.component"; -import { KcClassDirective } from "@keycloakify/angular/login/directives/kc-class.directive"; -import { KcSanitizePipe } from "@keycloakify/angular/login/pipes/kc-sanitize.pipe"; -import { MsgStrPipe } from "@keycloakify/angular/login/pipes/msg-str.pipe"; +} from '@keycloakify/angular/lib/public-api'; +import { ClassKey } from 'keycloakify/login/lib/kcClsx'; +import { KcContext } from 'keycloakify/login/KcContext'; +import { ComponentReference } from '@keycloakify/angular/login/classes/component-reference.class'; +import { PasswordWrapperComponent } from '@keycloakify/angular/login/components/password-wrapper/password-wrapper.component'; +import { TemplateComponent } from '@keycloakify/angular/login/containers/template.component'; +import { KcClassDirective } from '@keycloakify/angular/login/directives/kc-class.directive'; +import { KcSanitizePipe } from '@keycloakify/angular/login/pipes/kc-sanitize.pipe'; +import { MsgStrPipe } from '@keycloakify/angular/login/pipes/msg-str.pipe'; @Component({ - selector: "kc-root", - templateUrl: "./login.component.html", + selector: 'kc-root', + templateUrl: './login.component.html', standalone: true, changeDetection: ChangeDetectionStrategy.OnPush, imports: [ @@ -43,7 +43,7 @@ import { MsgStrPipe } from "@keycloakify/angular/login/pipes/msg-str.pipe"; ] }) export class LoginComponent extends ComponentReference { - kcContext = inject>(KC_CONTEXT); + kcContext = inject>(KC_CONTEXT); displayRequiredFields = input(false); documentTitle = input(); bodyClassName = input(); @@ -55,7 +55,7 @@ export class LoginComponent extends ComponentReference { !!this.kcContext?.realm?.registrationAllowed && !this.kcContext?.registrationDisabled; displayMessage: boolean = !this.kcContext?.messagesPerField?.existsError( - "username", - "password" + 'username', + 'password' ); } diff --git a/src/login/pages/logout-confirm/logout-confirm.component.ts b/src/login/pages/logout-confirm/logout-confirm.component.ts index 0aa93f73..3a10ed31 100644 --- a/src/login/pages/logout-confirm/logout-confirm.component.ts +++ b/src/login/pages/logout-confirm/logout-confirm.component.ts @@ -4,24 +4,24 @@ import { forwardRef, inject, input -} from "@angular/core"; +} from '@angular/core'; import { CLASSES, KC_CONTEXT, USE_DEFAULT_CSS -} from "@keycloakify/angular/lib/public-api"; -import { ClassKey } from "keycloakify/login/lib/kcClsx"; -import { KcContext } from "keycloakify/login/KcContext"; -import { ComponentReference } from "@keycloakify/angular/login/classes/component-reference.class"; -import { TemplateComponent } from "@keycloakify/angular/login/containers/template.component"; -import { KcClassDirective } from "@keycloakify/angular/login/directives"; -import { MsgStrPipe } from "@keycloakify/angular/login/pipes/msg-str.pipe"; +} from '@keycloakify/angular/lib/public-api'; +import { ClassKey } from 'keycloakify/login/lib/kcClsx'; +import { KcContext } from 'keycloakify/login/KcContext'; +import { ComponentReference } from '@keycloakify/angular/login/classes/component-reference.class'; +import { TemplateComponent } from '@keycloakify/angular/login/containers/template.component'; +import { KcClassDirective } from '@keycloakify/angular/login/directives'; +import { MsgStrPipe } from '@keycloakify/angular/login/pipes/msg-str.pipe'; @Component({ standalone: true, imports: [MsgStrPipe, TemplateComponent, KcClassDirective], - selector: "kc-root", - templateUrl: "logout-confirm.component.html", + selector: 'kc-root', + templateUrl: 'logout-confirm.component.html', changeDetection: ChangeDetectionStrategy.OnPush, providers: [ { @@ -31,7 +31,7 @@ import { MsgStrPipe } from "@keycloakify/angular/login/pipes/msg-str.pipe"; ] }) export class LogoutConfirmComponent extends ComponentReference { - kcContext = inject>(KC_CONTEXT); + kcContext = inject>(KC_CONTEXT); override doUseDefaultCss = inject(USE_DEFAULT_CSS); override classes = inject>>(CLASSES); displayRequiredFields = input(false); diff --git a/src/login/pages/register/register.component.ts b/src/login/pages/register/register.component.ts index 14a94cca..9f4f2838 100644 --- a/src/login/pages/register/register.component.ts +++ b/src/login/pages/register/register.component.ts @@ -1,4 +1,4 @@ -import { AsyncPipe, NgClass } from "@angular/common"; +import { AsyncPipe, NgClass } from '@angular/common'; import { ChangeDetectionStrategy, Component, @@ -6,25 +6,25 @@ import { inject, input, signal -} from "@angular/core"; +} from '@angular/core'; import { CLASSES, KC_CONTEXT, USE_DEFAULT_CSS -} from "@keycloakify/angular/lib/public-api"; -import { ClassKey } from "keycloakify/login/lib/kcClsx"; -import { KcContext } from "keycloakify/login/KcContext"; -import { ComponentReference } from "@keycloakify/angular/login/classes/component-reference.class"; -import { UserProfileFormFieldsComponent } from "@keycloakify/angular/login/components/user-profile-form-fields/user-profile-form-fields.component"; -import { TemplateComponent } from "@keycloakify/angular/login/containers/template.component"; -import { KcClassDirective } from "@keycloakify/angular/login/directives/kc-class.directive"; -import { AdvancedMsgStrPipe } from "@keycloakify/angular/login/pipes/advanced-msg-str.pipe"; -import { KcSanitizePipe } from "@keycloakify/angular/login/pipes/kc-sanitize.pipe"; -import { MsgStrPipe } from "@keycloakify/angular/login/pipes/msg-str.pipe"; +} from '@keycloakify/angular/lib/public-api'; +import { ClassKey } from 'keycloakify/login/lib/kcClsx'; +import { KcContext } from 'keycloakify/login/KcContext'; +import { ComponentReference } from '@keycloakify/angular/login/classes/component-reference.class'; +import { UserProfileFormFieldsComponent } from '@keycloakify/angular/login/components/user-profile-form-fields/user-profile-form-fields.component'; +import { TemplateComponent } from '@keycloakify/angular/login/containers/template.component'; +import { KcClassDirective } from '@keycloakify/angular/login/directives/kc-class.directive'; +import { AdvancedMsgStrPipe } from '@keycloakify/angular/login/pipes/advanced-msg-str.pipe'; +import { KcSanitizePipe } from '@keycloakify/angular/login/pipes/kc-sanitize.pipe'; +import { MsgStrPipe } from '@keycloakify/angular/login/pipes/msg-str.pipe'; @Component({ - selector: "kc-root", - templateUrl: "./register.component.html", + selector: 'kc-root', + templateUrl: './register.component.html', standalone: true, changeDetection: ChangeDetectionStrategy.OnPush, imports: [ @@ -45,7 +45,7 @@ import { MsgStrPipe } from "@keycloakify/angular/login/pipes/msg-str.pipe"; ] }) export class RegisterComponent extends ComponentReference { - kcContext = inject>(KC_CONTEXT); + kcContext = inject>(KC_CONTEXT); displayRequiredFields = input(false); documentTitle = input(); bodyClassName = input(); @@ -54,9 +54,9 @@ export class RegisterComponent extends ComponentReference { isFormSubmittable = signal(false); areTermsAccepted = signal(false); displayInfo: boolean = false; - displayMessage: boolean = !this.kcContext?.messagesPerField?.existsError("global"); + displayMessage: boolean = !this.kcContext?.messagesPerField?.existsError('global'); onCallback() { - (document.getElementById("kc-register-form") as HTMLFormElement).submit(); + (document.getElementById('kc-register-form') as HTMLFormElement).submit(); } } diff --git a/src/login/pages/saml-post-form/saml-post-form.component.ts b/src/login/pages/saml-post-form/saml-post-form.component.ts index 2abe7f23..be924fe6 100644 --- a/src/login/pages/saml-post-form/saml-post-form.component.ts +++ b/src/login/pages/saml-post-form/saml-post-form.component.ts @@ -6,23 +6,23 @@ import { inject, input, ViewChild -} from "@angular/core"; +} from '@angular/core'; import { CLASSES, KC_CONTEXT, USE_DEFAULT_CSS -} from "@keycloakify/angular/lib/public-api"; -import { ClassKey } from "keycloakify/login/lib/kcClsx"; -import { KcContext } from "keycloakify/login/KcContext"; -import { ComponentReference } from "@keycloakify/angular/login/classes/component-reference.class"; -import { TemplateComponent } from "@keycloakify/angular/login/containers/template.component"; -import { MsgStrPipe } from "@keycloakify/angular/login/pipes/msg-str.pipe"; +} from '@keycloakify/angular/lib/public-api'; +import { ClassKey } from 'keycloakify/login/lib/kcClsx'; +import { KcContext } from 'keycloakify/login/KcContext'; +import { ComponentReference } from '@keycloakify/angular/login/classes/component-reference.class'; +import { TemplateComponent } from '@keycloakify/angular/login/containers/template.component'; +import { MsgStrPipe } from '@keycloakify/angular/login/pipes/msg-str.pipe'; @Component({ standalone: true, imports: [TemplateComponent, MsgStrPipe], - selector: "kc-root", - templateUrl: "saml-post-form.component.html", + selector: 'kc-root', + templateUrl: 'saml-post-form.component.html', changeDetection: ChangeDetectionStrategy.OnPush, providers: [ { @@ -32,7 +32,7 @@ import { MsgStrPipe } from "@keycloakify/angular/login/pipes/msg-str.pipe"; ] }) export class SamlPostFormComponent extends ComponentReference implements AfterViewInit { - kcContext = inject>(KC_CONTEXT); + kcContext = inject>(KC_CONTEXT); override doUseDefaultCss = inject(USE_DEFAULT_CSS); override classes = inject>>(CLASSES); displayRequiredFields = input(false); @@ -40,7 +40,7 @@ export class SamlPostFormComponent extends ComponentReference implements AfterVi bodyClassName = input(); displayInfo: boolean = false; displayMessage: boolean = true; - @ViewChild("setHtmlFormElement") + @ViewChild('setHtmlFormElement') htmlFormElement!: HTMLFormElement; ngAfterViewInit(): void { @@ -48,8 +48,8 @@ export class SamlPostFormComponent extends ComponentReference implements AfterVi return; } - if (this.kcContext.samlPost.url === "#") { - alert("In a real Keycloak the user would be redirected immediately"); + if (this.kcContext.samlPost.url === '#') { + alert('In a real Keycloak the user would be redirected immediately'); return; } diff --git a/src/login/pages/select-authenticator/select-authenticator.component.ts b/src/login/pages/select-authenticator/select-authenticator.component.ts index 52dd32eb..b10d7b55 100644 --- a/src/login/pages/select-authenticator/select-authenticator.component.ts +++ b/src/login/pages/select-authenticator/select-authenticator.component.ts @@ -1,23 +1,23 @@ -import { NgClass } from "@angular/common"; +import { NgClass } from '@angular/common'; import { ChangeDetectionStrategy, Component, forwardRef, inject, input -} from "@angular/core"; +} from '@angular/core'; import { CLASSES, KC_CONTEXT, USE_DEFAULT_CSS -} from "@keycloakify/angular/lib/public-api"; -import { ClassKey } from "keycloakify/login/lib/kcClsx"; -import { KcContext } from "keycloakify/login/KcContext"; -import { ComponentReference } from "@keycloakify/angular/login/classes/component-reference.class"; -import { TemplateComponent } from "@keycloakify/angular/login/containers/template.component"; -import { KcClassDirective } from "@keycloakify/angular/login/directives"; -import { AdvancedMsgStrPipe } from "@keycloakify/angular/login/pipes"; -import { MsgStrPipe } from "@keycloakify/angular/login/pipes/msg-str.pipe"; +} from '@keycloakify/angular/lib/public-api'; +import { ClassKey } from 'keycloakify/login/lib/kcClsx'; +import { KcContext } from 'keycloakify/login/KcContext'; +import { ComponentReference } from '@keycloakify/angular/login/classes/component-reference.class'; +import { TemplateComponent } from '@keycloakify/angular/login/containers/template.component'; +import { KcClassDirective } from '@keycloakify/angular/login/directives'; +import { AdvancedMsgStrPipe } from '@keycloakify/angular/login/pipes'; +import { MsgStrPipe } from '@keycloakify/angular/login/pipes/msg-str.pipe'; @Component({ standalone: true, @@ -28,8 +28,8 @@ import { MsgStrPipe } from "@keycloakify/angular/login/pipes/msg-str.pipe"; KcClassDirective, NgClass ], - selector: "kc-root", - templateUrl: "select-authenticator.component.html", + selector: 'kc-root', + templateUrl: 'select-authenticator.component.html', changeDetection: ChangeDetectionStrategy.OnPush, providers: [ { @@ -40,7 +40,7 @@ import { MsgStrPipe } from "@keycloakify/angular/login/pipes/msg-str.pipe"; }) export class SelectAuthenticatorComponent extends ComponentReference { kcContext = - inject>(KC_CONTEXT); + inject>(KC_CONTEXT); override doUseDefaultCss = inject(USE_DEFAULT_CSS); override classes = inject>>(CLASSES); displayRequiredFields = input(false); diff --git a/src/login/pages/terms/terms.component.ts b/src/login/pages/terms/terms.component.ts index cb8a351d..4180c4fd 100644 --- a/src/login/pages/terms/terms.component.ts +++ b/src/login/pages/terms/terms.component.ts @@ -4,24 +4,24 @@ import { forwardRef, inject, input -} from "@angular/core"; +} from '@angular/core'; import { CLASSES, KC_CONTEXT, USE_DEFAULT_CSS -} from "@keycloakify/angular/lib/public-api"; -import { ClassKey } from "keycloakify/login/lib/kcClsx"; -import { KcContext } from "keycloakify/login/KcContext"; -import { ComponentReference } from "@keycloakify/angular/login/classes/component-reference.class"; -import { TemplateComponent } from "@keycloakify/angular/login/containers/template.component"; -import { KcClassDirective } from "@keycloakify/angular/login/directives"; -import { MsgStrPipe } from "@keycloakify/angular/login/pipes/msg-str.pipe"; +} from '@keycloakify/angular/lib/public-api'; +import { ClassKey } from 'keycloakify/login/lib/kcClsx'; +import { KcContext } from 'keycloakify/login/KcContext'; +import { ComponentReference } from '@keycloakify/angular/login/classes/component-reference.class'; +import { TemplateComponent } from '@keycloakify/angular/login/containers/template.component'; +import { KcClassDirective } from '@keycloakify/angular/login/directives'; +import { MsgStrPipe } from '@keycloakify/angular/login/pipes/msg-str.pipe'; @Component({ standalone: true, imports: [MsgStrPipe, TemplateComponent, KcClassDirective], - selector: "kc-root", - templateUrl: "terms.component.html", + selector: 'kc-root', + templateUrl: 'terms.component.html', changeDetection: ChangeDetectionStrategy.OnPush, providers: [ { @@ -31,7 +31,7 @@ import { MsgStrPipe } from "@keycloakify/angular/login/pipes/msg-str.pipe"; ] }) export class TermsComponent extends ComponentReference { - kcContext = inject>(KC_CONTEXT); + kcContext = inject>(KC_CONTEXT); override doUseDefaultCss = inject(USE_DEFAULT_CSS); override classes = inject>>(CLASSES); displayRequiredFields = input(false); diff --git a/src/login/pages/update-email/update-email.component.ts b/src/login/pages/update-email/update-email.component.ts index 006ca69e..b1cb9f4f 100644 --- a/src/login/pages/update-email/update-email.component.ts +++ b/src/login/pages/update-email/update-email.component.ts @@ -5,20 +5,20 @@ import { inject, input, signal -} from "@angular/core"; +} from '@angular/core'; import { CLASSES, KC_CONTEXT, USE_DEFAULT_CSS -} from "@keycloakify/angular/lib/public-api"; -import { ClassKey } from "keycloakify/login/lib/kcClsx"; -import { KcContext } from "keycloakify/login/KcContext"; -import { ComponentReference } from "@keycloakify/angular/login/classes/component-reference.class"; -import { LogoutOtherSessionsComponent } from "@keycloakify/angular/login/components/logout-other-sessions/logout-other-sessions.component"; -import { UserProfileFormFieldsComponent } from "@keycloakify/angular/login/components/user-profile-form-fields/user-profile-form-fields.component"; -import { TemplateComponent } from "@keycloakify/angular/login/containers/template.component"; -import { KcClassDirective } from "@keycloakify/angular/login/directives"; -import { MsgStrPipe } from "@keycloakify/angular/login/pipes/msg-str.pipe"; +} from '@keycloakify/angular/lib/public-api'; +import { ClassKey } from 'keycloakify/login/lib/kcClsx'; +import { KcContext } from 'keycloakify/login/KcContext'; +import { ComponentReference } from '@keycloakify/angular/login/classes/component-reference.class'; +import { LogoutOtherSessionsComponent } from '@keycloakify/angular/login/components/logout-other-sessions/logout-other-sessions.component'; +import { UserProfileFormFieldsComponent } from '@keycloakify/angular/login/components/user-profile-form-fields/user-profile-form-fields.component'; +import { TemplateComponent } from '@keycloakify/angular/login/containers/template.component'; +import { KcClassDirective } from '@keycloakify/angular/login/directives'; +import { MsgStrPipe } from '@keycloakify/angular/login/pipes/msg-str.pipe'; @Component({ standalone: true, @@ -29,8 +29,8 @@ import { MsgStrPipe } from "@keycloakify/angular/login/pipes/msg-str.pipe"; UserProfileFormFieldsComponent, LogoutOtherSessionsComponent ], - selector: "kc-root", - templateUrl: "update-email.component.html", + selector: 'kc-root', + templateUrl: 'update-email.component.html', changeDetection: ChangeDetectionStrategy.OnPush, providers: [ { @@ -40,13 +40,13 @@ import { MsgStrPipe } from "@keycloakify/angular/login/pipes/msg-str.pipe"; ] }) export class UpdateEmailComponent extends ComponentReference { - kcContext = inject>(KC_CONTEXT); + kcContext = inject>(KC_CONTEXT); override doUseDefaultCss = inject(USE_DEFAULT_CSS); override classes = inject>>(CLASSES); displayRequiredFields = input(true); documentTitle = input(); bodyClassName = input(); displayInfo: boolean = false; - displayMessage: boolean = this.kcContext.messagesPerField.exists("global"); + displayMessage: boolean = this.kcContext.messagesPerField.exists('global'); isFormSubmittable = signal(false); } diff --git a/src/login/pages/webauthn-authenticate/webauthn-authenticate.component.ts b/src/login/pages/webauthn-authenticate/webauthn-authenticate.component.ts index d74ef31c..92051294 100644 --- a/src/login/pages/webauthn-authenticate/webauthn-authenticate.component.ts +++ b/src/login/pages/webauthn-authenticate/webauthn-authenticate.component.ts @@ -4,23 +4,23 @@ import { forwardRef, inject, input -} from "@angular/core"; +} from '@angular/core'; import { CLASSES, KC_CONTEXT, USE_DEFAULT_CSS -} from "@keycloakify/angular/lib/public-api"; -import { Script } from "@keycloakify/angular/lib/models"; -import { ClassKey } from "keycloakify/login/lib/kcClsx"; -import { KcContext } from "keycloakify/login/KcContext"; -import { getKcClsx } from "keycloakify/login/lib/kcClsx"; -import { ComponentReference } from "@keycloakify/angular/login/classes/component-reference.class"; -import { LogoutOtherSessionsComponent } from "@keycloakify/angular/login/components/logout-other-sessions/logout-other-sessions.component"; -import { TemplateComponent } from "@keycloakify/angular/login/containers/template.component"; -import { KcClassDirective } from "@keycloakify/angular/login/directives"; -import { AdvancedMsgStrPipe } from "@keycloakify/angular/login/pipes/advanced-msg-str.pipe"; -import { MsgStrPipe } from "@keycloakify/angular/login/pipes/msg-str.pipe"; -import { LoginResourceInjectorService } from "@keycloakify/angular/login/services"; +} from '@keycloakify/angular/lib/public-api'; +import { Script } from '@keycloakify/angular/lib/models'; +import { ClassKey } from 'keycloakify/login/lib/kcClsx'; +import { KcContext } from 'keycloakify/login/KcContext'; +import { getKcClsx } from 'keycloakify/login/lib/kcClsx'; +import { ComponentReference } from '@keycloakify/angular/login/classes/component-reference.class'; +import { LogoutOtherSessionsComponent } from '@keycloakify/angular/login/components/logout-other-sessions/logout-other-sessions.component'; +import { TemplateComponent } from '@keycloakify/angular/login/containers/template.component'; +import { KcClassDirective } from '@keycloakify/angular/login/directives'; +import { AdvancedMsgStrPipe } from '@keycloakify/angular/login/pipes/advanced-msg-str.pipe'; +import { MsgStrPipe } from '@keycloakify/angular/login/pipes/msg-str.pipe'; +import { LoginResourceInjectorService } from '@keycloakify/angular/login/services'; @Component({ standalone: true, @@ -31,8 +31,8 @@ import { LoginResourceInjectorService } from "@keycloakify/angular/login/service KcClassDirective, LogoutOtherSessionsComponent ], - selector: "kc-root", - templateUrl: "webauthn-authenticate.component.html", + selector: 'kc-root', + templateUrl: 'webauthn-authenticate.component.html', changeDetection: ChangeDetectionStrategy.OnPush, providers: [ MsgStrPipe, @@ -44,7 +44,7 @@ import { LoginResourceInjectorService } from "@keycloakify/angular/login/service }) export class WebauthnAuthenticateComponent extends ComponentReference { kcContext = - inject>(KC_CONTEXT); + inject>(KC_CONTEXT); loginResourceInjectorService = inject(LoginResourceInjectorService); msgStr = inject(MsgStrPipe); override doUseDefaultCss = inject(USE_DEFAULT_CSS); @@ -55,7 +55,7 @@ export class WebauthnAuthenticateComponent extends ComponentReference { displayInfo: boolean = false; displayMessage: boolean = true; - authButtonId = "authenticateWebAuthnButton"; + authButtonId = 'authenticateWebAuthnButton'; constructor() { super(); @@ -69,8 +69,8 @@ export class WebauthnAuthenticateComponent extends ComponentReference { } = this.kcContext; const scripts: Script[] = [ { - type: "module", - id: "WebAuthnAuthenticateScript", + type: 'module', + id: 'WebAuthnAuthenticateScript', textContent: ` import { authenticateByWebAuthn } from "${url.resourcesPath}/js/webauthnAuthenticate.js"; const authButton = document.getElementById('${this.authButtonId}'); @@ -81,7 +81,7 @@ export class WebauthnAuthenticateComponent extends ComponentReference { userVerification : '${userVerification}', rpId : '${rpId}', createTimeout : ${createTimeout}, - errmsg : ${JSON.stringify(this.msgStr.transform("webauthn-unsupported-browser-text"))} + errmsg : ${JSON.stringify(this.msgStr.transform('webauthn-unsupported-browser-text'))} }; authenticateByWebAuthn(input); }); @@ -99,7 +99,7 @@ export class WebauthnAuthenticateComponent extends ComponentReference { // eslint-disable-next-line @typescript-eslint/no-explicit-any const className = kcClsx(iconClass as any); if (className === iconClass) { - return kcClsx("kcWebAuthnDefaultIcon"); + return kcClsx('kcWebAuthnDefaultIcon'); } return className; } diff --git a/src/login/pages/webauthn-error/webauthn-error.component.ts b/src/login/pages/webauthn-error/webauthn-error.component.ts index 5a87e66d..8f2a144c 100644 --- a/src/login/pages/webauthn-error/webauthn-error.component.ts +++ b/src/login/pages/webauthn-error/webauthn-error.component.ts @@ -4,19 +4,19 @@ import { forwardRef, inject, input -} from "@angular/core"; +} from '@angular/core'; import { CLASSES, KC_CONTEXT, USE_DEFAULT_CSS -} from "@keycloakify/angular/lib/public-api"; -import { ClassKey } from "keycloakify/login/lib/kcClsx"; -import { KcContext } from "keycloakify/login/KcContext"; -import { ComponentReference } from "@keycloakify/angular/login/classes/component-reference.class"; -import { LogoutOtherSessionsComponent } from "@keycloakify/angular/login/components/logout-other-sessions/logout-other-sessions.component"; -import { TemplateComponent } from "@keycloakify/angular/login/containers/template.component"; -import { KcClassDirective } from "@keycloakify/angular/login/directives"; -import { MsgStrPipe } from "@keycloakify/angular/login/pipes/msg-str.pipe"; +} from '@keycloakify/angular/lib/public-api'; +import { ClassKey } from 'keycloakify/login/lib/kcClsx'; +import { KcContext } from 'keycloakify/login/KcContext'; +import { ComponentReference } from '@keycloakify/angular/login/classes/component-reference.class'; +import { LogoutOtherSessionsComponent } from '@keycloakify/angular/login/components/logout-other-sessions/logout-other-sessions.component'; +import { TemplateComponent } from '@keycloakify/angular/login/containers/template.component'; +import { KcClassDirective } from '@keycloakify/angular/login/directives'; +import { MsgStrPipe } from '@keycloakify/angular/login/pipes/msg-str.pipe'; @Component({ standalone: true, @@ -26,8 +26,8 @@ import { MsgStrPipe } from "@keycloakify/angular/login/pipes/msg-str.pipe"; KcClassDirective, LogoutOtherSessionsComponent ], - selector: "kc-root", - templateUrl: "webauthn-error.component.html", + selector: 'kc-root', + templateUrl: 'webauthn-error.component.html', changeDetection: ChangeDetectionStrategy.OnPush, providers: [ { @@ -37,7 +37,7 @@ import { MsgStrPipe } from "@keycloakify/angular/login/pipes/msg-str.pipe"; ] }) export class WebauthnErrorComponent extends ComponentReference { - kcContext = inject>(KC_CONTEXT); + kcContext = inject>(KC_CONTEXT); override doUseDefaultCss = inject(USE_DEFAULT_CSS); override classes = inject>>(CLASSES); displayRequiredFields = input(false); @@ -48,10 +48,10 @@ export class WebauthnErrorComponent extends ComponentReference { onClick() { // @ts-expect-error: Trusted Keycloak's code - document.getElementById("isSetRetry").value = "retry"; + document.getElementById('isSetRetry').value = 'retry'; // @ts-expect-error: Trusted Keycloak's code - document.getElementById("executionValue").value = "${execution}"; + document.getElementById('executionValue').value = '${execution}'; // @ts-expect-error: Trusted Keycloak's code - document.getElementById("kc-error-credential-form").submit(); + document.getElementById('kc-error-credential-form').submit(); } } diff --git a/src/login/pages/webauthn-register/webauthn-register.component.ts b/src/login/pages/webauthn-register/webauthn-register.component.ts index d491815a..969ceec9 100644 --- a/src/login/pages/webauthn-register/webauthn-register.component.ts +++ b/src/login/pages/webauthn-register/webauthn-register.component.ts @@ -4,21 +4,21 @@ import { forwardRef, inject, input -} from "@angular/core"; +} from '@angular/core'; import { CLASSES, KC_CONTEXT, USE_DEFAULT_CSS -} from "@keycloakify/angular/lib/public-api"; -import { Script } from "@keycloakify/angular/lib/models"; -import { ClassKey } from "keycloakify/login/lib/kcClsx"; -import { KcContext } from "keycloakify/login/KcContext"; -import { ComponentReference } from "@keycloakify/angular/login/classes/component-reference.class"; -import { LogoutOtherSessionsComponent } from "@keycloakify/angular/login/components/logout-other-sessions/logout-other-sessions.component"; -import { TemplateComponent } from "@keycloakify/angular/login/containers/template.component"; -import { KcClassDirective } from "@keycloakify/angular/login/directives"; -import { MsgStrPipe } from "@keycloakify/angular/login/pipes/msg-str.pipe"; -import { LoginResourceInjectorService } from "@keycloakify/angular/login/services"; +} from '@keycloakify/angular/lib/public-api'; +import { Script } from '@keycloakify/angular/lib/models'; +import { ClassKey } from 'keycloakify/login/lib/kcClsx'; +import { KcContext } from 'keycloakify/login/KcContext'; +import { ComponentReference } from '@keycloakify/angular/login/classes/component-reference.class'; +import { LogoutOtherSessionsComponent } from '@keycloakify/angular/login/components/logout-other-sessions/logout-other-sessions.component'; +import { TemplateComponent } from '@keycloakify/angular/login/containers/template.component'; +import { KcClassDirective } from '@keycloakify/angular/login/directives'; +import { MsgStrPipe } from '@keycloakify/angular/login/pipes/msg-str.pipe'; +import { LoginResourceInjectorService } from '@keycloakify/angular/login/services'; @Component({ standalone: true, @@ -28,8 +28,8 @@ import { LoginResourceInjectorService } from "@keycloakify/angular/login/service KcClassDirective, LogoutOtherSessionsComponent ], - selector: "kc-root", - templateUrl: "webauthn-register.component.html", + selector: 'kc-root', + templateUrl: 'webauthn-register.component.html', changeDetection: ChangeDetectionStrategy.OnPush, providers: [ MsgStrPipe, @@ -41,7 +41,7 @@ import { LoginResourceInjectorService } from "@keycloakify/angular/login/service }) export class WebauthnRegisterComponent extends ComponentReference { kcContext = - inject>(KC_CONTEXT); + inject>(KC_CONTEXT); loginResourceInjectorService = inject(LoginResourceInjectorService); msgStr = inject(MsgStrPipe); override doUseDefaultCss = inject(USE_DEFAULT_CSS); @@ -52,7 +52,7 @@ export class WebauthnRegisterComponent extends ComponentReference { displayInfo: boolean = false; displayMessage: boolean = true; - authButtonId = "authenticateWebAuthnButton"; + authButtonId = 'authenticateWebAuthnButton'; constructor() { super(); @@ -73,8 +73,8 @@ export class WebauthnRegisterComponent extends ComponentReference { } = this.kcContext; const scripts: Script[] = [ { - type: "module", - id: "WebAuthnRegisterScript", + type: 'module', + id: 'WebAuthnRegisterScript', textContent: ` import { registerByWebAuthn } from "${url.resourcesPath}/js/webauthnRegister.js"; const registerButton = document.getElementById('${this.authButtonId}'); @@ -92,9 +92,9 @@ export class WebauthnRegisterComponent extends ComponentReference { userVerificationRequirement : ${JSON.stringify(userVerificationRequirement)}, createTimeout : ${createTimeout}, excludeCredentialIds : ${JSON.stringify(excludeCredentialIds)}, - initLabel : ${JSON.stringify(this.msgStr.transform("webauthn-registration-init-label"))}, - initLabelPrompt : ${JSON.stringify(this.msgStr.transform("webauthn-registration-init-label-prompt"))}, - errmsg : ${JSON.stringify(this.msgStr.transform("webauthn-unsupported-browser-text"))} + initLabel : ${JSON.stringify(this.msgStr.transform('webauthn-registration-init-label'))}, + initLabelPrompt : ${JSON.stringify(this.msgStr.transform('webauthn-registration-init-label-prompt'))}, + errmsg : ${JSON.stringify(this.msgStr.transform('webauthn-unsupported-browser-text'))} }; registerByWebAuthn(input); }); diff --git a/src/login/pipes/advanced-msg-str.pipe.ts b/src/login/pipes/advanced-msg-str.pipe.ts index 65d00c59..1b902f11 100644 --- a/src/login/pipes/advanced-msg-str.pipe.ts +++ b/src/login/pipes/advanced-msg-str.pipe.ts @@ -1,8 +1,8 @@ -import { inject, Pipe, PipeTransform } from "@angular/core"; -import { I18N } from "@keycloakify/angular/lib/public-api"; -import { I18n } from "../i18n"; +import { inject, Pipe, PipeTransform } from '@angular/core'; +import { I18N } from '@keycloakify/angular/lib/public-api'; +import { I18n } from '../i18n'; @Pipe({ - name: "advancedMsgStr", + name: 'advancedMsgStr', standalone: true }) export class AdvancedMsgStrPipe implements PipeTransform { diff --git a/src/login/pipes/index.ts b/src/login/pipes/index.ts index b6fa0a64..e5a9aa7f 100644 --- a/src/login/pipes/index.ts +++ b/src/login/pipes/index.ts @@ -1,6 +1,6 @@ -export * from "./advanced-msg-str.pipe"; -export * from "./input-type.pipe"; -export * from "./kc-sanitize.pipe"; -export * from "./msg-str.pipe"; -export * from "./to-array.pipe"; -export * from "./to-number.pipe"; +export * from './advanced-msg-str.pipe'; +export * from './input-type.pipe'; +export * from './kc-sanitize.pipe'; +export * from './msg-str.pipe'; +export * from './to-array.pipe'; +export * from './to-number.pipe'; diff --git a/src/login/pipes/input-type.pipe.ts b/src/login/pipes/input-type.pipe.ts index 2faea6bc..bf03b311 100644 --- a/src/login/pipes/input-type.pipe.ts +++ b/src/login/pipes/input-type.pipe.ts @@ -1,15 +1,15 @@ -import { Pipe, PipeTransform } from "@angular/core"; +import { Pipe, PipeTransform } from '@angular/core'; @Pipe({ - name: "inputType", + name: 'inputType', standalone: true }) export class InputTypePipe implements PipeTransform { transform(inputType?: string): string { - if (inputType?.startsWith("html5-")) { + if (inputType?.startsWith('html5-')) { return inputType.slice(6); } - return inputType ?? "text"; + return inputType ?? 'text'; } } diff --git a/src/login/pipes/kc-sanitize.pipe.ts b/src/login/pipes/kc-sanitize.pipe.ts index ea3bec53..5abf6529 100644 --- a/src/login/pipes/kc-sanitize.pipe.ts +++ b/src/login/pipes/kc-sanitize.pipe.ts @@ -1,4 +1,4 @@ -import { Pipe, PipeTransform } from "@angular/core"; +import { Pipe, PipeTransform } from '@angular/core'; import { DomSanitizer, SafeHtml, @@ -6,9 +6,9 @@ import { SafeScript, SafeStyle, SafeUrl -} from "@angular/platform-browser"; +} from '@angular/platform-browser'; -@Pipe({ name: "kcSanitize", standalone: true }) +@Pipe({ name: 'kcSanitize', standalone: true }) export class KcSanitizePipe implements PipeTransform { constructor(private sanitizer: DomSanitizer) {} // TODO: Fix typing @@ -19,15 +19,15 @@ export class KcSanitizePipe implements PipeTransform { type: string ): SafeHtml | SafeStyle | SafeScript | SafeUrl | SafeResourceUrl { switch (type) { - case "html": + case 'html': return this.sanitizer.bypassSecurityTrustHtml(value); - case "style": + case 'style': return this.sanitizer.bypassSecurityTrustStyle(value); - case "script": + case 'script': return this.sanitizer.bypassSecurityTrustScript(value); - case "url": + case 'url': return this.sanitizer.bypassSecurityTrustUrl(value); - case "resourceUrl": + case 'resourceUrl': return this.sanitizer.bypassSecurityTrustResourceUrl(value); default: throw new Error(`Invalid safe type specified: ${type}`); diff --git a/src/login/pipes/msg-str.pipe.ts b/src/login/pipes/msg-str.pipe.ts index 0397b291..58a544f5 100644 --- a/src/login/pipes/msg-str.pipe.ts +++ b/src/login/pipes/msg-str.pipe.ts @@ -1,9 +1,9 @@ -import { inject, Pipe, PipeTransform } from "@angular/core"; -import { I18N } from "@keycloakify/angular/lib/public-api"; -import { I18n } from "../i18n"; -import { MessageKey } from "keycloakify/login/i18n/messages_defaultSet/types"; +import { inject, Pipe, PipeTransform } from '@angular/core'; +import { I18N } from '@keycloakify/angular/lib/public-api'; +import { I18n } from '../i18n'; +import { MessageKey } from 'keycloakify/login/i18n/messages_defaultSet/types'; @Pipe({ - name: "msgStr", + name: 'msgStr', standalone: true }) export class MsgStrPipe implements PipeTransform { diff --git a/src/login/pipes/to-array.pipe.ts b/src/login/pipes/to-array.pipe.ts index 99f9b8ca..9c43a34c 100644 --- a/src/login/pipes/to-array.pipe.ts +++ b/src/login/pipes/to-array.pipe.ts @@ -1,7 +1,7 @@ -import { Pipe, PipeTransform } from "@angular/core"; +import { Pipe, PipeTransform } from '@angular/core'; @Pipe({ - name: "toArray", + name: 'toArray', standalone: true }) export class ToArrayPipe implements PipeTransform { diff --git a/src/login/pipes/to-number.pipe.ts b/src/login/pipes/to-number.pipe.ts index 66f9a4c9..8d018e29 100644 --- a/src/login/pipes/to-number.pipe.ts +++ b/src/login/pipes/to-number.pipe.ts @@ -1,13 +1,13 @@ -import { Pipe, PipeTransform } from "@angular/core"; +import { Pipe, PipeTransform } from '@angular/core'; @Pipe({ - name: "toNumber", + name: 'toNumber', standalone: true }) export class ToNumberPipe implements PipeTransform { transform(value: string | number): number { const number = parseInt(`${value}`); - if (isNaN(number)) throw new Error("number is NaN"); + if (isNaN(number)) throw new Error('number is NaN'); return number; } } diff --git a/src/login/services/index.ts b/src/login/services/index.ts index 9c5c8132..0f434f6c 100644 --- a/src/login/services/index.ts +++ b/src/login/services/index.ts @@ -1,2 +1,2 @@ -export * from "./login-resource-injector.service"; -export * from "./user-profile-form.service"; +export * from './login-resource-injector.service'; +export * from './user-profile-form.service'; diff --git a/src/login/services/login-resource-injector.service.ts b/src/login/services/login-resource-injector.service.ts index 6a8600dc..7fbaf96f 100644 --- a/src/login/services/login-resource-injector.service.ts +++ b/src/login/services/login-resource-injector.service.ts @@ -1,11 +1,11 @@ -import { inject, Injectable } from "@angular/core"; -import { KC_CONTEXT } from "@keycloakify/angular/lib/public-api"; -import { ResourceInjectorService, Script } from "@keycloakify/angular/lib/public-api"; -import { KcContext } from "keycloakify/login/KcContext"; -import { catchError, forkJoin, of, switchMap } from "rxjs"; +import { inject, Injectable } from '@angular/core'; +import { KC_CONTEXT } from '@keycloakify/angular/lib/public-api'; +import { ResourceInjectorService, Script } from '@keycloakify/angular/lib/public-api'; +import { KcContext } from 'keycloakify/login/KcContext'; +import { catchError, forkJoin, of, switchMap } from 'rxjs'; @Injectable({ - providedIn: "root" + providedIn: 'root' }) export class LoginResourceInjectorService { private kcContext: KcContext = inject(KC_CONTEXT); @@ -34,7 +34,7 @@ export class LoginResourceInjectorService { return of(true); }), catchError(error => { - console.error("Error loading styles:", error); + console.error('Error loading styles:', error); return of(false); }) ); @@ -47,18 +47,18 @@ export class LoginResourceInjectorService { private injectScripts() { const scripts: Script[] = [ { - type: "module", + type: 'module', id: `${this.kcContext.url.resourcesPath}/js/menu-button-links.js`, src: `${this.kcContext.url.resourcesPath}/js/menu-button-links.js` }, ...this.kcContext.scripts.map(script => ({ - type: "text/javascript", + type: 'text/javascript', src: script, id: script })), { - type: "module", - id: "authenticationSession", + type: 'module', + id: 'authenticationSession', textContent: ` import { checkCookiesAndSetTimer } from "${this.kcContext.url.resourcesPath}/js/authChecker.js"; diff --git a/src/login/services/user-profile-form.service.ts b/src/login/services/user-profile-form.service.ts index 7ae6eaf5..498ca38a 100644 --- a/src/login/services/user-profile-form.service.ts +++ b/src/login/services/user-profile-form.service.ts @@ -8,32 +8,32 @@ import { signal, Signal, WritableSignal -} from "@angular/core"; -import { DomSanitizer, SafeHtml } from "@angular/platform-browser"; +} from '@angular/core'; +import { DomSanitizer, SafeHtml } from '@angular/platform-browser'; import { DO_MAKE_USER_CONFIRM_PASSWORD, I18N, KC_CONTEXT -} from "@keycloakify/angular/lib/public-api"; +} from '@keycloakify/angular/lib/public-api'; import { Attribute, KcContext, PasswordPolicies, Validators -} from "keycloakify/login/KcContext"; +} from 'keycloakify/login/KcContext'; import type { KcContextLike as KcContextLike_i18n, MessageKey_defaultSet -} from "keycloakify/login/i18n/noJsx"; -import type { I18n } from "../i18n"; -import { emailRegexp } from "keycloakify/tools/emailRegExp"; -import { formatNumber } from "keycloakify/tools/formatNumber"; -import { structuredCloneButFunctions } from "keycloakify/tools/structuredCloneButFunctions"; -import { assert, id } from "tsafe"; -import { LoginResourceInjectorService } from "./login-resource-injector.service"; +} from 'keycloakify/login/i18n/noJsx'; +import type { I18n } from '../i18n'; +import { emailRegexp } from 'keycloakify/tools/emailRegExp'; +import { formatNumber } from 'keycloakify/tools/formatNumber'; +import { structuredCloneButFunctions } from 'keycloakify/tools/structuredCloneButFunctions'; +import { assert, id } from 'tsafe'; +import { LoginResourceInjectorService } from './login-resource-injector.service'; type KcContextLike_useGetErrors = KcContextLike_i18n & { - messagesPerField: Pick; + messagesPerField: Pick; passwordPolicies?: PasswordPolicies; }; export namespace FormFieldError { @@ -45,20 +45,20 @@ export namespace FormFieldError { export namespace Source { export type Validator = { - type: "validator"; + type: 'validator'; name: keyof Validators; }; export type PasswordPolicy = { - type: "passwordPolicy"; + type: 'passwordPolicy'; name: keyof PasswordPolicies; }; export type Server = { - type: "server"; + type: 'server'; }; export type Other = { - type: "other"; - rule: "passwordConfirmMatchesPassword" | "requiredField"; + type: 'other'; + rule: 'passwordConfirmMatchesPassword' | 'requiredField'; }; } } @@ -104,22 +104,22 @@ type FormState = { }; export type FormAction = | { - action: "update"; + action: 'update'; name: string; valueOrValues: string | string[]; /** Default false */ displayErrorsImmediately?: boolean; } | { - action: "focus lost"; + action: 'focus lost'; name: string; fieldIndex: number | undefined; }; -@Injectable({ providedIn: "root" }) +@Injectable({ providedIn: 'root' }) export class UserProfileFormService { private kcContext: KcContextLike = - inject>(KC_CONTEXT); + inject>(KC_CONTEXT); private i18n = inject(I18N); private doMakeUserConfirmPassword = inject(DO_MAKE_USER_CONFIRM_PASSWORD); private loginResourceInjectorService = inject(LoginResourceInjectorService); @@ -128,22 +128,22 @@ export class UserProfileFormService { const attributes: Attribute[] = (() => { mock_user_profile_attributes_for_older_keycloak_versions: { if ( - "profile" in this.kcContext && - "attributesByName" in this.kcContext.profile && + 'profile' in this.kcContext && + 'attributesByName' in this.kcContext.profile && Object.keys(this.kcContext.profile.attributesByName).length !== 0 ) { break mock_user_profile_attributes_for_older_keycloak_versions; } if ( - "register" in this.kcContext && + 'register' in this.kcContext && this.kcContext.register instanceof Object && - "formData" in this.kcContext.register + 'formData' in this.kcContext.register ) { //NOTE: Handle legacy register.ftl page - return (["firstName", "lastName", "email", "username"] as const) + return (['firstName', 'lastName', 'email', 'username'] as const) .filter(name => - name !== "username" + name !== 'username' ? true : !this.kcContext.realm.registrationEmailAsUsername ) @@ -155,17 +155,17 @@ export class UserProfileFormService { ), required: true, value: - (this.kcContext as any).register.formData[name] ?? "", + (this.kcContext as any).register.formData[name] ?? '', html5DataAnnotations: {}, readOnly: false, validators: {}, annotations: {}, autocomplete: (() => { switch (name) { - case "email": - return "email"; - case "username": - return "username"; + case 'email': + return 'email'; + case 'username': + return 'username'; default: return undefined; } @@ -174,11 +174,11 @@ export class UserProfileFormService { ); } - if ("user" in this.kcContext && this.kcContext.user instanceof Object) { + if ('user' in this.kcContext && this.kcContext.user instanceof Object) { //NOTE: Handle legacy login-update-profile.ftl - return (["username", "email", "firstName", "lastName"] as const) + return (['username', 'email', 'firstName', 'lastName'] as const) .filter(name => - name !== "username" + name !== 'username' ? true : (this.kcContext as any).user.editUsernameAllowed ) @@ -189,17 +189,17 @@ export class UserProfileFormService { `\${${name}}` ), required: true, - value: (this.kcContext as any).user[name] ?? "", + value: (this.kcContext as any).user[name] ?? '', html5DataAnnotations: {}, readOnly: false, validators: {}, annotations: {}, autocomplete: (() => { switch (name) { - case "email": - return "email"; - case "username": - return "username"; + case 'email': + return 'email'; + case 'username': + return 'username'; default: return undefined; } @@ -208,24 +208,24 @@ export class UserProfileFormService { ); } - if ("email" in this.kcContext && this.kcContext.email instanceof Object) { + if ('email' in this.kcContext && this.kcContext.email instanceof Object) { //NOTE: Handle legacy update-email.ftl return [ id({ - name: "email", + name: 'email', displayName: id<`\${${MessageKey_defaultSet}}`>(`\${email}`), required: true, - value: (this.kcContext.email as any).value ?? "", + value: (this.kcContext.email as any).value ?? '', html5DataAnnotations: {}, readOnly: false, validators: {}, annotations: {}, - autocomplete: "email" + autocomplete: 'email' }) ]; } - assert(false, "Unable to mock user profile from the current kcContext"); + assert(false, 'Unable to mock user profile from the current kcContext'); } return Object.values(this.kcContext.profile.attributesByName).map( @@ -235,7 +235,7 @@ export class UserProfileFormService { // Retro-compatibility and consistency patches attributes.forEach(attribute => { patch_legacy_group: { - if (typeof attribute.group !== "string") { + if (typeof attribute.group !== 'string') { break patch_legacy_group; } @@ -259,7 +259,7 @@ export class UserProfileFormService { // @ts-expect-error delete attribute.groupAnnotations; - if (group === "") { + if (group === '') { break patch_legacy_group; } @@ -277,7 +277,7 @@ export class UserProfileFormService { attribute.validators.options !== undefined && attribute.annotations.inputType === undefined ) { - attribute.annotations.inputType = "select"; + attribute.annotations.inputType = 'select'; } // Consistency patch on values/value property @@ -305,8 +305,8 @@ export class UserProfileFormService { if ( attribute.name !== (this.kcContext.realm.registrationEmailAsUsername - ? "email" - : "username") + ? 'email' + : 'username') ) { // NOTE: We want to add password and password-confirm after the field that identifies the user. // It's either email or username. @@ -317,25 +317,25 @@ export class UserProfileFormService { i + 1, 0, { - name: "password", - displayName: id<`\${${MessageKey_defaultSet}}`>("${password}"), + name: 'password', + displayName: id<`\${${MessageKey_defaultSet}}`>('${password}'), required: true, readOnly: false, validators: {}, annotations: {}, - autocomplete: "new-password", + autocomplete: 'new-password', html5DataAnnotations: {} }, { - name: "password-confirm", + name: 'password-confirm', displayName: - id<`\${${MessageKey_defaultSet}}`>("${passwordConfirm}"), + id<`\${${MessageKey_defaultSet}}`>('${passwordConfirm}'), required: true, readOnly: false, validators: {}, annotations: {}, html5DataAnnotations: {}, - autocomplete: "new-password" + autocomplete: 'new-password' } ); }); @@ -351,7 +351,7 @@ export class UserProfileFormService { break handle_multi_valued_attribute; } - const values = attribute.values?.length ? attribute.values : [""]; + const values = attribute.values?.length ? attribute.values : ['']; apply_validator_min_range: { if (this.getIsMultivaluedSingleField({ attribute })) { @@ -373,7 +373,7 @@ export class UserProfileFormService { const min = parseInt(`${minStr}`); for (let index = values.length; index < min; index++) { - values.push(""); + values.push(''); } } @@ -387,7 +387,7 @@ export class UserProfileFormService { initialFormFieldState.push({ attribute, - valueOrValues: attribute.value ?? "" + valueOrValues: attribute.value ?? '' }); } @@ -425,7 +425,7 @@ export class UserProfileFormService { }) => ({ displayableErrors: errors.filter(error => { const hasLostFocusAtLeastOnce = - typeof hasLostFocusAtLeastOnceOrArr === "boolean" + typeof hasLostFocusAtLeastOnceOrArr === 'boolean' ? hasLostFocusAtLeastOnceOrArr : error.fieldIndex !== undefined ? hasLostFocusAtLeastOnceOrArr[error.fieldIndex] @@ -434,64 +434,64 @@ export class UserProfileFormService { ]; let value = false; switch (error.source.type) { - case "server": + case 'server': value = true; break; - case "other": + case 'other': switch (error.source.rule) { - case "requiredField": + case 'requiredField': value = hasLostFocusAtLeastOnce; break; - case "passwordConfirmMatchesPassword": + case 'passwordConfirmMatchesPassword': value = hasLostFocusAtLeastOnce; break; } // assert>(false); break; - case "passwordPolicy": + case 'passwordPolicy': switch (error.source.name) { - case "length": + case 'length': value = hasLostFocusAtLeastOnce; break; - case "digits": + case 'digits': value = hasLostFocusAtLeastOnce; break; - case "lowerCase": + case 'lowerCase': value = hasLostFocusAtLeastOnce; break; - case "upperCase": + case 'upperCase': value = hasLostFocusAtLeastOnce; break; - case "specialChars": + case 'specialChars': value = hasLostFocusAtLeastOnce; break; - case "notUsername": + case 'notUsername': value = true; break; - case "notEmail": + case 'notEmail': value = true; break; } // assert>(false); break; - case "validator": + case 'validator': switch (error.source.name) { - case "length": + case 'length': value = hasLostFocusAtLeastOnce; break; - case "pattern": + case 'pattern': value = hasLostFocusAtLeastOnce; break; - case "email": + case 'email': value = hasLostFocusAtLeastOnce; break; - case "integer": + case 'integer': value = hasLostFocusAtLeastOnce; break; - case "multivalued": + case 'multivalued': value = hasLostFocusAtLeastOnce; break; - case "options": + case 'options': value = hasLostFocusAtLeastOnce; break; } @@ -513,9 +513,9 @@ export class UserProfileFormService { constructor() { this.loginResourceInjectorService.insertAdditionalScripts( Object.keys(this.kcContext.profile?.html5DataAnnotations ?? {}) - .filter(key => key !== "kcMultivalued" && key !== "kcNumberFormat") // NOTE: Keycloakify handles it. + .filter(key => key !== 'kcMultivalued' && key !== 'kcNumberFormat') // NOTE: Keycloakify handles it. .map(key => ({ - type: "module", + type: 'module', src: `${this.kcContext.url.resourcesPath}/js/${key}.js`, id: `${this.kcContext.url.resourcesPath}/js/${key}.js` })) @@ -530,7 +530,7 @@ export class UserProfileFormService { ); assert(formFieldState !== undefined); switch (formAction.action) { - case "update": + case 'update': formFieldState.valueOrValues = formAction.valueOrValues; apply_formatters: { @@ -570,7 +570,7 @@ export class UserProfileFormService { ? formAction.valueOrValues.map((...[, index]) => index) : [undefined]) { this.dispatchFormAction({ - action: "focus lost", + action: 'focus lost', name: formAction.name, fieldIndex }); @@ -582,13 +582,13 @@ export class UserProfileFormService { break update_password_confirm; } - if (formAction.name !== "password") { + if (formAction.name !== 'password') { break update_password_confirm; } this.dispatchFormAction({ - action: "update", - name: "password-confirm", + action: 'update', + name: 'password-confirm', valueOrValues: formAction.valueOrValues, displayErrorsImmediately: formAction.displayErrorsImmediately }); @@ -599,16 +599,16 @@ export class UserProfileFormService { break trigger_password_confirm_validation_on_password_change; } - if (formAction.name !== "password") { + if (formAction.name !== 'password') { break trigger_password_confirm_validation_on_password_change; } this.dispatchFormAction({ - action: "update", - name: "password-confirm", + action: 'update', + name: 'password-confirm', valueOrValues: (() => { const formFieldState = state.formFieldStates.find( - ({ attribute }) => attribute.name === "password-confirm" + ({ attribute }) => attribute.name === 'password-confirm' ); assert(formFieldState !== undefined); @@ -620,7 +620,7 @@ export class UserProfileFormService { } break; - case "focus lost": + case 'focus lost': if (formFieldState.hasLostFocusAtLeastOnce instanceof Array) { const { fieldIndex } = formAction; assert(fieldIndex !== undefined); @@ -643,7 +643,7 @@ export class UserProfileFormService { private getIsMultivaluedSingleField(params: { attribute: Attribute }) { const { attribute } = params; - return attribute.annotations.inputType?.startsWith("multiselect") ?? false; + return attribute.annotations.inputType?.startsWith('multiselect') ?? false; } private getErrors(params: { @@ -692,7 +692,7 @@ export class UserProfileFormService { server_side_error: { if (attribute.multivalued) { - const defaultValues = attribute.values?.length ? attribute.values : [""]; + const defaultValues = attribute.values?.length ? attribute.values : ['']; assert(valueOrValues instanceof Array); @@ -705,9 +705,9 @@ export class UserProfileFormService { break server_side_error; } } else { - const defaultValue = attribute.value ?? ""; + const defaultValue = attribute.value ?? ''; - assert(typeof valueOrValues === "string"); + assert(typeof valueOrValues === 'string'); const value = valueOrValues; @@ -738,7 +738,7 @@ export class UserProfileFormService { ), fieldIndex: undefined, source: { - type: "server" + type: 'server' } } ]; @@ -784,8 +784,8 @@ export class UserProfileFormService { return specificValueErrors .filter(error => { if ( - error.source.type === "other" && - error.source.rule === "requiredField" + error.source.type === 'other' && + error.source.rule === 'requiredField' ) { return false; } @@ -806,11 +806,11 @@ export class UserProfileFormService { break required_field; } - if (values.every(value => value !== "")) { + if (values.every(value => value !== '')) { break required_field; } - const msgArgs = ["error-user-attribute-required"] as const; + const msgArgs = ['error-user-attribute-required'] as const; errors.push({ errorMessage: this.sanitizer.bypassSecurityTrustHtml( @@ -819,8 +819,8 @@ export class UserProfileFormService { errorMessageStr: msgStr(...msgArgs), fieldIndex: undefined, source: { - type: "other", - rule: "requiredField" + type: 'other', + rule: 'requiredField' } }); } @@ -837,7 +837,7 @@ export class UserProfileFormService { break handle_multi_valued_single_field; } - const validatorName = "multivalued"; + const validatorName = 'multivalued'; const validator = attribute.validators[validatorName]; @@ -866,7 +866,7 @@ export class UserProfileFormService { } const msgArgs = [ - "error-invalid-multivalued-size", + 'error-invalid-multivalued-size', `${min}`, `${max}` ] as const; @@ -879,21 +879,21 @@ export class UserProfileFormService { errorMessageStr: msgStr(...msgArgs), fieldIndex: undefined, source: { - type: "validator", + type: 'validator', name: validatorName } } ]; } - assert(typeof valueOrValues === "string"); + assert(typeof valueOrValues === 'string'); const value = valueOrValues; const errors: FormFieldError[] = []; check_password_policies: { - if (attributeName !== "password") { + if (attributeName !== 'password') { break check_password_policies; } @@ -902,7 +902,7 @@ export class UserProfileFormService { } check_password_policy_x: { - const policyName = "length"; + const policyName = 'length'; const policy = passwordPolicies[policyName]; @@ -917,7 +917,7 @@ export class UserProfileFormService { } const msgArgs = [ - "invalidPasswordMinLengthMessage", + 'invalidPasswordMinLengthMessage', `${minLength}` ] as const; @@ -928,14 +928,14 @@ export class UserProfileFormService { errorMessageStr: msgStr(...msgArgs), fieldIndex: undefined, source: { - type: "passwordPolicy", + type: 'passwordPolicy', name: policyName } }); } check_password_policy_x: { - const policyName = "digits"; + const policyName = 'digits'; const policy = passwordPolicies[policyName]; @@ -946,14 +946,14 @@ export class UserProfileFormService { const minNumberOfDigits = policy; if ( - value.split("").filter(char => !isNaN(parseInt(char))).length >= + value.split('').filter(char => !isNaN(parseInt(char))).length >= minNumberOfDigits ) { break check_password_policy_x; } const msgArgs = [ - "invalidPasswordMinDigitsMessage", + 'invalidPasswordMinDigitsMessage', `${minNumberOfDigits}` ] as const; @@ -964,14 +964,14 @@ export class UserProfileFormService { errorMessageStr: msgStr(...msgArgs), fieldIndex: undefined, source: { - type: "passwordPolicy", + type: 'passwordPolicy', name: policyName } }); } check_password_policy_x: { - const policyName = "lowerCase"; + const policyName = 'lowerCase'; const policy = passwordPolicies[policyName]; @@ -983,7 +983,7 @@ export class UserProfileFormService { if ( value - .split("") + .split('') .filter( char => char === char.toLowerCase() && char !== char.toUpperCase() @@ -993,7 +993,7 @@ export class UserProfileFormService { } const msgArgs = [ - "invalidPasswordMinLowerCaseCharsMessage", + 'invalidPasswordMinLowerCaseCharsMessage', `${minNumberOfLowerCaseChar}` ] as const; @@ -1004,14 +1004,14 @@ export class UserProfileFormService { errorMessageStr: msgStr(...msgArgs), fieldIndex: undefined, source: { - type: "passwordPolicy", + type: 'passwordPolicy', name: policyName } }); } check_password_policy_x: { - const policyName = "upperCase"; + const policyName = 'upperCase'; const policy = passwordPolicies[policyName]; @@ -1023,7 +1023,7 @@ export class UserProfileFormService { if ( value - .split("") + .split('') .filter( char => char === char.toUpperCase() && char !== char.toLowerCase() @@ -1033,7 +1033,7 @@ export class UserProfileFormService { } const msgArgs = [ - "invalidPasswordMinUpperCaseCharsMessage", + 'invalidPasswordMinUpperCaseCharsMessage', `${minNumberOfUpperCaseChar}` ] as const; @@ -1044,14 +1044,14 @@ export class UserProfileFormService { errorMessageStr: msgStr(...msgArgs), fieldIndex: undefined, source: { - type: "passwordPolicy", + type: 'passwordPolicy', name: policyName } }); } check_password_policy_x: { - const policyName = "specialChars"; + const policyName = 'specialChars'; const policy = passwordPolicies[policyName]; @@ -1062,14 +1062,14 @@ export class UserProfileFormService { const minNumberOfSpecialChar = policy; if ( - value.split("").filter(char => !char.match(/[a-zA-Z0-9]/)).length >= + value.split('').filter(char => !char.match(/[a-zA-Z0-9]/)).length >= minNumberOfSpecialChar ) { break check_password_policy_x; } const msgArgs = [ - "invalidPasswordMinSpecialCharsMessage", + 'invalidPasswordMinSpecialCharsMessage', `${minNumberOfSpecialChar}` ] as const; @@ -1080,14 +1080,14 @@ export class UserProfileFormService { errorMessageStr: msgStr(...msgArgs), fieldIndex: undefined, source: { - type: "passwordPolicy", + type: 'passwordPolicy', name: policyName } }); } check_password_policy_x: { - const policyName = "notUsername"; + const policyName = 'notUsername'; const notUsername = passwordPolicies[policyName]; @@ -1096,7 +1096,7 @@ export class UserProfileFormService { } const usernameFormFieldState = formFieldStates.find( - formFieldState => formFieldState.attribute.name === "username" + formFieldState => formFieldState.attribute.name === 'username' ); if (!usernameFormFieldState) { @@ -1106,7 +1106,7 @@ export class UserProfileFormService { const usernameValue = (() => { let { valueOrValues } = usernameFormFieldState; - assert(typeof valueOrValues === "string"); + assert(typeof valueOrValues === 'string'); unFormat_number: { const { kcNumberUnFormat } = attribute.html5DataAnnotations ?? {}; @@ -1121,7 +1121,7 @@ export class UserProfileFormService { return valueOrValues; })(); - if (usernameValue === "") { + if (usernameValue === '') { break check_password_policy_x; } @@ -1129,7 +1129,7 @@ export class UserProfileFormService { break check_password_policy_x; } - const msgArgs = ["invalidPasswordNotUsernameMessage"] as const; + const msgArgs = ['invalidPasswordNotUsernameMessage'] as const; errors.push({ errorMessage: this.sanitizer.bypassSecurityTrustHtml( @@ -1138,14 +1138,14 @@ export class UserProfileFormService { errorMessageStr: msgStr(...msgArgs), fieldIndex: undefined, source: { - type: "passwordPolicy", + type: 'passwordPolicy', name: policyName } }); } check_password_policy_x: { - const policyName = "notEmail"; + const policyName = 'notEmail'; const notEmail = passwordPolicies[policyName]; @@ -1154,19 +1154,19 @@ export class UserProfileFormService { } const emailFormFieldState = formFieldStates.find( - formFieldState => formFieldState.attribute.name === "email" + formFieldState => formFieldState.attribute.name === 'email' ); if (!emailFormFieldState) { break check_password_policy_x; } - assert(typeof emailFormFieldState.valueOrValues === "string"); + assert(typeof emailFormFieldState.valueOrValues === 'string'); { const emailValue = emailFormFieldState.valueOrValues; - if (emailValue === "") { + if (emailValue === '') { break check_password_policy_x; } @@ -1175,7 +1175,7 @@ export class UserProfileFormService { } } - const msgArgs = ["invalidPasswordNotEmailMessage"] as const; + const msgArgs = ['invalidPasswordNotEmailMessage'] as const; errors.push({ errorMessage: this.sanitizer.bypassSecurityTrustHtml( @@ -1184,7 +1184,7 @@ export class UserProfileFormService { errorMessageStr: msgStr(...msgArgs), fieldIndex: undefined, source: { - type: "passwordPolicy", + type: 'passwordPolicy', name: policyName } }); @@ -1192,17 +1192,17 @@ export class UserProfileFormService { } password_confirm_matches_password: { - if (attributeName !== "password-confirm") { + if (attributeName !== 'password-confirm') { break password_confirm_matches_password; } const passwordFormFieldState = formFieldStates.find( - formFieldState => formFieldState.attribute.name === "password" + formFieldState => formFieldState.attribute.name === 'password' ); assert(passwordFormFieldState !== undefined); - assert(typeof passwordFormFieldState.valueOrValues === "string"); + assert(typeof passwordFormFieldState.valueOrValues === 'string'); { const passwordValue = passwordFormFieldState.valueOrValues; @@ -1212,7 +1212,7 @@ export class UserProfileFormService { } } - const msgArgs = ["invalidPasswordConfirmMessage"] as const; + const msgArgs = ['invalidPasswordConfirmMessage'] as const; errors.push({ errorMessage: this.sanitizer.bypassSecurityTrustHtml( @@ -1221,8 +1221,8 @@ export class UserProfileFormService { errorMessageStr: msgStr(...msgArgs), fieldIndex: undefined, source: { - type: "other", - rule: "passwordConfirmMatchesPassword" + type: 'other', + rule: 'passwordConfirmMatchesPassword' } }); } @@ -1234,11 +1234,11 @@ export class UserProfileFormService { break required_field; } - if (value !== "") { + if (value !== '') { break required_field; } - const msgArgs = ["error-user-attribute-required"] as const; + const msgArgs = ['error-user-attribute-required'] as const; errors.push({ errorMessage: this.sanitizer.bypassSecurityTrustHtml( @@ -1247,14 +1247,14 @@ export class UserProfileFormService { errorMessageStr: msgStr(...msgArgs), fieldIndex: undefined, source: { - type: "other", - rule: "requiredField" + type: 'other', + rule: 'requiredField' } }); } validator_x: { - const validatorName = "length"; + const validatorName = 'length'; const validator = validators[validatorName]; @@ -1263,22 +1263,22 @@ export class UserProfileFormService { } const { - "ignore.empty.value": ignoreEmptyValue = false, + 'ignore.empty.value': ignoreEmptyValue = false, max, min } = validator; - if (ignoreEmptyValue && value === "") { + if (ignoreEmptyValue && value === '') { break validator_x; } const source: FormFieldError.Source = { - type: "validator", + type: 'validator', name: validatorName }; if (max && value.length > parseInt(`${max}`)) { - const msgArgs = ["error-invalid-length-too-long", `${max}`] as const; + const msgArgs = ['error-invalid-length-too-long', `${max}`] as const; errors.push({ errorMessage: this.sanitizer.bypassSecurityTrustHtml( @@ -1291,7 +1291,7 @@ export class UserProfileFormService { } if (min && value.length < parseInt(`${min}`)) { - const msgArgs = ["error-invalid-length-too-short", `${min}`] as const; + const msgArgs = ['error-invalid-length-too-short', `${min}`] as const; errors.push({ errorMessage: this.sanitizer.bypassSecurityTrustHtml( @@ -1305,7 +1305,7 @@ export class UserProfileFormService { } validator_x: { - const validatorName = "pattern"; + const validatorName = 'pattern'; const validator = validators[validatorName]; @@ -1314,12 +1314,12 @@ export class UserProfileFormService { } const { - "ignore.empty.value": ignoreEmptyValue = false, + 'ignore.empty.value': ignoreEmptyValue = false, pattern, - "error-message": errorMessageKey + 'error-message': errorMessageKey } = validator; - if (ignoreEmptyValue && value === "") { + if (ignoreEmptyValue && value === '') { break validator_x; } @@ -1328,7 +1328,7 @@ export class UserProfileFormService { } const msgArgs = [ - errorMessageKey ?? id("shouldMatchPattern"), + errorMessageKey ?? id('shouldMatchPattern'), pattern ] as const; @@ -1339,7 +1339,7 @@ export class UserProfileFormService { errorMessageStr: advancedMsgStr(...msgArgs), fieldIndex: undefined, source: { - type: "validator", + type: 'validator', name: validatorName } }); @@ -1350,14 +1350,14 @@ export class UserProfileFormService { const lastError = errors[errors.length - 1]; if ( lastError !== undefined && - lastError.source.type === "validator" && - lastError.source.name === "pattern" + lastError.source.type === 'validator' && + lastError.source.name === 'pattern' ) { break validator_x; } } - const validatorName = "email"; + const validatorName = 'email'; const validator = validators[validatorName]; @@ -1365,9 +1365,9 @@ export class UserProfileFormService { break validator_x; } - const { "ignore.empty.value": ignoreEmptyValue = false } = validator; + const { 'ignore.empty.value': ignoreEmptyValue = false } = validator; - if (ignoreEmptyValue && value === "") { + if (ignoreEmptyValue && value === '') { break validator_x; } @@ -1375,7 +1375,7 @@ export class UserProfileFormService { break validator_x; } - const msgArgs = [id("invalidEmailMessage")] as const; + const msgArgs = [id('invalidEmailMessage')] as const; errors.push({ errorMessage: this.sanitizer.bypassSecurityTrustHtml( @@ -1384,14 +1384,14 @@ export class UserProfileFormService { errorMessageStr: msgStr(...msgArgs), fieldIndex: undefined, source: { - type: "validator", + type: 'validator', name: validatorName } }); } validator_x: { - const validatorName = "integer"; + const validatorName = 'integer'; const validator = validators[validatorName]; @@ -1400,24 +1400,24 @@ export class UserProfileFormService { } const { - "ignore.empty.value": ignoreEmptyValue = false, + 'ignore.empty.value': ignoreEmptyValue = false, max, min } = validator; - if (ignoreEmptyValue && value === "") { + if (ignoreEmptyValue && value === '') { break validator_x; } const intValue = parseInt(value); const source: FormFieldError.Source = { - type: "validator", + type: 'validator', name: validatorName }; if (isNaN(intValue)) { - const msgArgs = ["mustBeAnInteger"] as const; + const msgArgs = ['mustBeAnInteger'] as const; errors.push({ errorMessage: this.sanitizer.bypassSecurityTrustHtml( @@ -1432,7 +1432,7 @@ export class UserProfileFormService { } if (max && intValue > parseInt(`${max}`)) { - const msgArgs = ["error-number-out-of-range-too-big", `${max}`] as const; + const msgArgs = ['error-number-out-of-range-too-big', `${max}`] as const; errors.push({ errorMessage: this.sanitizer.bypassSecurityTrustHtml( @@ -1448,7 +1448,7 @@ export class UserProfileFormService { if (min && intValue < parseInt(`${min}`)) { const msgArgs = [ - "error-number-out-of-range-too-small", + 'error-number-out-of-range-too-small', `${min}` ] as const; @@ -1466,7 +1466,7 @@ export class UserProfileFormService { } validator_x: { - const validatorName = "options"; + const validatorName = 'options'; const validator = validators[validatorName]; @@ -1474,7 +1474,7 @@ export class UserProfileFormService { break validator_x; } - if (value === "") { + if (value === '') { break validator_x; } @@ -1482,7 +1482,7 @@ export class UserProfileFormService { break validator_x; } - const msgArgs = [id("notAValidOption")] as const; + const msgArgs = [id('notAValidOption')] as const; errors.push({ errorMessage: this.sanitizer.bypassSecurityTrustHtml( @@ -1491,7 +1491,7 @@ export class UserProfileFormService { errorMessageStr: msgStr(...msgArgs), fieldIndex: undefined, source: { - type: "validator", + type: 'validator', name: validatorName } }); diff --git a/stories/login/pages/login/login.stories.ts b/stories/login/pages/login/login.stories.ts new file mode 100644 index 00000000..0a5bc88a --- /dev/null +++ b/stories/login/pages/login/login.stories.ts @@ -0,0 +1,146 @@ +import type { Meta, StoryObj } from '@storybook/angular'; +import { KcPageStoryComponent } from '../kc-page-story.component'; // Assuming this is the Angular component + +export const KcActionsData = {}; + +const meta: Meta = { + title: 'login/login.ftl', + component: KcPageStoryComponent +}; + +export default meta; + +type Story = StoryObj; + +export const Default: Story = { + args: { + // No specific args, default rendering of the component + } +}; + +export const WithInvalidCredential: Story = { + args: { + kcContext: { + login: { + username: 'johndoe' + }, + messagesPerField: { + existsError: (fieldName: string, ...otherFieldNames: string[]) => { + const fieldNames = [fieldName, ...otherFieldNames]; + return ( + fieldNames.includes('username') || fieldNames.includes('password') + ); + }, + get: (fieldName: string) => { + if (fieldName === 'username' || fieldName === 'password') { + return 'Invalid username or password.'; + } + return ''; + } + } + } + } +}; + +export const WithoutRegistration: Story = { + args: { + kcContext: { + realm: { registrationAllowed: false } + } + } +}; + +export const WithoutRememberMe: Story = { + args: { + kcContext: { + realm: { rememberMe: false } + } + } +}; + +export const WithoutPasswordReset: Story = { + args: { + kcContext: { + realm: { resetPasswordAllowed: false } + } + } +}; + +export const WithEmailAsUsername: Story = { + args: { + kcContext: { + realm: { loginWithEmailAllowed: false } + } + } +}; + +export const WithPresetUsername: Story = { + args: { + kcContext: { + login: { username: 'max.mustermann@mail.com' } + } + } +}; + +export const WithImmutablePresetUsername: Story = { + args: { + kcContext: { + auth: { + attemptedUsername: 'max.mustermann@mail.com', + showUsername: true + }, + usernameHidden: true, + message: { + type: 'info', + summary: 'Please re-authenticate to continue' + } + } + } +}; + +export const WithSocialProviders: Story = { + args: { + kcContext: { + social: { + displayInfo: true, + providers: [ + { + loginUrl: 'google', + alias: 'google', + providerId: 'google', + displayName: 'Google', + iconClasses: 'fa fa-google' + }, + { + loginUrl: 'microsoft', + alias: 'microsoft', + providerId: 'microsoft', + displayName: 'Microsoft', + iconClasses: 'fa fa-windows' + } + // Add other providers as needed + ] + } + } + } +}; + +export const WithoutPasswordField: Story = { + args: { + kcContext: { + realm: { password: false } + } + } +}; + +export const WithErrorMessage: Story = { + args: { + kcContext: { + message: { + summary: + 'The time allotted for the connection has elapsed.
The login process will restart from the beginning.', + type: 'error' + } + } + } +}; From 7a08c6b10983bb99e53d31da6d85325db645357a Mon Sep 17 00:00:00 2001 From: Joseph Garrone Date: Mon, 30 Sep 2024 05:46:24 +0200 Subject: [PATCH 12/64] A few aditional tweak --- scripts/build/main.ts | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/scripts/build/main.ts b/scripts/build/main.ts index 6863b9e4..76ed3037 100644 --- a/scripts/build/main.ts +++ b/scripts/build/main.ts @@ -73,6 +73,10 @@ import { crawl } from '../tools/crawl'; return undefined; } + if (fileRelativePath === 'public-api.mjs') { + return undefined; + } + return { modifiedSourceCode: sourceCode }; } }); @@ -93,6 +97,14 @@ import { crawl } from '../tools/crawl'; return undefined; } + if (fileRelativePath === 'index.d.ts') { + return undefined; + } + + if (fileRelativePath === 'public-api.d.ts') { + return undefined; + } + return { modifiedSourceCode: sourceCode }; } }); @@ -116,7 +128,7 @@ import { crawl } from '../tools/crawl'; srcDirPath: pathJoin(getThisCodebaseRootDirPath(), 'stories'), destDirPath: pathJoin(getThisCodebaseRootDirPath(), 'dist', 'stories'), transformSourceCode: ({ fileRelativePath, sourceCode }) => { - if (!fileRelativePath.endsWith('.stories.tsx')) { + if (!fileRelativePath.endsWith('.stories.ts')) { return undefined; } From 6efaa01aa3181b84d6ff528da08a4153cbed283f Mon Sep 17 00:00:00 2001 From: Joseph Garrone Date: Mon, 30 Sep 2024 05:46:42 +0200 Subject: [PATCH 13/64] Release candidate --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 16774c30..bddb3ece 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@keycloakify/angular", - "version": "0.0.1-rc.0", + "version": "0.0.1-rc.1", "description": "Angular components for Keycloakify", "repository": { "type": "git", From 7d4c235bb286ce24d03289e3cf00f4f54ebedac3 Mon Sep 17 00:00:00 2001 From: Joseph Garrone Date: Mon, 30 Sep 2024 05:48:39 +0200 Subject: [PATCH 14/64] Do not remove the dist every time --- scripts/build/main.ts | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/scripts/build/main.ts b/scripts/build/main.ts index 76ed3037..c0b2f3d9 100644 --- a/scripts/build/main.ts +++ b/scripts/build/main.ts @@ -13,14 +13,14 @@ import { crawl } from '../tools/crawl'; const distDirPath = pathJoin(getThisCodebaseRootDirPath(), 'dist'); - if (fs.existsSync(distDirPath)) { - fs.rmSync(distDirPath, { recursive: true, force: true }); - } - // tsc + angular JIT { const angularWorkspaceDirPath = pathJoin(distDirPath, 'workspace'); + if (fs.existsSync(distDirPath)) { + fs.rmSync(distDirPath, { recursive: true, force: true }); + } + transformCodebase({ srcDirPath: pathJoin(__dirname, 'workspace'), destDirPath: angularWorkspaceDirPath From 73b4b28345aacd349bad7eed0af096f2fd5454d8 Mon Sep 17 00:00:00 2001 From: Joseph Garrone Date: Mon, 30 Sep 2024 05:53:42 +0200 Subject: [PATCH 15/64] Add hello-world component --- scripts/link-in-starter.ts | 4 ++-- .../components/hello-world/hello-world.component.css | 0 .../components/hello-world/hello-world.component.html | 1 + .../components/hello-world/hello-world.component.ts | 10 ++++++++++ 4 files changed, 13 insertions(+), 2 deletions(-) create mode 100644 src/login/components/hello-world/hello-world.component.css create mode 100644 src/login/components/hello-world/hello-world.component.html create mode 100644 src/login/components/hello-world/hello-world.component.ts diff --git a/scripts/link-in-starter.ts b/scripts/link-in-starter.ts index 89ff4b2f..757b80f6 100644 --- a/scripts/link-in-starter.ts +++ b/scripts/link-in-starter.ts @@ -1,7 +1,7 @@ import * as fs from 'fs'; import { join } from 'path'; import { startRebuildOnSrcChange } from './shared/startRebuildOnSrcChange'; -import { crawl } from '../src/bin/tools/crawl'; +import { crawl } from './tools/crawl'; import { run } from './shared/run'; { @@ -35,7 +35,7 @@ fs.rmSync('.yarn_home', { recursive: true, force: true }); run('yarn install'); run('yarn build'); -const starterName = 'keycloakify-starter'; +const starterName = 'keycloakify-angular-starter'; fs.rmSync(join('..', starterName, 'node_modules'), { recursive: true, diff --git a/src/login/components/hello-world/hello-world.component.css b/src/login/components/hello-world/hello-world.component.css new file mode 100644 index 00000000..e69de29b diff --git a/src/login/components/hello-world/hello-world.component.html b/src/login/components/hello-world/hello-world.component.html new file mode 100644 index 00000000..589144d4 --- /dev/null +++ b/src/login/components/hello-world/hello-world.component.html @@ -0,0 +1 @@ +

hello-world works!

diff --git a/src/login/components/hello-world/hello-world.component.ts b/src/login/components/hello-world/hello-world.component.ts new file mode 100644 index 00000000..312d8a07 --- /dev/null +++ b/src/login/components/hello-world/hello-world.component.ts @@ -0,0 +1,10 @@ +import { Component } from '@angular/core'; + +@Component({ + selector: 'kc-hello-world', + standalone: true, + imports: [], + templateUrl: './hello-world.component.html', + styleUrl: './hello-world.component.css' +}) +export class HelloWorldComponent {} From f46b238261d7b686cc6a588c88592251031f5a44 Mon Sep 17 00:00:00 2001 From: Joseph Garrone Date: Mon, 30 Sep 2024 05:53:57 +0200 Subject: [PATCH 16/64] Release candidate --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index bddb3ece..0b143cf0 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@keycloakify/angular", - "version": "0.0.1-rc.1", + "version": "0.0.1-rc.2", "description": "Angular components for Keycloakify", "repository": { "type": "git", From e61f7d6dcc27508a51700a5ef7734333092b9ed9 Mon Sep 17 00:00:00 2001 From: Joseph Garrone Date: Mon, 30 Sep 2024 05:59:30 +0200 Subject: [PATCH 17/64] Other attempt --- scripts/build/main.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/scripts/build/main.ts b/scripts/build/main.ts index c0b2f3d9..7ed71cbe 100644 --- a/scripts/build/main.ts +++ b/scripts/build/main.ts @@ -7,7 +7,7 @@ import { getThisCodebaseRootDirPath } from '../tools/getThisCodebaseRootDirPath' import { crawl } from '../tools/crawl'; (async () => { - console.log(chalk.cyan('Building Keycloakify...')); + console.log(chalk.cyan('Building @keycloakify/angular...')); const startTime = Date.now(); @@ -57,7 +57,7 @@ import { crawl } from '../tools/crawl'; ); } - run(`yarn build`, { cwd: angularWorkspaceDirPath }); + run(`npm run build`, { cwd: angularWorkspaceDirPath }); const angularDistDirPath = pathJoin( angularWorkspaceDirPath, From 90e1a1b73aab357136fce646a96dcbf6299f4487 Mon Sep 17 00:00:00 2001 From: Joseph Garrone Date: Mon, 30 Sep 2024 06:01:19 +0200 Subject: [PATCH 18/64] Test on mac --- .github/workflows/ci.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml index 81fb9b81..1ee936a7 100644 --- a/.github/workflows/ci.yaml +++ b/.github/workflows/ci.yaml @@ -18,7 +18,7 @@ jobs: - name: If this step fails run 'npm run format' then commit again. run: npm run _format --list-different test: - runs-on: ubuntu-latest + runs-on: macos-latest needs: test_format steps: - uses: actions/checkout@v4 From 46477122cce62df3d5d862bca1e835218cb3fe74 Mon Sep 17 00:00:00 2001 From: Joseph Garrone Date: Mon, 30 Sep 2024 06:05:03 +0200 Subject: [PATCH 19/64] Attempt to fix strange recursion --- .github/workflows/ci.yaml | 2 +- scripts/build/main.ts | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml index 1ee936a7..81fb9b81 100644 --- a/.github/workflows/ci.yaml +++ b/.github/workflows/ci.yaml @@ -18,7 +18,7 @@ jobs: - name: If this step fails run 'npm run format' then commit again. run: npm run _format --list-different test: - runs-on: macos-latest + runs-on: ubuntu-latest needs: test_format steps: - uses: actions/checkout@v4 diff --git a/scripts/build/main.ts b/scripts/build/main.ts index 7ed71cbe..0d9e75f8 100644 --- a/scripts/build/main.ts +++ b/scripts/build/main.ts @@ -57,7 +57,7 @@ import { crawl } from '../tools/crawl'; ); } - run(`npm run build`, { cwd: angularWorkspaceDirPath }); + run(`npx ng build`, { cwd: angularWorkspaceDirPath }); const angularDistDirPath = pathJoin( angularWorkspaceDirPath, From 6e4ed7853063d090ed561f3fcb9e3d7b5c5452d4 Mon Sep 17 00:00:00 2001 From: Joseph Garrone Date: Mon, 30 Sep 2024 06:10:05 +0200 Subject: [PATCH 20/64] Add debug --- scripts/build/main.ts | 28 ++++++++++++++++++++++++++++ 1 file changed, 28 insertions(+) diff --git a/scripts/build/main.ts b/scripts/build/main.ts index 0d9e75f8..c22bc2ff 100644 --- a/scripts/build/main.ts +++ b/scripts/build/main.ts @@ -17,15 +17,21 @@ import { crawl } from '../tools/crawl'; { const angularWorkspaceDirPath = pathJoin(distDirPath, 'workspace'); + console.log('a'); + if (fs.existsSync(distDirPath)) { fs.rmSync(distDirPath, { recursive: true, force: true }); } + console.log('b'); + transformCodebase({ srcDirPath: pathJoin(__dirname, 'workspace'), destDirPath: angularWorkspaceDirPath }); + console.log('c'); + const srcDirPath_workspace = pathJoin( angularWorkspaceDirPath, 'projects', @@ -33,11 +39,15 @@ import { crawl } from '../tools/crawl'; 'src' ); + console.log('e'); + transformCodebase({ srcDirPath: pathJoin(getThisCodebaseRootDirPath(), 'src'), destDirPath: srcDirPath_workspace }); + console.log('f'); + { const typescriptFilesRelativeFilePaths = crawl({ dirPath: pathJoin(getThisCodebaseRootDirPath(), 'src'), @@ -57,14 +67,20 @@ import { crawl } from '../tools/crawl'; ); } + console.log('g'); + run(`npx ng build`, { cwd: angularWorkspaceDirPath }); + console.log('h'); + const angularDistDirPath = pathJoin( angularWorkspaceDirPath, 'dist', 'keycloakify-angular' ); + console.log('i'); + transformCodebase({ srcDirPath: pathJoin(angularDistDirPath, 'esm2022'), destDirPath: distDirPath, @@ -81,6 +97,8 @@ import { crawl } from '../tools/crawl'; } }); + console.log('j'); + transformCodebase({ srcDirPath: angularDistDirPath, destDirPath: distDirPath, @@ -109,11 +127,17 @@ import { crawl } from '../tools/crawl'; } }); + console.log('k'); + fs.rmSync(angularWorkspaceDirPath, { recursive: true, force: true }); } + console.log('l'); + run(`npx tsc-alias -p ${pathJoin('src', 'tsconfig.json')}`); + console.log('m'); + { const dirBasename = 'src'; @@ -124,6 +148,8 @@ import { crawl } from '../tools/crawl'; fs.cpSync(dirBasename, destDirPath, { recursive: true }); } + console.log('n'); + transformCodebase({ srcDirPath: pathJoin(getThisCodebaseRootDirPath(), 'stories'), destDirPath: pathJoin(getThisCodebaseRootDirPath(), 'dist', 'stories'), @@ -136,6 +162,8 @@ import { crawl } from '../tools/crawl'; } }); + console.log('o'); + console.log( chalk.green(`✓ built in ${((Date.now() - startTime) / 1000).toFixed(2)}s`) ); From 08127249319c769f1f194ba077b299e173145730 Mon Sep 17 00:00:00 2001 From: Joseph Garrone Date: Mon, 30 Sep 2024 06:11:29 +0200 Subject: [PATCH 21/64] Add debug log --- scripts/build/main.ts | 2 ++ 1 file changed, 2 insertions(+) diff --git a/scripts/build/main.ts b/scripts/build/main.ts index c22bc2ff..2f69496d 100644 --- a/scripts/build/main.ts +++ b/scripts/build/main.ts @@ -9,6 +9,8 @@ import { crawl } from '../tools/crawl'; (async () => { console.log(chalk.cyan('Building @keycloakify/angular...')); + console.log('0'); + const startTime = Date.now(); const distDirPath = pathJoin(getThisCodebaseRootDirPath(), 'dist'); From 38cea1386b1ffec5d6b352cf61c27480d88efc98 Mon Sep 17 00:00:00 2001 From: Joseph Garrone Date: Mon, 30 Sep 2024 06:16:38 +0200 Subject: [PATCH 22/64] use yarn install explicitely --- .github/workflows/ci.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml index 81fb9b81..18bb812a 100644 --- a/.github/workflows/ci.yaml +++ b/.github/workflows/ci.yaml @@ -23,7 +23,7 @@ jobs: steps: - uses: actions/checkout@v4 - uses: actions/setup-node@v4 - - uses: bahmutov/npm-install@v1 + - run: yarn - run: npm run build #- run: npm run test From 90f93b2aeb0d07e9920820a3afbb2909c55a27b1 Mon Sep 17 00:00:00 2001 From: Joseph Garrone Date: Mon, 30 Sep 2024 06:22:22 +0200 Subject: [PATCH 23/64] new test --- .github/workflows/ci.yaml | 20 ++++++++++---------- scripts/build/main.ts | 9 ++++++++- 2 files changed, 18 insertions(+), 11 deletions(-) diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml index 18bb812a..b8f382a1 100644 --- a/.github/workflows/ci.yaml +++ b/.github/workflows/ci.yaml @@ -9,21 +9,21 @@ on: jobs: - test_format: - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v4 - - uses: actions/setup-node@v4 - - uses: bahmutov/npm-install@v1 - - name: If this step fails run 'npm run format' then commit again. - run: npm run _format --list-different + #test_format: + # runs-on: ubuntu-latest + # steps: + # - uses: actions/checkout@v4 + # - uses: actions/setup-node@v4 + # - uses: bahmutov/npm-install@v1 + # - name: If this step fails run 'npm run format' then commit again. + # run: npm run _format --list-different test: runs-on: ubuntu-latest - needs: test_format + #needs: test_format steps: - uses: actions/checkout@v4 - uses: actions/setup-node@v4 - - run: yarn + - uses: bahmutov/npm-install@v1 - run: npm run build #- run: npm run test diff --git a/scripts/build/main.ts b/scripts/build/main.ts index 2f69496d..d95d8ab6 100644 --- a/scripts/build/main.ts +++ b/scripts/build/main.ts @@ -69,7 +69,14 @@ import { crawl } from '../tools/crawl'; ); } - console.log('g'); + console.log('g', JSON.stringify(process.env, null, 4)); + + transformCodebase({ + srcDirPath: pathJoin(getThisCodebaseRootDirPath(), 'node_modules'), + destDirPath: pathJoin(angularWorkspaceDirPath, 'node_modules') + }); + + console.log('g2'); run(`npx ng build`, { cwd: angularWorkspaceDirPath }); From 73803431052e0d251cbf0f25afd6bf7f9a11b18a Mon Sep 17 00:00:00 2001 From: Joseph Garrone Date: Mon, 30 Sep 2024 06:27:00 +0200 Subject: [PATCH 24/64] Fix ci build (hopefully) --- .github/workflows/ci.yaml | 19 +- package.json | 1 + scripts/build/main.ts | 37 -- yarn.lock | 718 +++++++++++++++++++++++++++++++++++++- 4 files changed, 712 insertions(+), 63 deletions(-) diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml index b8f382a1..fd9495d0 100644 --- a/.github/workflows/ci.yaml +++ b/.github/workflows/ci.yaml @@ -9,17 +9,18 @@ on: jobs: - #test_format: - # runs-on: ubuntu-latest - # steps: - # - uses: actions/checkout@v4 - # - uses: actions/setup-node@v4 - # - uses: bahmutov/npm-install@v1 - # - name: If this step fails run 'npm run format' then commit again. - # run: npm run _format --list-different + test_format: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + - uses: actions/setup-node@v4 + - uses: bahmutov/npm-install@v1 + - name: If this step fails run 'npm run format' then commit again. + run: npm run _format --list-different + test: runs-on: ubuntu-latest - #needs: test_format + needs: test_format steps: - uses: actions/checkout@v4 - uses: actions/setup-node@v4 diff --git a/package.json b/package.json index 0b143cf0..e5e9d1c1 100644 --- a/package.json +++ b/package.json @@ -60,6 +60,7 @@ "zone.js": "^0.14.0", "chalk": "^5.3.0", "@angular-devkit/build-angular": "^18.2.6", + "@angular/cli": "^18.2.6", "@angular/compiler-cli": "^18.2.6", "@angular/compiler": "^18.2.6", "ng-packagr": "^18.2.1", diff --git a/scripts/build/main.ts b/scripts/build/main.ts index d95d8ab6..0d9e75f8 100644 --- a/scripts/build/main.ts +++ b/scripts/build/main.ts @@ -9,8 +9,6 @@ import { crawl } from '../tools/crawl'; (async () => { console.log(chalk.cyan('Building @keycloakify/angular...')); - console.log('0'); - const startTime = Date.now(); const distDirPath = pathJoin(getThisCodebaseRootDirPath(), 'dist'); @@ -19,21 +17,15 @@ import { crawl } from '../tools/crawl'; { const angularWorkspaceDirPath = pathJoin(distDirPath, 'workspace'); - console.log('a'); - if (fs.existsSync(distDirPath)) { fs.rmSync(distDirPath, { recursive: true, force: true }); } - console.log('b'); - transformCodebase({ srcDirPath: pathJoin(__dirname, 'workspace'), destDirPath: angularWorkspaceDirPath }); - console.log('c'); - const srcDirPath_workspace = pathJoin( angularWorkspaceDirPath, 'projects', @@ -41,15 +33,11 @@ import { crawl } from '../tools/crawl'; 'src' ); - console.log('e'); - transformCodebase({ srcDirPath: pathJoin(getThisCodebaseRootDirPath(), 'src'), destDirPath: srcDirPath_workspace }); - console.log('f'); - { const typescriptFilesRelativeFilePaths = crawl({ dirPath: pathJoin(getThisCodebaseRootDirPath(), 'src'), @@ -69,27 +57,14 @@ import { crawl } from '../tools/crawl'; ); } - console.log('g', JSON.stringify(process.env, null, 4)); - - transformCodebase({ - srcDirPath: pathJoin(getThisCodebaseRootDirPath(), 'node_modules'), - destDirPath: pathJoin(angularWorkspaceDirPath, 'node_modules') - }); - - console.log('g2'); - run(`npx ng build`, { cwd: angularWorkspaceDirPath }); - console.log('h'); - const angularDistDirPath = pathJoin( angularWorkspaceDirPath, 'dist', 'keycloakify-angular' ); - console.log('i'); - transformCodebase({ srcDirPath: pathJoin(angularDistDirPath, 'esm2022'), destDirPath: distDirPath, @@ -106,8 +81,6 @@ import { crawl } from '../tools/crawl'; } }); - console.log('j'); - transformCodebase({ srcDirPath: angularDistDirPath, destDirPath: distDirPath, @@ -136,17 +109,11 @@ import { crawl } from '../tools/crawl'; } }); - console.log('k'); - fs.rmSync(angularWorkspaceDirPath, { recursive: true, force: true }); } - console.log('l'); - run(`npx tsc-alias -p ${pathJoin('src', 'tsconfig.json')}`); - console.log('m'); - { const dirBasename = 'src'; @@ -157,8 +124,6 @@ import { crawl } from '../tools/crawl'; fs.cpSync(dirBasename, destDirPath, { recursive: true }); } - console.log('n'); - transformCodebase({ srcDirPath: pathJoin(getThisCodebaseRootDirPath(), 'stories'), destDirPath: pathJoin(getThisCodebaseRootDirPath(), 'dist', 'stories'), @@ -171,8 +136,6 @@ import { crawl } from '../tools/crawl'; } }); - console.log('o'); - console.log( chalk.green(`✓ built in ${((Date.now() - startTime) / 1000).toFixed(2)}s`) ); diff --git a/yarn.lock b/yarn.lock index 57bad9ed..162fa0e0 100644 --- a/yarn.lock +++ b/yarn.lock @@ -108,6 +108,17 @@ rxjs "7.8.1" source-map "0.7.4" +"@angular-devkit/schematics@18.2.6": + version "18.2.6" + resolved "https://registry.yarnpkg.com/@angular-devkit/schematics/-/schematics-18.2.6.tgz#8d1b539067ef4f84e4a643c4a5b4ea4f51c179db" + integrity sha512-uIttrQ2cQ2PWAFFVPeCoNR8xvs7tPJ2i8gzqsIwYdge107xDC6u9CqfgmBqPDSFpWj+IiC2Jwcm8Z4HYKU4+7A== + dependencies: + "@angular-devkit/core" "18.2.6" + jsonc-parser "3.3.1" + magic-string "0.30.11" + ora "5.4.1" + rxjs "7.8.1" + "@angular/build@18.2.6": version "18.2.6" resolved "https://registry.yarnpkg.com/@angular/build/-/build-18.2.6.tgz#e0fa6da2b43bcf73ab9d9362e762a3c2aaac9f19" @@ -139,6 +150,29 @@ vite "5.4.6" watchpack "2.4.1" +"@angular/cli@^18.2.6": + version "18.2.6" + resolved "https://registry.yarnpkg.com/@angular/cli/-/cli-18.2.6.tgz#bd170e42e813168101cae99a12495c59ee235c74" + integrity sha512-tdXsnV/w+Rgu8q0zFsLU5L9ImTVqrTol1vppHaQkJ/vuoHy+s8ZEbBqhVrO/ffosNb2xseUybGYvqMS4zkNQjg== + dependencies: + "@angular-devkit/architect" "0.1802.6" + "@angular-devkit/core" "18.2.6" + "@angular-devkit/schematics" "18.2.6" + "@inquirer/prompts" "5.3.8" + "@listr2/prompt-adapter-inquirer" "2.0.15" + "@schematics/angular" "18.2.6" + "@yarnpkg/lockfile" "1.1.0" + ini "4.1.3" + jsonc-parser "3.3.1" + listr2 "8.2.4" + npm-package-arg "11.0.3" + npm-pick-manifest "9.1.0" + pacote "18.0.6" + resolve "1.22.8" + semver "7.6.3" + symbol-observable "4.0.0" + yargs "17.7.2" + "@angular/common@^18.2.6": version "18.2.6" resolved "https://registry.yarnpkg.com/@angular/common/-/common-18.2.6.tgz#f5b57bf0e9b66a5b25526877d193227a53cad539" @@ -1523,6 +1557,17 @@ resolved "https://registry.yarnpkg.com/@esbuild/win32-x64/-/win32-x64-0.23.1.tgz#81fd50d11e2c32b2d6241470e3185b70c7b30699" integrity sha512-BHpFFeslkWrXWyUPnbKm+xYYVYruCinGcftSBaa8zoF9hZO4BcSCFUvHVTtzpIY6YzUnYtuEhZ+C9iEXjxnasg== +"@inquirer/checkbox@^2.4.7": + version "2.5.0" + resolved "https://registry.yarnpkg.com/@inquirer/checkbox/-/checkbox-2.5.0.tgz#41c5c9dd332c0a8fa159be23982ce080d0b199d4" + integrity sha512-sMgdETOfi2dUHT8r7TT1BTKOwNvdDGFDXYWtQ2J69SvlYNntk9I/gJe7r5yvMwwsuKnYbuRs3pNhx4tgNck5aA== + dependencies: + "@inquirer/core" "^9.1.0" + "@inquirer/figures" "^1.0.5" + "@inquirer/type" "^1.5.3" + ansi-escapes "^4.3.2" + yoctocolors-cjs "^2.1.2" + "@inquirer/confirm@3.1.22": version "3.1.22" resolved "https://registry.yarnpkg.com/@inquirer/confirm/-/confirm-3.1.22.tgz#23990624c11f60c6f7a5b0558c7505c35076a037" @@ -1531,7 +1576,15 @@ "@inquirer/core" "^9.0.10" "@inquirer/type" "^1.5.2" -"@inquirer/core@^9.0.10": +"@inquirer/confirm@^3.1.22": + version "3.2.0" + resolved "https://registry.yarnpkg.com/@inquirer/confirm/-/confirm-3.2.0.tgz#6af1284670ea7c7d95e3f1253684cfbd7228ad6a" + integrity sha512-oOIwPs0Dvq5220Z8lGL/6LHRTEr9TgLHmiI99Rj1PJ1p1czTys+olrgBqZk4E2qC0YTzeHprxSQmoHioVdJ7Lw== + dependencies: + "@inquirer/core" "^9.1.0" + "@inquirer/type" "^1.5.3" + +"@inquirer/core@^9.0.10", "@inquirer/core@^9.1.0": version "9.2.1" resolved "https://registry.yarnpkg.com/@inquirer/core/-/core-9.2.1.tgz#677c49dee399c9063f31e0c93f0f37bddc67add1" integrity sha512-F2VBt7W/mwqEU4bL0RnHNZmC/OxzNx9cOYxHqnXX3MP6ruYvZUZAW9imgN9+h/uBT/oP8Gh888J2OZSbjSeWcg== @@ -1549,12 +1602,101 @@ wrap-ansi "^6.2.0" yoctocolors-cjs "^2.1.2" -"@inquirer/figures@^1.0.6": +"@inquirer/editor@^2.1.22": + version "2.2.0" + resolved "https://registry.yarnpkg.com/@inquirer/editor/-/editor-2.2.0.tgz#a41eb7b151bd9a6bc3c0b69219d02d82547bc387" + integrity sha512-9KHOpJ+dIL5SZli8lJ6xdaYLPPzB8xB9GZItg39MBybzhxA16vxmszmQFrRwbOA918WA2rvu8xhDEg/p6LXKbw== + dependencies: + "@inquirer/core" "^9.1.0" + "@inquirer/type" "^1.5.3" + external-editor "^3.1.0" + +"@inquirer/expand@^2.1.22": + version "2.3.0" + resolved "https://registry.yarnpkg.com/@inquirer/expand/-/expand-2.3.0.tgz#afc44aee303315a85563e9d0275e658f0ee0e701" + integrity sha512-qnJsUcOGCSG1e5DTOErmv2BPQqrtT6uzqn1vI/aYGiPKq+FgslGZmtdnXbhuI7IlT7OByDoEEqdnhUnVR2hhLw== + dependencies: + "@inquirer/core" "^9.1.0" + "@inquirer/type" "^1.5.3" + yoctocolors-cjs "^2.1.2" + +"@inquirer/figures@^1.0.5", "@inquirer/figures@^1.0.6": version "1.0.6" resolved "https://registry.yarnpkg.com/@inquirer/figures/-/figures-1.0.6.tgz#1a562f916da39888c56b65b78259d2261bd7d40b" integrity sha512-yfZzps3Cso2UbM7WlxKwZQh2Hs6plrbjs1QnzQDZhK2DgyCo6D8AaHps9olkNcUFlcYERMqU3uJSp1gmy3s/qQ== -"@inquirer/type@^1.5.2": +"@inquirer/input@^2.2.9": + version "2.3.0" + resolved "https://registry.yarnpkg.com/@inquirer/input/-/input-2.3.0.tgz#9b99022f53780fecc842908f3f319b52a5a16865" + integrity sha512-XfnpCStx2xgh1LIRqPXrTNEEByqQWoxsWYzNRSEUxJ5c6EQlhMogJ3vHKu8aXuTacebtaZzMAHwEL0kAflKOBw== + dependencies: + "@inquirer/core" "^9.1.0" + "@inquirer/type" "^1.5.3" + +"@inquirer/number@^1.0.10": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@inquirer/number/-/number-1.1.0.tgz#4dac004021ea67c89552a261564f103a494cac96" + integrity sha512-ilUnia/GZUtfSZy3YEErXLJ2Sljo/mf9fiKc08n18DdwdmDbOzRcTv65H1jjDvlsAuvdFXf4Sa/aL7iw/NanVA== + dependencies: + "@inquirer/core" "^9.1.0" + "@inquirer/type" "^1.5.3" + +"@inquirer/password@^2.1.22": + version "2.2.0" + resolved "https://registry.yarnpkg.com/@inquirer/password/-/password-2.2.0.tgz#0b6f26336c259c8a9e5f5a3f2e1a761564f764ba" + integrity sha512-5otqIpgsPYIshqhgtEwSspBQE40etouR8VIxzpJkv9i0dVHIpyhiivbkH9/dGiMLdyamT54YRdGJLfl8TFnLHg== + dependencies: + "@inquirer/core" "^9.1.0" + "@inquirer/type" "^1.5.3" + ansi-escapes "^4.3.2" + +"@inquirer/prompts@5.3.8": + version "5.3.8" + resolved "https://registry.yarnpkg.com/@inquirer/prompts/-/prompts-5.3.8.tgz#f394050d95076c2f1b046be324f06f619b257c3e" + integrity sha512-b2BudQY/Si4Y2a0PdZZL6BeJtl8llgeZa7U2j47aaJSCeAl1e4UI7y8a9bSkO3o/ZbZrgT5muy/34JbsjfIWxA== + dependencies: + "@inquirer/checkbox" "^2.4.7" + "@inquirer/confirm" "^3.1.22" + "@inquirer/editor" "^2.1.22" + "@inquirer/expand" "^2.1.22" + "@inquirer/input" "^2.2.9" + "@inquirer/number" "^1.0.10" + "@inquirer/password" "^2.1.22" + "@inquirer/rawlist" "^2.2.4" + "@inquirer/search" "^1.0.7" + "@inquirer/select" "^2.4.7" + +"@inquirer/rawlist@^2.2.4": + version "2.3.0" + resolved "https://registry.yarnpkg.com/@inquirer/rawlist/-/rawlist-2.3.0.tgz#6b2c0da39c1cd855af5608b2d627681cdac7277d" + integrity sha512-zzfNuINhFF7OLAtGHfhwOW2TlYJyli7lOUoJUXw/uyklcwalV6WRXBXtFIicN8rTRK1XTiPWB4UY+YuW8dsnLQ== + dependencies: + "@inquirer/core" "^9.1.0" + "@inquirer/type" "^1.5.3" + yoctocolors-cjs "^2.1.2" + +"@inquirer/search@^1.0.7": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@inquirer/search/-/search-1.1.0.tgz#665928cac2326b9501ddafbb8606ce4823b3106b" + integrity sha512-h+/5LSj51dx7hp5xOn4QFnUaKeARwUCLs6mIhtkJ0JYPBLmEYjdHSYh7I6GrLg9LwpJ3xeX0FZgAG1q0QdCpVQ== + dependencies: + "@inquirer/core" "^9.1.0" + "@inquirer/figures" "^1.0.5" + "@inquirer/type" "^1.5.3" + yoctocolors-cjs "^2.1.2" + +"@inquirer/select@^2.4.7": + version "2.5.0" + resolved "https://registry.yarnpkg.com/@inquirer/select/-/select-2.5.0.tgz#345c6908ecfaeef3d84ddd2f9feb2f487c558efb" + integrity sha512-YmDobTItPP3WcEI86GvPo+T2sRHkxxOq/kXmsBjHS5BVXUgvgZ5AfJjkvQvZr03T81NnI3KrrRuMzeuYUQRFOA== + dependencies: + "@inquirer/core" "^9.1.0" + "@inquirer/figures" "^1.0.5" + "@inquirer/type" "^1.5.3" + ansi-escapes "^4.3.2" + yoctocolors-cjs "^2.1.2" + +"@inquirer/type@^1.5.1", "@inquirer/type@^1.5.2", "@inquirer/type@^1.5.3": version "1.5.5" resolved "https://registry.yarnpkg.com/@inquirer/type/-/type-1.5.5.tgz#303ea04ce7ad2e585b921b662b3be36ef7b4f09b" integrity sha512-MzICLu4yS7V8AA61sANROZ9vT1H3ooca5dSmI1FjZkzq7o/koMsRfQSzRtFo+F3Ao4Sf1C0bpLKejpKB/+j6MA== @@ -1650,6 +1792,13 @@ resolved "https://registry.yarnpkg.com/@leichtgewicht/ip-codec/-/ip-codec-2.0.5.tgz#4fc56c15c580b9adb7dc3c333a134e540b44bfb1" integrity sha512-Vo+PSpZG2/fmgmiNzYK9qWRh8h/CHrwD0mo1h1DzL4yzHNSfWYujGTYsWGreD000gcgmZ7K4Ys6Tx9TxtsKdDw== +"@listr2/prompt-adapter-inquirer@2.0.15": + version "2.0.15" + resolved "https://registry.yarnpkg.com/@listr2/prompt-adapter-inquirer/-/prompt-adapter-inquirer-2.0.15.tgz#45f13178b13327a28a220057a34a886cab18218e" + integrity sha512-MZrGem/Ujjd4cPTLYDfCZK2iKKeiO/8OX13S6jqxldLs0Prf2aGqVlJ77nMBqMv7fzqgXEgjrNHLXcKR8l9lOg== + dependencies: + "@inquirer/type" "^1.5.1" + "@lmdb/lmdb-darwin-arm64@3.0.13": version "3.0.13" resolved "https://registry.yarnpkg.com/@lmdb/lmdb-darwin-arm64/-/lmdb-darwin-arm64-3.0.13.tgz#b09af72bde5a9933abfab34dc5c10e5b6c16d4a5" @@ -1838,6 +1987,17 @@ "@nodelib/fs.scandir" "2.1.5" fastq "^1.6.0" +"@npmcli/agent@^2.0.0": + version "2.2.2" + resolved "https://registry.yarnpkg.com/@npmcli/agent/-/agent-2.2.2.tgz#967604918e62f620a648c7975461c9c9e74fc5d5" + integrity sha512-OrcNPXdpSl9UX7qPVRWbmWMCSXrcDa2M9DvrbOTj7ao1S4PlqVFYv9/yLKMkrJKZ/V5A/kDBC690or307i26Og== + dependencies: + agent-base "^7.1.0" + http-proxy-agent "^7.0.0" + https-proxy-agent "^7.0.1" + lru-cache "^10.0.1" + socks-proxy-agent "^8.0.3" + "@npmcli/fs@^3.1.0": version "3.1.1" resolved "https://registry.yarnpkg.com/@npmcli/fs/-/fs-3.1.1.tgz#59cdaa5adca95d135fc00f2bb53f5771575ce726" @@ -1845,6 +2005,71 @@ dependencies: semver "^7.3.5" +"@npmcli/git@^5.0.0": + version "5.0.8" + resolved "https://registry.yarnpkg.com/@npmcli/git/-/git-5.0.8.tgz#8ba3ff8724192d9ccb2735a2aa5380a992c5d3d1" + integrity sha512-liASfw5cqhjNW9UFd+ruwwdEf/lbOAQjLL2XY2dFW/bkJheXDYZgOyul/4gVvEV4BWkTXjYGmDqMw9uegdbJNQ== + dependencies: + "@npmcli/promise-spawn" "^7.0.0" + ini "^4.1.3" + lru-cache "^10.0.1" + npm-pick-manifest "^9.0.0" + proc-log "^4.0.0" + promise-inflight "^1.0.1" + promise-retry "^2.0.1" + semver "^7.3.5" + which "^4.0.0" + +"@npmcli/installed-package-contents@^2.0.1": + version "2.1.0" + resolved "https://registry.yarnpkg.com/@npmcli/installed-package-contents/-/installed-package-contents-2.1.0.tgz#63048e5f6e40947a3a88dcbcb4fd9b76fdd37c17" + integrity sha512-c8UuGLeZpm69BryRykLuKRyKFZYJsZSCT4aVY5ds4omyZqJ172ApzgfKJ5eV/r3HgLdUYgFVe54KSFVjKoe27w== + dependencies: + npm-bundled "^3.0.0" + npm-normalize-package-bin "^3.0.0" + +"@npmcli/node-gyp@^3.0.0": + version "3.0.0" + resolved "https://registry.yarnpkg.com/@npmcli/node-gyp/-/node-gyp-3.0.0.tgz#101b2d0490ef1aa20ed460e4c0813f0db560545a" + integrity sha512-gp8pRXC2oOxu0DUE1/M3bYtb1b3/DbJ5aM113+XJBgfXdussRAsX0YOrOhdd8WvnAR6auDBvJomGAkLKA5ydxA== + +"@npmcli/package-json@^5.0.0", "@npmcli/package-json@^5.1.0": + version "5.2.1" + resolved "https://registry.yarnpkg.com/@npmcli/package-json/-/package-json-5.2.1.tgz#df69477b1023b81ff8503f2b9db4db4faea567ed" + integrity sha512-f7zYC6kQautXHvNbLEWgD/uGu1+xCn9izgqBfgItWSx22U0ZDekxN08A1vM8cTxj/cRVe0Q94Ode+tdoYmIOOQ== + dependencies: + "@npmcli/git" "^5.0.0" + glob "^10.2.2" + hosted-git-info "^7.0.0" + json-parse-even-better-errors "^3.0.0" + normalize-package-data "^6.0.0" + proc-log "^4.0.0" + semver "^7.5.3" + +"@npmcli/promise-spawn@^7.0.0": + version "7.0.2" + resolved "https://registry.yarnpkg.com/@npmcli/promise-spawn/-/promise-spawn-7.0.2.tgz#1d53d34ffeb5d151bfa8ec661bcccda8bbdfd532" + integrity sha512-xhfYPXoV5Dy4UkY0D+v2KkwvnDfiA/8Mt3sWCGI/hM03NsYIH8ZaG6QzS9x7pje5vHZBZJ2v6VRFVTWACnqcmQ== + dependencies: + which "^4.0.0" + +"@npmcli/redact@^2.0.0": + version "2.0.1" + resolved "https://registry.yarnpkg.com/@npmcli/redact/-/redact-2.0.1.tgz#95432fd566e63b35c04494621767a4312c316762" + integrity sha512-YgsR5jCQZhVmTJvjduTOIHph0L73pK8xwMVaDY0PatySqVM9AZj93jpoXYSJqfHFxFkN9dmqTw6OiqExsS3LPw== + +"@npmcli/run-script@^8.0.0": + version "8.1.0" + resolved "https://registry.yarnpkg.com/@npmcli/run-script/-/run-script-8.1.0.tgz#a563e5e29b1ca4e648a6b1bbbfe7220b4bfe39fc" + integrity sha512-y7efHHwghQfk28G2z3tlZ67pLG0XdfYbcVG26r7YIXALRsrVQcTq4/tdenSmdOrEsNahIYA/eh8aEVROWGFUDg== + dependencies: + "@npmcli/node-gyp" "^3.0.0" + "@npmcli/package-json" "^5.0.0" + "@npmcli/promise-spawn" "^7.0.0" + node-gyp "^10.0.0" + proc-log "^4.0.0" + which "^4.0.0" + "@pkgjs/parseargs@^0.11.0": version "0.11.0" resolved "https://registry.yarnpkg.com/@pkgjs/parseargs/-/parseargs-0.11.0.tgz#a77ea742fab25775145434eb1d2328cf5013ac33" @@ -2046,11 +2271,79 @@ optionalDependencies: fsevents "~2.3.2" +"@schematics/angular@18.2.6": + version "18.2.6" + resolved "https://registry.yarnpkg.com/@schematics/angular/-/angular-18.2.6.tgz#4b6143498cb71e23ca8082cbecd4d32dba80003c" + integrity sha512-Y988EoOEQDLEyHu3414T6AeVUyx21AexBHQNbUNQkK8cxlxyB6m1eH1cx6vFgLRFUTsLVv+C6Ln/ICNTfLcG4A== + dependencies: + "@angular-devkit/core" "18.2.6" + "@angular-devkit/schematics" "18.2.6" + jsonc-parser "3.3.1" + +"@sigstore/bundle@^2.3.2": + version "2.3.2" + resolved "https://registry.yarnpkg.com/@sigstore/bundle/-/bundle-2.3.2.tgz#ad4dbb95d665405fd4a7a02c8a073dbd01e4e95e" + integrity sha512-wueKWDk70QixNLB363yHc2D2ItTgYiMTdPwK8D9dKQMR3ZQ0c35IxP5xnwQ8cNLoCgCRcHf14kE+CLIvNX1zmA== + dependencies: + "@sigstore/protobuf-specs" "^0.3.2" + +"@sigstore/core@^1.0.0", "@sigstore/core@^1.1.0": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@sigstore/core/-/core-1.1.0.tgz#5583d8f7ffe599fa0a89f2bf289301a5af262380" + integrity sha512-JzBqdVIyqm2FRQCulY6nbQzMpJJpSiJ8XXWMhtOX9eKgaXXpfNOF53lzQEjIydlStnd/eFtuC1dW4VYdD93oRg== + +"@sigstore/protobuf-specs@^0.3.2": + version "0.3.2" + resolved "https://registry.yarnpkg.com/@sigstore/protobuf-specs/-/protobuf-specs-0.3.2.tgz#5becf88e494a920f548d0163e2978f81b44b7d6f" + integrity sha512-c6B0ehIWxMI8wiS/bj6rHMPqeFvngFV7cDU/MY+B16P9Z3Mp9k8L93eYZ7BYzSickzuqAQqAq0V956b3Ju6mLw== + +"@sigstore/sign@^2.3.2": + version "2.3.2" + resolved "https://registry.yarnpkg.com/@sigstore/sign/-/sign-2.3.2.tgz#d3d01e56d03af96fd5c3a9b9897516b1233fc1c4" + integrity sha512-5Vz5dPVuunIIvC5vBb0APwo7qKA4G9yM48kPWJT+OEERs40md5GoUR1yedwpekWZ4m0Hhw44m6zU+ObsON+iDA== + dependencies: + "@sigstore/bundle" "^2.3.2" + "@sigstore/core" "^1.0.0" + "@sigstore/protobuf-specs" "^0.3.2" + make-fetch-happen "^13.0.1" + proc-log "^4.2.0" + promise-retry "^2.0.1" + +"@sigstore/tuf@^2.3.4": + version "2.3.4" + resolved "https://registry.yarnpkg.com/@sigstore/tuf/-/tuf-2.3.4.tgz#da1d2a20144f3b87c0172920cbc8dcc7851ca27c" + integrity sha512-44vtsveTPUpqhm9NCrbU8CWLe3Vck2HO1PNLw7RIajbB7xhtn5RBPm1VNSCMwqGYHhDsBJG8gDF0q4lgydsJvw== + dependencies: + "@sigstore/protobuf-specs" "^0.3.2" + tuf-js "^2.2.1" + +"@sigstore/verify@^1.2.1": + version "1.2.1" + resolved "https://registry.yarnpkg.com/@sigstore/verify/-/verify-1.2.1.tgz#c7e60241b432890dcb8bd8322427f6062ef819e1" + integrity sha512-8iKx79/F73DKbGfRf7+t4dqrc0bRr0thdPrxAtCKWRm/F0tG71i6O1rvlnScncJLLBZHn3h8M3c1BSUAb9yu8g== + dependencies: + "@sigstore/bundle" "^2.3.2" + "@sigstore/core" "^1.1.0" + "@sigstore/protobuf-specs" "^0.3.2" + "@sindresorhus/merge-streams@^2.1.0": version "2.3.0" resolved "https://registry.yarnpkg.com/@sindresorhus/merge-streams/-/merge-streams-2.3.0.tgz#719df7fb41766bc143369eaa0dd56d8dc87c9958" integrity sha512-LtoMMhxAlorcGhmFYI+LhPgbPZCkgP6ra1YL604EeF6U98pLlQ3iWIGMdWSC+vWmPBWBNgmDBAhnAobLROJmwg== +"@tufjs/canonical-json@2.0.0": + version "2.0.0" + resolved "https://registry.yarnpkg.com/@tufjs/canonical-json/-/canonical-json-2.0.0.tgz#a52f61a3d7374833fca945b2549bc30a2dd40d0a" + integrity sha512-yVtV8zsdo8qFHe+/3kw81dSLyF7D576A5cCFCi4X7B39tWT7SekaEFUnvnWJHz+9qO7qJTah1JbrDjWKqFtdWA== + +"@tufjs/models@2.0.1": + version "2.0.1" + resolved "https://registry.yarnpkg.com/@tufjs/models/-/models-2.0.1.tgz#e429714e753b6c2469af3212e7f320a6973c2812" + integrity sha512-92F7/SFyufn4DXsha9+QfKnN03JGqtMFMXgSHbZOo8JG59WkTni7UzAouNQDf7AuP9OAMxVOPQcqG3sB7w+kkg== + dependencies: + "@tufjs/canonical-json" "2.0.0" + minimatch "^9.0.4" + "@types/body-parser@*": version "1.19.5" resolved "https://registry.yarnpkg.com/@types/body-parser/-/body-parser-1.19.5.tgz#04ce9a3b677dc8bd681a17da1ab9835dc9d3ede4" @@ -2378,6 +2671,16 @@ resolved "https://registry.yarnpkg.com/@xtuc/long/-/long-4.2.2.tgz#d291c6a4e97989b5c61d9acf396ae4fe133a718d" integrity sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ== +"@yarnpkg/lockfile@1.1.0": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@yarnpkg/lockfile/-/lockfile-1.1.0.tgz#e77a97fbd345b76d83245edcd17d393b1b41fb31" + integrity sha512-GpSwvyXOcOOlV70vbnzjj4fW5xW/FdUF6nQEt1ENy7m4ZCczi1+/buVUPAqmGfqznsORNFzUMjctTIp8a9tuCQ== + +abbrev@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-2.0.0.tgz#cf59829b8b4f03f89dda2771cb7f3653828c89bf" + integrity sha512-6/mh1E2u2YgEsCHdY0Yx5oW+61gZU+1vXaoiHHrpKeuRNNgFvS+/jrwHiQhB5apAf5oB7UB7E19ol2R2LKH8hQ== + accepts@~1.3.4, accepts@~1.3.5, accepts@~1.3.8: version "1.3.8" resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.8.tgz#0bf0be125b67014adcb0b0921e62db7bffe16b2e" @@ -2404,7 +2707,7 @@ adjust-sourcemap-loader@^4.0.0: loader-utils "^2.0.0" regex-parser "^2.2.11" -agent-base@^7.0.2: +agent-base@^7.0.2, agent-base@^7.1.0, agent-base@^7.1.1: version "7.1.1" resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-7.1.1.tgz#bdbded7dfb096b751a2a087eeeb9664725b2e317" integrity sha512-H0TSyFNDMomMNJQBn8wFV5YC/2eJ+VXECwOadZJT554xP6cODZHPX3H9QMQECxvrgiSOP1pHjy1sMWQVYJOUOA== @@ -2770,6 +3073,11 @@ chalk@^5.3.0: resolved "https://registry.yarnpkg.com/chalk/-/chalk-5.3.0.tgz#67c20a7ebef70e7f3970a01f90fa210cb6860385" integrity sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w== +chardet@^0.7.0: + version "0.7.0" + resolved "https://registry.yarnpkg.com/chardet/-/chardet-0.7.0.tgz#90094849f0937f2eedc2425d0d28a9e5f0cbad9e" + integrity sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA== + "chokidar@>=3.0.0 <4.0.0", chokidar@^3.0.0, chokidar@^3.5.3, chokidar@^3.6.0: version "3.6.0" resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.6.0.tgz#197c6cc669ef2a8dc5e7b4d97ee4e092c3eb0d5b" @@ -3289,6 +3597,13 @@ encodeurl@~2.0.0: resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-2.0.0.tgz#7b8ea898077d7e409d3ac45474ea38eaf0857a58" integrity sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg== +encoding@^0.1.13: + version "0.1.13" + resolved "https://registry.yarnpkg.com/encoding/-/encoding-0.1.13.tgz#56574afdd791f54a8e9b2785c0582a2d26210fa9" + integrity sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A== + dependencies: + iconv-lite "^0.6.2" + enhanced-resolve@^5.17.1: version "5.17.1" resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-5.17.1.tgz#67bfbbcc2f81d511be77d686a90267ef7f898a15" @@ -3310,7 +3625,7 @@ entities@^4.2.0, entities@^4.3.0, entities@^4.4.0: resolved "https://registry.yarnpkg.com/entities/-/entities-4.5.0.tgz#5d268ea5e7113ec74c4d033b79ea5a35a488fb48" integrity sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw== -env-paths@^2.2.1: +env-paths@^2.2.0, env-paths@^2.2.1: version "2.2.1" resolved "https://registry.yarnpkg.com/env-paths/-/env-paths-2.2.1.tgz#420399d416ce1fbe9bc0a07c62fa68d67fd0f8f2" integrity sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A== @@ -3320,6 +3635,11 @@ environment@^1.0.0: resolved "https://registry.yarnpkg.com/environment/-/environment-1.1.0.tgz#8e86c66b180f363c7ab311787e0259665f45a9f1" integrity sha512-xUtoPkMggbz0MPyPiIWr1Kp4aeWJjDZ6SMvURhimjdZgsRuDplF5/s9hcgGhyXMhs+6vpnuoiZ2kFiu3FMnS8Q== +err-code@^2.0.2: + version "2.0.3" + resolved "https://registry.yarnpkg.com/err-code/-/err-code-2.0.3.tgz#23c2f3b756ffdfc608d30e27c9a941024807e7f9" + integrity sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA== + errno@^0.1.1: version "0.1.8" resolved "https://registry.yarnpkg.com/errno/-/errno-0.1.8.tgz#8bb3e9c7d463be4976ff888f76b4809ebc2e811f" @@ -3530,6 +3850,11 @@ execa@^5.0.0, execa@^5.1.1: signal-exit "^3.0.3" strip-final-newline "^2.0.0" +exponential-backoff@^3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/exponential-backoff/-/exponential-backoff-3.1.1.tgz#64ac7526fe341ab18a39016cd22c787d01e00bf6" + integrity sha512-dX7e/LHVJ6W3DE1MHWi9S1EYzDESENfLrYohG2G++ovZrYOkm4Knwa0mc1cn84xJOR4KEU0WSchhLbd0UklbHw== + express@^4.17.3: version "4.21.0" resolved "https://registry.yarnpkg.com/express/-/express-4.21.0.tgz#d57cb706d49623d4ac27833f1cbc466b668eb915" @@ -3567,6 +3892,15 @@ express@^4.17.3: utils-merge "1.0.1" vary "~1.1.2" +external-editor@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/external-editor/-/external-editor-3.1.0.tgz#cb03f740befae03ea4d283caed2741a83f335495" + integrity sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew== + dependencies: + chardet "^0.7.0" + iconv-lite "^0.4.24" + tmp "^0.0.33" + fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3: version "3.1.3" resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525" @@ -3794,7 +4128,7 @@ glob-to-regexp@^0.4.1: resolved "https://registry.yarnpkg.com/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz#c75297087c851b9a578bd217dd59a92f59fe546e" integrity sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw== -glob@^10.2.2, glob@^10.3.7: +glob@^10.2.2, glob@^10.3.10, glob@^10.3.7: version "10.4.5" resolved "https://registry.yarnpkg.com/glob/-/glob-10.4.5.tgz#f4d9f0b90ffdbab09c9d77f5f29b4262517b0956" integrity sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg== @@ -3886,6 +4220,13 @@ hasown@^2.0.0, hasown@^2.0.2: dependencies: function-bind "^1.1.2" +hosted-git-info@^7.0.0: + version "7.0.2" + resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-7.0.2.tgz#9b751acac097757667f30114607ef7b661ff4f17" + integrity sha512-puUZAUKT5m8Zzvs72XWy3HtvVbTWljRE66cP60bxJzAqf2DgICo7lYTY2IHUmLnNpjYvw5bvmoHvPc0QO2a62w== + dependencies: + lru-cache "^10.0.1" + hpack.js@^2.1.6: version "2.1.6" resolved "https://registry.yarnpkg.com/hpack.js/-/hpack.js-2.1.6.tgz#87774c0949e513f42e84575b3c45681fade2a0b2" @@ -3911,6 +4252,11 @@ htmlparser2@^8.0.2: domutils "^3.0.1" entities "^4.4.0" +http-cache-semantics@^4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/http-cache-semantics/-/http-cache-semantics-4.1.1.tgz#abe02fcb2985460bf0323be664436ec3476a6d5a" + integrity sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ== + http-deceiver@^1.2.7: version "1.2.7" resolved "https://registry.yarnpkg.com/http-deceiver/-/http-deceiver-1.2.7.tgz#fa7168944ab9a519d337cb0bec7284dc3e723d87" @@ -3942,6 +4288,14 @@ http-parser-js@>=0.5.1: resolved "https://registry.yarnpkg.com/http-parser-js/-/http-parser-js-0.5.8.tgz#af23090d9ac4e24573de6f6aecc9d84a48bf20e3" integrity sha512-SGeBX54F94Wgu5RH3X5jsDtf4eHyRogWX1XGT3b4HuW3tQPM4AaBzoUji/4AAJNXCEOWZ5O0DgZmJw1947gD5Q== +http-proxy-agent@^7.0.0: + version "7.0.2" + resolved "https://registry.yarnpkg.com/http-proxy-agent/-/http-proxy-agent-7.0.2.tgz#9a8b1f246866c028509486585f62b8f2c18c270e" + integrity sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig== + dependencies: + agent-base "^7.1.0" + debug "^4.3.4" + http-proxy-middleware@3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/http-proxy-middleware/-/http-proxy-middleware-3.0.0.tgz#550790357d6f92a9b82ab2d63e07343a791cf26b" @@ -3974,7 +4328,7 @@ http-proxy@^1.18.1: follow-redirects "^1.0.0" requires-port "^1.0.0" -https-proxy-agent@7.0.5: +https-proxy-agent@7.0.5, https-proxy-agent@^7.0.1: version "7.0.5" resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-7.0.5.tgz#9e8b5013873299e11fab6fd548405da2d6c602b2" integrity sha512-1e4Wqeblerz+tMKPIq2EMGiiWW1dIjZOksyHWSUm1rmuvw/how9hBHZ38lAGj5ID4Ik6EdkOw7NmWPy6LAwalw== @@ -4008,14 +4362,14 @@ hyperdyperid@^1.2.0: resolved "https://registry.yarnpkg.com/hyperdyperid/-/hyperdyperid-1.2.0.tgz#59668d323ada92228d2a869d3e474d5a33b69e6b" integrity sha512-Y93lCzHYgGWdrJ66yIktxiaGULYc6oGiABxhcO5AufBeOyoIdZF7bIfLaOrbM0iGIOXQQgxxRrFEnb+Y6w1n4A== -iconv-lite@0.4.24: +iconv-lite@0.4.24, iconv-lite@^0.4.24: version "0.4.24" resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA== dependencies: safer-buffer ">= 2.1.2 < 3" -iconv-lite@^0.6.3: +iconv-lite@^0.6.2, iconv-lite@^0.6.3: version "0.6.3" resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.6.3.tgz#a52f80bf38da1952eb5c681790719871a1a72501" integrity sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw== @@ -4032,6 +4386,13 @@ ieee754@^1.1.13: resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.2.1.tgz#8eb7a10a63fff25d15a57b001586d177d1b0d352" integrity sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA== +ignore-walk@^6.0.4: + version "6.0.5" + resolved "https://registry.yarnpkg.com/ignore-walk/-/ignore-walk-6.0.5.tgz#ef8d61eab7da169078723d1f82833b36e200b0dd" + integrity sha512-VuuG0wCnjhnylG1ABXT3dAuIpTNDs/G8jlpmwXY03fXoXy/8ZK8/T+hMzt8L4WnrLCJgdybqgPagnF/f97cg3A== + dependencies: + minimatch "^9.0.0" + ignore@^5.2.0, ignore@^5.2.4: version "5.3.2" resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.3.2.tgz#3cd40e729f3643fd87cb04e50bf0eb722bc596f5" @@ -4075,6 +4436,11 @@ inherits@2.0.4, inherits@^2.0.1, inherits@^2.0.3, inherits@^2.0.4, inherits@~2.0 resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== +ini@4.1.3, ini@^4.1.3: + version "4.1.3" + resolved "https://registry.yarnpkg.com/ini/-/ini-4.1.3.tgz#4c359675a6071a46985eb39b14e4a2c0ec98a795" + integrity sha512-X7rqawQBvfdjS10YU1y1YVreA3SsLrW9dX2CewP2EbBJM4ypVNLDkO5y04gejPwKIY9lR+7r9gn3rFPt/kmWFg== + injection-js@^2.4.0: version "2.4.0" resolved "https://registry.yarnpkg.com/injection-js/-/injection-js-2.4.0.tgz#ebe8871b1a349f23294eaa751bbd8209a636e754" @@ -4082,6 +4448,14 @@ injection-js@^2.4.0: dependencies: tslib "^2.0.0" +ip-address@^9.0.5: + version "9.0.5" + resolved "https://registry.yarnpkg.com/ip-address/-/ip-address-9.0.5.tgz#117a960819b08780c3bd1f14ef3c1cc1d3f3ea5a" + integrity sha512-zHtQzGojZXTwZTHQqra+ETKd4Sn3vgi7uBmlPoXVWZqYvuKmtI0l/VZTjqGmJY9x88GGOaZ9+G9ES8hC4T4X8g== + dependencies: + jsbn "1.1.0" + sprintf-js "^1.1.3" + ipaddr.js@1.9.1: version "1.9.1" resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.9.1.tgz#bff38543eeb8984825079ff3a2a8e6cbd46781b3" @@ -4157,6 +4531,11 @@ is-interactive@^1.0.0: resolved "https://registry.yarnpkg.com/is-interactive/-/is-interactive-1.0.0.tgz#cea6e6ae5c870a7b0a0004070b7b587e0252912e" integrity sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w== +is-lambda@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-lambda/-/is-lambda-1.0.1.tgz#3d9877899e6a53efc0160504cde15f82e6f061d5" + integrity sha512-z7CMFGNrENq5iFB9Bqo64Xk6Y9sg+epq1myIcdHaGnbMTYOxvzsEtdYqQUylB7LxfkvgrrjP32T6Ywciio9UIQ== + is-module@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/is-module/-/is-module-1.0.0.tgz#3258fb69f78c14d5b815d664336b4cffb6441591" @@ -4226,6 +4605,11 @@ isexe@^2.0.0: resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" integrity sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw== +isexe@^3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/isexe/-/isexe-3.1.1.tgz#4a407e2bd78ddfb14bea0c27c6f7072dde775f0d" + integrity sha512-LpB/54B+/2J5hqQ7imZHfdU31OlgQqx7ZicVlkm9kzg9/w8GKLEcFfJl/t7DCEDueOyBAD6zCCwTO6Fzs0NoEQ== + isobject@^3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/isobject/-/isobject-3.0.1.tgz#4e431e92b11a9731636aa1f9c8d1ccbcfdab78df" @@ -4282,6 +4666,11 @@ js-yaml@^4.1.0: dependencies: argparse "^2.0.1" +jsbn@1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-1.1.0.tgz#b01307cb29b618a1ed26ec79e911f803c4da0040" + integrity sha512-4bYVV3aAMtDTTu4+xsDYa6sy9GyJ69/amsu9sYF2zqjiEoZA5xJi3BrfX3uY+/IekIu7MwdObdbDWpoZdBv3/A== + jsesc@^2.5.1: version "2.5.2" resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-2.5.2.tgz#80564d2e483dacf6e8ef209650a67df3f0c283a4" @@ -4297,6 +4686,11 @@ json-parse-even-better-errors@^2.3.0, json-parse-even-better-errors@^2.3.1: resolved "https://registry.yarnpkg.com/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz#7c47805a94319928e05777405dc12e1f7a4ee02d" integrity sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w== +json-parse-even-better-errors@^3.0.0: + version "3.0.2" + resolved "https://registry.yarnpkg.com/json-parse-even-better-errors/-/json-parse-even-better-errors-3.0.2.tgz#b43d35e89c0f3be6b5fbbe9dc6c82467b30c28da" + integrity sha512-fi0NG4bPjCHunUJffmLd0gxssIgkNmArMvis4iNah6Owg1MCJjWhEcDLmsK6iGkJq3tHwbDkTlce70/tmXN4cQ== + json-schema-traverse@^0.4.1: version "0.4.1" resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660" @@ -4317,6 +4711,11 @@ jsonc-parser@3.3.1, jsonc-parser@^3.2.0: resolved "https://registry.yarnpkg.com/jsonc-parser/-/jsonc-parser-3.3.1.tgz#f2a524b4f7fd11e3d791e559977ad60b98b798b4" integrity sha512-HUgH65KyejrUFPvHFPbqOY0rsFip3Bo5wb4ngvdi1EpCYWUQDC5V+Y7mZws+DLkr4M//zQJoanu1SP+87Dv1oQ== +jsonparse@^1.3.1: + version "1.3.1" + resolved "https://registry.yarnpkg.com/jsonparse/-/jsonparse-1.3.1.tgz#3f4dae4a91fac315f71062f8521cc239f1366280" + integrity sha512-POQXvpdL69+CluYsillJ7SUhKvytYjW9vG/GKpnf+xP8UWgYEM/RaMzHHofbALDiKbbP1W8UEYmgGl39WkPZsg== + karma-source-map-support@1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/karma-source-map-support/-/karma-source-map-support-1.4.0.tgz#58526ceccf7e8730e56effd97a4de8d712ac0d6b" @@ -4550,6 +4949,24 @@ make-dir@^3.0.2: dependencies: semver "^6.0.0" +make-fetch-happen@^13.0.0, make-fetch-happen@^13.0.1: + version "13.0.1" + resolved "https://registry.yarnpkg.com/make-fetch-happen/-/make-fetch-happen-13.0.1.tgz#273ba2f78f45e1f3a6dca91cede87d9fa4821e36" + integrity sha512-cKTUFc/rbKUd/9meOvgrpJ2WrNzymt6jfRDdwg5UCnVzv9dTpEj9JS5m3wtziXVCjluIXyL8pcaukYqezIzZQA== + dependencies: + "@npmcli/agent" "^2.0.0" + cacache "^18.0.0" + http-cache-semantics "^4.1.1" + is-lambda "^1.0.1" + minipass "^7.0.2" + minipass-fetch "^3.0.0" + minipass-flush "^1.0.5" + minipass-pipeline "^1.2.4" + negotiator "^0.6.3" + proc-log "^4.2.0" + promise-retry "^2.0.1" + ssri "^10.0.0" + media-typer@0.3.0: version "0.3.0" resolved "https://registry.yarnpkg.com/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748" @@ -4638,7 +5055,7 @@ minimalistic-assert@^1.0.0: resolved "https://registry.yarnpkg.com/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz#2e194de044626d4a10e7f7fbc00ce73e83e4d5c7" integrity sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A== -minimatch@^9.0.4: +minimatch@^9.0.0, minimatch@^9.0.4: version "9.0.5" resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-9.0.5.tgz#d74f9dd6b57d83d8e98cfb82133b03978bc929e5" integrity sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow== @@ -4652,6 +5069,17 @@ minipass-collect@^2.0.1: dependencies: minipass "^7.0.3" +minipass-fetch@^3.0.0: + version "3.0.5" + resolved "https://registry.yarnpkg.com/minipass-fetch/-/minipass-fetch-3.0.5.tgz#f0f97e40580affc4a35cc4a1349f05ae36cb1e4c" + integrity sha512-2N8elDQAtSnFV0Dk7gt15KHsS0Fyz6CbYZ360h0WTYV1Ty46li3rAXVOQj1THMNLdmrD9Vt5pBPtWtVkpwGBqg== + dependencies: + minipass "^7.0.3" + minipass-sized "^1.0.3" + minizlib "^2.1.2" + optionalDependencies: + encoding "^0.1.13" + minipass-flush@^1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/minipass-flush/-/minipass-flush-1.0.5.tgz#82e7135d7e89a50ffe64610a787953c4c4cbb373" @@ -4666,6 +5094,13 @@ minipass-pipeline@^1.2.4: dependencies: minipass "^3.0.0" +minipass-sized@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/minipass-sized/-/minipass-sized-1.0.3.tgz#70ee5a7c5052070afacfbc22977ea79def353b70" + integrity sha512-MbkQQ2CTiBMlA2Dm/5cY+9SWFEN8pzzOXi6rlM5Xxq0Yqbda5ZQy9sU75a673FE9ZK0Zsbr6Y5iP6u9nktfg2g== + dependencies: + minipass "^3.0.0" + minipass@^3.0.0: version "3.3.6" resolved "https://registry.yarnpkg.com/minipass/-/minipass-3.3.6.tgz#7bba384db3a1520d18c9c0e5251c3444e95dd94a" @@ -4678,12 +5113,12 @@ minipass@^5.0.0: resolved "https://registry.yarnpkg.com/minipass/-/minipass-5.0.0.tgz#3e9788ffb90b694a5d0ec94479a45b5d8738133d" integrity sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ== -"minipass@^5.0.0 || ^6.0.2 || ^7.0.0", minipass@^7.0.3, minipass@^7.1.2: +"minipass@^5.0.0 || ^6.0.2 || ^7.0.0", minipass@^7.0.2, minipass@^7.0.3, minipass@^7.1.2: version "7.1.2" resolved "https://registry.yarnpkg.com/minipass/-/minipass-7.1.2.tgz#93a9626ce5e5e66bd4db86849e7515e92340a707" integrity sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw== -minizlib@^2.1.1: +minizlib@^2.1.1, minizlib@^2.1.2: version "2.1.2" resolved "https://registry.yarnpkg.com/minizlib/-/minizlib-2.1.2.tgz#e90d3466ba209b932451508a11ce3d3632145931" integrity sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg== @@ -4763,7 +5198,7 @@ needle@^3.1.0: iconv-lite "^0.6.3" sax "^1.2.4" -negotiator@0.6.3: +negotiator@0.6.3, negotiator@^0.6.3: version "0.6.3" resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.3.tgz#58e323a72fedc0d6f9cd4d31fe49f51479590ccd" integrity sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg== @@ -4838,11 +5273,43 @@ node-gyp-build@^4.2.2: resolved "https://registry.yarnpkg.com/node-gyp-build/-/node-gyp-build-4.8.2.tgz#4f802b71c1ab2ca16af830e6c1ea7dd1ad9496fa" integrity sha512-IRUxE4BVsHWXkV/SFOut4qTlagw2aM8T5/vnTsmrHJvVoKueJHRc/JaFND7QDDc61kLYUJ6qlZM3sqTSyx2dTw== +node-gyp@^10.0.0: + version "10.2.0" + resolved "https://registry.yarnpkg.com/node-gyp/-/node-gyp-10.2.0.tgz#80101c4aa4f7ab225f13fcc8daaaac4eb1a8dd86" + integrity sha512-sp3FonBAaFe4aYTcFdZUn2NYkbP7xroPGYvQmP4Nl5PxamznItBnNCgjrVTKrEfQynInMsJvZrdmqUnysCJ8rw== + dependencies: + env-paths "^2.2.0" + exponential-backoff "^3.1.1" + glob "^10.3.10" + graceful-fs "^4.2.6" + make-fetch-happen "^13.0.0" + nopt "^7.0.0" + proc-log "^4.1.0" + semver "^7.3.5" + tar "^6.2.1" + which "^4.0.0" + node-releases@^2.0.18: version "2.0.18" resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.18.tgz#f010e8d35e2fe8d6b2944f03f70213ecedc4ca3f" integrity sha512-d9VeXT4SJ7ZeOqGX6R5EM022wpL+eWPooLI+5UpWn2jCT1aosUQEhQP214x33Wkwx3JQMvIm+tIoVOdodFS40g== +nopt@^7.0.0: + version "7.2.1" + resolved "https://registry.yarnpkg.com/nopt/-/nopt-7.2.1.tgz#1cac0eab9b8e97c9093338446eddd40b2c8ca1e7" + integrity sha512-taM24ViiimT/XntxbPyJQzCG+p4EKOpgD3mxFwW38mGjVUrfERQOeY4EDHjdnptttfHuHQXFx+lTP08Q+mLa/w== + dependencies: + abbrev "^2.0.0" + +normalize-package-data@^6.0.0: + version "6.0.2" + resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-6.0.2.tgz#a7bc22167fe24025412bcff0a9651eb768b03506" + integrity sha512-V6gygoYb/5EmNI+MEGrWkC+e6+Rr7mTmfHrxDbLzxQogBkgzo76rkok0Am6thgSF7Mv2nLOajAJj5vDJZEFn7g== + dependencies: + hosted-git-info "^7.0.0" + semver "^7.3.5" + validate-npm-package-license "^3.0.4" + normalize-path@^3.0.0, normalize-path@~3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" @@ -4853,6 +5320,66 @@ normalize-range@^0.1.2: resolved "https://registry.yarnpkg.com/normalize-range/-/normalize-range-0.1.2.tgz#2d10c06bdfd312ea9777695a4d28439456b75942" integrity sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA== +npm-bundled@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/npm-bundled/-/npm-bundled-3.0.1.tgz#cca73e15560237696254b10170d8f86dad62da25" + integrity sha512-+AvaheE/ww1JEwRHOrn4WHNzOxGtVp+adrg2AeZS/7KuxGUYFuBta98wYpfHBbJp6Tg6j1NKSEVHNcfZzJHQwQ== + dependencies: + npm-normalize-package-bin "^3.0.0" + +npm-install-checks@^6.0.0: + version "6.3.0" + resolved "https://registry.yarnpkg.com/npm-install-checks/-/npm-install-checks-6.3.0.tgz#046552d8920e801fa9f919cad569545d60e826fe" + integrity sha512-W29RiK/xtpCGqn6f3ixfRYGk+zRyr+Ew9F2E20BfXxT5/euLdA/Nm7fO7OeTGuAmTs30cpgInyJ0cYe708YTZw== + dependencies: + semver "^7.1.1" + +npm-normalize-package-bin@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/npm-normalize-package-bin/-/npm-normalize-package-bin-3.0.1.tgz#25447e32a9a7de1f51362c61a559233b89947832" + integrity sha512-dMxCf+zZ+3zeQZXKxmyuCKlIDPGuv8EF940xbkC4kQVDTtqoh6rJFO+JTKSA6/Rwi0getWmtuy4Itup0AMcaDQ== + +npm-package-arg@11.0.3, npm-package-arg@^11.0.0: + version "11.0.3" + resolved "https://registry.yarnpkg.com/npm-package-arg/-/npm-package-arg-11.0.3.tgz#dae0c21199a99feca39ee4bfb074df3adac87e2d" + integrity sha512-sHGJy8sOC1YraBywpzQlIKBE4pBbGbiF95U6Auspzyem956E0+FtDtsx1ZxlOJkQCZ1AFXAY/yuvtFYrOxF+Bw== + dependencies: + hosted-git-info "^7.0.0" + proc-log "^4.0.0" + semver "^7.3.5" + validate-npm-package-name "^5.0.0" + +npm-packlist@^8.0.0: + version "8.0.2" + resolved "https://registry.yarnpkg.com/npm-packlist/-/npm-packlist-8.0.2.tgz#5b8d1d906d96d21c85ebbeed2cf54147477c8478" + integrity sha512-shYrPFIS/JLP4oQmAwDyk5HcyysKW8/JLTEA32S0Z5TzvpaeeX2yMFfoK1fjEBnCBvVyIB/Jj/GBFdm0wsgzbA== + dependencies: + ignore-walk "^6.0.4" + +npm-pick-manifest@9.1.0, npm-pick-manifest@^9.0.0: + version "9.1.0" + resolved "https://registry.yarnpkg.com/npm-pick-manifest/-/npm-pick-manifest-9.1.0.tgz#83562afde52b0b07cb6244361788d319ce7e8636" + integrity sha512-nkc+3pIIhqHVQr085X9d2JzPzLyjzQS96zbruppqC9aZRm/x8xx6xhI98gHtsfELP2bE+loHq8ZaHFHhe+NauA== + dependencies: + npm-install-checks "^6.0.0" + npm-normalize-package-bin "^3.0.0" + npm-package-arg "^11.0.0" + semver "^7.3.5" + +npm-registry-fetch@^17.0.0: + version "17.1.0" + resolved "https://registry.yarnpkg.com/npm-registry-fetch/-/npm-registry-fetch-17.1.0.tgz#fb69e8e762d456f08bda2f5f169f7638fb92beb1" + integrity sha512-5+bKQRH0J1xG1uZ1zMNvxW0VEyoNWgJpY9UDuluPFLKDfJ9u2JmmjmTJV1srBGQOROfdBMiVvnH2Zvpbm+xkVA== + dependencies: + "@npmcli/redact" "^2.0.0" + jsonparse "^1.3.1" + make-fetch-happen "^13.0.0" + minipass "^7.0.2" + minipass-fetch "^3.0.0" + minizlib "^2.1.2" + npm-package-arg "^11.0.0" + proc-log "^4.0.0" + npm-run-path@^4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-4.0.1.tgz#b7ecd1e5ed53da8e37a55e1c2269e0b97ed748ea" @@ -4938,6 +5465,11 @@ ordered-binary@^1.4.1: resolved "https://registry.yarnpkg.com/ordered-binary/-/ordered-binary-1.5.2.tgz#2007072bcc4cb3454e250ca8ecc994f092ca03dc" integrity sha512-JTo+4+4Fw7FreyAvlSLjb1BBVaxEQAacmjD3jjuyPZclpbEghTvQZbXBb2qPd2LeIMxiHwXBZUcpmG2Gl/mDEA== +os-tmpdir@~1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274" + integrity sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g== + p-limit@^2.2.0: version "2.3.0" resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.3.0.tgz#3dd33c647a214fdfffd835933eb086da0dc21db1" @@ -5006,6 +5538,29 @@ package-json-from-dist@^1.0.0: resolved "https://registry.yarnpkg.com/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz#4f1471a010827a86f94cfd9b0727e36d267de505" integrity sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw== +pacote@18.0.6: + version "18.0.6" + resolved "https://registry.yarnpkg.com/pacote/-/pacote-18.0.6.tgz#ac28495e24f4cf802ef911d792335e378e86fac7" + integrity sha512-+eK3G27SMwsB8kLIuj4h1FUhHtwiEUo21Tw8wNjmvdlpOEr613edv+8FUsTj/4F/VN5ywGE19X18N7CC2EJk6A== + dependencies: + "@npmcli/git" "^5.0.0" + "@npmcli/installed-package-contents" "^2.0.1" + "@npmcli/package-json" "^5.1.0" + "@npmcli/promise-spawn" "^7.0.0" + "@npmcli/run-script" "^8.0.0" + cacache "^18.0.0" + fs-minipass "^3.0.0" + minipass "^7.0.2" + npm-package-arg "^11.0.0" + npm-packlist "^8.0.0" + npm-pick-manifest "^9.0.0" + npm-registry-fetch "^17.0.0" + proc-log "^4.0.0" + promise-retry "^2.0.1" + sigstore "^2.2.0" + ssri "^10.0.0" + tar "^6.1.11" + parent-module@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/parent-module/-/parent-module-1.0.1.tgz#691d2709e78c79fae3a156622452d00762caaaa2" @@ -5246,11 +5801,29 @@ prettier@^3.2.5: resolved "https://registry.yarnpkg.com/prettier/-/prettier-3.3.3.tgz#30c54fe0be0d8d12e6ae61dbb10109ea00d53105" integrity sha512-i2tDNA0O5IrMO757lfrdQZCc2jPNDVntV0m/+4whiDfWaTKfMNgR7Qz0NAeGz/nRqF4m5/6CLzbP4/liHt12Ew== +proc-log@^4.0.0, proc-log@^4.1.0, proc-log@^4.2.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/proc-log/-/proc-log-4.2.0.tgz#b6f461e4026e75fdfe228b265e9f7a00779d7034" + integrity sha512-g8+OnU/L2v+wyiVK+D5fA34J7EH8jZ8DDlvwhRCMxmMj7UCBvxiO1mGeN+36JXIKF4zevU4kRBd8lVgG9vLelA== + process-nextick-args@~2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.1.tgz#7820d9b16120cc55ca9ae7792680ae7dba6d7fe2" integrity sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag== +promise-inflight@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/promise-inflight/-/promise-inflight-1.0.1.tgz#98472870bf228132fcbdd868129bad12c3c029e3" + integrity sha512-6zWPyEOFaQBJYcGMHBKTKJ3u6TBsnMFOIZSa6ce1e/ZrrsOlnHRHbabMjLiBYKp+n44X9eUI6VUPaukCXHuG4g== + +promise-retry@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/promise-retry/-/promise-retry-2.0.1.tgz#ff747a13620ab57ba688f5fc67855410c370da22" + integrity sha512-y+WKFlBR8BGXnsNlIHFGPZmyDf3DFMoLhaflAnyZgV6rG6xu+JwesTo2Q9R6XwYmtmwAFCkAk3e35jEdoeh/3g== + dependencies: + err-code "^2.0.2" + retry "^0.12.0" + proxy-addr@~2.0.7: version "2.0.7" resolved "https://registry.yarnpkg.com/proxy-addr/-/proxy-addr-2.0.7.tgz#f19fe69ceab311eeb94b42e70e8c2070f9ba1025" @@ -5431,7 +6004,7 @@ resolve-url-loader@5.0.0: postcss "^8.2.14" source-map "0.6.1" -resolve@^1.14.2, resolve@^1.22.1: +resolve@1.22.8, resolve@^1.14.2, resolve@^1.22.1: version "1.22.8" resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.8.tgz#b6c87a9f2aa06dfab52e3d70ac8cde321fa5a48d" integrity sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw== @@ -5456,6 +6029,11 @@ restore-cursor@^5.0.0: onetime "^7.0.0" signal-exit "^4.1.0" +retry@^0.12.0: + version "0.12.0" + resolved "https://registry.yarnpkg.com/retry/-/retry-0.12.0.tgz#1b42a6266a21f07421d1b0b54b7dc167b01c013b" + integrity sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow== + retry@^0.13.1: version "0.13.1" resolved "https://registry.yarnpkg.com/retry/-/retry-0.13.1.tgz#185b1587acf67919d63b357349e03537b2484658" @@ -5634,7 +6212,7 @@ semver-regex@^3.1.2: resolved "https://registry.yarnpkg.com/semver-regex/-/semver-regex-3.1.4.tgz#13053c0d4aa11d070a2f2872b6b1e3ae1e1971b4" integrity sha512-6IiqeZNgq01qGf0TId0t3NvKzSvUsjcpdEO3AQNeIjR6A2+ckTnQlDpl4qu1bjRv0RzN3FP9hzFmws3lKqRWkA== -semver@7.6.3, semver@^7.0.0, semver@^7.3.5, semver@^7.5.4: +semver@7.6.3, semver@^7.0.0, semver@^7.1.1, semver@^7.3.5, semver@^7.5.3, semver@^7.5.4: version "7.6.3" resolved "https://registry.yarnpkg.com/semver/-/semver-7.6.3.tgz#980f7b5550bc175fb4dc09403085627f9eb33143" integrity sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A== @@ -5764,6 +6342,18 @@ signal-exit@^4.0.1, signal-exit@^4.1.0: resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-4.1.0.tgz#952188c1cbd546070e2dd20d0f41c0ae0530cb04" integrity sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw== +sigstore@^2.2.0: + version "2.3.1" + resolved "https://registry.yarnpkg.com/sigstore/-/sigstore-2.3.1.tgz#0755dd2cc4820f2e922506da54d3d628e13bfa39" + integrity sha512-8G+/XDU8wNsJOQS5ysDVO0Etg9/2uA5gR9l4ZwijjlwxBcrU6RPfwi2+jJmbP+Ap1Hlp/nVAaEO4Fj22/SL2gQ== + dependencies: + "@sigstore/bundle" "^2.3.2" + "@sigstore/core" "^1.0.0" + "@sigstore/protobuf-specs" "^0.3.2" + "@sigstore/sign" "^2.3.2" + "@sigstore/tuf" "^2.3.4" + "@sigstore/verify" "^1.2.1" + slash@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/slash/-/slash-3.0.0.tgz#6539be870c165adbd5240220dbe361f1bc4d4634" @@ -5808,6 +6398,11 @@ slice-ansi@^7.1.0: ansi-styles "^6.2.1" is-fullwidth-code-point "^5.0.0" +smart-buffer@^4.2.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/smart-buffer/-/smart-buffer-4.2.0.tgz#6e1d71fa4f18c05f7d0ff216dd16a481d0e8d9ae" + integrity sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg== + sockjs@^0.3.24: version "0.3.24" resolved "https://registry.yarnpkg.com/sockjs/-/sockjs-0.3.24.tgz#c9bc8995f33a111bea0395ec30aa3206bdb5ccce" @@ -5817,6 +6412,23 @@ sockjs@^0.3.24: uuid "^8.3.2" websocket-driver "^0.7.4" +socks-proxy-agent@^8.0.3: + version "8.0.4" + resolved "https://registry.yarnpkg.com/socks-proxy-agent/-/socks-proxy-agent-8.0.4.tgz#9071dca17af95f483300316f4b063578fa0db08c" + integrity sha512-GNAq/eg8Udq2x0eNiFkr9gRg5bA7PXEWagQdeRX4cPSG+X/8V38v637gim9bjFptMk1QWsCTr0ttrJEiXbNnRw== + dependencies: + agent-base "^7.1.1" + debug "^4.3.4" + socks "^2.8.3" + +socks@^2.8.3: + version "2.8.3" + resolved "https://registry.yarnpkg.com/socks/-/socks-2.8.3.tgz#1ebd0f09c52ba95a09750afe3f3f9f724a800cb5" + integrity sha512-l5x7VUUWbjVFbafGLxPWkYsHIhEvmF85tbIeFZWc8ZPtoMyybuEhL7Jye/ooC4/d48FgOjSJXgsF/AJPYCW8Zw== + dependencies: + ip-address "^9.0.5" + smart-buffer "^4.2.0" + "source-map-js@>=0.6.2 <2.0.0", source-map-js@^1.0.2, source-map-js@^1.2.0, source-map-js@^1.2.1: version "1.2.1" resolved "https://registry.yarnpkg.com/source-map-js/-/source-map-js-1.2.1.tgz#1ce5650fddd87abc099eda37dcff024c2667ae46" @@ -5848,6 +6460,32 @@ source-map@0.7.4: resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.7.4.tgz#a9bbe705c9d8846f4e08ff6765acf0f1b0898656" integrity sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA== +spdx-correct@^3.0.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/spdx-correct/-/spdx-correct-3.2.0.tgz#4f5ab0668f0059e34f9c00dce331784a12de4e9c" + integrity sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA== + dependencies: + spdx-expression-parse "^3.0.0" + spdx-license-ids "^3.0.0" + +spdx-exceptions@^2.1.0: + version "2.5.0" + resolved "https://registry.yarnpkg.com/spdx-exceptions/-/spdx-exceptions-2.5.0.tgz#5d607d27fc806f66d7b64a766650fa890f04ed66" + integrity sha512-PiU42r+xO4UbUS1buo3LPJkjlO7430Xn5SVAhdpzzsPHsjbYVflnnFdATgabnLude+Cqu25p6N+g2lw/PFsa4w== + +spdx-expression-parse@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz#cf70f50482eefdc98e3ce0a6833e4a53ceeba679" + integrity sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q== + dependencies: + spdx-exceptions "^2.1.0" + spdx-license-ids "^3.0.0" + +spdx-license-ids@^3.0.0: + version "3.0.20" + resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-3.0.20.tgz#e44ed19ed318dd1e5888f93325cee800f0f51b89" + integrity sha512-jg25NiDV/1fLtSgEgyvVyDunvaNHbuwF9lfNV17gSmPFAlYzdfNBlLtLzXTevwkPj7DhGbmN9VnmJIgLnhvaBw== + spdy-transport@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/spdy-transport/-/spdy-transport-3.0.0.tgz#00d4863a6400ad75df93361a1608605e5dcdcf31" @@ -5871,6 +6509,11 @@ spdy@^4.0.2: select-hose "^2.0.0" spdy-transport "^3.0.0" +sprintf-js@^1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.1.3.tgz#4914b903a2f8b685d17fdf78a70e917e872e444a" + integrity sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA== + ssri@^10.0.0: version "10.0.6" resolved "https://registry.yarnpkg.com/ssri/-/ssri-10.0.6.tgz#a8aade2de60ba2bce8688e3fa349bad05c7dc1e5" @@ -6004,12 +6647,17 @@ supports-preserve-symlinks-flag@^1.0.0: resolved "https://registry.yarnpkg.com/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz#6eda4bd344a3c94aea376d4cc31bc77311039e09" integrity sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w== +symbol-observable@4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/symbol-observable/-/symbol-observable-4.0.0.tgz#5b425f192279e87f2f9b937ac8540d1984b39205" + integrity sha512-b19dMThMV4HVFynSAM1++gBHAbk2Tc/osgLIBZMKsyqh34jb2e8Os7T6ZW/Bt3pJFdBTd2JwAnAAEQV7rSNvcQ== + tapable@^2.1.1, tapable@^2.2.0, tapable@^2.2.1: version "2.2.1" resolved "https://registry.yarnpkg.com/tapable/-/tapable-2.2.1.tgz#1967a73ef4060a82f12ab96af86d52fdb76eeca0" integrity sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ== -tar@^6.1.11: +tar@^6.1.11, tar@^6.2.1: version "6.2.1" resolved "https://registry.yarnpkg.com/tar/-/tar-6.2.1.tgz#717549c541bc3c2af15751bea94b1dd068d4b03a" integrity sha512-DZ4yORTwrbTj/7MZYq2w+/ZFdI6OZ/f9SFHR+71gIVUZhOQPHzVCLpvRnPgyaMpfWxxk/4ONva3GQSyNIKRv6A== @@ -6067,6 +6715,13 @@ thunky@^1.0.2: resolved "https://registry.yarnpkg.com/thunky/-/thunky-1.1.0.tgz#5abaf714a9405db0504732bbccd2cedd9ef9537d" integrity sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA== +tmp@^0.0.33: + version "0.0.33" + resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.0.33.tgz#6d34335889768d21b2bcda0aa277ced3b1bfadf9" + integrity sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw== + dependencies: + os-tmpdir "~1.0.2" + to-fast-properties@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-2.0.0.tgz#dc5e698cbd079265bc73e0377681a4e4e83f616e" @@ -6131,6 +6786,15 @@ tsx@^4.15.5: optionalDependencies: fsevents "~2.3.3" +tuf-js@^2.2.1: + version "2.2.1" + resolved "https://registry.yarnpkg.com/tuf-js/-/tuf-js-2.2.1.tgz#fdd8794b644af1a75c7aaa2b197ddffeb2911b56" + integrity sha512-GwIJau9XaA8nLVbUXsN3IlFi7WmQ48gBUrl3FTkkL/XLu/POhBzfmX9hd33FNMX1qAsfl6ozO1iMmW9NC8YniA== + dependencies: + "@tufjs/models" "2.0.1" + debug "^4.3.4" + make-fetch-happen "^13.0.1" + type-fest@^0.21.3: version "0.21.3" resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.21.3.tgz#d260a24b0198436e133fa26a524a6d65fa3b2e37" @@ -6236,6 +6900,19 @@ uuid@^8.3.2: resolved "https://registry.yarnpkg.com/uuid/-/uuid-8.3.2.tgz#80d5b5ced271bb9af6c445f21a1a04c606cefbe2" integrity sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg== +validate-npm-package-license@^3.0.4: + version "3.0.4" + resolved "https://registry.yarnpkg.com/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz#fc91f6b9c7ba15c857f4cb2c5defeec39d4f410a" + integrity sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew== + dependencies: + spdx-correct "^3.0.0" + spdx-expression-parse "^3.0.0" + +validate-npm-package-name@^5.0.0: + version "5.0.1" + resolved "https://registry.yarnpkg.com/validate-npm-package-name/-/validate-npm-package-name-5.0.1.tgz#a316573e9b49f3ccd90dbb6eb52b3f06c6d604e8" + integrity sha512-OljLrQ9SQdOUqTaQxqL5dEfZWrXExyyWsozYlAWFawPVNuD83igl7uJD2RTkNMbniIYgt8l81eCJGIdQF7avLQ== + vary@~1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/vary/-/vary-1.1.2.tgz#2299f02c6ded30d4a5961b0b9f74524a18f634fc" @@ -6411,6 +7088,13 @@ which@^2.0.1: dependencies: isexe "^2.0.0" +which@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/which/-/which-4.0.0.tgz#cd60b5e74503a3fbcfbf6cd6b4138a8bae644c1a" + integrity sha512-GlaYyEb07DPxYCKhKzplCWBJtvxZcZMrL+4UkrTSJHHPyZU4mYYTv3qaOe77H7EODLSSopAUFAc6W8U4yqvscg== + dependencies: + isexe "^3.1.1" + wildcard@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/wildcard/-/wildcard-2.0.1.tgz#5ab10d02487198954836b6349f74fff961e10f67" @@ -6491,7 +7175,7 @@ yargs-parser@^21.1.1: resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-21.1.1.tgz#9096bceebf990d21bb31fa9516e0ede294a77d35" integrity sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw== -yargs@^17.2.1: +yargs@17.7.2, yargs@^17.2.1: version "17.7.2" resolved "https://registry.yarnpkg.com/yargs/-/yargs-17.7.2.tgz#991df39aca675a192b816e1e0363f9d75d2aa269" integrity sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w== From ffd701d146bef58ba78bd121df78a6530b7c4731 Mon Sep 17 00:00:00 2001 From: Joseph Garrone Date: Mon, 30 Sep 2024 06:35:01 +0200 Subject: [PATCH 25/64] New test --- scripts/build/main.ts | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/scripts/build/main.ts b/scripts/build/main.ts index 0d9e75f8..de05c367 100644 --- a/scripts/build/main.ts +++ b/scripts/build/main.ts @@ -57,6 +57,13 @@ import { crawl } from '../tools/crawl'; ); } + console.log("copying angular's node_modules..."); + + transformCodebase({ + srcDirPath: pathJoin(getThisCodebaseRootDirPath(), 'node_modules'), + destDirPath: pathJoin(angularWorkspaceDirPath, 'node_modules') + }); + run(`npx ng build`, { cwd: angularWorkspaceDirPath }); const angularDistDirPath = pathJoin( From 87faf534bf16da4137f92d15fc67bac1339ffd49 Mon Sep 17 00:00:00 2001 From: Joseph Garrone Date: Mon, 30 Sep 2024 06:39:24 +0200 Subject: [PATCH 26/64] Rollback --- scripts/build/main.ts | 11 ++--------- 1 file changed, 2 insertions(+), 9 deletions(-) diff --git a/scripts/build/main.ts b/scripts/build/main.ts index de05c367..23f864a3 100644 --- a/scripts/build/main.ts +++ b/scripts/build/main.ts @@ -17,8 +17,8 @@ import { crawl } from '../tools/crawl'; { const angularWorkspaceDirPath = pathJoin(distDirPath, 'workspace'); - if (fs.existsSync(distDirPath)) { - fs.rmSync(distDirPath, { recursive: true, force: true }); + if (fs.existsSync(angularWorkspaceDirPath)) { + fs.rmSync(angularWorkspaceDirPath, { recursive: true, force: true }); } transformCodebase({ @@ -57,13 +57,6 @@ import { crawl } from '../tools/crawl'; ); } - console.log("copying angular's node_modules..."); - - transformCodebase({ - srcDirPath: pathJoin(getThisCodebaseRootDirPath(), 'node_modules'), - destDirPath: pathJoin(angularWorkspaceDirPath, 'node_modules') - }); - run(`npx ng build`, { cwd: angularWorkspaceDirPath }); const angularDistDirPath = pathJoin( From bd39bd1be13856ff2a2a987f68d9b298956623db Mon Sep 17 00:00:00 2001 From: Joseph Garrone Date: Mon, 30 Sep 2024 06:53:54 +0200 Subject: [PATCH 27/64] Fix linking script --- scripts/link-in-app.ts | 23 ++++++++++++++++++++++- 1 file changed, 22 insertions(+), 1 deletion(-) diff --git a/scripts/link-in-app.ts b/scripts/link-in-app.ts index 25b786ea..aa6bf6da 100644 --- a/scripts/link-in-app.ts +++ b/scripts/link-in-app.ts @@ -4,7 +4,13 @@ import { getThisCodebaseRootDirPath } from './tools/getThisCodebaseRootDirPath'; import * as fs from 'fs'; import * as os from 'os'; -const singletonDependencies: string[] = ['keycloakify', 'rxjs', 'zone.js']; +const singletonDependencies: string[] = [ + 'keycloakify', + 'rxjs', + 'zone.js', + 'tslib', + 'typescript' +]; // For example [ "@emotion" ] it's more convenient than // having to list every sub emotion packages (@emotion/css @emotion/utils ...) @@ -64,6 +70,21 @@ fs.mkdirSync(yarnGlobalDirPath); const execYarnLink = (params: { targetModuleName?: string; cwd: string }) => { const { targetModuleName, cwd } = params; + if (targetModuleName === undefined) { + const packageJsonFilePath = pathJoin(cwd, 'package.json'); + + const packageJson = JSON.parse( + fs.readFileSync(packageJsonFilePath).toString('utf8') + ); + + delete packageJson['packageManager']; + + fs.writeFileSync( + packageJsonFilePath, + Buffer.from(JSON.stringify(packageJson, null, 2)) + ); + } + const cmd = [ 'yarn', 'link', From 08a37008ed69aa4577f9c226bba2c062899387d7 Mon Sep 17 00:00:00 2001 From: Joseph Garrone Date: Mon, 30 Sep 2024 07:51:04 +0200 Subject: [PATCH 28/64] Remove workspace --- scripts/build/main.ts | 2 +- scripts/build/workspace | 1 - 2 files changed, 1 insertion(+), 2 deletions(-) delete mode 160000 scripts/build/workspace diff --git a/scripts/build/main.ts b/scripts/build/main.ts index 23f864a3..a8bad012 100644 --- a/scripts/build/main.ts +++ b/scripts/build/main.ts @@ -15,7 +15,7 @@ import { crawl } from '../tools/crawl'; // tsc + angular JIT { - const angularWorkspaceDirPath = pathJoin(distDirPath, 'workspace'); + const angularWorkspaceDirPath = pathJoin(distDirPath, 'wp'); if (fs.existsSync(angularWorkspaceDirPath)) { fs.rmSync(angularWorkspaceDirPath, { recursive: true, force: true }); diff --git a/scripts/build/workspace b/scripts/build/workspace deleted file mode 160000 index a4233242..00000000 --- a/scripts/build/workspace +++ /dev/null @@ -1 +0,0 @@ -Subproject commit a42332421c05aec460ed12542c57cc97cb37e6bd From fb9cd4d9198a00b25151d98bbdf9d083567678f6 Mon Sep 17 00:00:00 2001 From: Joseph Garrone Date: Mon, 30 Sep 2024 07:52:34 +0200 Subject: [PATCH 29/64] Track workspace not as a git repo --- scripts/build/main.ts | 2 +- scripts/build/workspace/angular.json | 33 +++++++++++++++++ scripts/build/workspace/package.json | 28 ++++++++++++++ .../keycloakify-angular/ng-package.json | 7 ++++ .../projects/keycloakify-angular/package.json | 6 +++ .../keycloakify-angular/tsconfig.lib.json | 13 +++++++ .../tsconfig.lib.prod.json | 11 ++++++ .../keycloakify-angular/tsconfig.spec.json | 10 +++++ scripts/build/workspace/tsconfig.json | 37 +++++++++++++++++++ 9 files changed, 146 insertions(+), 1 deletion(-) create mode 100644 scripts/build/workspace/angular.json create mode 100644 scripts/build/workspace/package.json create mode 100644 scripts/build/workspace/projects/keycloakify-angular/ng-package.json create mode 100644 scripts/build/workspace/projects/keycloakify-angular/package.json create mode 100644 scripts/build/workspace/projects/keycloakify-angular/tsconfig.lib.json create mode 100644 scripts/build/workspace/projects/keycloakify-angular/tsconfig.lib.prod.json create mode 100644 scripts/build/workspace/projects/keycloakify-angular/tsconfig.spec.json create mode 100644 scripts/build/workspace/tsconfig.json diff --git a/scripts/build/main.ts b/scripts/build/main.ts index a8bad012..23f864a3 100644 --- a/scripts/build/main.ts +++ b/scripts/build/main.ts @@ -15,7 +15,7 @@ import { crawl } from '../tools/crawl'; // tsc + angular JIT { - const angularWorkspaceDirPath = pathJoin(distDirPath, 'wp'); + const angularWorkspaceDirPath = pathJoin(distDirPath, 'workspace'); if (fs.existsSync(angularWorkspaceDirPath)) { fs.rmSync(angularWorkspaceDirPath, { recursive: true, force: true }); diff --git a/scripts/build/workspace/angular.json b/scripts/build/workspace/angular.json new file mode 100644 index 00000000..9af604e2 --- /dev/null +++ b/scripts/build/workspace/angular.json @@ -0,0 +1,33 @@ +{ + "$schema": "./node_modules/@angular/cli/lib/config/schema.json", + "version": 1, + "newProjectRoot": "projects", + "projects": { + "keycloakify-angular": { + "projectType": "library", + "root": "projects/keycloakify-angular", + "sourceRoot": "projects/keycloakify-angular", + "prefix": "kc", + "architect": { + "build": { + "builder": "@angular-devkit/build-angular:ng-packagr", + "options": { + "project": "projects/keycloakify-angular/ng-package.json" + }, + "configurations": { + "production": { + "tsConfig": "projects/keycloakify-angular/tsconfig.lib.prod.json" + }, + "development": { + "tsConfig": "projects/keycloakify-angular/tsconfig.lib.json" + } + }, + "defaultConfiguration": "production" + } + } + } + }, + "cli": { + "analytics": "5582c240-d3aa-476d-8ab8-bfa63b3b6c8b" + } +} diff --git a/scripts/build/workspace/package.json b/scripts/build/workspace/package.json new file mode 100644 index 00000000..97a810f7 --- /dev/null +++ b/scripts/build/workspace/package.json @@ -0,0 +1,28 @@ +{ + "name": "keycloakify-angular-workspace", + "version": "0.0.0", + "type": "module", + "private": true, + "devDependencies": { + "keycloakify": "^11.2.2", + "prettier": "^3.2.5", + "typescript": "~5.4.0", + "husky": "^4.3.8", + "lint-staged": "^11.0.0", + "tsc-alias": "^1.8.10", + "tsx": "^4.15.5", + "@angular/core": "^18.2.6", + "@angular/common": "^18.2.6", + "@angular/platform-browser": "^18.2.6", + "@types/node": "^22.7.4", + "rxjs": "^7.8.1", + "zone.js": "^0.14.0", + "chalk": "^5.3.0", + "@angular-devkit/build-angular": "^18.2.6", + "@angular/cli": "^18.2.6", + "@angular/compiler-cli": "^18.2.6", + "@angular/compiler": "^18.2.6", + "ng-packagr": "^18.2.1", + "tslib": "^2.7.0" + } +} diff --git a/scripts/build/workspace/projects/keycloakify-angular/ng-package.json b/scripts/build/workspace/projects/keycloakify-angular/ng-package.json new file mode 100644 index 00000000..47f1b62e --- /dev/null +++ b/scripts/build/workspace/projects/keycloakify-angular/ng-package.json @@ -0,0 +1,7 @@ +{ + "$schema": "../../node_modules/ng-packagr/ng-package.schema.json", + "dest": "../../dist/keycloakify-angular", + "lib": { + "entryFile": "src/public-api.ts" + } +} diff --git a/scripts/build/workspace/projects/keycloakify-angular/package.json b/scripts/build/workspace/projects/keycloakify-angular/package.json new file mode 100644 index 00000000..4f6bd750 --- /dev/null +++ b/scripts/build/workspace/projects/keycloakify-angular/package.json @@ -0,0 +1,6 @@ +{ + "name": "keycloakify-angular", + "version": "0.0.1", + "type": "module", + "sideEffects": false +} diff --git a/scripts/build/workspace/projects/keycloakify-angular/tsconfig.lib.json b/scripts/build/workspace/projects/keycloakify-angular/tsconfig.lib.json new file mode 100644 index 00000000..8d15dc9a --- /dev/null +++ b/scripts/build/workspace/projects/keycloakify-angular/tsconfig.lib.json @@ -0,0 +1,13 @@ +/* To learn more about Typescript configuration file: https://www.typescriptlang.org/docs/handbook/tsconfig-json.html. */ +/* To learn more about Angular compiler options: https://angular.dev/reference/configs/angular-compiler-options. */ +{ + "extends": "../../tsconfig.json", + "compilerOptions": { + "outDir": "../../out-tsc/lib", + "declaration": true, + "declarationMap": true, + "inlineSources": true, + "types": [] + }, + "exclude": ["**/*.spec.ts"] +} diff --git a/scripts/build/workspace/projects/keycloakify-angular/tsconfig.lib.prod.json b/scripts/build/workspace/projects/keycloakify-angular/tsconfig.lib.prod.json new file mode 100644 index 00000000..e8500081 --- /dev/null +++ b/scripts/build/workspace/projects/keycloakify-angular/tsconfig.lib.prod.json @@ -0,0 +1,11 @@ +/* To learn more about Typescript configuration file: https://www.typescriptlang.org/docs/handbook/tsconfig-json.html. */ +/* To learn more about Angular compiler options: https://angular.dev/reference/configs/angular-compiler-options. */ +{ + "extends": "./tsconfig.lib.json", + "compilerOptions": { + "declarationMap": false + }, + "angularCompilerOptions": { + "compilationMode": "partial" + } +} diff --git a/scripts/build/workspace/projects/keycloakify-angular/tsconfig.spec.json b/scripts/build/workspace/projects/keycloakify-angular/tsconfig.spec.json new file mode 100644 index 00000000..714ddd45 --- /dev/null +++ b/scripts/build/workspace/projects/keycloakify-angular/tsconfig.spec.json @@ -0,0 +1,10 @@ +/* To learn more about Typescript configuration file: https://www.typescriptlang.org/docs/handbook/tsconfig-json.html. */ +/* To learn more about Angular compiler options: https://angular.dev/reference/configs/angular-compiler-options. */ +{ + "extends": "../../tsconfig.json", + "compilerOptions": { + "outDir": "../../out-tsc/spec", + "types": ["jasmine"] + }, + "include": ["**/*.spec.ts", "**/*.d.ts"] +} diff --git a/scripts/build/workspace/tsconfig.json b/scripts/build/workspace/tsconfig.json new file mode 100644 index 00000000..f33d4b45 --- /dev/null +++ b/scripts/build/workspace/tsconfig.json @@ -0,0 +1,37 @@ +/* To learn more about Typescript configuration file: https://www.typescriptlang.org/docs/handbook/tsconfig-json.html. */ +/* To learn more about Angular compiler options: https://angular.dev/reference/configs/angular-compiler-options. */ +{ + "compileOnSave": false, + "compilerOptions": { + "outDir": "./dist/out-tsc", + "skipLibCheck": true, + "isolatedModules": true, + "baseUrl": ".", + "paths": { + "@keycloakify/angular/*": ["./projects/keycloakify-angular/src/*"] + }, + "esModuleInterop": true, + "sourceMap": true, + "declaration": false, + "experimentalDecorators": true, + "moduleResolution": "bundler", + "importHelpers": true, + "target": "ES2022", + "module": "ES2022", + "lib": ["ES2022", "dom"], + /* Linting */ + "strict": true, + "forceConsistentCasingInFileNames": true, + "useDefineForClassFields": false, + "noImplicitOverride": true, + "noPropertyAccessFromIndexSignature": true, + "noImplicitReturns": true, + "noFallthroughCasesInSwitch": true + }, + "angularCompilerOptions": { + "enableI18nLegacyMessageIdFormat": false, + "strictInjectionParameters": true, + "strictInputAccessModifiers": true, + "strictTemplates": true + } +} From 05d1d9826eb937793f2189693057d86d6700c6cf Mon Sep 17 00:00:00 2001 From: Joseph Garrone Date: Mon, 30 Sep 2024 08:56:22 +0200 Subject: [PATCH 30/64] Hot reload and dynamic linking works --- scripts/build/main.ts | 19 +++++ scripts/link-in-app.ts | 78 +++++++++++++++++++ .../hello-world/hello-world.component.html | 2 +- 3 files changed, 98 insertions(+), 1 deletion(-) diff --git a/scripts/build/main.ts b/scripts/build/main.ts index 23f864a3..dbf407df 100644 --- a/scripts/build/main.ts +++ b/scripts/build/main.ts @@ -136,6 +136,25 @@ import { crawl } from '../tools/crawl'; } }); + bump_dev_package_json_version: { + const devPackageJsonFilePath = pathJoin(distDirPath, 'package.json'); + + if (!fs.existsSync(devPackageJsonFilePath)) { + break bump_dev_package_json_version; + } + + const devPackageJson = JSON.parse( + fs.readFileSync(devPackageJsonFilePath).toString('utf8') + ); + + devPackageJson.version = `0.0.0-rc.${Date.now()}`; + + fs.writeFileSync( + devPackageJsonFilePath, + Buffer.from(JSON.stringify(devPackageJson, null, 2)) + ); + } + console.log( chalk.green(`✓ built in ${((Date.now() - startTime) / 1000).toFixed(2)}s`) ); diff --git a/scripts/link-in-app.ts b/scripts/link-in-app.ts index aa6bf6da..4c22130c 100644 --- a/scripts/link-in-app.ts +++ b/scripts/link-in-app.ts @@ -176,4 +176,82 @@ testAppPaths.forEach(testAppPath => }) ); +testAppPaths.forEach(testAppPath => { + const ngFilePath = pathJoin(testAppPath, 'node_modules', '.bin', 'ng'); + + fs.rmSync(ngFilePath); + + fs.writeFileSync( + ngFilePath, + Buffer.from( + `#!/usr/bin/env node + +const { spawn } = require('child_process'); +const fs = require('fs'); +const { join: pathJoin } = require('path'); + +const [nodePath, , ...args] = process.argv; + +(function callee() { + + const serverProcess = spawn( + nodePath, + [ + pathJoin(__dirname, "..", "@angular", "cli", "bin", "ng.js"), + ...args + ], + { stdio: 'inherit' } + ); + + const getPackageJsonVersion = () => { + const packageJson = JSON.parse( + fs.readFileSync( + pathJoin(__dirname, "..", "@keycloakify", "angular", "package.json"), + "utf8" + ) + ); + + return packageJson.version; + }; + + let packageJsonVersion = getPackageJsonVersion(); + + fs.watch( + pathJoin(__dirname, "..", "@keycloakify", "angular", "package.json"), + eventType => { + + if (eventType !== "change") { + return; + } + + const newPackageJsonVersion = getPackageJsonVersion(); + + if (packageJsonVersion === newPackageJsonVersion) { + return; + } + + console.log("Detected change in package.json. Restarting ng..."); + + serverProcess.kill('SIGTERM'); + + fs.rmSync( + pathJoin(__dirname, "..", "..", ".angular", "cache"), + { recursive: true } + ); + + callee(); + + } + ); + +})(); + `, + 'utf8' + ) + ); + + // add execute permission + fs.chmodSync(ngFilePath, '755'); +}); + export {}; diff --git a/src/login/components/hello-world/hello-world.component.html b/src/login/components/hello-world/hello-world.component.html index 589144d4..dc2c4947 100644 --- a/src/login/components/hello-world/hello-world.component.html +++ b/src/login/components/hello-world/hello-world.component.html @@ -1 +1 @@ -

hello-world works!

+

hello-world works! epic victory royal

From 8f794673935b87fad8511368eb543d6112f25a03 Mon Sep 17 00:00:00 2001 From: Luca Peruzzo Date: Mon, 30 Sep 2024 11:27:45 +0200 Subject: [PATCH 31/64] fix config --- .prettierrc.json | 6 +- package.json | 7 +- scripts/tools/SemVer.ts | 8 +- ...tons-multi-valued-attribute.component.html | 38 +- ...uttons-multi-valued-attribute.component.ts | 14 +- .../field-errors/field-errors.component.html | 20 +- .../field-errors/field-errors.component.ts | 8 +- .../group-label/group-label.component.html | 50 +-- .../group-label/group-label.component.ts | 9 +- .../input-field-by-type.component.html | 114 ++--- .../input-field-by-type.component.ts | 24 +- .../input-tag-selects.component.html | 44 +- .../input-tag-selects.component.ts | 20 +- .../input-tag/input-tag.component.html | 86 ++-- .../input-tag/input-tag.component.ts | 15 +- .../logout-other-sessions.component.html | 30 +- .../password-wrapper.component.html | 26 +- .../password-wrapper.component.ts | 17 +- .../select-tag/select-tag.component.html | 52 +-- .../select-tag/select-tag.component.ts | 23 +- .../textarea-tag/textarea-tag.component.html | 28 +- .../textarea-tag/textarea-tag.component.ts | 14 +- .../user-profile-form-fields.component.html | 142 +++---- .../user-profile-form-fields.component.ts | 32 +- src/login/containers/template.component.html | 366 ++++++++--------- src/login/containers/template.component.ts | 26 +- src/login/pages/code/code.component.html | 42 +- src/login/pages/code/code.component.ts | 6 +- .../delete-account-confirm.component.html | 86 ++-- .../delete-account-confirm.component.ts | 9 +- .../delete-credential.component.html | 58 +-- .../delete-credential.component.ts | 17 +- src/login/pages/error/error.component.html | 40 +- src/login/pages/error/error.component.ts | 6 +- .../frontchannel-logout.component.html | 62 +-- .../frontchannel-logout.component.ts | 18 +- .../idp-review-user-profile.component.html | 72 ++-- .../idp-review-user-profile.component.ts | 25 +- src/login/pages/info/info.component.html | 90 ++-- src/login/pages/info/info.component.ts | 18 +- .../login-config-totp.component.html | 368 +++++++++-------- .../login-config-totp.component.ts | 31 +- ...n-idp-link-confirm-override.component.html | 68 +-- ...gin-idp-link-confirm-override.component.ts | 19 +- .../login-idp-link-confirm.component.html | 70 ++-- .../login-idp-link-confirm.component.ts | 17 +- .../login-idp-link-email.component.html | 62 +-- .../login-idp-link-email.component.ts | 17 +- .../login-oauth-grant.component.html | 164 ++++---- .../login-oauth-grant.component.ts | 17 +- ...th2-device-verify-user-code.component.html | 114 ++--- ...auth2-device-verify-user-code.component.ts | 19 +- .../pages/login-otp/login-otp.component.html | 192 ++++----- .../pages/login-otp/login-otp.component.ts | 14 +- .../login-page-expired.component.html | 62 +-- .../login-page-expired.component.ts | 17 +- ...ys-conditional-authenticate.component.html | 364 ++++++++-------- ...keys-conditional-authenticate.component.ts | 11 +- .../login-password.component.html | 164 ++++---- .../login-password.component.ts | 23 +- ...-recovery-authn-code-config.component.html | 284 ++++++------- ...in-recovery-authn-code-config.component.ts | 27 +- ...n-recovery-authn-code-input.component.html | 134 +++--- ...gin-recovery-authn-code-input.component.ts | 22 +- .../login-reset-otp.component.html | 120 +++--- .../login-reset-otp.component.ts | 14 +- .../login-reset-password.component.html | 168 ++++---- .../login-reset-password.component.ts | 17 +- .../login-update-password.component.html | 214 +++++----- .../login-update-password.component.ts | 31 +- .../login-update-profile.component.html | 106 ++--- .../login-update-profile.component.ts | 25 +- .../login-username.component.html | 292 ++++++------- .../login-username.component.ts | 29 +- .../login-verify-email.component.html | 44 +- .../login-verify-email.component.ts | 17 +- .../login-x509-info.component.html | 192 ++++----- .../login-x509-info.component.ts | 14 +- src/login/pages/login/login.component.html | 388 +++++++++--------- src/login/pages/login/login.component.ts | 35 +- .../logout-confirm.component.html | 102 ++--- .../logout-confirm.component.ts | 14 +- .../pages/register/register.component.html | 226 +++++----- .../pages/register/register.component.ts | 15 +- .../saml-post-form.component.html | 95 +++-- .../saml-post-form.component.ts | 16 +- .../select-authenticator.component.html | 87 ++-- .../select-authenticator.component.ts | 25 +- src/login/pages/terms/terms.component.html | 64 +-- src/login/pages/terms/terms.component.ts | 14 +- .../update-email/update-email.component.html | 104 ++--- .../update-email/update-email.component.ts | 23 +- .../webauthn-authenticate.component.html | 294 +++++++------ .../webauthn-authenticate.component.ts | 34 +- .../webauthn-error.component.html | 106 ++--- .../webauthn-error.component.ts | 21 +- .../webauthn-register.component.html | 146 +++---- .../webauthn-register.component.ts | 24 +- src/tsconfig.json | 1 - 99 files changed, 3273 insertions(+), 3892 deletions(-) diff --git a/.prettierrc.json b/.prettierrc.json index 5620c63b..95dbe910 100644 --- a/.prettierrc.json +++ b/.prettierrc.json @@ -7,16 +7,18 @@ "trailingComma": "none", "bracketSpacing": true, "arrowParens": "avoid", + "singleAttributePerLine": true, "overrides": [ { - "files": "*.tsx", + "files": "*.component.ts", "options": { "printWidth": 150 } }, { - "files": "useUserProfileForm.tsx", + "files": "*.html", "options": { + "parser": "angular", "printWidth": 150 } } diff --git a/package.json b/package.json index e5e9d1c1..3fc7f252 100644 --- a/package.json +++ b/package.json @@ -9,12 +9,12 @@ "scripts": { "build": "tsx scripts/build/main.ts", "link-in-starter": "tsx scripts/link-in-starter.ts", - "_format": "prettier '**/*.{ts,tsx,json,md}'", + "_format": "prettier '**/*.{ts,html,json,md}'", "format": "yarn _format --write", "link-in-app": "tsx scripts/link-in-app.ts" }, "lint-staged": { - "*.{ts,tsx,json,md}": [ + "*.{ts,html,json,md}": [ "prettier --write" ] }, @@ -68,5 +68,6 @@ }, "publishConfig": { "access": "public" - } + }, + "packageManager": "yarn@1.22.22+sha512.a6b2f7906b721bba3d67d4aff083df04dad64c399707841b7acf00f6b133b7ac24255f2652fa22ae3534329dc6180534e98d17432037ff6fd140556e2bb3137e" } diff --git a/scripts/tools/SemVer.ts b/scripts/tools/SemVer.ts index 41be29af..5364d097 100644 --- a/scripts/tools/SemVer.ts +++ b/scripts/tools/SemVer.ts @@ -55,9 +55,7 @@ export namespace SemVer { } export function stringify(v: Omit): string { - return `${v.major}.${v.minor}.${v.patch}${ - v.rc === undefined ? '' : `-rc.${v.rc}` - }`; + return `${v.major}.${v.minor}.${v.patch}${v.rc === undefined ? '' : `-rc.${v.rc}`}`; } /** @@ -101,9 +99,7 @@ export namespace SemVer { if (compare(versionBehind, versionAhead) === 1) { throw new Error( - `Version regression ${stringify(versionBehind)} -> ${stringify( - versionAhead - )}` + `Version regression ${stringify(versionBehind)} -> ${stringify(versionAhead)}` ); } diff --git a/src/login/components/add-remove-buttons-multi-valued-attribute/add-remove-buttons-multi-valued-attribute.component.html b/src/login/components/add-remove-buttons-multi-valued-attribute/add-remove-buttons-multi-valued-attribute.component.html index 46939891..6b118761 100644 --- a/src/login/components/add-remove-buttons-multi-valued-attribute/add-remove-buttons-multi-valued-attribute.component.html +++ b/src/login/components/add-remove-buttons-multi-valued-attribute/add-remove-buttons-multi-valued-attribute.component.html @@ -1,24 +1,24 @@ @let idPostfix = attribute()?.name ?? '' + '-' + (fieldIndex() ?? 0 + 1); @if (hasRemove()) { - - @if (hasAdd()) { -  |  - } + + @if (hasAdd()) { +  |  + } } @if (hasAdd()) { - + } diff --git a/src/login/components/add-remove-buttons-multi-valued-attribute/add-remove-buttons-multi-valued-attribute.component.ts b/src/login/components/add-remove-buttons-multi-valued-attribute/add-remove-buttons-multi-valued-attribute.component.ts index c4e3995d..6f2fba71 100644 --- a/src/login/components/add-remove-buttons-multi-valued-attribute/add-remove-buttons-multi-valued-attribute.component.ts +++ b/src/login/components/add-remove-buttons-multi-valued-attribute/add-remove-buttons-multi-valued-attribute.component.ts @@ -1,10 +1,4 @@ -import { - ChangeDetectionStrategy, - Component, - computed, - input, - output -} from '@angular/core'; +import { ChangeDetectionStrategy, Component, computed, input, output } from '@angular/core'; import { Attribute } from 'keycloakify/login/KcContext'; import { MsgStrPipe } from '@keycloakify/angular/login/pipes/msg-str.pipe'; import { FormAction } from '@keycloakify/angular/login/services/user-profile-form.service'; @@ -72,11 +66,7 @@ export class AddRemoveButtonsMultiValuedAttributeComponent { }); } - private getButtonToDisplayForMultivaluedAttributeField(params: { - attribute: Attribute; - values: string[]; - fieldIndex: number; - }) { + private getButtonToDisplayForMultivaluedAttributeField(params: { attribute: Attribute; values: string[]; fieldIndex: number }) { const { attribute, values, fieldIndex } = params; const hasRemove = (() => { diff --git a/src/login/components/field-errors/field-errors.component.html b/src/login/components/field-errors/field-errors.component.html index f16db076..d543faa6 100644 --- a/src/login/components/field-errors/field-errors.component.html +++ b/src/login/components/field-errors/field-errors.component.html @@ -1,15 +1,15 @@ @let index = fieldIndex(); - @for (error of displayableErrors(); track error; let i = $index) { - @if (error.fieldIndex === index) { - - @if (displayableErrors()?.length ?? 0 - 1 !== i) { -
- } + @for (error of displayableErrors(); track error; let i = $index) { + @if (error.fieldIndex === index) { + + @if (displayableErrors()?.length ?? 0 - 1 !== i) { +
+ } + } } - }
diff --git a/src/login/components/field-errors/field-errors.component.ts b/src/login/components/field-errors/field-errors.component.ts index 8f4f61c4..57d94eb1 100644 --- a/src/login/components/field-errors/field-errors.component.ts +++ b/src/login/components/field-errors/field-errors.component.ts @@ -1,10 +1,4 @@ -import { - ChangeDetectionStrategy, - Component, - forwardRef, - inject, - input -} from '@angular/core'; +import { ChangeDetectionStrategy, Component, forwardRef, inject, input } from '@angular/core'; import { CLASSES, USE_DEFAULT_CSS } from '@keycloakify/angular/lib/public-api'; import { Attribute } from 'keycloakify/login/KcContext'; import { ClassKey } from 'keycloakify/login/lib/kcClsx'; diff --git a/src/login/components/group-label/group-label.component.html b/src/login/components/group-label/group-label.component.html index fb94f89f..95332ffb 100644 --- a/src/login/components/group-label/group-label.component.html +++ b/src/login/components/group-label/group-label.component.html @@ -1,30 +1,30 @@ @let attr = attribute(); @let groupName = groupNameRef(); @if (attr && groupName !== '') { -
- @let groupDisplayHeader = attr.group?.displayHeader ?? ''; - @let groupHeaderText = groupDisplayHeader !== '' ? groupDisplayHeader : (attr.group?.name ?? ''); -
- +
+ @let groupDisplayHeader = attr.group?.displayHeader ?? ''; + @let groupHeaderText = groupDisplayHeader !== '' ? groupDisplayHeader : (attr.group?.name ?? ''); +
+ +
+ @let groupDisplayDescription = attr.group?.displayDescription ?? ''; + @if (groupDisplayDescription !== '') { +
+ +
+ }
- @let groupDisplayDescription = attr.group?.displayDescription ?? ''; - @if (groupDisplayDescription !== '') { -
- -
- } -
} diff --git a/src/login/components/group-label/group-label.component.ts b/src/login/components/group-label/group-label.component.ts index bab6aab5..8cd3f6cc 100644 --- a/src/login/components/group-label/group-label.component.ts +++ b/src/login/components/group-label/group-label.component.ts @@ -1,11 +1,4 @@ -import { - ChangeDetectionStrategy, - Component, - computed, - forwardRef, - inject, - input -} from '@angular/core'; +import { ChangeDetectionStrategy, Component, computed, forwardRef, inject, input } from '@angular/core'; import { CLASSES, USE_DEFAULT_CSS } from '@keycloakify/angular/lib/public-api'; import { Attribute } from 'keycloakify/login/KcContext'; import { ClassKey } from 'keycloakify/login/lib/kcClsx'; diff --git a/src/login/components/input-field-by-type/input-field-by-type.component.html b/src/login/components/input-field-by-type/input-field-by-type.component.html index 4fda53bc..9a0dd8a5 100644 --- a/src/login/components/input-field-by-type/input-field-by-type.component.html +++ b/src/login/components/input-field-by-type/input-field-by-type.component.html @@ -1,63 +1,63 @@ @let attr = attribute(); @if (attr) { - @let type = attr.annotations.inputType; - @switch (type) { - @case ('textarea') { - - } - @case (type === 'select' || type === 'multiselect' ? type : '') { - - } - @case (type === 'select-radiobuttons' || type === 'multiselect-checkboxes' ? type : '') { - - } - @default { - @let values = valueOrValues(); - - @if (values && (values | toArray: true).length) { - @for (value of values; track value; let i = $index) { - + @let type = attr.annotations.inputType; + @switch (type) { + @case ('textarea') { + + } + @case (type === 'select' || type === 'multiselect' ? type : '') { + + } + @case (type === 'select-radiobuttons' || type === 'multiselect-checkboxes' ? type : '') { + } - } @else { - @if (attr.name === 'password' || attr.name === 'password-confirm') { - - - - } @else { - + @default { + @let values = valueOrValues(); + + @if (values && (values | toArray: true).length) { + @for (value of values; track value; let i = $index) { + + } + } @else { + @if (attr.name === 'password' || attr.name === 'password-confirm') { + + + + } @else { + + } + } } - } } - } } diff --git a/src/login/components/input-field-by-type/input-field-by-type.component.ts b/src/login/components/input-field-by-type/input-field-by-type.component.ts index 64f00afb..ee770364 100644 --- a/src/login/components/input-field-by-type/input-field-by-type.component.ts +++ b/src/login/components/input-field-by-type/input-field-by-type.component.ts @@ -1,21 +1,10 @@ -import { - ChangeDetectionStrategy, - Component, - computed, - forwardRef, - inject, - input, - output -} from '@angular/core'; +import { ChangeDetectionStrategy, Component, computed, forwardRef, inject, input, output } from '@angular/core'; import { CLASSES, USE_DEFAULT_CSS } from '@keycloakify/angular/lib/public-api'; import { Attribute } from 'keycloakify/login/KcContext'; import { ClassKey } from 'keycloakify/login/lib/kcClsx'; import { ComponentReference } from '@keycloakify/angular/login/classes/component-reference.class'; import { ToArrayPipe } from '@keycloakify/angular/login/pipes/to-array.pipe'; -import { - FormAction, - FormFieldError -} from '@keycloakify/angular/login/services/user-profile-form.service'; +import { FormAction, FormFieldError } from '@keycloakify/angular/login/services/user-profile-form.service'; import { InputTagSelectsComponent } from '@keycloakify/angular/login/components/input-tag-selects/input-tag-selects.component'; import { InputTagComponent } from '@keycloakify/angular/login/components/input-tag/input-tag.component'; import { PasswordWrapperComponent } from '@keycloakify/angular/login/components/password-wrapper/password-wrapper.component'; @@ -31,14 +20,7 @@ import { TextareaTagComponent } from '@keycloakify/angular/login/components/text } ` ], - imports: [ - ToArrayPipe, - TextareaTagComponent, - SelectTagComponent, - InputTagSelectsComponent, - InputTagComponent, - PasswordWrapperComponent - ], + imports: [ToArrayPipe, TextareaTagComponent, SelectTagComponent, InputTagSelectsComponent, InputTagComponent, PasswordWrapperComponent], selector: 'kc-input-field-by-type', templateUrl: 'input-field-by-type.component.html', changeDetection: ChangeDetectionStrategy.OnPush, diff --git a/src/login/components/input-tag-selects/input-tag-selects.component.html b/src/login/components/input-tag-selects/input-tag-selects.component.html index b993153d..439f40b9 100644 --- a/src/login/components/input-tag-selects/input-tag-selects.component.html +++ b/src/login/components/input-tag-selects/input-tag-selects.component.html @@ -4,26 +4,26 @@ @let classDiv = context()?.classDiv; @let attr = attribute(); @if (attr) { - @for (option of options(); track option) { -
- - -
- } + @for (option of options(); track option) { +
+ + +
+ } } diff --git a/src/login/components/input-tag-selects/input-tag-selects.component.ts b/src/login/components/input-tag-selects/input-tag-selects.component.ts index 2e5fa052..91c8fdc8 100644 --- a/src/login/components/input-tag-selects/input-tag-selects.component.ts +++ b/src/login/components/input-tag-selects/input-tag-selects.component.ts @@ -1,23 +1,11 @@ -import { - ChangeDetectionStrategy, - Component, - computed, - forwardRef, - inject, - input, - output, - Signal -} from '@angular/core'; +import { ChangeDetectionStrategy, Component, computed, forwardRef, inject, input, output, Signal } from '@angular/core'; import { CLASSES, USE_DEFAULT_CSS } from '@keycloakify/angular/lib/public-api'; import { Attribute } from 'keycloakify/login/KcContext'; import { ClassKey } from 'keycloakify/login/lib/kcClsx'; import { ComponentReference } from '@keycloakify/angular/login/classes/component-reference.class'; import { KcClassDirective } from '@keycloakify/angular/login/directives/kc-class.directive'; import { AdvancedMsgStrPipe } from '@keycloakify/angular/login/pipes/advanced-msg-str.pipe'; -import { - FormAction, - FormFieldError -} from '@keycloakify/angular/login/services/user-profile-form.service'; +import { FormAction, FormFieldError } from '@keycloakify/angular/login/services/user-profile-form.service'; @Component({ standalone: true, @@ -87,9 +75,7 @@ export class InputTagSelectsComponent extends ComponentReference { break walk; } - const validator = ( - attribute.validators as Record - )[inputOptionsFromValidation]; + const validator = (attribute.validators as Record)[inputOptionsFromValidation]; if (validator === undefined) { break walk; diff --git a/src/login/components/input-tag/input-tag.component.html b/src/login/components/input-tag/input-tag.component.html index 011b7410..5588d31d 100644 --- a/src/login/components/input-tag/input-tag.component.html +++ b/src/login/components/input-tag/input-tag.component.html @@ -1,49 +1,45 @@ @let attr = attribute(); @let index = fieldIndex(); @if (attr) { - - @if (index !== undefined) { - @let values = valueOrValues() ?? [] | toArray; - - - } + + @if (index !== undefined) { + @let values = valueOrValues() ?? [] | toArray; + + + } } diff --git a/src/login/components/input-tag/input-tag.component.ts b/src/login/components/input-tag/input-tag.component.ts index ff315bbe..dec02f38 100644 --- a/src/login/components/input-tag/input-tag.component.ts +++ b/src/login/components/input-tag/input-tag.component.ts @@ -1,12 +1,4 @@ -import { - ChangeDetectionStrategy, - Component, - computed, - forwardRef, - inject, - input, - output -} from '@angular/core'; +import { ChangeDetectionStrategy, Component, computed, forwardRef, inject, input, output } from '@angular/core'; import { CLASSES, USE_DEFAULT_CSS } from '@keycloakify/angular/lib/public-api'; import { Attribute } from 'keycloakify/login/KcContext'; import { ClassKey } from 'keycloakify/login/lib/kcClsx'; @@ -17,10 +9,7 @@ import { AdvancedMsgStrPipe } from '@keycloakify/angular/login/pipes/advanced-ms import { InputTypePipe } from '@keycloakify/angular/login/pipes/input-type.pipe'; import { ToArrayPipe } from '@keycloakify/angular/login/pipes/to-array.pipe'; import { ToNumberPipe } from '@keycloakify/angular/login/pipes/to-number.pipe'; -import { - FormAction, - FormFieldError -} from '@keycloakify/angular/login/services/user-profile-form.service'; +import { FormAction, FormFieldError } from '@keycloakify/angular/login/services/user-profile-form.service'; import { AddRemoveButtonsMultiValuedAttributeComponent } from '@keycloakify/angular/login/components/add-remove-buttons-multi-valued-attribute/add-remove-buttons-multi-valued-attribute.component'; import { FieldErrorsComponent } from '@keycloakify/angular/login/components/field-errors/field-errors.component'; diff --git a/src/login/components/logout-other-sessions/logout-other-sessions.component.html b/src/login/components/logout-other-sessions/logout-other-sessions.component.html index 788d35b0..76575806 100644 --- a/src/login/components/logout-other-sessions/logout-other-sessions.component.html +++ b/src/login/components/logout-other-sessions/logout-other-sessions.component.html @@ -1,19 +1,19 @@
-
-
- +
+
+ +
-
diff --git a/src/login/components/password-wrapper/password-wrapper.component.html b/src/login/components/password-wrapper/password-wrapper.component.html index 1a4b0283..b4e4c7a0 100644 --- a/src/login/components/password-wrapper/password-wrapper.component.html +++ b/src/login/components/password-wrapper/password-wrapper.component.html @@ -1,15 +1,15 @@
- - + +
diff --git a/src/login/components/password-wrapper/password-wrapper.component.ts b/src/login/components/password-wrapper/password-wrapper.component.ts index 0f9d372c..f3957f69 100644 --- a/src/login/components/password-wrapper/password-wrapper.component.ts +++ b/src/login/components/password-wrapper/password-wrapper.component.ts @@ -1,14 +1,5 @@ import { AsyncPipe } from '@angular/common'; -import { - ChangeDetectionStrategy, - Component, - forwardRef, - inject, - input, - Renderer2, - signal, - WritableSignal -} from '@angular/core'; +import { ChangeDetectionStrategy, Component, forwardRef, inject, input, Renderer2, signal, WritableSignal } from '@angular/core'; import { CLASSES, USE_DEFAULT_CSS } from '@keycloakify/angular/lib/public-api'; import { ClassKey } from 'keycloakify/login/lib/kcClsx'; import { ComponentReference } from '@keycloakify/angular/login/classes/component-reference.class'; @@ -51,11 +42,7 @@ export class PasswordWrapperComponent extends ComponentReference { private setPasswordInputType(): void { const input = document.getElementById(this.passwordInputId()); if (input) { - this.renderer.setProperty( - input, - 'type', - this.isPasswordRevealed() ? 'text' : 'password' - ); + this.renderer.setProperty(input, 'type', this.isPasswordRevealed() ? 'text' : 'password'); } } } diff --git a/src/login/components/select-tag/select-tag.component.html b/src/login/components/select-tag/select-tag.component.html index ede6f1ec..f74e4153 100644 --- a/src/login/components/select-tag/select-tag.component.html +++ b/src/login/components/select-tag/select-tag.component.html @@ -1,31 +1,31 @@ @let attr = attribute(); @let multiple = isMultiple(); @if (attr) { - + @if (!multiple) { + } - - } - + @for (option of options(); track option) { + + } + } diff --git a/src/login/components/select-tag/select-tag.component.ts b/src/login/components/select-tag/select-tag.component.ts index 414551ba..352e83ac 100644 --- a/src/login/components/select-tag/select-tag.component.ts +++ b/src/login/components/select-tag/select-tag.component.ts @@ -1,12 +1,4 @@ -import { - ChangeDetectionStrategy, - Component, - computed, - forwardRef, - inject, - input, - output -} from '@angular/core'; +import { ChangeDetectionStrategy, Component, computed, forwardRef, inject, input, output } from '@angular/core'; import { CLASSES, USE_DEFAULT_CSS } from '@keycloakify/angular/lib/public-api'; import { Attribute } from 'keycloakify/login/KcContext'; import { ClassKey } from 'keycloakify/login/lib/kcClsx'; @@ -14,10 +6,7 @@ import { ComponentReference } from '@keycloakify/angular/login/classes/component import { KcClassDirective } from '@keycloakify/angular/login/directives/kc-class.directive'; import { AdvancedMsgStrPipe } from '@keycloakify/angular/login/pipes/advanced-msg-str.pipe'; import { ToNumberPipe } from '@keycloakify/angular/login/pipes/to-number.pipe'; -import { - FormAction, - FormFieldError -} from '@keycloakify/angular/login/services/user-profile-form.service'; +import { FormAction, FormFieldError } from '@keycloakify/angular/login/services/user-profile-form.service'; @Component({ standalone: true, @@ -62,9 +51,7 @@ export class SelectTagComponent extends ComponentReference { break walk; } - const validator = ( - attribute.validators as Record - )[inputOptionsFromValidation]; + const validator = (attribute.validators as Record)[inputOptionsFromValidation]; if (validator === undefined) { break walk; @@ -89,9 +76,7 @@ export class SelectTagComponent extends ComponentReference { name: this.attribute()?.name ?? '', valueOrValues: (() => { if (this.isMultiple()) { - return Array.from( - (event.target as HTMLSelectElement).selectedOptions - ).map(option => option.value); + return Array.from((event.target as HTMLSelectElement).selectedOptions).map(option => option.value); } return (event.target as HTMLSelectElement).value; diff --git a/src/login/components/textarea-tag/textarea-tag.component.html b/src/login/components/textarea-tag/textarea-tag.component.html index 2a10a52a..ab2815d1 100644 --- a/src/login/components/textarea-tag/textarea-tag.component.html +++ b/src/login/components/textarea-tag/textarea-tag.component.html @@ -1,18 +1,16 @@ @let attr = attribute(); @if (attr) { - + } diff --git a/src/login/components/textarea-tag/textarea-tag.component.ts b/src/login/components/textarea-tag/textarea-tag.component.ts index b7eca271..bad80949 100644 --- a/src/login/components/textarea-tag/textarea-tag.component.ts +++ b/src/login/components/textarea-tag/textarea-tag.component.ts @@ -1,21 +1,11 @@ -import { - ChangeDetectionStrategy, - Component, - forwardRef, - inject, - input, - output -} from '@angular/core'; +import { ChangeDetectionStrategy, Component, forwardRef, inject, input, output } from '@angular/core'; import { CLASSES, USE_DEFAULT_CSS } from '@keycloakify/angular/lib/public-api'; import { Attribute } from 'keycloakify/login/KcContext'; import { ClassKey } from 'keycloakify/login/lib/kcClsx'; import { ComponentReference } from '@keycloakify/angular/login/classes/component-reference.class'; import { KcClassDirective } from '@keycloakify/angular/login/directives/kc-class.directive'; import { ToNumberPipe } from '@keycloakify/angular/login/pipes/to-number.pipe'; -import { - FormAction, - FormFieldError -} from '@keycloakify/angular/login/services/user-profile-form.service'; +import { FormAction, FormFieldError } from '@keycloakify/angular/login/services/user-profile-form.service'; @Component({ standalone: true, diff --git a/src/login/components/user-profile-form-fields/user-profile-form-fields.component.html b/src/login/components/user-profile-form-fields/user-profile-form-fields.component.html index 67da0e34..f22853ee 100644 --- a/src/login/components/user-profile-form-fields/user-profile-form-fields.component.html +++ b/src/login/components/user-profile-form-fields/user-profile-form-fields.component.html @@ -1,85 +1,85 @@ @let formFieldStates = formState().formFieldStates; @for (fieldState of formFieldStates; track fieldState.attribute) { - - + - @if (beforeField) { - + + } + +
- - } +
+ +
-
-
- -
+
+ @if (fieldState.attribute.annotations.inputHelperTextBefore) { +
+ {{ fieldState.attribute.annotations.inputHelperTextBefore | advancedMsgStr }} +
+ } -
- @if (fieldState.attribute.annotations.inputHelperTextBefore) { -
- {{ fieldState.attribute.annotations.inputHelperTextBefore | advancedMsgStr }} -
- } + + - - + + + @if (fieldState.attribute.annotations.inputHelperTextAfter) { +
+ {{ fieldState.attribute.annotations.inputHelperTextAfter | advancedMsgStr }} +
+ } - - - @if (fieldState.attribute.annotations.inputHelperTextAfter) { -
- {{ fieldState.attribute.annotations.inputHelperTextAfter | advancedMsgStr }} + @if (afterField) { + + + } +
- } - - @if (afterField) { - - - } -
-
} diff --git a/src/login/components/user-profile-form-fields/user-profile-form-fields.component.ts b/src/login/components/user-profile-form-fields/user-profile-form-fields.component.ts index 1cd33a81..37974a81 100644 --- a/src/login/components/user-profile-form-fields/user-profile-form-fields.component.ts +++ b/src/login/components/user-profile-form-fields/user-profile-form-fields.component.ts @@ -1,29 +1,12 @@ import { NgTemplateOutlet } from '@angular/common'; -import { - ChangeDetectionStrategy, - Component, - ContentChild, - effect, - forwardRef, - inject, - output, - TemplateRef -} from '@angular/core'; -import { - DO_MAKE_USER_CONFIRM_PASSWORD, - KC_CONTEXT, - CLASSES, - USE_DEFAULT_CSS -} from '@keycloakify/angular/lib/public-api'; +import { ChangeDetectionStrategy, Component, ContentChild, effect, forwardRef, inject, output, TemplateRef } from '@angular/core'; +import { DO_MAKE_USER_CONFIRM_PASSWORD, KC_CONTEXT, CLASSES, USE_DEFAULT_CSS } from '@keycloakify/angular/lib/public-api'; import { ClassKey } from 'keycloakify/login/lib/kcClsx'; import { KcContext } from 'keycloakify/login/KcContext'; import { ComponentReference } from '@keycloakify/angular/login/classes/component-reference.class'; import { KcClassDirective } from '@keycloakify/angular/login/directives/kc-class.directive'; import { AdvancedMsgStrPipe } from '@keycloakify/angular/login/pipes/advanced-msg-str.pipe'; -import { - FormAction, - UserProfileFormService -} from '@keycloakify/angular/login/services/user-profile-form.service'; +import { FormAction, UserProfileFormService } from '@keycloakify/angular/login/services/user-profile-form.service'; import { FieldErrorsComponent } from '@keycloakify/angular/login/components/field-errors/field-errors.component'; import { GroupLabelComponent } from '@keycloakify/angular/login/components/group-label/group-label.component'; import { InputFieldByTypeComponent } from '@keycloakify/angular/login/components/input-field-by-type/input-field-by-type.component'; @@ -37,14 +20,7 @@ import { InputFieldByTypeComponent } from '@keycloakify/angular/login/components } ` ], - imports: [ - KcClassDirective, - FieldErrorsComponent, - InputFieldByTypeComponent, - GroupLabelComponent, - NgTemplateOutlet, - AdvancedMsgStrPipe - ], + imports: [KcClassDirective, FieldErrorsComponent, InputFieldByTypeComponent, GroupLabelComponent, NgTemplateOutlet, AdvancedMsgStrPipe], selector: 'kc-user-profile-form-fields', templateUrl: 'user-profile-form-fields.component.html', changeDetection: ChangeDetectionStrategy.OnPush, diff --git a/src/login/containers/template.component.html b/src/login/containers/template.component.html index 6cb38d9d..fd2014c2 100644 --- a/src/login/containers/template.component.html +++ b/src/login/containers/template.component.html @@ -6,198 +6,198 @@ @let isReadyToRender = isReadyToRender$ | async; @if (isReadyToRender) { -
-
-
-
-
-
- -
-
- - @if (i18n.enabledLanguages.length > 1) { -
+
+
- +
-
- } +
- - - @if (auth && !auth.showUsername && !auth.showResetCredentials) { -

- -

- } @else { -
- - - - -
- } -
+
+
+ + @if (i18n.enabledLanguages.length > 1) { +
+
+ +
+
+ } - @if (displayRequiredFields()) { -
-
- - * - {{ 'requiredFields' | msgStr }} - -
-
- -
-
- } @else { - - } -
+ + + @if (auth && !auth.showUsername && !auth.showResetCredentials) { +

+ +

+ } @else { +
+ + + + +
+ } +
-
-
- - @if (displayMessage() && message && (message.type !== 'warning' || !isAppInitiatedAction)) { -
-
- @switch (message.type) { - @case ('success') { - - } - @case ('warning') { - - } - @case ('info') { - - } - @case ('error') { - - } + @if (displayRequiredFields()) { +
+
+ + * + {{ 'requiredFields' | msgStr }} + +
+
+ +
+
+ } @else { + } -
- -
- } - - - @if (!!auth && auth?.showTryAnotherWayLink) { -
- -
- } +
- - - @if (displayInfo()) { -
-
- -
+
+
+ + @if (displayMessage() && message && (message.type !== 'warning' || !isAppInitiatedAction)) { +
+
+ @switch (message.type) { + @case ('success') { + + } + @case ('warning') { + + } + @case ('info') { + + } + @case ('error') { + + } + } +
+ +
+ } + + + @if (!!auth && auth?.showTryAnotherWayLink) { +
+ +
+ } + + + + @if (displayInfo()) { +
+
+ +
+
+ } +
- }
-
-
} diff --git a/src/login/containers/template.component.ts b/src/login/containers/template.component.ts index 78447d27..798b72fd 100644 --- a/src/login/containers/template.component.ts +++ b/src/login/containers/template.component.ts @@ -1,20 +1,7 @@ import { AsyncPipe, NgTemplateOutlet } from '@angular/common'; -import { - ChangeDetectionStrategy, - Component, - forwardRef, - inject, - input, - OnInit, - Renderer2 -} from '@angular/core'; +import { ChangeDetectionStrategy, Component, forwardRef, inject, input, OnInit, Renderer2 } from '@angular/core'; import { Meta, Title } from '@angular/platform-browser'; -import { - CLASSES, - I18N, - KC_CONTEXT, - USE_DEFAULT_CSS -} from '@keycloakify/angular/lib/public-api'; +import { CLASSES, I18N, KC_CONTEXT, USE_DEFAULT_CSS } from '@keycloakify/angular/lib/public-api'; import type { I18n } from '@keycloakify/angular/login/i18n'; import { KcContext } from 'keycloakify/login/KcContext/KcContext'; import { ClassKey, getKcClsx } from 'keycloakify/login/lib/kcClsx'; @@ -58,13 +45,8 @@ export class TemplateComponent extends ComponentReference implements OnInit { constructor() { super(); - this.title.setTitle( - this.documentTitle() ?? - this.i18n.msgStr('loginTitle', this.kcContext.realm.displayName) - ); - this.isReadyToRender$ = this.loginResourceInjectorService.injectResource( - this.doUseDefaultCss - ); + this.title.setTitle(this.documentTitle() ?? this.i18n.msgStr('loginTitle', this.kcContext.realm.displayName)); + this.isReadyToRender$ = this.loginResourceInjectorService.injectResource(this.doUseDefaultCss); } ngOnInit() { diff --git a/src/login/pages/code/code.component.html b/src/login/pages/code/code.component.html index 225d9ae9..ebe92969 100644 --- a/src/login/pages/code/code.component.html +++ b/src/login/pages/code/code.component.html @@ -1,26 +1,26 @@ @let code = kcContext.code; - - @if (code.success) { - {{ 'codeSuccessTitle' | msgStr }} - } @else { - {{ 'codeErrorTitle' | msgStr: code.error }} - } - + + @if (code.success) { + {{ 'codeSuccessTitle' | msgStr }} + } @else { + {{ 'codeErrorTitle' | msgStr: code.error }} + } + - -
- @if (code.success) { -

{{ 'copyCodeInstruction' | msgStr }}

- - } @else { -

{{ code.error }}

- } -
-
+ +
+ @if (code.success) { +

{{ 'copyCodeInstruction' | msgStr }}

+ + } @else { +

{{ code.error }}

+ } +
+
diff --git a/src/login/pages/code/code.component.ts b/src/login/pages/code/code.component.ts index af8f707a..b31bd24f 100644 --- a/src/login/pages/code/code.component.ts +++ b/src/login/pages/code/code.component.ts @@ -1,9 +1,5 @@ import { ChangeDetectionStrategy, Component, forwardRef, inject } from '@angular/core'; -import { - CLASSES, - KC_CONTEXT, - USE_DEFAULT_CSS -} from '@keycloakify/angular/lib/public-api'; +import { CLASSES, KC_CONTEXT, USE_DEFAULT_CSS } from '@keycloakify/angular/lib/public-api'; import { ClassKey } from 'keycloakify/login/lib/kcClsx'; import { KcContext } from 'keycloakify/login/KcContext'; import { ComponentReference } from '@keycloakify/angular/login/classes/component-reference.class'; diff --git a/src/login/pages/delete-account-confirm/delete-account-confirm.component.html b/src/login/pages/delete-account-confirm/delete-account-confirm.component.html index 3cf3b017..a68ffc75 100644 --- a/src/login/pages/delete-account-confirm/delete-account-confirm.component.html +++ b/src/login/pages/delete-account-confirm/delete-account-confirm.component.html @@ -1,46 +1,48 @@ @let url = kcContext.url; @let triggered_from_aia = kcContext.triggered_from_aia; - - {{ 'deleteAccountConfirm' | msgStr }} - - -
-
- - {{ 'irreversibleAction' | msgStr }} -
-

{{ 'deletingImplies' | msgStr }}

-
    -
  • {{ 'loggingOutImmediately' | msgStr }}
  • -
  • {{ 'errasingData' | msgStr }}
  • -
- -
- - @if (triggered_from_aia) { - - } -
-
-
+ + {{ 'deleteAccountConfirm' | msgStr }} + + +
+
+ + {{ 'irreversibleAction' | msgStr }} +
+

{{ 'deletingImplies' | msgStr }}

+
    +
  • {{ 'loggingOutImmediately' | msgStr }}
  • +
  • {{ 'errasingData' | msgStr }}
  • +
+ +
+ + @if (triggered_from_aia) { + + } +
+
+
diff --git a/src/login/pages/delete-account-confirm/delete-account-confirm.component.ts b/src/login/pages/delete-account-confirm/delete-account-confirm.component.ts index 99112020..7f2f0271 100644 --- a/src/login/pages/delete-account-confirm/delete-account-confirm.component.ts +++ b/src/login/pages/delete-account-confirm/delete-account-confirm.component.ts @@ -1,9 +1,5 @@ import { ChangeDetectionStrategy, Component, forwardRef, inject } from '@angular/core'; -import { - CLASSES, - KC_CONTEXT, - USE_DEFAULT_CSS -} from '@keycloakify/angular/lib/public-api'; +import { CLASSES, KC_CONTEXT, USE_DEFAULT_CSS } from '@keycloakify/angular/lib/public-api'; import { ClassKey } from 'keycloakify/login/lib/kcClsx'; import { KcContext } from 'keycloakify/login/KcContext'; import { ComponentReference } from '@keycloakify/angular/login/classes/component-reference.class'; @@ -25,8 +21,7 @@ import { MsgStrPipe } from '@keycloakify/angular/login/pipes/msg-str.pipe'; ] }) export class DeleteAccountConfirmComponent extends ComponentReference { - kcContext = - inject>(KC_CONTEXT); + kcContext = inject>(KC_CONTEXT); override doUseDefaultCss = inject(USE_DEFAULT_CSS); override classes = inject>>(CLASSES); } diff --git a/src/login/pages/delete-credential/delete-credential.component.html b/src/login/pages/delete-credential/delete-credential.component.html index 7e8c3a18..f71a82b6 100644 --- a/src/login/pages/delete-credential/delete-credential.component.html +++ b/src/login/pages/delete-credential/delete-credential.component.html @@ -1,35 +1,35 @@ @let url = kcContext.url; @let credentialLabel = kcContext.credentialLabel; - - {{ 'deleteCredentialTitle' | msgStr: credentialLabel }} - - -
- {{ 'deleteCredentialMessage' | msgStr: credentialLabel }} -
+ + {{ 'deleteCredentialTitle' | msgStr: credentialLabel }} + + +
+ {{ 'deleteCredentialMessage' | msgStr: credentialLabel }} +
-
- + + - -
-
-
+ + +
+
diff --git a/src/login/pages/delete-credential/delete-credential.component.ts b/src/login/pages/delete-credential/delete-credential.component.ts index bfe35234..996371ef 100644 --- a/src/login/pages/delete-credential/delete-credential.component.ts +++ b/src/login/pages/delete-credential/delete-credential.component.ts @@ -1,15 +1,5 @@ -import { - ChangeDetectionStrategy, - Component, - forwardRef, - inject, - input -} from '@angular/core'; -import { - CLASSES, - KC_CONTEXT, - USE_DEFAULT_CSS -} from '@keycloakify/angular/lib/public-api'; +import { ChangeDetectionStrategy, Component, forwardRef, inject, input } from '@angular/core'; +import { CLASSES, KC_CONTEXT, USE_DEFAULT_CSS } from '@keycloakify/angular/lib/public-api'; import { ClassKey } from 'keycloakify/login/lib/kcClsx'; import { KcContext } from 'keycloakify/login/KcContext'; import { ComponentReference } from '@keycloakify/angular/login/classes/component-reference.class'; @@ -31,8 +21,7 @@ import { MsgStrPipe } from '@keycloakify/angular/login/pipes/msg-str.pipe'; ] }) export class DeleteCredentialComponent extends ComponentReference { - kcContext = - inject>(KC_CONTEXT); + kcContext = inject>(KC_CONTEXT); override doUseDefaultCss = inject(USE_DEFAULT_CSS); override classes = inject>>(CLASSES); displayRequiredFields = input(false); diff --git a/src/login/pages/error/error.component.html b/src/login/pages/error/error.component.html index 5a355180..74479db4 100644 --- a/src/login/pages/error/error.component.html +++ b/src/login/pages/error/error.component.html @@ -2,24 +2,24 @@ @let skipLink = kcContext.skipLink; @let client = kcContext.client; - - {{ 'errorTitle' | msgStr }} - - -
-

- @if (!skipLink && !!client?.baseUrl) { -

- -

- } -
-
+ + {{ 'errorTitle' | msgStr }} + + +
+

+ @if (!skipLink && !!client?.baseUrl) { +

+ +

+ } +
+
diff --git a/src/login/pages/error/error.component.ts b/src/login/pages/error/error.component.ts index 0b84b9e1..3db03710 100644 --- a/src/login/pages/error/error.component.ts +++ b/src/login/pages/error/error.component.ts @@ -1,9 +1,5 @@ import { ChangeDetectionStrategy, Component, forwardRef, inject } from '@angular/core'; -import { - CLASSES, - KC_CONTEXT, - USE_DEFAULT_CSS -} from '@keycloakify/angular/lib/public-api'; +import { CLASSES, KC_CONTEXT, USE_DEFAULT_CSS } from '@keycloakify/angular/lib/public-api'; import { ClassKey } from 'keycloakify/login/lib/kcClsx'; import { KcContext } from 'keycloakify/login/KcContext'; import { ComponentReference } from '@keycloakify/angular/login/classes/component-reference.class'; diff --git a/src/login/pages/frontchannel-logout/frontchannel-logout.component.html b/src/login/pages/frontchannel-logout/frontchannel-logout.component.html index 24864ede..9954042e 100644 --- a/src/login/pages/frontchannel-logout/frontchannel-logout.component.html +++ b/src/login/pages/frontchannel-logout/frontchannel-logout.component.html @@ -1,35 +1,35 @@ @let logout = kcContext.logout; - - {{ 'frontchannel-logout.title' | msgStr }} - - -

{{ 'frontchannel-logout.message' | msgStr }}

-
    - @for (client of logout.clients; track client.name; let idx = $index) { -
  • - {{ client.name }} - -
  • - } -
- @if (logout.logoutRedirectUri) { - - {{ 'doContinue' | msgStr }} - - } -
+ + {{ 'frontchannel-logout.title' | msgStr }} + + +

{{ 'frontchannel-logout.message' | msgStr }}

+
    + @for (client of logout.clients; track client.name; let idx = $index) { +
  • + {{ client.name }} + +
  • + } +
+ @if (logout.logoutRedirectUri) { + + {{ 'doContinue' | msgStr }} + + } +
diff --git a/src/login/pages/frontchannel-logout/frontchannel-logout.component.ts b/src/login/pages/frontchannel-logout/frontchannel-logout.component.ts index 03a84917..429dd2d7 100644 --- a/src/login/pages/frontchannel-logout/frontchannel-logout.component.ts +++ b/src/login/pages/frontchannel-logout/frontchannel-logout.component.ts @@ -1,16 +1,5 @@ -import { - ChangeDetectionStrategy, - Component, - forwardRef, - inject, - input, - OnInit -} from '@angular/core'; -import { - CLASSES, - KC_CONTEXT, - USE_DEFAULT_CSS -} from '@keycloakify/angular/lib/public-api'; +import { ChangeDetectionStrategy, Component, forwardRef, inject, input, OnInit } from '@angular/core'; +import { CLASSES, KC_CONTEXT, USE_DEFAULT_CSS } from '@keycloakify/angular/lib/public-api'; import { ClassKey } from 'keycloakify/login/lib/kcClsx'; import { KcContext } from 'keycloakify/login/KcContext'; import { ComponentReference } from '@keycloakify/angular/login/classes/component-reference.class'; @@ -32,8 +21,7 @@ import { MsgStrPipe } from '@keycloakify/angular/login/pipes/msg-str.pipe'; ] }) export class FrontchannelLogoutComponent extends ComponentReference implements OnInit { - kcContext = - inject>(KC_CONTEXT); + kcContext = inject>(KC_CONTEXT); override doUseDefaultCss = inject(USE_DEFAULT_CSS); override classes = inject>>(CLASSES); displayRequiredFields = input(false); diff --git a/src/login/pages/idp-review-user-profile/idp-review-user-profile.component.html b/src/login/pages/idp-review-user-profile/idp-review-user-profile.component.html index 44e1c7b2..88e1818f 100644 --- a/src/login/pages/idp-review-user-profile/idp-review-user-profile.component.html +++ b/src/login/pages/idp-review-user-profile/idp-review-user-profile.component.html @@ -1,41 +1,41 @@ @let url = kcContext.url; - - {{ 'loginIdpReviewProfileTitle' | msgStr }} - - -
- -
-
+ {{ 'loginIdpReviewProfileTitle' | msgStr }} + + + -
-
-
- -
-
- -
+ +
+
+
+
+
+ +
+
+ +
diff --git a/src/login/pages/idp-review-user-profile/idp-review-user-profile.component.ts b/src/login/pages/idp-review-user-profile/idp-review-user-profile.component.ts index d6ab5aff..e4df5f20 100644 --- a/src/login/pages/idp-review-user-profile/idp-review-user-profile.component.ts +++ b/src/login/pages/idp-review-user-profile/idp-review-user-profile.component.ts @@ -1,16 +1,5 @@ -import { - ChangeDetectionStrategy, - Component, - forwardRef, - inject, - input, - signal -} from '@angular/core'; -import { - CLASSES, - KC_CONTEXT, - USE_DEFAULT_CSS -} from '@keycloakify/angular/lib/public-api'; +import { ChangeDetectionStrategy, Component, forwardRef, inject, input, signal } from '@angular/core'; +import { CLASSES, KC_CONTEXT, USE_DEFAULT_CSS } from '@keycloakify/angular/lib/public-api'; import { ClassKey } from 'keycloakify/login/lib/kcClsx'; import { KcContext } from 'keycloakify/login/KcContext'; import { ComponentReference } from '@keycloakify/angular/login/classes/component-reference.class'; @@ -21,12 +10,7 @@ import { MsgStrPipe } from '@keycloakify/angular/login/pipes/msg-str.pipe'; @Component({ standalone: true, - imports: [ - TemplateComponent, - MsgStrPipe, - UserProfileFormFieldsComponent, - KcClassDirective - ], + imports: [TemplateComponent, MsgStrPipe, UserProfileFormFieldsComponent, KcClassDirective], selector: 'kc-root', templateUrl: 'idp-review-user-profile.component.html', changeDetection: ChangeDetectionStrategy.OnPush, @@ -38,8 +22,7 @@ import { MsgStrPipe } from '@keycloakify/angular/login/pipes/msg-str.pipe'; ] }) export class IdpReviewUserProfileComponent extends ComponentReference { - kcContext = - inject>(KC_CONTEXT); + kcContext = inject>(KC_CONTEXT); displayRequiredFields = input(true); documentTitle = input(); bodyClassName = input(); diff --git a/src/login/pages/info/info.component.html b/src/login/pages/info/info.component.html index e5a73a73..6e252b6b 100644 --- a/src/login/pages/info/info.component.html +++ b/src/login/pages/info/info.component.html @@ -5,50 +5,50 @@ @let messageHeader = kcContext.messageHeader; @let message = kcContext.message; - - - - -
-

- @if (!skipLink) { - @if (pageRedirectUri) { -

- - -

- } - @if (actionUri) { -

- - -

- } - @if (client.baseUrl) { -

- - -

- } - } -
-
+ + + + +
+

+ @if (!skipLink) { + @if (pageRedirectUri) { +

+ + +

+ } + @if (actionUri) { +

+ + +

+ } + @if (client.baseUrl) { +

+ + +

+ } + } +
+
diff --git a/src/login/pages/info/info.component.ts b/src/login/pages/info/info.component.ts index e7df1a30..c0729c9f 100644 --- a/src/login/pages/info/info.component.ts +++ b/src/login/pages/info/info.component.ts @@ -1,15 +1,5 @@ -import { - ChangeDetectionStrategy, - Component, - forwardRef, - inject, - input -} from '@angular/core'; -import { - CLASSES, - KC_CONTEXT, - USE_DEFAULT_CSS -} from '@keycloakify/angular/lib/public-api'; +import { ChangeDetectionStrategy, Component, forwardRef, inject, input } from '@angular/core'; +import { CLASSES, KC_CONTEXT, USE_DEFAULT_CSS } from '@keycloakify/angular/lib/public-api'; import { ClassKey } from 'keycloakify/login/lib/kcClsx'; import { KcContext } from 'keycloakify/login/KcContext'; import { ComponentReference } from '@keycloakify/angular/login/classes/component-reference.class'; @@ -53,9 +43,7 @@ export class InfoComponent extends ComponentReference { html += ''; html += this.kcContext.requiredActions - .map(requiredAction => - this.advancedMsgStr.transform(`requiredAction.${requiredAction}`) - ) + .map(requiredAction => this.advancedMsgStr.transform(`requiredAction.${requiredAction}`)) .join(', '); html += ''; diff --git a/src/login/pages/login-config-totp/login-config-totp.component.html b/src/login/pages/login-config-totp/login-config-totp.component.html index 56310e7e..44df0c78 100644 --- a/src/login/pages/login-config-totp/login-config-totp.component.html +++ b/src/login/pages/login-config-totp/login-config-totp.component.html @@ -4,187 +4,197 @@ @let mode = kcContext.mode; @let isAppInitiatedAction = kcContext.isAppInitiatedAction; - - {{ 'loginTotpStep1' | msgStr }} - - -
    -
  1. -

    {{ 'loginTotpStep1' | msgStr }}

    -
      - @for (app of totp.supportedApplications; track app) { -
    • {{ app | advancedMsgStr }}
    • - } -
    -
  2. - @if (kcContext.mode === 'manual') { -
  3. -

    {{ 'loginTotpManualStep2' | msgStr }}

    -

    - {{ totp.totpSecretEncoded }} -

    -

    - - {{ 'loginTotpScanBarcode' | msgStr }} - -

    -
  4. -
  5. -

    {{ 'loginTotpManualStep3' | msgStr }}

    -

    -
      -
    • - {{ 'loginTotpType' | msgStr }}: {{ 'loginTotp.' + totp.policy.type | advancedMsgStr }} + + {{ 'loginTotpStep1' | msgStr }} + + +
        +
      1. +

        {{ 'loginTotpStep1' | msgStr }}

        +
          + @for (app of totp.supportedApplications; track app) { +
        • {{ app | advancedMsgStr }}
        • + } +
      2. -
      3. {{ 'loginTotpAlgorithm' | msgStr }}: {{ totp.policy.getAlgorithmKey() }}
      4. -
      5. {{ 'loginTotpDigits' | msgStr }}: {{ totp.policy.digits }}
      6. - @if (totp.policy.type === 'totp') { -
      7. {{ 'loginTotpInterval' | msgStr }}: {{ totp.policy.period }}
      8. + @if (kcContext.mode === 'manual') { +
      9. +

        {{ 'loginTotpManualStep2' | msgStr }}

        +

        + {{ totp.totpSecretEncoded }} +

        +

        + + {{ 'loginTotpScanBarcode' | msgStr }} + +

        +
      10. +
      11. +

        {{ 'loginTotpManualStep3' | msgStr }}

        +

        +
          +
        • + {{ 'loginTotpType' | msgStr }}: + {{ 'loginTotp.' + totp.policy.type | advancedMsgStr }} +
        • +
        • + {{ 'loginTotpAlgorithm' | msgStr }}: + {{ totp.policy.getAlgorithmKey() }} +
        • +
        • {{ 'loginTotpDigits' | msgStr }}: {{ totp.policy.digits }}
        • + @if (totp.policy.type === 'totp') { +
        • + {{ 'loginTotpInterval' | msgStr }}: + {{ totp.policy.period }} +
        • + } @else { +
        • + {{ 'loginTotpCounter' | msgStr }}: + {{ totp.policy.initialCounter }} +
        • + } +
        +
      12. } @else { -
      13. {{ 'loginTotpCounter' | msgStr }}: {{ totp.policy.initialCounter }}
      14. +
      15. +

        {{ 'loginTotpStep2' | msgStr }}

        + Figure: Barcode +
        +

        + + {{ 'loginTotpUnableToScan' | msgStr }} + +

        +
      16. } -
    -
  6. - } @else { -
  7. -

    {{ 'loginTotpStep2' | msgStr }}

    - Figure: Barcode -
    -

    - - {{ 'loginTotpUnableToScan' | msgStr }} - -

    -
  8. - } -
  9. -

    {{ 'loginTotpStep3' | msgStr }}

    -

    {{ 'loginTotpStep3DeviceName' | msgStr }}

    -
  10. -
-
-
-
- - * -
-
- - @if (messagesPerField.existsError('totp')) { - - } -
- - @if (mode) { - - } -
-
-
- - @if (totp.otpCredentials.length >= 1) { - * - } -
-
- - @if (messagesPerField.existsError('userLabel')) { - - } -
-
-
- -
- - @if (isAppInitiatedAction) { - - - } @else { - - } -
-> +
+
+ + * +
+
+ + @if (messagesPerField.existsError('totp')) { + + } +
+ + @if (mode) { + + } +
+
+
+ + @if (totp.otpCredentials.length >= 1) { + * + } +
+
+ + @if (messagesPerField.existsError('userLabel')) { + + } +
+
+
+ +
+ + @if (isAppInitiatedAction) { + + + } @else { + + } + + + diff --git a/src/login/pages/login-config-totp/login-config-totp.component.ts b/src/login/pages/login-config-totp/login-config-totp.component.ts index f7524155..b8ee6d3e 100644 --- a/src/login/pages/login-config-totp/login-config-totp.component.ts +++ b/src/login/pages/login-config-totp/login-config-totp.component.ts @@ -1,15 +1,5 @@ -import { - ChangeDetectionStrategy, - Component, - forwardRef, - inject, - input -} from '@angular/core'; -import { - CLASSES, - KC_CONTEXT, - USE_DEFAULT_CSS -} from '@keycloakify/angular/lib/public-api'; +import { ChangeDetectionStrategy, Component, forwardRef, inject, input } from '@angular/core'; +import { CLASSES, KC_CONTEXT, USE_DEFAULT_CSS } from '@keycloakify/angular/lib/public-api'; import { ClassKey } from 'keycloakify/login/lib/kcClsx'; import { KcContext } from 'keycloakify/login/KcContext'; import { ComponentReference } from '@keycloakify/angular/login/classes/component-reference.class'; @@ -22,14 +12,7 @@ import { MsgStrPipe } from '@keycloakify/angular/login/pipes/msg-str.pipe'; @Component({ standalone: true, - imports: [ - TemplateComponent, - MsgStrPipe, - AdvancedMsgStrPipe, - KcClassDirective, - KcSanitizePipe, - LogoutOtherSessionsComponent - ], + imports: [TemplateComponent, MsgStrPipe, AdvancedMsgStrPipe, KcClassDirective, KcSanitizePipe, LogoutOtherSessionsComponent], selector: 'kc-root', templateUrl: 'login-config-totp.component.html', changeDetection: ChangeDetectionStrategy.OnPush, @@ -41,8 +24,7 @@ import { MsgStrPipe } from '@keycloakify/angular/login/pipes/msg-str.pipe'; ] }) export class LoginConfigTotpComponent extends ComponentReference { - kcContext = - inject>(KC_CONTEXT); + kcContext = inject>(KC_CONTEXT); override doUseDefaultCss = inject(USE_DEFAULT_CSS); override classes = inject>>(CLASSES); @@ -50,8 +32,5 @@ export class LoginConfigTotpComponent extends ComponentReference { documentTitle = input(); bodyClassName = input(); displayInfo: boolean = false; - displayMessage: boolean = this.kcContext.messagesPerField.existsError( - 'totp', - 'userLabel' - ); + displayMessage: boolean = this.kcContext.messagesPerField.existsError('totp', 'userLabel'); } diff --git a/src/login/pages/login-idp-link-confirm-override/login-idp-link-confirm-override.component.html b/src/login/pages/login-idp-link-confirm-override/login-idp-link-confirm-override.component.html index 9e934f96..5e6ba57f 100644 --- a/src/login/pages/login-idp-link-confirm-override/login-idp-link-confirm-override.component.html +++ b/src/login/pages/login-idp-link-confirm-override/login-idp-link-confirm-override.component.html @@ -2,39 +2,39 @@ @let idpDisplayName = kcContext.idpDisplayName; - - {{ 'confirmOverrideIdpTitle' | msgStr }} - - -
- {{ 'pageExpiredMsg1' | msgStr }} - - {{ 'doClickHere' | msgStr }} - -
-
- -
-
+ + {{ 'confirmOverrideIdpTitle' | msgStr }} + + +
+ {{ 'pageExpiredMsg1' | msgStr }} + + {{ 'doClickHere' | msgStr }} + +
+
+ +
+
diff --git a/src/login/pages/login-idp-link-confirm-override/login-idp-link-confirm-override.component.ts b/src/login/pages/login-idp-link-confirm-override/login-idp-link-confirm-override.component.ts index 85b3bd28..b5f884e6 100644 --- a/src/login/pages/login-idp-link-confirm-override/login-idp-link-confirm-override.component.ts +++ b/src/login/pages/login-idp-link-confirm-override/login-idp-link-confirm-override.component.ts @@ -1,15 +1,5 @@ -import { - ChangeDetectionStrategy, - Component, - forwardRef, - inject, - input -} from '@angular/core'; -import { - CLASSES, - KC_CONTEXT, - USE_DEFAULT_CSS -} from '@keycloakify/angular/lib/public-api'; +import { ChangeDetectionStrategy, Component, forwardRef, inject, input } from '@angular/core'; +import { CLASSES, KC_CONTEXT, USE_DEFAULT_CSS } from '@keycloakify/angular/lib/public-api'; import { ClassKey } from 'keycloakify/login/lib/kcClsx'; import { KcContext } from 'keycloakify/login/KcContext'; import { ComponentReference } from '@keycloakify/angular/login/classes/component-reference.class'; @@ -31,10 +21,7 @@ import { MsgStrPipe } from '@keycloakify/angular/login/pipes/msg-str.pipe'; ] }) export class LoginIdpLinkConfirmOverrideComponent extends ComponentReference { - kcContext = - inject>( - KC_CONTEXT - ); + kcContext = inject>(KC_CONTEXT); override doUseDefaultCss = inject(USE_DEFAULT_CSS); override classes = inject>>(CLASSES); displayRequiredFields = input(false); diff --git a/src/login/pages/login-idp-link-confirm/login-idp-link-confirm.component.html b/src/login/pages/login-idp-link-confirm/login-idp-link-confirm.component.html index e5152bd9..1c37a509 100644 --- a/src/login/pages/login-idp-link-confirm/login-idp-link-confirm.component.html +++ b/src/login/pages/login-idp-link-confirm/login-idp-link-confirm.component.html @@ -1,41 +1,41 @@ @let url = kcContext.url; @let idpAlias = kcContext.idpAlias; - - {{ 'confirmLinkIdpTitle' | msgStr }} - - -
-
- - -
-
-
+
+ + +
+ +
diff --git a/src/login/pages/login-idp-link-confirm/login-idp-link-confirm.component.ts b/src/login/pages/login-idp-link-confirm/login-idp-link-confirm.component.ts index 7462dd66..abca2058 100644 --- a/src/login/pages/login-idp-link-confirm/login-idp-link-confirm.component.ts +++ b/src/login/pages/login-idp-link-confirm/login-idp-link-confirm.component.ts @@ -1,15 +1,5 @@ -import { - ChangeDetectionStrategy, - Component, - forwardRef, - inject, - input -} from '@angular/core'; -import { - CLASSES, - KC_CONTEXT, - USE_DEFAULT_CSS -} from '@keycloakify/angular/lib/public-api'; +import { ChangeDetectionStrategy, Component, forwardRef, inject, input } from '@angular/core'; +import { CLASSES, KC_CONTEXT, USE_DEFAULT_CSS } from '@keycloakify/angular/lib/public-api'; import { ClassKey } from 'keycloakify/login/lib/kcClsx'; import { KcContext } from 'keycloakify/login/KcContext'; import { ComponentReference } from '@keycloakify/angular/login/classes/component-reference.class'; @@ -31,8 +21,7 @@ import { MsgStrPipe } from '@keycloakify/angular/login/pipes/msg-str.pipe'; ] }) export class LoginIdpLinkConfirmComponent extends ComponentReference { - kcContext = - inject>(KC_CONTEXT); + kcContext = inject>(KC_CONTEXT); override doUseDefaultCss = inject(USE_DEFAULT_CSS); override classes = inject>>(CLASSES); displayRequiredFields = input(false); diff --git a/src/login/pages/login-idp-link-email/login-idp-link-email.component.html b/src/login/pages/login-idp-link-email/login-idp-link-email.component.html index 72f1f890..5909fbc9 100644 --- a/src/login/pages/login-idp-link-email/login-idp-link-email.component.html +++ b/src/login/pages/login-idp-link-email/login-idp-link-email.component.html @@ -3,35 +3,37 @@ @let realm = kcContext.realm; @let url = kcContext.url; - - {{ 'emailLinkIdpTitle' | msgStr: idpAlias }} - - -

- {{ 'emailLinkIdp1' | msgStr: idpAlias : brokerContext.username : realm.displayName }} -

-

- {{ 'emailLinkIdp2' | msgStr }} {{ 'doClickHere' | msgStr }} - {{ 'emailLinkIdp3' | msgStr }} -

-

- {{ 'emailLinkIdp4' | msgStr }} {{ 'doClickHere' | msgStr }} - {{ 'emailLinkIdp5' | msgStr }} -

+ + {{ 'emailLinkIdpTitle' | msgStr: idpAlias }} + + +

+ {{ 'emailLinkIdp1' | msgStr: idpAlias : brokerContext.username : realm.displayName }} +

+

+ {{ 'emailLinkIdp2' | msgStr }} + {{ 'doClickHere' | msgStr }} + {{ 'emailLinkIdp3' | msgStr }} +

+

+ {{ 'emailLinkIdp4' | msgStr }} + {{ 'doClickHere' | msgStr }} + {{ 'emailLinkIdp5' | msgStr }} +

+
diff --git a/src/login/pages/login-idp-link-email/login-idp-link-email.component.ts b/src/login/pages/login-idp-link-email/login-idp-link-email.component.ts index f2d3872f..3f34ea71 100644 --- a/src/login/pages/login-idp-link-email/login-idp-link-email.component.ts +++ b/src/login/pages/login-idp-link-email/login-idp-link-email.component.ts @@ -1,15 +1,5 @@ -import { - ChangeDetectionStrategy, - Component, - forwardRef, - inject, - input -} from '@angular/core'; -import { - CLASSES, - KC_CONTEXT, - USE_DEFAULT_CSS -} from '@keycloakify/angular/lib/public-api'; +import { ChangeDetectionStrategy, Component, forwardRef, inject, input } from '@angular/core'; +import { CLASSES, KC_CONTEXT, USE_DEFAULT_CSS } from '@keycloakify/angular/lib/public-api'; import { ClassKey } from 'keycloakify/login/lib/kcClsx'; import { KcContext } from 'keycloakify/login/KcContext'; import { ComponentReference } from '@keycloakify/angular/login/classes/component-reference.class'; @@ -31,8 +21,7 @@ import { MsgStrPipe } from '@keycloakify/angular/login/pipes/msg-str.pipe'; ] }) export class LoginIdpLinkEmailComponent extends ComponentReference { - kcContext = - inject>(KC_CONTEXT); + kcContext = inject>(KC_CONTEXT); override doUseDefaultCss = inject(USE_DEFAULT_CSS); override classes = inject>>(CLASSES); displayRequiredFields = input(false); diff --git a/src/login/pages/login-oauth-grant/login-oauth-grant.component.html b/src/login/pages/login-oauth-grant/login-oauth-grant.component.html index f6333894..cba30b7e 100644 --- a/src/login/pages/login-oauth-grant/login-oauth-grant.component.html +++ b/src/login/pages/login-oauth-grant/login-oauth-grant.component.html @@ -2,91 +2,93 @@ @let oauth = kcContext.oauth; @let url = kcContext.url; - - @if (client.attributes['logoUri']) { - - } -

{{ 'oauthGrantTitle' | msgStr: (client.name ? (client.name | advancedMsgStr) : client.clientId) }}

-
- - -
-

{{ 'oauthGrantRequest' | msgStr }}

-
    - @for (clientScope of oauth.clientScopesRequested; track clientScope) { -
  • - - {{ clientScope.consentScreenText | advancedMsgStr }} - @if (clientScope.dynamicScopeParameter) { - : {{ clientScope.dynamicScopeParameter }} - } - -
  • + + @if (client.attributes['logoUri']) { + } -
+

+ {{ 'oauthGrantTitle' | msgStr: (client.name ? (client.name | advancedMsgStr) : client.clientId) }} +

+ + + +
+

{{ 'oauthGrantRequest' | msgStr }}

+
    + @for (clientScope of oauth.clientScopesRequested; track clientScope) { +
  • + + {{ clientScope.consentScreenText | advancedMsgStr }} + @if (clientScope.dynamicScopeParameter) { + : {{ clientScope.dynamicScopeParameter }} + } + +
  • + } +
- @if (client.attributes['policyUri'] || client.attributes['tosUri']) { -

- @if (client.name) { - {{ 'oauthGrantInformation' | msgStr: (client.name | advancedMsgStr) }} - } @else { - {{ 'oauthGrantInformation' | msgStr: client.clientId }} - } - @if (client.attributes['policyUri']) { - {{ 'oauthGrantReview' | msgStr }} - + @if (client.name) { + {{ 'oauthGrantInformation' | msgStr: (client.name | advancedMsgStr) }} + } @else { + {{ 'oauthGrantInformation' | msgStr: client.clientId }} + } + @if (client.attributes['policyUri']) { + {{ 'oauthGrantReview' | msgStr }} + + {{ 'oauthGrantPolicy' | msgStr }} + + } +

+ } +
- {{ 'oauthGrantPolicy' | msgStr }} - - } - - } - - -
-
-
-
+ +
+
+
+
-
-
- - -
-
+
+
+ + +
+
+
+ +
- -
-
-
+ diff --git a/src/login/pages/login-oauth-grant/login-oauth-grant.component.ts b/src/login/pages/login-oauth-grant/login-oauth-grant.component.ts index bb4ade0c..8312d949 100644 --- a/src/login/pages/login-oauth-grant/login-oauth-grant.component.ts +++ b/src/login/pages/login-oauth-grant/login-oauth-grant.component.ts @@ -1,15 +1,5 @@ -import { - ChangeDetectionStrategy, - Component, - forwardRef, - inject, - input -} from '@angular/core'; -import { - CLASSES, - KC_CONTEXT, - USE_DEFAULT_CSS -} from '@keycloakify/angular/lib/public-api'; +import { ChangeDetectionStrategy, Component, forwardRef, inject, input } from '@angular/core'; +import { CLASSES, KC_CONTEXT, USE_DEFAULT_CSS } from '@keycloakify/angular/lib/public-api'; import { ClassKey } from 'keycloakify/login/lib/kcClsx'; import { KcContext } from 'keycloakify/login/KcContext'; import { ComponentReference } from '@keycloakify/angular/login/classes/component-reference.class'; @@ -32,8 +22,7 @@ import { MsgStrPipe } from '@keycloakify/angular/login/pipes/msg-str.pipe'; ] }) export class LoginOauthGrantComponent extends ComponentReference { - kcContext = - inject>(KC_CONTEXT); + kcContext = inject>(KC_CONTEXT); override doUseDefaultCss = inject(USE_DEFAULT_CSS); override classes = inject>>(CLASSES); displayRequiredFields = input(false); diff --git a/src/login/pages/login-oauth2-device-verify-user-code/login-oauth2-device-verify-user-code.component.html b/src/login/pages/login-oauth2-device-verify-user-code/login-oauth2-device-verify-user-code.component.html index 4b59d2b9..c4668691 100644 --- a/src/login/pages/login-oauth2-device-verify-user-code/login-oauth2-device-verify-user-code.component.html +++ b/src/login/pages/login-oauth2-device-verify-user-code/login-oauth2-device-verify-user-code.component.html @@ -1,63 +1,63 @@ @let url = kcContext.url; - - {{ 'oauth2DeviceVerificationTitle' | msgStr }} - - -
-
-
- -
- -
- -
-
-
-
+ {{ 'oauth2DeviceVerificationTitle' | msgStr }} + + + -
-
+
+
+ +
-
-
- -
-
-
- - +
+ +
+
+
+
+
+
+ +
+
+ +
+
+
+ +
diff --git a/src/login/pages/login-oauth2-device-verify-user-code/login-oauth2-device-verify-user-code.component.ts b/src/login/pages/login-oauth2-device-verify-user-code/login-oauth2-device-verify-user-code.component.ts index eb2fa7ef..85c5a5da 100644 --- a/src/login/pages/login-oauth2-device-verify-user-code/login-oauth2-device-verify-user-code.component.ts +++ b/src/login/pages/login-oauth2-device-verify-user-code/login-oauth2-device-verify-user-code.component.ts @@ -1,15 +1,5 @@ -import { - ChangeDetectionStrategy, - Component, - forwardRef, - inject, - input -} from '@angular/core'; -import { - CLASSES, - KC_CONTEXT, - USE_DEFAULT_CSS -} from '@keycloakify/angular/lib/public-api'; +import { ChangeDetectionStrategy, Component, forwardRef, inject, input } from '@angular/core'; +import { CLASSES, KC_CONTEXT, USE_DEFAULT_CSS } from '@keycloakify/angular/lib/public-api'; import { ClassKey } from 'keycloakify/login/lib/kcClsx'; import { KcContext } from 'keycloakify/login/KcContext'; import { ComponentReference } from '@keycloakify/angular/login/classes/component-reference.class'; @@ -31,10 +21,7 @@ import { MsgStrPipe } from '@keycloakify/angular/login/pipes/msg-str.pipe'; ] }) export class LoginOauth2DeviceVerifyUserCodeComponent extends ComponentReference { - kcContext = - inject< - Extract - >(KC_CONTEXT); + kcContext = inject>(KC_CONTEXT); override doUseDefaultCss = inject(USE_DEFAULT_CSS); override classes = inject>>(CLASSES); displayRequiredFields = input(false); diff --git a/src/login/pages/login-otp/login-otp.component.html b/src/login/pages/login-otp/login-otp.component.html index 86de6b67..91d6ad80 100644 --- a/src/login/pages/login-otp/login-otp.component.html +++ b/src/login/pages/login-otp/login-otp.component.html @@ -2,102 +2,102 @@ @let otpLogin = kcContext.otpLogin; @let messagesPerField = kcContext.messagesPerField; - - {{ 'doLogIn' | msgStr }} - - -
- @if (otpLogin.userOtpCredentials.length > 1) { -
-
- @for (otpCredential of otpLogin.userOtpCredentials; track otpCredential; let i = $index) { - - - - - } -
-
- } -
-
- -
-
- - @if (messagesPerField.existsError('totp')) { - - } -
-
-
-
-
+ {{ 'doLogIn' | msgStr }} + + + - -
-
-
-
+ @if (otpLogin.userOtpCredentials.length > 1) { +
+
+ @for (otpCredential of otpLogin.userOtpCredentials; track otpCredential; let i = $index) { + + + + + } +
+
+ } +
+
+ +
+
+ + @if (messagesPerField.existsError('totp')) { + + } +
+
+
+
+
+ +
+
+ +
diff --git a/src/login/pages/login-otp/login-otp.component.ts b/src/login/pages/login-otp/login-otp.component.ts index 824d4612..0dca5821 100644 --- a/src/login/pages/login-otp/login-otp.component.ts +++ b/src/login/pages/login-otp/login-otp.component.ts @@ -1,15 +1,5 @@ -import { - ChangeDetectionStrategy, - Component, - forwardRef, - inject, - input -} from '@angular/core'; -import { - CLASSES, - KC_CONTEXT, - USE_DEFAULT_CSS -} from '@keycloakify/angular/lib/public-api'; +import { ChangeDetectionStrategy, Component, forwardRef, inject, input } from '@angular/core'; +import { CLASSES, KC_CONTEXT, USE_DEFAULT_CSS } from '@keycloakify/angular/lib/public-api'; import { ClassKey } from 'keycloakify/login/lib/kcClsx'; import { KcContext } from 'keycloakify/login/KcContext'; import { ComponentReference } from '@keycloakify/angular/login/classes/component-reference.class'; diff --git a/src/login/pages/login-page-expired/login-page-expired.component.html b/src/login/pages/login-page-expired/login-page-expired.component.html index 19e83434..09a86a38 100644 --- a/src/login/pages/login-page-expired/login-page-expired.component.html +++ b/src/login/pages/login-page-expired/login-page-expired.component.html @@ -1,35 +1,35 @@ @let url = kcContext.url; - - {{ 'pageExpiredTitle' | msgStr }} - - -

- {{ 'pageExpiredMsg1' | msgStr }} - - {{ 'doClickHere' | msgStr }} - - .
- {{ 'pageExpiredMsg2' | msgStr }} - - {{ 'doClickHere' | msgStr }} - - . -

-
+ + {{ 'pageExpiredTitle' | msgStr }} + + +

+ {{ 'pageExpiredMsg1' | msgStr }} + + {{ 'doClickHere' | msgStr }} + + .
+ {{ 'pageExpiredMsg2' | msgStr }} + + {{ 'doClickHere' | msgStr }} + + . +

+
diff --git a/src/login/pages/login-page-expired/login-page-expired.component.ts b/src/login/pages/login-page-expired/login-page-expired.component.ts index 983d7bd1..fe6b953c 100644 --- a/src/login/pages/login-page-expired/login-page-expired.component.ts +++ b/src/login/pages/login-page-expired/login-page-expired.component.ts @@ -1,15 +1,5 @@ -import { - ChangeDetectionStrategy, - Component, - forwardRef, - inject, - input -} from '@angular/core'; -import { - CLASSES, - KC_CONTEXT, - USE_DEFAULT_CSS -} from '@keycloakify/angular/lib/public-api'; +import { ChangeDetectionStrategy, Component, forwardRef, inject, input } from '@angular/core'; +import { CLASSES, KC_CONTEXT, USE_DEFAULT_CSS } from '@keycloakify/angular/lib/public-api'; import { ClassKey } from 'keycloakify/login/lib/kcClsx'; import { KcContext } from 'keycloakify/login/KcContext'; import { ComponentReference } from '@keycloakify/angular/login/classes/component-reference.class'; @@ -30,8 +20,7 @@ import { MsgStrPipe } from '@keycloakify/angular/login/pipes/msg-str.pipe'; ] }) export class LoginPageExpiredComponent extends ComponentReference { - kcContext = - inject>(KC_CONTEXT); + kcContext = inject>(KC_CONTEXT); override doUseDefaultCss = inject(USE_DEFAULT_CSS); override classes = inject>>(CLASSES); displayRequiredFields = input(false); diff --git a/src/login/pages/login-passkeys-conditional-authenticate/login-passkeys-conditional-authenticate.component.html b/src/login/pages/login-passkeys-conditional-authenticate/login-passkeys-conditional-authenticate.component.html index 4fb01732..a874c6ad 100644 --- a/src/login/pages/login-passkeys-conditional-authenticate/login-passkeys-conditional-authenticate.component.html +++ b/src/login/pages/login-passkeys-conditional-authenticate/login-passkeys-conditional-authenticate.component.html @@ -7,197 +7,199 @@ @let usernameHidden = kcContext.usernameHidden; @let registrationDisabled = kcContext.registrationDisabled; - - {{ 'passkey-login-title' | msgStr }} - - - @if (realm.registrationAllowed && !registrationDisabled) { -
- - {{ 'noAccount' | msgStr }} - - {{ 'doRegister' | msgStr }} - - -
- } -
+ + {{ 'passkey-login-title' | msgStr }} + + + @if (realm.registrationAllowed && !registrationDisabled) { +
+ + {{ 'noAccount' | msgStr }} + + {{ 'doRegister' | msgStr }} + + +
+ } +
- -
- - - - - - -
-
- @if (authenticators !== undefined && authenticators.authenticators.length !== 0) { +
- @for (authenticator of authenticators.authenticators; track authenticator; let i = $index) { + + + + + - }
+
+ @if (authenticators !== undefined && authenticators.authenticators.length !== 0) { +
+ @for (authenticator of authenticators.authenticators; track authenticator; let i = $index) { + + } +
- @if (shouldDisplayAuthenticators) { - @if (authenticators.authenticators.length > 1) { -

- {{ 'passkey-available-authenticators' | msgStr }} -

- } + @if (shouldDisplayAuthenticators) { + @if (authenticators.authenticators.length > 1) { +

+ {{ 'passkey-available-authenticators' | msgStr }} +

+ } -
- @for (authenticator of authenticators.authenticators; track authenticator; let i = $index) { -
- -
-
- {{ authenticator.label | advancedMsgStr }} -
- @if ( - authenticator.transports !== undefined && - authenticator.transports.displayNameProperties !== undefined && - authenticator.transports.displayNameProperties.length !== 0 - ) { -
- @for ( - nameProperty of authenticator.transports.displayNameProperties; - track nameProperty; - let i = $index - ) { - {{ nameProperty | advancedMsgStr }} - @if (i !== authenticator.transports.displayNameProperties.length - 1) { - , +
+ @for (authenticator of authenticators.authenticators; track authenticator; let i = $index) { +
+ +
+
+ {{ authenticator.label | advancedMsgStr }} +
+ @if ( + authenticator.transports !== undefined && + authenticator.transports.displayNameProperties !== undefined && + authenticator.transports.displayNameProperties.length !== 0 + ) { +
+ @for ( + nameProperty of authenticator.transports.displayNameProperties; + track nameProperty; + let i = $index + ) { + + {{ nameProperty | advancedMsgStr }} + + @if (i !== authenticator.transports.displayNameProperties.length - 1) { + , + } + } +
+
+ + {{ 'passkey-createdAt-label' | msgStr }} + + + {{ authenticator.createdAt }} + +
+
+ } +
+
} - } -
-
- - {{ 'passkey-createdAt-label' | msgStr }} - - - {{ authenticator.createdAt }} -
-
- } -
-
- } -
- } - } -
- @if (realm.password) { - - - } -
-
- +
+ @if (realm.password) { + + + } +
+
+
diff --git a/src/login/pages/login-passkeys-conditional-authenticate/login-passkeys-conditional-authenticate.component.ts b/src/login/pages/login-passkeys-conditional-authenticate/login-passkeys-conditional-authenticate.component.ts index 1346db20..438dc06c 100644 --- a/src/login/pages/login-passkeys-conditional-authenticate/login-passkeys-conditional-authenticate.component.ts +++ b/src/login/pages/login-passkeys-conditional-authenticate/login-passkeys-conditional-authenticate.component.ts @@ -1,9 +1,5 @@ import { ChangeDetectionStrategy, Component, forwardRef, inject } from '@angular/core'; -import { - CLASSES, - KC_CONTEXT, - USE_DEFAULT_CSS -} from '@keycloakify/angular/lib/public-api'; +import { CLASSES, KC_CONTEXT, USE_DEFAULT_CSS } from '@keycloakify/angular/lib/public-api'; import { Script } from '@keycloakify/angular/lib/models'; import { ClassKey } from 'keycloakify/login/lib/kcClsx'; import { KcContext } from 'keycloakify/login/KcContext'; @@ -30,10 +26,7 @@ import { LoginResourceInjectorService } from '@keycloakify/angular/login/service ] }) export class LoginPasskeysConditionalAuthenticateComponent extends ComponentReference { - kcContext = - inject< - Extract - >(KC_CONTEXT); + kcContext = inject>(KC_CONTEXT); loginResourceInjectorService = inject(LoginResourceInjectorService); msgStr = inject(MsgStrPipe); override doUseDefaultCss = inject(USE_DEFAULT_CSS); diff --git a/src/login/pages/login-password/login-password.component.html b/src/login/pages/login-password/login-password.component.html index 437d3950..f7e94cd3 100644 --- a/src/login/pages/login-password/login-password.component.html +++ b/src/login/pages/login-password/login-password.component.html @@ -2,89 +2,89 @@ @let messagesPerField = kcContext.messagesPerField; @let realm = kcContext.realm; - - {{ 'doLogIn' | msgStr }} - - -
-
-
-
-
- - - - + + {{ 'doLogIn' | msgStr }} + + +
+
+ +
+
+ + + + - @if (messagesPerField.existsError('password')) { - - - } -
-
-
-
- @if (realm.resetPasswordAllowed) { - - - {{ 'doForgotPassword' | msgStr }} - - - } + @if (messagesPerField.existsError('password')) { + + + } +
+
+
+
+ @if (realm.resetPasswordAllowed) { + + + {{ 'doForgotPassword' | msgStr }} + + + } +
+
+
+ +
+
-
-
- -
- -
-
- +
+ diff --git a/src/login/pages/login-password/login-password.component.ts b/src/login/pages/login-password/login-password.component.ts index e64016b7..6de04e3d 100644 --- a/src/login/pages/login-password/login-password.component.ts +++ b/src/login/pages/login-password/login-password.component.ts @@ -1,16 +1,5 @@ -import { - ChangeDetectionStrategy, - Component, - forwardRef, - inject, - input, - signal -} from '@angular/core'; -import { - CLASSES, - KC_CONTEXT, - USE_DEFAULT_CSS -} from '@keycloakify/angular/lib/public-api'; +import { ChangeDetectionStrategy, Component, forwardRef, inject, input, signal } from '@angular/core'; +import { CLASSES, KC_CONTEXT, USE_DEFAULT_CSS } from '@keycloakify/angular/lib/public-api'; import { ClassKey } from 'keycloakify/login/lib/kcClsx'; import { KcContext } from 'keycloakify/login/KcContext'; import { ComponentReference } from '@keycloakify/angular/login/classes/component-reference.class'; @@ -22,13 +11,7 @@ import { MsgStrPipe } from '@keycloakify/angular/login/pipes/msg-str.pipe'; @Component({ standalone: true, - imports: [ - TemplateComponent, - MsgStrPipe, - KcClassDirective, - PasswordWrapperComponent, - KcSanitizePipe - ], + imports: [TemplateComponent, MsgStrPipe, KcClassDirective, PasswordWrapperComponent, KcSanitizePipe], selector: 'kc-root', templateUrl: 'login-password.component.html', changeDetection: ChangeDetectionStrategy.OnPush, diff --git a/src/login/pages/login-recovery-authn-code-config/login-recovery-authn-code-config.component.html b/src/login/pages/login-recovery-authn-code-config/login-recovery-authn-code-config.component.html index 78b178e3..551776ad 100644 --- a/src/login/pages/login-recovery-authn-code-config/login-recovery-authn-code-config.component.html +++ b/src/login/pages/login-recovery-authn-code-config/login-recovery-authn-code-config.component.html @@ -1,155 +1,155 @@ @let recoveryAuthnCodesConfigBean = kcContext.recoveryAuthnCodesConfigBean; @let isAppInitiatedAction = kcContext.isAppInitiatedAction; - - {{ 'recovery-code-config-header' | msgStr }} - + + {{ 'recovery-code-config-header' | msgStr }} + - -
-
- -
-

- Warning alert: - {{ 'recovery-code-config-warning-title' | msgStr }} -

-
-

{{ 'recovery-code-config-warning-message' | msgStr }}

-
-
+ +
+
+ +
+

+ Warning alert: + {{ 'recovery-code-config-warning-title' | msgStr }} +

+
+

{{ 'recovery-code-config-warning-message' | msgStr }}

+
+
-
    - @for (code of recoveryAuthnCodesConfigBean.generatedRecoveryAuthnCodesList; track code; let i = $index) { -
  1. - {{ i + 1 }}: {{ code.slice(0, 4) }}-{{ code.slice(4, 8) }}-{{ code.slice(8) }} -
  2. - } -
+
    + @for (code of recoveryAuthnCodesConfigBean.generatedRecoveryAuthnCodesList; track code; let i = $index) { +
  1. + {{ i + 1 }}: {{ code.slice(0, 4) }}-{{ code.slice(4, 8) }}-{{ code.slice(8) }} +
  2. + } +
- -
- - - -
+ +
+ + + +
- + -
- -
+
+ +
-
- - - + + + + - + - @if (isAppInitiatedAction) { - - - } @else { - - } -
-
+ @if (isAppInitiatedAction) { + + + } @else { + + } + +
diff --git a/src/login/pages/login-recovery-authn-code-config/login-recovery-authn-code-config.component.ts b/src/login/pages/login-recovery-authn-code-config/login-recovery-authn-code-config.component.ts index 5367082b..a142e1f3 100644 --- a/src/login/pages/login-recovery-authn-code-config/login-recovery-authn-code-config.component.ts +++ b/src/login/pages/login-recovery-authn-code-config/login-recovery-authn-code-config.component.ts @@ -1,16 +1,5 @@ -import { - ChangeDetectionStrategy, - Component, - forwardRef, - inject, - input, - signal -} from '@angular/core'; -import { - CLASSES, - KC_CONTEXT, - USE_DEFAULT_CSS -} from '@keycloakify/angular/lib/public-api'; +import { ChangeDetectionStrategy, Component, forwardRef, inject, input, signal } from '@angular/core'; +import { CLASSES, KC_CONTEXT, USE_DEFAULT_CSS } from '@keycloakify/angular/lib/public-api'; import { ClassKey } from 'keycloakify/login/lib/kcClsx'; import { KcContext } from 'keycloakify/login/KcContext'; import { ComponentReference } from '@keycloakify/angular/login/classes/component-reference.class'; @@ -21,12 +10,7 @@ import { MsgStrPipe } from '@keycloakify/angular/login/pipes/msg-str.pipe'; @Component({ standalone: true, - imports: [ - MsgStrPipe, - TemplateComponent, - KcClassDirective, - LogoutOtherSessionsComponent - ], + imports: [MsgStrPipe, TemplateComponent, KcClassDirective, LogoutOtherSessionsComponent], selector: 'kc-root', templateUrl: 'login-recovery-authn-code-config.component.html', changeDetection: ChangeDetectionStrategy.OnPush, @@ -38,10 +22,7 @@ import { MsgStrPipe } from '@keycloakify/angular/login/pipes/msg-str.pipe'; ] }) export class LoginRecoveryAuthnCodeConfigComponent extends ComponentReference { - kcContext = - inject>( - KC_CONTEXT - ); + kcContext = inject>(KC_CONTEXT); override doUseDefaultCss = inject(USE_DEFAULT_CSS); override classes = inject>>(CLASSES); displayRequiredFields = input(false); diff --git a/src/login/pages/login-recovery-authn-code-input/login-recovery-authn-code-input.component.html b/src/login/pages/login-recovery-authn-code-input/login-recovery-authn-code-input.component.html index 4eb895d7..c16ea6c8 100644 --- a/src/login/pages/login-recovery-authn-code-input/login-recovery-authn-code-input.component.html +++ b/src/login/pages/login-recovery-authn-code-input/login-recovery-authn-code-input.component.html @@ -3,74 +3,74 @@ @let messagesPerField = kcContext.messagesPerField; - - {{ 'auth-recovery-code-header' | msgStr }} - + + {{ 'auth-recovery-code-header' | msgStr }} + - -
-
-
- -
-
- - @if (messagesPerField.existsError('recoveryCodeInput')) { - - } -
-
- -
-
-
-
-
+ - -
-
-
-
+
+
+ +
+
+ + @if (messagesPerField.existsError('recoveryCodeInput')) { + + } +
+
+ +
+
+
+
+
+ +
+
+ +
diff --git a/src/login/pages/login-recovery-authn-code-input/login-recovery-authn-code-input.component.ts b/src/login/pages/login-recovery-authn-code-input/login-recovery-authn-code-input.component.ts index 9ed180db..df93d6ed 100644 --- a/src/login/pages/login-recovery-authn-code-input/login-recovery-authn-code-input.component.ts +++ b/src/login/pages/login-recovery-authn-code-input/login-recovery-authn-code-input.component.ts @@ -1,15 +1,5 @@ -import { - ChangeDetectionStrategy, - Component, - forwardRef, - inject, - input -} from '@angular/core'; -import { - CLASSES, - KC_CONTEXT, - USE_DEFAULT_CSS -} from '@keycloakify/angular/lib/public-api'; +import { ChangeDetectionStrategy, Component, forwardRef, inject, input } from '@angular/core'; +import { CLASSES, KC_CONTEXT, USE_DEFAULT_CSS } from '@keycloakify/angular/lib/public-api'; import { ClassKey } from 'keycloakify/login/lib/kcClsx'; import { KcContext } from 'keycloakify/login/KcContext'; import { ComponentReference } from '@keycloakify/angular/login/classes/component-reference.class'; @@ -32,16 +22,12 @@ import { MsgStrPipe } from '@keycloakify/angular/login/pipes/msg-str.pipe'; ] }) export class LoginRecoveryAuthnCodeInputComponent extends ComponentReference { - kcContext = - inject>( - KC_CONTEXT - ); + kcContext = inject>(KC_CONTEXT); override doUseDefaultCss = inject(USE_DEFAULT_CSS); override classes = inject>>(CLASSES); displayRequiredFields = input(false); documentTitle = input(); bodyClassName = input(); displayInfo: boolean = false; - displayMessage: boolean = - this.kcContext.messagesPerField.existsError('recoveryCodeInput'); + displayMessage: boolean = this.kcContext.messagesPerField.existsError('recoveryCodeInput'); } diff --git a/src/login/pages/login-reset-otp/login-reset-otp.component.html b/src/login/pages/login-reset-otp/login-reset-otp.component.html index 1745af4d..6b747370 100644 --- a/src/login/pages/login-reset-otp/login-reset-otp.component.html +++ b/src/login/pages/login-reset-otp/login-reset-otp.component.html @@ -1,65 +1,67 @@ @let url = kcContext.url; @let configuredOtpCredentials = kcContext.configuredOtpCredentials; - - {{ 'doLogIn' | msgStr }} - - -
-
-
-

{{ 'otp-reset-description' | msgStr }}

- @for (otpCredential of configuredOtpCredentials.userOtpCredentials; track otpCredential; let i = $index) { - - - } -
-
- + + {{ 'doLogIn' | msgStr }} + + + +
+
+

+ {{ 'otp-reset-description' | msgStr }} +

+ @for (otpCredential of configuredOtpCredentials.userOtpCredentials; track otpCredential; let i = $index) { + + + } +
+
+ +
+
+
-
-
-
- - + + diff --git a/src/login/pages/login-reset-otp/login-reset-otp.component.ts b/src/login/pages/login-reset-otp/login-reset-otp.component.ts index b6338807..98e871b7 100644 --- a/src/login/pages/login-reset-otp/login-reset-otp.component.ts +++ b/src/login/pages/login-reset-otp/login-reset-otp.component.ts @@ -1,15 +1,5 @@ -import { - ChangeDetectionStrategy, - Component, - forwardRef, - inject, - input -} from '@angular/core'; -import { - CLASSES, - KC_CONTEXT, - USE_DEFAULT_CSS -} from '@keycloakify/angular/lib/public-api'; +import { ChangeDetectionStrategy, Component, forwardRef, inject, input } from '@angular/core'; +import { CLASSES, KC_CONTEXT, USE_DEFAULT_CSS } from '@keycloakify/angular/lib/public-api'; import { ClassKey } from 'keycloakify/login/lib/kcClsx'; import { KcContext } from 'keycloakify/login/KcContext'; import { ComponentReference } from '@keycloakify/angular/login/classes/component-reference.class'; diff --git a/src/login/pages/login-reset-password/login-reset-password.component.html b/src/login/pages/login-reset-password/login-reset-password.component.html index be2c9f48..74ef6fd5 100644 --- a/src/login/pages/login-reset-password/login-reset-password.component.html +++ b/src/login/pages/login-reset-password/login-reset-password.component.html @@ -3,93 +3,93 @@ @let realm = kcContext.realm; @let auth = kcContext.auth; - - {{ 'emailForgotTitle' | msgStr }} - - - @if (realm.duplicateEmailsAllowed) { - {{ 'emailInstructionUsername' | msgStr }} - } @else { - {{ 'emailInstruction' | msgStr }} - } - + + {{ 'emailForgotTitle' | msgStr }} + + + @if (realm.duplicateEmailsAllowed) { + {{ 'emailInstructionUsername' | msgStr }} + } @else { + {{ 'emailInstruction' | msgStr }} + } + - -
-
-
- -
+ + +
+
+ +
-
- +
+ - @if (messagesPerField.existsError('username')) { - - } -
-
+ @if (messagesPerField.existsError('username')) { + + } +
+
-
-
-
- - - -
-
-
- -
-
-
-
+
+
+
+ + + +
+
+
+ +
+
+ +
diff --git a/src/login/pages/login-reset-password/login-reset-password.component.ts b/src/login/pages/login-reset-password/login-reset-password.component.ts index 5320a199..0b26a3a9 100644 --- a/src/login/pages/login-reset-password/login-reset-password.component.ts +++ b/src/login/pages/login-reset-password/login-reset-password.component.ts @@ -1,15 +1,5 @@ -import { - ChangeDetectionStrategy, - Component, - forwardRef, - inject, - input -} from '@angular/core'; -import { - CLASSES, - KC_CONTEXT, - USE_DEFAULT_CSS -} from '@keycloakify/angular/lib/public-api'; +import { ChangeDetectionStrategy, Component, forwardRef, inject, input } from '@angular/core'; +import { CLASSES, KC_CONTEXT, USE_DEFAULT_CSS } from '@keycloakify/angular/lib/public-api'; import { ClassKey } from 'keycloakify/login/lib/kcClsx'; import { KcContext } from 'keycloakify/login/KcContext'; import { ComponentReference } from '@keycloakify/angular/login/classes/component-reference.class'; @@ -32,8 +22,7 @@ import { MsgStrPipe } from '@keycloakify/angular/login/pipes/msg-str.pipe'; ] }) export class LoginResetPasswordComponent extends ComponentReference { - kcContext = - inject>(KC_CONTEXT); + kcContext = inject>(KC_CONTEXT); override doUseDefaultCss = inject(USE_DEFAULT_CSS); override classes = inject>>(CLASSES); displayRequiredFields = input(false); diff --git a/src/login/pages/login-update-password/login-update-password.component.html b/src/login/pages/login-update-password/login-update-password.component.html index 70d9d52e..1ac826f4 100644 --- a/src/login/pages/login-update-password/login-update-password.component.html +++ b/src/login/pages/login-update-password/login-update-password.component.html @@ -3,114 +3,114 @@ @let isAppInitiatedAction = kcContext.isAppInitiatedAction; - - {{ 'updatePasswordTitle' | msgStr }} - - -
-
-
- -
-
- - - + + {{ 'updatePasswordTitle' | msgStr }} + + + +
+
+ +
+
+ + + - @if (messagesPerField.existsError('password')) { - - } -
-
+ @if (messagesPerField.existsError('password')) { + + } +
+
-
-
- -
-
- - - - @if (messagesPerField.existsError('password-confirm')) { - - } -
-
-
- -
- - @if (isAppInitiatedAction) { - - } -
-
-
-
+
+
+ +
+
+ + + + @if (messagesPerField.existsError('password-confirm')) { + + } +
+
+
+ +
+ + @if (isAppInitiatedAction) { + + } +
+
+ +
diff --git a/src/login/pages/login-update-password/login-update-password.component.ts b/src/login/pages/login-update-password/login-update-password.component.ts index 685c97ce..c33ed6af 100644 --- a/src/login/pages/login-update-password/login-update-password.component.ts +++ b/src/login/pages/login-update-password/login-update-password.component.ts @@ -1,15 +1,5 @@ -import { - ChangeDetectionStrategy, - Component, - forwardRef, - inject, - input -} from '@angular/core'; -import { - CLASSES, - KC_CONTEXT, - USE_DEFAULT_CSS -} from '@keycloakify/angular/lib/public-api'; +import { ChangeDetectionStrategy, Component, forwardRef, inject, input } from '@angular/core'; +import { CLASSES, KC_CONTEXT, USE_DEFAULT_CSS } from '@keycloakify/angular/lib/public-api'; import { ClassKey } from 'keycloakify/login/lib/kcClsx'; import { KcContext } from 'keycloakify/login/KcContext'; import { ComponentReference } from '@keycloakify/angular/login/classes/component-reference.class'; @@ -22,14 +12,7 @@ import { MsgStrPipe } from '@keycloakify/angular/login/pipes/msg-str.pipe'; @Component({ standalone: true, - imports: [ - TemplateComponent, - MsgStrPipe, - KcClassDirective, - PasswordWrapperComponent, - KcSanitizePipe, - LogoutOtherSessionsComponent - ], + imports: [TemplateComponent, MsgStrPipe, KcClassDirective, PasswordWrapperComponent, KcSanitizePipe, LogoutOtherSessionsComponent], selector: 'kc-root', templateUrl: 'login-update-password.component.html', changeDetection: ChangeDetectionStrategy.OnPush, @@ -41,16 +24,12 @@ import { MsgStrPipe } from '@keycloakify/angular/login/pipes/msg-str.pipe'; ] }) export class LoginUpdatePasswordComponent extends ComponentReference { - kcContext = - inject>(KC_CONTEXT); + kcContext = inject>(KC_CONTEXT); override doUseDefaultCss = inject(USE_DEFAULT_CSS); override classes = inject>>(CLASSES); displayRequiredFields = input(false); documentTitle = input(); bodyClassName = input(); displayInfo = false; - displayMessage = !this.kcContext.messagesPerField.existsError( - 'password', - 'password-confirm' - ); + displayMessage = !this.kcContext.messagesPerField.existsError('password', 'password-confirm'); } diff --git a/src/login/pages/login-update-profile/login-update-profile.component.html b/src/login/pages/login-update-profile/login-update-profile.component.html index 07275d5d..cd8d65e1 100644 --- a/src/login/pages/login-update-profile/login-update-profile.component.html +++ b/src/login/pages/login-update-profile/login-update-profile.component.html @@ -1,59 +1,59 @@ @let url = kcContext.url; @let isAppInitiatedAction = kcContext.isAppInitiatedAction; - - {{ 'loginProfileTitle' | msgStr }} - - -
- - -
-
-
-
-
+ {{ 'loginProfileTitle' | msgStr }} + + + - - @if (isAppInitiatedAction) { - - } -
-
-
-
+ + +
+
+
+
+
+ + @if (isAppInitiatedAction) { + + } +
+
+ +
diff --git a/src/login/pages/login-update-profile/login-update-profile.component.ts b/src/login/pages/login-update-profile/login-update-profile.component.ts index 7c1165a8..c61d1495 100644 --- a/src/login/pages/login-update-profile/login-update-profile.component.ts +++ b/src/login/pages/login-update-profile/login-update-profile.component.ts @@ -1,16 +1,5 @@ -import { - ChangeDetectionStrategy, - Component, - forwardRef, - inject, - input, - signal -} from '@angular/core'; -import { - CLASSES, - KC_CONTEXT, - USE_DEFAULT_CSS -} from '@keycloakify/angular/lib/public-api'; +import { ChangeDetectionStrategy, Component, forwardRef, inject, input, signal } from '@angular/core'; +import { CLASSES, KC_CONTEXT, USE_DEFAULT_CSS } from '@keycloakify/angular/lib/public-api'; import { ClassKey } from 'keycloakify/login/lib/kcClsx'; import { KcContext } from 'keycloakify/login/KcContext'; import { ComponentReference } from '@keycloakify/angular/login/classes/component-reference.class'; @@ -21,12 +10,7 @@ import { MsgStrPipe } from '@keycloakify/angular/login/pipes/msg-str.pipe'; @Component({ standalone: true, - imports: [ - TemplateComponent, - KcClassDirective, - MsgStrPipe, - UserProfileFormFieldsComponent - ], + imports: [TemplateComponent, KcClassDirective, MsgStrPipe, UserProfileFormFieldsComponent], selector: 'kc-root', templateUrl: 'login-update-profile.component.html', changeDetection: ChangeDetectionStrategy.OnPush, @@ -38,8 +22,7 @@ import { MsgStrPipe } from '@keycloakify/angular/login/pipes/msg-str.pipe'; ] }) export class LoginUpdateProfileComponent extends ComponentReference { - kcContext = - inject>(KC_CONTEXT); + kcContext = inject>(KC_CONTEXT); override doUseDefaultCss = inject(USE_DEFAULT_CSS); override classes = inject>>(CLASSES); displayRequiredFields = input(true); diff --git a/src/login/pages/login-username/login-username.component.html b/src/login/pages/login-username/login-username.component.html index fa96f6c9..342c96e4 100644 --- a/src/login/pages/login-username/login-username.component.html +++ b/src/login/pages/login-username/login-username.component.html @@ -6,156 +6,156 @@ @let login = kcContext.login; - - {{ 'doLogIn' | msgStr }} - - -
- - {{ 'noAccount' | msgStr }} - - {{ 'doRegister' | msgStr }} - - -
-
- - @if (!!realm?.password && !!social?.providers?.length) { -
-
-

{{ 'identity-provider-login-label' | msgStr }}

- -
- } -
- -
-
- @if (realm.password) { -
- @if (!usernameHidden) { - + + + @if (!!realm?.password && !!social?.providers?.length) {
- +
+

{{ 'identity-provider-login-label' | msgStr }}

+
- } -
-
-
+ + +
+
+ @if (realm.password) { +
+ @if (!usernameHidden) { +
+ + + @if (messagesPerField?.existsError('username')) { + + + } + +
+ } + +
+
+ @if (realm.rememberMe && !usernameHidden) { +
+ +
+ } +
+
+
+ +
+
+ } +
+
+
diff --git a/src/login/pages/login-username/login-username.component.ts b/src/login/pages/login-username/login-username.component.ts index 4c901911..cf40ac8c 100644 --- a/src/login/pages/login-username/login-username.component.ts +++ b/src/login/pages/login-username/login-username.component.ts @@ -1,17 +1,6 @@ import { AsyncPipe, NgClass } from '@angular/common'; -import { - ChangeDetectionStrategy, - Component, - forwardRef, - inject, - input, - signal -} from '@angular/core'; -import { - CLASSES, - KC_CONTEXT, - USE_DEFAULT_CSS -} from '@keycloakify/angular/lib/public-api'; +import { ChangeDetectionStrategy, Component, forwardRef, inject, input, signal } from '@angular/core'; +import { CLASSES, KC_CONTEXT, USE_DEFAULT_CSS } from '@keycloakify/angular/lib/public-api'; import { ClassKey } from 'keycloakify/login/lib/kcClsx'; import { KcContext } from 'keycloakify/login/KcContext'; import { ComponentReference } from '@keycloakify/angular/login/classes/component-reference.class'; @@ -25,14 +14,7 @@ import { MsgStrPipe } from '@keycloakify/angular/login/pipes/msg-str.pipe'; templateUrl: './login-username.component.html', standalone: true, changeDetection: ChangeDetectionStrategy.OnPush, - imports: [ - KcClassDirective, - AsyncPipe, - KcSanitizePipe, - NgClass, - TemplateComponent, - MsgStrPipe - ], + imports: [KcClassDirective, AsyncPipe, KcSanitizePipe, NgClass, TemplateComponent, MsgStrPipe], providers: [ { provide: ComponentReference, @@ -48,9 +30,6 @@ export class LoginUsernameComponent extends ComponentReference { override doUseDefaultCss = inject(USE_DEFAULT_CSS); override classes = inject>>(CLASSES); isLoginButtonDisabled = signal(false); - displayInfo: boolean = - !!this.kcContext?.realm?.password && - !!this.kcContext?.realm?.registrationAllowed && - !this.kcContext?.registrationDisabled; + displayInfo: boolean = !!this.kcContext?.realm?.password && !!this.kcContext?.realm?.registrationAllowed && !this.kcContext?.registrationDisabled; displayMessage: boolean = !this.kcContext?.messagesPerField?.existsError('username'); } diff --git a/src/login/pages/login-verify-email/login-verify-email.component.html b/src/login/pages/login-verify-email/login-verify-email.component.html index f8a9763a..35689676 100644 --- a/src/login/pages/login-verify-email/login-verify-email.component.html +++ b/src/login/pages/login-verify-email/login-verify-email.component.html @@ -1,27 +1,27 @@ @let url = kcContext.url; @let user = kcContext.user; - - {{ 'emailVerifyTitle' | msgStr }} - - -

- {{ 'emailVerifyInstruction2' | msgStr }} -
- {{ 'doClickHere' | msgStr }} -   - {{ 'emailVerifyInstruction3' | msgStr }} -

-
- -

- {{ 'emailVerifyInstruction1' | msgStr: user?.email ?? '' }} -

+ + {{ 'emailVerifyTitle' | msgStr }} + + +

+ {{ 'emailVerifyInstruction2' | msgStr }} +
+ {{ 'doClickHere' | msgStr }} +   + {{ 'emailVerifyInstruction3' | msgStr }} +

+
+ +

+ {{ 'emailVerifyInstruction1' | msgStr: user?.email ?? '' }} +

diff --git a/src/login/pages/login-verify-email/login-verify-email.component.ts b/src/login/pages/login-verify-email/login-verify-email.component.ts index 1521d681..3b4e439a 100644 --- a/src/login/pages/login-verify-email/login-verify-email.component.ts +++ b/src/login/pages/login-verify-email/login-verify-email.component.ts @@ -1,15 +1,5 @@ -import { - ChangeDetectionStrategy, - Component, - forwardRef, - inject, - input -} from '@angular/core'; -import { - CLASSES, - KC_CONTEXT, - USE_DEFAULT_CSS -} from '@keycloakify/angular/lib/public-api'; +import { ChangeDetectionStrategy, Component, forwardRef, inject, input } from '@angular/core'; +import { CLASSES, KC_CONTEXT, USE_DEFAULT_CSS } from '@keycloakify/angular/lib/public-api'; import { ClassKey } from 'keycloakify/login/lib/kcClsx'; import { KcContext } from 'keycloakify/login/KcContext'; import { ComponentReference } from '@keycloakify/angular/login/classes/component-reference.class'; @@ -31,8 +21,7 @@ import { MsgStrPipe } from '@keycloakify/angular/login/pipes/msg-str.pipe'; ] }) export class LoginVerifyEmailComponent extends ComponentReference { - kcContext = - inject>(KC_CONTEXT); + kcContext = inject>(KC_CONTEXT); override doUseDefaultCss = inject(USE_DEFAULT_CSS); override classes = inject>>(CLASSES); displayRequiredFields = input(false); diff --git a/src/login/pages/login-x509-info/login-x509-info.component.html b/src/login/pages/login-x509-info/login-x509-info.component.html index d55a6b98..916fadaa 100644 --- a/src/login/pages/login-x509-info/login-x509-info.component.html +++ b/src/login/pages/login-x509-info/login-x509-info.component.html @@ -1,102 +1,102 @@ @let url = kcContext.url; @let x509 = kcContext.x509; - - {{ 'doLogIn' | msgStr }} - - -
-
-
- -
- @if (x509.formData.subjectDN) { -
- -
- } @else { -
- -
- } -
-
- @if (x509.formData.isUserEnabled) { -
- -
-
- -
- } -
-
-
+ {{ 'doLogIn' | msgStr }} + + + -
-
-
-
- - @if (x509.formData.isUserEnabled) { - - } -
-
-
-
-
+
+
+ +
+ @if (x509.formData.subjectDN) { +
+ +
+ } @else { +
+ +
+ } +
+
+ @if (x509.formData.isUserEnabled) { +
+ +
+
+ +
+ } +
+
+
+
+
+
+
+ + @if (x509.formData.isUserEnabled) { + + } +
+
+
+ +
diff --git a/src/login/pages/login-x509-info/login-x509-info.component.ts b/src/login/pages/login-x509-info/login-x509-info.component.ts index b3daeef7..878a788b 100644 --- a/src/login/pages/login-x509-info/login-x509-info.component.ts +++ b/src/login/pages/login-x509-info/login-x509-info.component.ts @@ -1,15 +1,5 @@ -import { - ChangeDetectionStrategy, - Component, - forwardRef, - inject, - input -} from '@angular/core'; -import { - CLASSES, - KC_CONTEXT, - USE_DEFAULT_CSS -} from '@keycloakify/angular/lib/public-api'; +import { ChangeDetectionStrategy, Component, forwardRef, inject, input } from '@angular/core'; +import { CLASSES, KC_CONTEXT, USE_DEFAULT_CSS } from '@keycloakify/angular/lib/public-api'; import { ClassKey } from 'keycloakify/login/lib/kcClsx'; import { KcContext } from 'keycloakify/login/KcContext'; import { ComponentReference } from '@keycloakify/angular/login/classes/component-reference.class'; diff --git a/src/login/pages/login/login.component.html b/src/login/pages/login/login.component.html index 8e2b439b..02de5f3e 100644 --- a/src/login/pages/login/login.component.html +++ b/src/login/pages/login/login.component.html @@ -7,206 +7,206 @@ @let login = kcContext.login; - - {{ 'loginAccountTitle' | msgStr }} - - -
-
- - {{ 'noAccount' | msgStr }} - - {{ 'doRegister' | msgStr }} - - -
-
-
- - @if (!!realm?.password && !!social?.providers?.length) { -
-
-

{{ 'identity-provider-login-label' | msgStr }}

- -
- } -
- -
-
- - @if (realm?.password) { -
- @if (!usernameHidden) { -
- - - @if (messagesPerField?.existsError('username', 'password')) { - - - } -
- } - -
- - - - - - @if (usernameHidden && messagesPerField?.existsError('username', 'password')) { - - - } -
- -
-
- @if (realm?.rememberMe && !usernameHidden) { -
- -
- } -
- -
- @if (realm?.resetPasswordAllowed) { - + + {{ 'loginAccountTitle' | msgStr }} + + +
+
+ + {{ 'noAccount' | msgStr }} {{ 'doForgotPassword' | msgStr }} - - } -
+ {{ 'doRegister' | msgStr }} + +
+
+ + + @if (!!realm?.password && !!social?.providers?.length) {
- - +
+

{{ 'identity-provider-login-label' | msgStr }}

+
- } -
-
- + + +
+
+ + @if (realm?.password) { +
+ @if (!usernameHidden) { +
+ + + @if (messagesPerField?.existsError('username', 'password')) { + + + } +
+ } + +
+ + + + + + @if (usernameHidden && messagesPerField?.existsError('username', 'password')) { + + + } +
+ +
+
+ @if (realm?.rememberMe && !usernameHidden) { +
+ +
+ } +
+ +
+ @if (realm?.resetPasswordAllowed) { + + {{ 'doForgotPassword' | msgStr }} + + } +
+
+
+ + +
+
+ } +
+
+
diff --git a/src/login/pages/login/login.component.ts b/src/login/pages/login/login.component.ts index 8c2b4e60..41361f40 100644 --- a/src/login/pages/login/login.component.ts +++ b/src/login/pages/login/login.component.ts @@ -1,17 +1,6 @@ import { AsyncPipe, NgClass } from '@angular/common'; -import { - ChangeDetectionStrategy, - Component, - forwardRef, - inject, - input, - signal -} from '@angular/core'; -import { - CLASSES, - KC_CONTEXT, - USE_DEFAULT_CSS -} from '@keycloakify/angular/lib/public-api'; +import { ChangeDetectionStrategy, Component, forwardRef, inject, input, signal } from '@angular/core'; +import { CLASSES, KC_CONTEXT, USE_DEFAULT_CSS } from '@keycloakify/angular/lib/public-api'; import { ClassKey } from 'keycloakify/login/lib/kcClsx'; import { KcContext } from 'keycloakify/login/KcContext'; import { ComponentReference } from '@keycloakify/angular/login/classes/component-reference.class'; @@ -26,15 +15,7 @@ import { MsgStrPipe } from '@keycloakify/angular/login/pipes/msg-str.pipe'; templateUrl: './login.component.html', standalone: true, changeDetection: ChangeDetectionStrategy.OnPush, - imports: [ - KcClassDirective, - AsyncPipe, - KcSanitizePipe, - PasswordWrapperComponent, - NgClass, - TemplateComponent, - MsgStrPipe - ], + imports: [KcClassDirective, AsyncPipe, KcSanitizePipe, PasswordWrapperComponent, NgClass, TemplateComponent, MsgStrPipe], providers: [ { provide: ComponentReference, @@ -50,12 +31,6 @@ export class LoginComponent extends ComponentReference { override doUseDefaultCss = inject(USE_DEFAULT_CSS); override classes = inject>>(CLASSES); isLoginButtonDisabled = signal(false); - displayInfo: boolean = - !!this.kcContext?.realm?.password && - !!this.kcContext?.realm?.registrationAllowed && - !this.kcContext?.registrationDisabled; - displayMessage: boolean = !this.kcContext?.messagesPerField?.existsError( - 'username', - 'password' - ); + displayInfo: boolean = !!this.kcContext?.realm?.password && !!this.kcContext?.realm?.registrationAllowed && !this.kcContext?.registrationDisabled; + displayMessage: boolean = !this.kcContext?.messagesPerField?.existsError('username', 'password'); } diff --git a/src/login/pages/logout-confirm/logout-confirm.component.html b/src/login/pages/logout-confirm/logout-confirm.component.html index 19342a42..9af004d0 100644 --- a/src/login/pages/logout-confirm/logout-confirm.component.html +++ b/src/login/pages/logout-confirm/logout-confirm.component.html @@ -3,57 +3,57 @@ @let client = kcContext.client; - - {{ 'logoutConfirmTitle' | msgStr }} - - -
-

{{ 'logoutConfirmHeader' | msgStr }}

-
- -
-
-
-
-
- -
+ + {{ 'logoutConfirmTitle' | msgStr }} + + +
+

{{ 'logoutConfirmHeader' | msgStr }}

+ + +
+
+
+
+
+ +
+
+ +
+ @if (!logoutConfirm.skipLink && client.baseUrl) { +

+ {{ 'backToApplication' | msgStr }} +

+ } +
- -
- @if (!logoutConfirm.skipLink && client.baseUrl) { -

- {{ 'backToApplication' | msgStr }} -

- } -
-
- + diff --git a/src/login/pages/logout-confirm/logout-confirm.component.ts b/src/login/pages/logout-confirm/logout-confirm.component.ts index 3a10ed31..8cbd88b2 100644 --- a/src/login/pages/logout-confirm/logout-confirm.component.ts +++ b/src/login/pages/logout-confirm/logout-confirm.component.ts @@ -1,15 +1,5 @@ -import { - ChangeDetectionStrategy, - Component, - forwardRef, - inject, - input -} from '@angular/core'; -import { - CLASSES, - KC_CONTEXT, - USE_DEFAULT_CSS -} from '@keycloakify/angular/lib/public-api'; +import { ChangeDetectionStrategy, Component, forwardRef, inject, input } from '@angular/core'; +import { CLASSES, KC_CONTEXT, USE_DEFAULT_CSS } from '@keycloakify/angular/lib/public-api'; import { ClassKey } from 'keycloakify/login/lib/kcClsx'; import { KcContext } from 'keycloakify/login/KcContext'; import { ComponentReference } from '@keycloakify/angular/login/classes/component-reference.class'; diff --git a/src/login/pages/register/register.component.html b/src/login/pages/register/register.component.html index b2d88674..641aee32 100644 --- a/src/login/pages/register/register.component.html +++ b/src/login/pages/register/register.component.html @@ -8,119 +8,119 @@ @let termsAcceptanceRequired = kcContext.termsAcceptanceRequired; - - {{ messageHeader ?? 'registerTitle' | advancedMsgStr }} - - -
- - @if (termsAcceptanceRequired) { -
-
- {{ 'termsTitle' | msgStr }} -
- {{ 'termsText' | msgStr }} -
-
-
-
-
- - -
- @if (messagesPerField.existsError('termsAccepted')) { -
- -
- } -
- } - @if (recaptchaRequired && (recaptchaVisible || recaptchaAction === undefined)) { -
-
-
-
-
- } - -
-
+ {{ messageHeader ?? 'registerTitle' | advancedMsgStr }} + + + -
- - - -
-
- @if (recaptchaRequired && !recaptchaVisible && recaptchaAction !== undefined) { -
- -
- } @else { -
- -
- } -
-
-
+ + @if (termsAcceptanceRequired) { +
+
+ {{ 'termsTitle' | msgStr }} +
+ {{ 'termsText' | msgStr }} +
+
+
+
+
+ + +
+ @if (messagesPerField.existsError('termsAccepted')) { +
+ +
+ } +
+ } + @if (recaptchaRequired && (recaptchaVisible || recaptchaAction === undefined)) { +
+
+
+
+
+ } + +
+
+
+ + + +
+
+ @if (recaptchaRequired && !recaptchaVisible && recaptchaAction !== undefined) { +
+ +
+ } @else { +
+ +
+ } +
+ +
diff --git a/src/login/pages/register/register.component.ts b/src/login/pages/register/register.component.ts index 9f4f2838..bb376aad 100644 --- a/src/login/pages/register/register.component.ts +++ b/src/login/pages/register/register.component.ts @@ -1,17 +1,6 @@ import { AsyncPipe, NgClass } from '@angular/common'; -import { - ChangeDetectionStrategy, - Component, - forwardRef, - inject, - input, - signal -} from '@angular/core'; -import { - CLASSES, - KC_CONTEXT, - USE_DEFAULT_CSS -} from '@keycloakify/angular/lib/public-api'; +import { ChangeDetectionStrategy, Component, forwardRef, inject, input, signal } from '@angular/core'; +import { CLASSES, KC_CONTEXT, USE_DEFAULT_CSS } from '@keycloakify/angular/lib/public-api'; import { ClassKey } from 'keycloakify/login/lib/kcClsx'; import { KcContext } from 'keycloakify/login/KcContext'; import { ComponentReference } from '@keycloakify/angular/login/classes/component-reference.class'; diff --git a/src/login/pages/saml-post-form/saml-post-form.component.html b/src/login/pages/saml-post-form/saml-post-form.component.html index 6657158d..b1cbd36f 100644 --- a/src/login/pages/saml-post-form/saml-post-form.component.html +++ b/src/login/pages/saml-post-form/saml-post-form.component.html @@ -1,51 +1,50 @@ @let samlPost = kcContext.samlPost; - - {{ 'saml.post-form.title' | msgStr }} - - -

{{ 'saml.post-form.message' | msgStr }}

-
- @if (!!samlPost.SAMLRequest) { - - } - @if (!!samlPost.SAMLResponse) { - - } - @if (!!samlPost.relayState) { - - } - -
-
- >
+ + {{ 'saml.post-form.title' | msgStr }} + + +

{{ 'saml.post-form.message' | msgStr }}

+
+ @if (!!samlPost.SAMLRequest) { + + } + @if (!!samlPost.SAMLResponse) { + + } + @if (!!samlPost.relayState) { + + } + +
+
+ diff --git a/src/login/pages/saml-post-form/saml-post-form.component.ts b/src/login/pages/saml-post-form/saml-post-form.component.ts index be924fe6..9e24ea93 100644 --- a/src/login/pages/saml-post-form/saml-post-form.component.ts +++ b/src/login/pages/saml-post-form/saml-post-form.component.ts @@ -1,17 +1,5 @@ -import { - AfterViewInit, - ChangeDetectionStrategy, - Component, - forwardRef, - inject, - input, - ViewChild -} from '@angular/core'; -import { - CLASSES, - KC_CONTEXT, - USE_DEFAULT_CSS -} from '@keycloakify/angular/lib/public-api'; +import { AfterViewInit, ChangeDetectionStrategy, Component, forwardRef, inject, input, ViewChild } from '@angular/core'; +import { CLASSES, KC_CONTEXT, USE_DEFAULT_CSS } from '@keycloakify/angular/lib/public-api'; import { ClassKey } from 'keycloakify/login/lib/kcClsx'; import { KcContext } from 'keycloakify/login/KcContext'; import { ComponentReference } from '@keycloakify/angular/login/classes/component-reference.class'; diff --git a/src/login/pages/select-authenticator/select-authenticator.component.html b/src/login/pages/select-authenticator/select-authenticator.component.html index bd622be4..1c976dc5 100644 --- a/src/login/pages/select-authenticator/select-authenticator.component.html +++ b/src/login/pages/select-authenticator/select-authenticator.component.html @@ -1,49 +1,48 @@ @let url = kcContext.url; @let auth = kcContext.auth; - - {{ 'loginChooseAuthenticator' | msgStr }} - - -
-
- @for (authenticationSelection of auth.authenticationSelections; track authenticationSelection; let i = $index) { - + }
-
-
- {{ authenticationSelection.displayName | advancedMsgStr }} -
-
- {{ authenticationSelection.helpText | advancedMsgStr }} -
-
-
-
- -
- - } -
- -
- >
+ + + diff --git a/src/login/pages/select-authenticator/select-authenticator.component.ts b/src/login/pages/select-authenticator/select-authenticator.component.ts index b10d7b55..c38306de 100644 --- a/src/login/pages/select-authenticator/select-authenticator.component.ts +++ b/src/login/pages/select-authenticator/select-authenticator.component.ts @@ -1,16 +1,6 @@ import { NgClass } from '@angular/common'; -import { - ChangeDetectionStrategy, - Component, - forwardRef, - inject, - input -} from '@angular/core'; -import { - CLASSES, - KC_CONTEXT, - USE_DEFAULT_CSS -} from '@keycloakify/angular/lib/public-api'; +import { ChangeDetectionStrategy, Component, forwardRef, inject, input } from '@angular/core'; +import { CLASSES, KC_CONTEXT, USE_DEFAULT_CSS } from '@keycloakify/angular/lib/public-api'; import { ClassKey } from 'keycloakify/login/lib/kcClsx'; import { KcContext } from 'keycloakify/login/KcContext'; import { ComponentReference } from '@keycloakify/angular/login/classes/component-reference.class'; @@ -21,13 +11,7 @@ import { MsgStrPipe } from '@keycloakify/angular/login/pipes/msg-str.pipe'; @Component({ standalone: true, - imports: [ - TemplateComponent, - MsgStrPipe, - AdvancedMsgStrPipe, - KcClassDirective, - NgClass - ], + imports: [TemplateComponent, MsgStrPipe, AdvancedMsgStrPipe, KcClassDirective, NgClass], selector: 'kc-root', templateUrl: 'select-authenticator.component.html', changeDetection: ChangeDetectionStrategy.OnPush, @@ -39,8 +23,7 @@ import { MsgStrPipe } from '@keycloakify/angular/login/pipes/msg-str.pipe'; ] }) export class SelectAuthenticatorComponent extends ComponentReference { - kcContext = - inject>(KC_CONTEXT); + kcContext = inject>(KC_CONTEXT); override doUseDefaultCss = inject(USE_DEFAULT_CSS); override classes = inject>>(CLASSES); displayRequiredFields = input(false); diff --git a/src/login/pages/terms/terms.component.html b/src/login/pages/terms/terms.component.html index 8aa1d517..a5e8039e 100644 --- a/src/login/pages/terms/terms.component.html +++ b/src/login/pages/terms/terms.component.html @@ -1,36 +1,36 @@ @let url = kcContext.url; - - {{ 'termsTitle' | msgStr }} - - -
{{ 'termsText' | msgStr }}
-
- - -
-
-
+ + {{ 'termsTitle' | msgStr }} + + +
{{ 'termsText' | msgStr }}
+
+ + +
+
+
diff --git a/src/login/pages/terms/terms.component.ts b/src/login/pages/terms/terms.component.ts index 4180c4fd..53859f6c 100644 --- a/src/login/pages/terms/terms.component.ts +++ b/src/login/pages/terms/terms.component.ts @@ -1,15 +1,5 @@ -import { - ChangeDetectionStrategy, - Component, - forwardRef, - inject, - input -} from '@angular/core'; -import { - CLASSES, - KC_CONTEXT, - USE_DEFAULT_CSS -} from '@keycloakify/angular/lib/public-api'; +import { ChangeDetectionStrategy, Component, forwardRef, inject, input } from '@angular/core'; +import { CLASSES, KC_CONTEXT, USE_DEFAULT_CSS } from '@keycloakify/angular/lib/public-api'; import { ClassKey } from 'keycloakify/login/lib/kcClsx'; import { KcContext } from 'keycloakify/login/KcContext'; import { ComponentReference } from '@keycloakify/angular/login/classes/component-reference.class'; diff --git a/src/login/pages/update-email/update-email.component.html b/src/login/pages/update-email/update-email.component.html index 56526c75..e19580b5 100644 --- a/src/login/pages/update-email/update-email.component.html +++ b/src/login/pages/update-email/update-email.component.html @@ -1,58 +1,58 @@ @let url = kcContext.url; @let isAppInitiatedAction = kcContext.isAppInitiatedAction; - - {{ 'updateEmailTitle' | msgStr }} - - -
- -
-
+ {{ 'updateEmailTitle' | msgStr }} + + + -
-
- -
- - @if (isAppInitiatedAction) { - - } -
-
-
-
+ +
+
+
+
+ +
+ + @if (isAppInitiatedAction) { + + } +
+
+ +
diff --git a/src/login/pages/update-email/update-email.component.ts b/src/login/pages/update-email/update-email.component.ts index b1cb9f4f..270fd4b3 100644 --- a/src/login/pages/update-email/update-email.component.ts +++ b/src/login/pages/update-email/update-email.component.ts @@ -1,16 +1,5 @@ -import { - ChangeDetectionStrategy, - Component, - forwardRef, - inject, - input, - signal -} from '@angular/core'; -import { - CLASSES, - KC_CONTEXT, - USE_DEFAULT_CSS -} from '@keycloakify/angular/lib/public-api'; +import { ChangeDetectionStrategy, Component, forwardRef, inject, input, signal } from '@angular/core'; +import { CLASSES, KC_CONTEXT, USE_DEFAULT_CSS } from '@keycloakify/angular/lib/public-api'; import { ClassKey } from 'keycloakify/login/lib/kcClsx'; import { KcContext } from 'keycloakify/login/KcContext'; import { ComponentReference } from '@keycloakify/angular/login/classes/component-reference.class'; @@ -22,13 +11,7 @@ import { MsgStrPipe } from '@keycloakify/angular/login/pipes/msg-str.pipe'; @Component({ standalone: true, - imports: [ - TemplateComponent, - MsgStrPipe, - KcClassDirective, - UserProfileFormFieldsComponent, - LogoutOtherSessionsComponent - ], + imports: [TemplateComponent, MsgStrPipe, KcClassDirective, UserProfileFormFieldsComponent, LogoutOtherSessionsComponent], selector: 'kc-root', templateUrl: 'update-email.component.html', changeDetection: ChangeDetectionStrategy.OnPush, diff --git a/src/login/pages/webauthn-authenticate/webauthn-authenticate.component.html b/src/login/pages/webauthn-authenticate/webauthn-authenticate.component.html index d21f5b33..1e5537be 100644 --- a/src/login/pages/webauthn-authenticate/webauthn-authenticate.component.html +++ b/src/login/pages/webauthn-authenticate/webauthn-authenticate.component.html @@ -3,160 +3,158 @@ @let shouldDisplayAuthenticators = kcContext.shouldDisplayAuthenticators; - - {{ 'webauthn-login-title' | msgStr }} - - -
- - {{ 'noAccount' | msgStr }} - + {{ 'webauthn-login-title' | msgStr }} + + + + + +
- {{ 'doRegister' | msgStr }} - - -
-
- -
-
- - - - - - -
+
+ + + + + + +
-
- @if (authenticators) { -
- @for (authenticator of authenticators.authenticators; track authenticator.credentialId) { - - } - @if (shouldDisplayAuthenticators) { - @if (authenticators.authenticators.length > 1) { -

{{ 'webauthn-available-authenticators' | msgStr }}

- } -
- @for ( - authenticator of authenticators.authenticators; - track authenticator.credentialId; - let i = $index - ) { -
-
- -
-
- {{ authenticator.label | advancedMsgStr }} -
- @if (authenticator.transports.displayNameProperties?.length) { -
- @for ( - displayNameProperty of authenticator.transports.displayNameProperties; - track displayNameProperty; - let last = $last - ) { - {{ displayNameProperty | advancedMsgStr }} - @if (!last) { - , - } +
+ @if (authenticators) { + + @for (authenticator of authenticators.authenticators; track authenticator.credentialId) { + + } + @if (shouldDisplayAuthenticators) { + @if (authenticators.authenticators.length > 1) { +

+ {{ 'webauthn-available-authenticators' | msgStr }} +

} -
-
- - {{ 'webauthn-createdAt-label' | msgStr }} - - {{ authenticator.createdAt }} -
-
+
+ @for (authenticator of authenticators.authenticators; track authenticator.credentialId; let i = $index) { +
+
+ +
+
+ {{ authenticator.label | advancedMsgStr }} +
+ @if (authenticator.transports.displayNameProperties?.length) { +
+ @for ( + displayNameProperty of authenticator.transports.displayNameProperties; + track displayNameProperty; + let last = $last + ) { + {{ displayNameProperty | advancedMsgStr }} + @if (!last) { + , + } + } +
+
+ + {{ 'webauthn-createdAt-label' | msgStr }} + + {{ authenticator.createdAt }} +
+
+ } +
+
+
+ } +
} -
-
-
+ } -
- } - - } -
- +
+ +
+
-
-
-
+ diff --git a/src/login/pages/webauthn-authenticate/webauthn-authenticate.component.ts b/src/login/pages/webauthn-authenticate/webauthn-authenticate.component.ts index 92051294..87353e82 100644 --- a/src/login/pages/webauthn-authenticate/webauthn-authenticate.component.ts +++ b/src/login/pages/webauthn-authenticate/webauthn-authenticate.component.ts @@ -1,15 +1,5 @@ -import { - ChangeDetectionStrategy, - Component, - forwardRef, - inject, - input -} from '@angular/core'; -import { - CLASSES, - KC_CONTEXT, - USE_DEFAULT_CSS -} from '@keycloakify/angular/lib/public-api'; +import { ChangeDetectionStrategy, Component, forwardRef, inject, input } from '@angular/core'; +import { CLASSES, KC_CONTEXT, USE_DEFAULT_CSS } from '@keycloakify/angular/lib/public-api'; import { Script } from '@keycloakify/angular/lib/models'; import { ClassKey } from 'keycloakify/login/lib/kcClsx'; import { KcContext } from 'keycloakify/login/KcContext'; @@ -24,13 +14,7 @@ import { LoginResourceInjectorService } from '@keycloakify/angular/login/service @Component({ standalone: true, - imports: [ - TemplateComponent, - MsgStrPipe, - AdvancedMsgStrPipe, - KcClassDirective, - LogoutOtherSessionsComponent - ], + imports: [TemplateComponent, MsgStrPipe, AdvancedMsgStrPipe, KcClassDirective, LogoutOtherSessionsComponent], selector: 'kc-root', templateUrl: 'webauthn-authenticate.component.html', changeDetection: ChangeDetectionStrategy.OnPush, @@ -43,8 +27,7 @@ import { LoginResourceInjectorService } from '@keycloakify/angular/login/service ] }) export class WebauthnAuthenticateComponent extends ComponentReference { - kcContext = - inject>(KC_CONTEXT); + kcContext = inject>(KC_CONTEXT); loginResourceInjectorService = inject(LoginResourceInjectorService); msgStr = inject(MsgStrPipe); override doUseDefaultCss = inject(USE_DEFAULT_CSS); @@ -59,14 +42,7 @@ export class WebauthnAuthenticateComponent extends ComponentReference { constructor() { super(); - const { - url, - isUserIdentified, - challenge, - userVerification, - rpId, - createTimeout - } = this.kcContext; + const { url, isUserIdentified, challenge, userVerification, rpId, createTimeout } = this.kcContext; const scripts: Script[] = [ { type: 'module', diff --git a/src/login/pages/webauthn-error/webauthn-error.component.html b/src/login/pages/webauthn-error/webauthn-error.component.html index 720404d6..587e5069 100644 --- a/src/login/pages/webauthn-error/webauthn-error.component.html +++ b/src/login/pages/webauthn-error/webauthn-error.component.html @@ -2,59 +2,59 @@ @let isAppInitiatedAction = kcContext.isAppInitiatedAction; - - {{ 'webauthn-error-title' | msgStr }} - - -
- - -
- - @if (isAppInitiatedAction) { -
- -
- } -
+ + + + + @if (isAppInitiatedAction) { +
+ +
+ } +
diff --git a/src/login/pages/webauthn-error/webauthn-error.component.ts b/src/login/pages/webauthn-error/webauthn-error.component.ts index 8f2a144c..c652b949 100644 --- a/src/login/pages/webauthn-error/webauthn-error.component.ts +++ b/src/login/pages/webauthn-error/webauthn-error.component.ts @@ -1,15 +1,5 @@ -import { - ChangeDetectionStrategy, - Component, - forwardRef, - inject, - input -} from '@angular/core'; -import { - CLASSES, - KC_CONTEXT, - USE_DEFAULT_CSS -} from '@keycloakify/angular/lib/public-api'; +import { ChangeDetectionStrategy, Component, forwardRef, inject, input } from '@angular/core'; +import { CLASSES, KC_CONTEXT, USE_DEFAULT_CSS } from '@keycloakify/angular/lib/public-api'; import { ClassKey } from 'keycloakify/login/lib/kcClsx'; import { KcContext } from 'keycloakify/login/KcContext'; import { ComponentReference } from '@keycloakify/angular/login/classes/component-reference.class'; @@ -20,12 +10,7 @@ import { MsgStrPipe } from '@keycloakify/angular/login/pipes/msg-str.pipe'; @Component({ standalone: true, - imports: [ - TemplateComponent, - MsgStrPipe, - KcClassDirective, - LogoutOtherSessionsComponent - ], + imports: [TemplateComponent, MsgStrPipe, KcClassDirective, LogoutOtherSessionsComponent], selector: 'kc-root', templateUrl: 'webauthn-error.component.html', changeDetection: ChangeDetectionStrategy.OnPush, diff --git a/src/login/pages/webauthn-register/webauthn-register.component.html b/src/login/pages/webauthn-register/webauthn-register.component.html index 78193623..26e1777e 100644 --- a/src/login/pages/webauthn-register/webauthn-register.component.html +++ b/src/login/pages/webauthn-register/webauthn-register.component.html @@ -3,80 +3,80 @@ @let isAppInitiatedAction = kcContext.isAppInitiatedAction; - - - {{ 'webauthn-registration-title' | msgStr }} - - -
-
- - - - - + + + {{ 'webauthn-registration-title' | msgStr }} + + + +
+ + + + + + + +
+ - -
- - - @if (!isSetRetry && isAppInitiatedAction) { -
- -
- } -
+ @if (!isSetRetry && isAppInitiatedAction) { +
+ +
+ } +
diff --git a/src/login/pages/webauthn-register/webauthn-register.component.ts b/src/login/pages/webauthn-register/webauthn-register.component.ts index 969ceec9..cdcc0544 100644 --- a/src/login/pages/webauthn-register/webauthn-register.component.ts +++ b/src/login/pages/webauthn-register/webauthn-register.component.ts @@ -1,15 +1,5 @@ -import { - ChangeDetectionStrategy, - Component, - forwardRef, - inject, - input -} from '@angular/core'; -import { - CLASSES, - KC_CONTEXT, - USE_DEFAULT_CSS -} from '@keycloakify/angular/lib/public-api'; +import { ChangeDetectionStrategy, Component, forwardRef, inject, input } from '@angular/core'; +import { CLASSES, KC_CONTEXT, USE_DEFAULT_CSS } from '@keycloakify/angular/lib/public-api'; import { Script } from '@keycloakify/angular/lib/models'; import { ClassKey } from 'keycloakify/login/lib/kcClsx'; import { KcContext } from 'keycloakify/login/KcContext'; @@ -22,12 +12,7 @@ import { LoginResourceInjectorService } from '@keycloakify/angular/login/service @Component({ standalone: true, - imports: [ - TemplateComponent, - MsgStrPipe, - KcClassDirective, - LogoutOtherSessionsComponent - ], + imports: [TemplateComponent, MsgStrPipe, KcClassDirective, LogoutOtherSessionsComponent], selector: 'kc-root', templateUrl: 'webauthn-register.component.html', changeDetection: ChangeDetectionStrategy.OnPush, @@ -40,8 +25,7 @@ import { LoginResourceInjectorService } from '@keycloakify/angular/login/service ] }) export class WebauthnRegisterComponent extends ComponentReference { - kcContext = - inject>(KC_CONTEXT); + kcContext = inject>(KC_CONTEXT); loginResourceInjectorService = inject(LoginResourceInjectorService); msgStr = inject(MsgStrPipe); override doUseDefaultCss = inject(USE_DEFAULT_CSS); diff --git a/src/tsconfig.json b/src/tsconfig.json index c0b21cbc..8dc713da 100644 --- a/src/tsconfig.json +++ b/src/tsconfig.json @@ -11,7 +11,6 @@ "paths": { "@keycloakify/angular/*": ["./*"] }, - "jsx": "react-jsx", "allowSyntheticDefaultImports": true, "experimentalDecorators": true } From 19929373a0494d585d824fd00b1e681b1c5758b1 Mon Sep 17 00:00:00 2001 From: Luca Peruzzo Date: Mon, 30 Sep 2024 11:28:34 +0200 Subject: [PATCH 32/64] clean yarn install automatic packageManager add --- package.json | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/package.json b/package.json index 3fc7f252..9f284f26 100644 --- a/package.json +++ b/package.json @@ -68,6 +68,5 @@ }, "publishConfig": { "access": "public" - }, - "packageManager": "yarn@1.22.22+sha512.a6b2f7906b721bba3d67d4aff083df04dad64c399707841b7acf00f6b133b7ac24255f2652fa22ae3534329dc6180534e98d17432037ff6fd140556e2bb3137e" + } } From 3b5accfd2320aa705f527fdbe9a1cff603506cb4 Mon Sep 17 00:00:00 2001 From: Joseph Garrone Date: Mon, 30 Sep 2024 09:20:04 +0200 Subject: [PATCH 33/64] Minor fix in linking script --- scripts/link-in-app.ts | 20 ++++++++++++++----- .../hello-world/hello-world.component.html | 2 +- 2 files changed, 16 insertions(+), 6 deletions(-) diff --git a/scripts/link-in-app.ts b/scripts/link-in-app.ts index 4c22130c..a8098bc3 100644 --- a/scripts/link-in-app.ts +++ b/scripts/link-in-app.ts @@ -194,6 +194,21 @@ const [nodePath, , ...args] = process.argv; (function callee() { + remove_angular_cache: { + + const angularCacheDirPath = pathJoin(__dirname, "..", "..", ".angular", "cache"); + + if( !fs.existsSync(angularCacheDirPath) ){ + break remove_angular_cache; + } + + fs.rmSync( + angularCacheDirPath, + { recursive: true } + ); + + } + const serverProcess = spawn( nodePath, [ @@ -234,11 +249,6 @@ const [nodePath, , ...args] = process.argv; serverProcess.kill('SIGTERM'); - fs.rmSync( - pathJoin(__dirname, "..", "..", ".angular", "cache"), - { recursive: true } - ); - callee(); } diff --git a/src/login/components/hello-world/hello-world.component.html b/src/login/components/hello-world/hello-world.component.html index dc2c4947..589144d4 100644 --- a/src/login/components/hello-world/hello-world.component.html +++ b/src/login/components/hello-world/hello-world.component.html @@ -1 +1 @@ -

hello-world works! epic victory royal

+

hello-world works!

From f106683c3d09ecd9fc30785fa6c9007d254f4ceb Mon Sep 17 00:00:00 2001 From: Joseph Garrone Date: Mon, 30 Sep 2024 18:18:02 +0200 Subject: [PATCH 34/64] Update tsafe to get rid of CJS warnings --- package.json | 6 +++--- yarn.lock | 18 +++++++++--------- 2 files changed, 12 insertions(+), 12 deletions(-) diff --git a/package.json b/package.json index 9f284f26..d082456b 100644 --- a/package.json +++ b/package.json @@ -36,16 +36,16 @@ ], "homepage": "https://www.keycloakify.dev", "dependencies": { - "tsafe": "^1.6.6" + "tsafe": "^1.7.4" }, "peerDependencies": { - "keycloakify": "^11.2.2", + "keycloakify": "^11.2.4", "@angular/core": "^18.0.0", "@angular/common": "^18.0.0", "@angular/platform-browser": "^18.0.0" }, "devDependencies": { - "keycloakify": "^11.2.2", + "keycloakify": "^11.2.4", "prettier": "^3.2.5", "typescript": "~5.4.0", "husky": "^4.3.8", diff --git a/yarn.lock b/yarn.lock index 162fa0e0..8336bb9c 100644 --- a/yarn.lock +++ b/yarn.lock @@ -4723,12 +4723,12 @@ karma-source-map-support@1.4.0: dependencies: source-map-support "^0.5.5" -keycloakify@^11.2.2: - version "11.2.2" - resolved "https://registry.yarnpkg.com/keycloakify/-/keycloakify-11.2.2.tgz#316b562ad3545e304571d37543d69afdf62d552c" - integrity sha512-QiRTAyiya3zpuwnzuiSJiEKaBGe7Dk0NaAIKfv+bUaXPMsEAncQHaHBCeMy5vACfxIiMpBjdLAgIpPT9br7Qwg== +keycloakify@^11.2.4: + version "11.2.4" + resolved "https://registry.yarnpkg.com/keycloakify/-/keycloakify-11.2.4.tgz#445d2555548c245d36db819a764dcab44f5defb7" + integrity sha512-T9xH+DiD6C6f24woxFV7wXGAcbVSH9ggcsDhMbmMopdYSLN+5dqTZMBc/Qqv9NSfvQeTYCdAOpgqaiBfXXEl+A== dependencies: - tsafe "^1.6.6" + tsafe "^1.7.4" kind-of@^6.0.2: version "6.0.3" @@ -6749,10 +6749,10 @@ tree-kill@1.2.2: resolved "https://registry.yarnpkg.com/tree-kill/-/tree-kill-1.2.2.tgz#4ca09a9092c88b73a7cdc5e8a01b507b0790a0cc" integrity sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A== -tsafe@^1.6.6: - version "1.7.2" - resolved "https://registry.yarnpkg.com/tsafe/-/tsafe-1.7.2.tgz#0f63d414876287ad01b135f832722f93e22da374" - integrity sha512-dAPfQLhCfCRre5qs+Z5Q2a7s2CV7RxffZUmvj7puGaePYjECzWREJFd3w4XSFe/T5tbxgowfItA/JSSZ6Ma3dA== +tsafe@^1.7.4: + version "1.7.4" + resolved "https://registry.yarnpkg.com/tsafe/-/tsafe-1.7.4.tgz#7dd288b1a1be8d9c25e84ab8dd8a7df6094168d7" + integrity sha512-4BrLklZMJ14dEtA+CkhY9OtID3al4+/GJhaeocWPtUuoZPr4SJkaqoPemyFgkLC1Y3LRNXF9zxa94SwssRGMaQ== tsc-alias@^1.8.10: version "1.8.10" From dbdab8359720f6f29f686318f88cd616e139ac1d Mon Sep 17 00:00:00 2001 From: Joseph Garrone Date: Mon, 30 Sep 2024 18:20:09 +0200 Subject: [PATCH 35/64] Remove already installed at the root level dependency from workspace --- scripts/build/workspace/package.json | 24 +----------------------- 1 file changed, 1 insertion(+), 23 deletions(-) diff --git a/scripts/build/workspace/package.json b/scripts/build/workspace/package.json index 97a810f7..5a91ebe6 100644 --- a/scripts/build/workspace/package.json +++ b/scripts/build/workspace/package.json @@ -2,27 +2,5 @@ "name": "keycloakify-angular-workspace", "version": "0.0.0", "type": "module", - "private": true, - "devDependencies": { - "keycloakify": "^11.2.2", - "prettier": "^3.2.5", - "typescript": "~5.4.0", - "husky": "^4.3.8", - "lint-staged": "^11.0.0", - "tsc-alias": "^1.8.10", - "tsx": "^4.15.5", - "@angular/core": "^18.2.6", - "@angular/common": "^18.2.6", - "@angular/platform-browser": "^18.2.6", - "@types/node": "^22.7.4", - "rxjs": "^7.8.1", - "zone.js": "^0.14.0", - "chalk": "^5.3.0", - "@angular-devkit/build-angular": "^18.2.6", - "@angular/cli": "^18.2.6", - "@angular/compiler-cli": "^18.2.6", - "@angular/compiler": "^18.2.6", - "ng-packagr": "^18.2.1", - "tslib": "^2.7.0" - } + "private": true } From d447bb1b46f50b74409b843ee8dda3e852968e79 Mon Sep 17 00:00:00 2001 From: Joseph Garrone Date: Mon, 30 Sep 2024 18:20:25 +0200 Subject: [PATCH 36/64] Fix ref path for final location --- scripts/build/workspace/angular.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/build/workspace/angular.json b/scripts/build/workspace/angular.json index 9af604e2..7c8c232d 100644 --- a/scripts/build/workspace/angular.json +++ b/scripts/build/workspace/angular.json @@ -1,5 +1,5 @@ { - "$schema": "./node_modules/@angular/cli/lib/config/schema.json", + "$schema": "../../node_modules/@angular/cli/lib/config/schema.json", "version": 1, "newProjectRoot": "projects", "projects": { From c263d2cc4d7b63b26d02cb268366b528f98063c4 Mon Sep 17 00:00:00 2001 From: Joseph Garrone Date: Mon, 30 Sep 2024 18:23:00 +0200 Subject: [PATCH 37/64] Clean dist before new build --- scripts/build/main.ts | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/scripts/build/main.ts b/scripts/build/main.ts index dbf407df..e44d0ba2 100644 --- a/scripts/build/main.ts +++ b/scripts/build/main.ts @@ -13,6 +13,13 @@ import { crawl } from '../tools/crawl'; const distDirPath = pathJoin(getThisCodebaseRootDirPath(), 'dist'); + fs.readdirSync(distDirPath).forEach(basename => { + if (basename === 'package.json') { + return; + } + fs.rmSync(pathJoin(distDirPath, basename), { recursive: true, force: true }); + }); + // tsc + angular JIT { const angularWorkspaceDirPath = pathJoin(distDirPath, 'workspace'); From a2b8198e067d279109ad9187c3e978ce2d6e68a6 Mon Sep 17 00:00:00 2001 From: Joseph Garrone Date: Mon, 30 Sep 2024 18:33:32 +0200 Subject: [PATCH 38/64] Fix readdir on non existing dir --- scripts/build/main.ts | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) diff --git a/scripts/build/main.ts b/scripts/build/main.ts index e44d0ba2..4ec44283 100644 --- a/scripts/build/main.ts +++ b/scripts/build/main.ts @@ -13,12 +13,18 @@ import { crawl } from '../tools/crawl'; const distDirPath = pathJoin(getThisCodebaseRootDirPath(), 'dist'); - fs.readdirSync(distDirPath).forEach(basename => { - if (basename === 'package.json') { - return; + clean_dit: { + if (!fs.existsSync(distDirPath)) { + break clean_dit; } - fs.rmSync(pathJoin(distDirPath, basename), { recursive: true, force: true }); - }); + + fs.readdirSync(distDirPath).forEach(basename => { + if (basename === 'package.json') { + return; + } + fs.rmSync(pathJoin(distDirPath, basename), { recursive: true, force: true }); + }); + } // tsc + angular JIT { From f90aa11ea993b8be3ebb1e36a4f1e96af0782f7c Mon Sep 17 00:00:00 2001 From: Joseph Garrone Date: Mon, 30 Sep 2024 18:33:46 +0200 Subject: [PATCH 39/64] Release candidate --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index d082456b..1d8c30b0 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@keycloakify/angular", - "version": "0.0.1-rc.2", + "version": "0.0.1-rc.3", "description": "Angular components for Keycloakify", "repository": { "type": "git", From 21ea77b6936cfff93ae862c2c85343f5b5424880 Mon Sep 17 00:00:00 2001 From: Luca Peruzzo Date: Mon, 30 Sep 2024 12:12:35 +0200 Subject: [PATCH 40/64] login/pages relative kcContext import --- src/login/pages/code/code.component.ts | 2 +- .../delete-account-confirm/delete-account-confirm.component.ts | 2 +- .../pages/delete-credential/delete-credential.component.ts | 2 +- src/login/pages/error/error.component.ts | 2 +- .../pages/frontchannel-logout/frontchannel-logout.component.ts | 2 +- .../idp-review-user-profile.component.ts | 2 +- src/login/pages/info/info.component.ts | 2 +- .../pages/login-config-totp/login-config-totp.component.ts | 2 +- .../login-idp-link-confirm-override.component.ts | 2 +- .../login-idp-link-confirm/login-idp-link-confirm.component.ts | 2 +- .../login-idp-link-email/login-idp-link-email.component.ts | 2 +- .../pages/login-oauth-grant/login-oauth-grant.component.ts | 2 +- .../login-oauth2-device-verify-user-code.component.ts | 2 +- src/login/pages/login-otp/login-otp.component.ts | 2 +- .../pages/login-page-expired/login-page-expired.component.ts | 2 +- .../login-passkeys-conditional-authenticate.component.ts | 2 +- src/login/pages/login-password/login-password.component.ts | 2 +- .../login-recovery-authn-code-config.component.ts | 2 +- .../login-recovery-authn-code-input.component.ts | 2 +- src/login/pages/login-reset-otp/login-reset-otp.component.ts | 2 +- .../login-reset-password/login-reset-password.component.ts | 2 +- .../login-update-password/login-update-password.component.ts | 2 +- .../login-update-profile/login-update-profile.component.ts | 2 +- src/login/pages/login-username/login-username.component.ts | 2 +- .../pages/login-verify-email/login-verify-email.component.ts | 2 +- src/login/pages/login-x509-info/login-x509-info.component.ts | 2 +- src/login/pages/login/login.component.ts | 2 +- src/login/pages/logout-confirm/logout-confirm.component.ts | 2 +- src/login/pages/register/register.component.ts | 2 +- src/login/pages/saml-post-form/saml-post-form.component.ts | 2 +- .../select-authenticator/select-authenticator.component.ts | 2 +- src/login/pages/terms/terms.component.ts | 2 +- src/login/pages/update-email/update-email.component.ts | 2 +- .../webauthn-authenticate/webauthn-authenticate.component.ts | 2 +- src/login/pages/webauthn-error/webauthn-error.component.ts | 2 +- .../pages/webauthn-register/webauthn-register.component.ts | 2 +- 36 files changed, 36 insertions(+), 36 deletions(-) diff --git a/src/login/pages/code/code.component.ts b/src/login/pages/code/code.component.ts index b31bd24f..7dfb61e9 100644 --- a/src/login/pages/code/code.component.ts +++ b/src/login/pages/code/code.component.ts @@ -1,7 +1,7 @@ import { ChangeDetectionStrategy, Component, forwardRef, inject } from '@angular/core'; import { CLASSES, KC_CONTEXT, USE_DEFAULT_CSS } from '@keycloakify/angular/lib/public-api'; import { ClassKey } from 'keycloakify/login/lib/kcClsx'; -import { KcContext } from 'keycloakify/login/KcContext'; +import { KcContext } from '../../KcContext'; import { ComponentReference } from '@keycloakify/angular/login/classes/component-reference.class'; import { TemplateComponent } from '@keycloakify/angular/login/containers/template.component'; import { KcClassDirective } from '@keycloakify/angular/login/directives/kc-class.directive'; diff --git a/src/login/pages/delete-account-confirm/delete-account-confirm.component.ts b/src/login/pages/delete-account-confirm/delete-account-confirm.component.ts index 7f2f0271..c6ab13a1 100644 --- a/src/login/pages/delete-account-confirm/delete-account-confirm.component.ts +++ b/src/login/pages/delete-account-confirm/delete-account-confirm.component.ts @@ -1,7 +1,7 @@ import { ChangeDetectionStrategy, Component, forwardRef, inject } from '@angular/core'; import { CLASSES, KC_CONTEXT, USE_DEFAULT_CSS } from '@keycloakify/angular/lib/public-api'; import { ClassKey } from 'keycloakify/login/lib/kcClsx'; -import { KcContext } from 'keycloakify/login/KcContext'; +import { KcContext } from '../../KcContext'; import { ComponentReference } from '@keycloakify/angular/login/classes/component-reference.class'; import { TemplateComponent } from '@keycloakify/angular/login/containers/template.component'; import { KcClassDirective } from '@keycloakify/angular/login/directives'; diff --git a/src/login/pages/delete-credential/delete-credential.component.ts b/src/login/pages/delete-credential/delete-credential.component.ts index 996371ef..4bdefa19 100644 --- a/src/login/pages/delete-credential/delete-credential.component.ts +++ b/src/login/pages/delete-credential/delete-credential.component.ts @@ -1,7 +1,7 @@ import { ChangeDetectionStrategy, Component, forwardRef, inject, input } from '@angular/core'; import { CLASSES, KC_CONTEXT, USE_DEFAULT_CSS } from '@keycloakify/angular/lib/public-api'; import { ClassKey } from 'keycloakify/login/lib/kcClsx'; -import { KcContext } from 'keycloakify/login/KcContext'; +import { KcContext } from '../../KcContext'; import { ComponentReference } from '@keycloakify/angular/login/classes/component-reference.class'; import { TemplateComponent } from '@keycloakify/angular/login/containers/template.component'; import { KcClassDirective } from '@keycloakify/angular/login/directives/kc-class.directive'; diff --git a/src/login/pages/error/error.component.ts b/src/login/pages/error/error.component.ts index 3db03710..6d59c878 100644 --- a/src/login/pages/error/error.component.ts +++ b/src/login/pages/error/error.component.ts @@ -1,7 +1,7 @@ import { ChangeDetectionStrategy, Component, forwardRef, inject } from '@angular/core'; import { CLASSES, KC_CONTEXT, USE_DEFAULT_CSS } from '@keycloakify/angular/lib/public-api'; import { ClassKey } from 'keycloakify/login/lib/kcClsx'; -import { KcContext } from 'keycloakify/login/KcContext'; +import { KcContext } from '../../KcContext'; import { ComponentReference } from '@keycloakify/angular/login/classes/component-reference.class'; import { TemplateComponent } from '@keycloakify/angular/login/containers/template.component'; import { KcSanitizePipe } from '@keycloakify/angular/login/pipes/kc-sanitize.pipe'; diff --git a/src/login/pages/frontchannel-logout/frontchannel-logout.component.ts b/src/login/pages/frontchannel-logout/frontchannel-logout.component.ts index 429dd2d7..a0d8223e 100644 --- a/src/login/pages/frontchannel-logout/frontchannel-logout.component.ts +++ b/src/login/pages/frontchannel-logout/frontchannel-logout.component.ts @@ -1,7 +1,7 @@ import { ChangeDetectionStrategy, Component, forwardRef, inject, input, OnInit } from '@angular/core'; import { CLASSES, KC_CONTEXT, USE_DEFAULT_CSS } from '@keycloakify/angular/lib/public-api'; import { ClassKey } from 'keycloakify/login/lib/kcClsx'; -import { KcContext } from 'keycloakify/login/KcContext'; +import { KcContext } from '../../KcContext'; import { ComponentReference } from '@keycloakify/angular/login/classes/component-reference.class'; import { TemplateComponent } from '@keycloakify/angular/login/containers/template.component'; import { KcSanitizePipe } from '@keycloakify/angular/login/pipes/kc-sanitize.pipe'; diff --git a/src/login/pages/idp-review-user-profile/idp-review-user-profile.component.ts b/src/login/pages/idp-review-user-profile/idp-review-user-profile.component.ts index e4df5f20..a6524c60 100644 --- a/src/login/pages/idp-review-user-profile/idp-review-user-profile.component.ts +++ b/src/login/pages/idp-review-user-profile/idp-review-user-profile.component.ts @@ -1,7 +1,7 @@ import { ChangeDetectionStrategy, Component, forwardRef, inject, input, signal } from '@angular/core'; import { CLASSES, KC_CONTEXT, USE_DEFAULT_CSS } from '@keycloakify/angular/lib/public-api'; import { ClassKey } from 'keycloakify/login/lib/kcClsx'; -import { KcContext } from 'keycloakify/login/KcContext'; +import { KcContext } from '../../KcContext'; import { ComponentReference } from '@keycloakify/angular/login/classes/component-reference.class'; import { UserProfileFormFieldsComponent } from '@keycloakify/angular/login/components/user-profile-form-fields/user-profile-form-fields.component'; import { TemplateComponent } from '@keycloakify/angular/login/containers/template.component'; diff --git a/src/login/pages/info/info.component.ts b/src/login/pages/info/info.component.ts index c0729c9f..d29c40cf 100644 --- a/src/login/pages/info/info.component.ts +++ b/src/login/pages/info/info.component.ts @@ -1,7 +1,7 @@ import { ChangeDetectionStrategy, Component, forwardRef, inject, input } from '@angular/core'; import { CLASSES, KC_CONTEXT, USE_DEFAULT_CSS } from '@keycloakify/angular/lib/public-api'; import { ClassKey } from 'keycloakify/login/lib/kcClsx'; -import { KcContext } from 'keycloakify/login/KcContext'; +import { KcContext } from '../../KcContext'; import { ComponentReference } from '@keycloakify/angular/login/classes/component-reference.class'; import { TemplateComponent } from '@keycloakify/angular/login/containers/template.component'; import { AdvancedMsgStrPipe } from '@keycloakify/angular/login/pipes/advanced-msg-str.pipe'; diff --git a/src/login/pages/login-config-totp/login-config-totp.component.ts b/src/login/pages/login-config-totp/login-config-totp.component.ts index b8ee6d3e..3fdb748a 100644 --- a/src/login/pages/login-config-totp/login-config-totp.component.ts +++ b/src/login/pages/login-config-totp/login-config-totp.component.ts @@ -1,7 +1,7 @@ import { ChangeDetectionStrategy, Component, forwardRef, inject, input } from '@angular/core'; import { CLASSES, KC_CONTEXT, USE_DEFAULT_CSS } from '@keycloakify/angular/lib/public-api'; import { ClassKey } from 'keycloakify/login/lib/kcClsx'; -import { KcContext } from 'keycloakify/login/KcContext'; +import { KcContext } from '../../KcContext'; import { ComponentReference } from '@keycloakify/angular/login/classes/component-reference.class'; import { LogoutOtherSessionsComponent } from '@keycloakify/angular/login/components/logout-other-sessions/logout-other-sessions.component'; import { TemplateComponent } from '@keycloakify/angular/login/containers/template.component'; diff --git a/src/login/pages/login-idp-link-confirm-override/login-idp-link-confirm-override.component.ts b/src/login/pages/login-idp-link-confirm-override/login-idp-link-confirm-override.component.ts index b5f884e6..da878fc0 100644 --- a/src/login/pages/login-idp-link-confirm-override/login-idp-link-confirm-override.component.ts +++ b/src/login/pages/login-idp-link-confirm-override/login-idp-link-confirm-override.component.ts @@ -1,7 +1,7 @@ import { ChangeDetectionStrategy, Component, forwardRef, inject, input } from '@angular/core'; import { CLASSES, KC_CONTEXT, USE_DEFAULT_CSS } from '@keycloakify/angular/lib/public-api'; import { ClassKey } from 'keycloakify/login/lib/kcClsx'; -import { KcContext } from 'keycloakify/login/KcContext'; +import { KcContext } from '../../KcContext'; import { ComponentReference } from '@keycloakify/angular/login/classes/component-reference.class'; import { TemplateComponent } from '@keycloakify/angular/login/containers/template.component'; import { KcClassDirective } from '@keycloakify/angular/login/directives/kc-class.directive'; diff --git a/src/login/pages/login-idp-link-confirm/login-idp-link-confirm.component.ts b/src/login/pages/login-idp-link-confirm/login-idp-link-confirm.component.ts index abca2058..c3491002 100644 --- a/src/login/pages/login-idp-link-confirm/login-idp-link-confirm.component.ts +++ b/src/login/pages/login-idp-link-confirm/login-idp-link-confirm.component.ts @@ -1,7 +1,7 @@ import { ChangeDetectionStrategy, Component, forwardRef, inject, input } from '@angular/core'; import { CLASSES, KC_CONTEXT, USE_DEFAULT_CSS } from '@keycloakify/angular/lib/public-api'; import { ClassKey } from 'keycloakify/login/lib/kcClsx'; -import { KcContext } from 'keycloakify/login/KcContext'; +import { KcContext } from '../../KcContext'; import { ComponentReference } from '@keycloakify/angular/login/classes/component-reference.class'; import { TemplateComponent } from '@keycloakify/angular/login/containers/template.component'; import { KcClassDirective } from '@keycloakify/angular/login/directives/kc-class.directive'; diff --git a/src/login/pages/login-idp-link-email/login-idp-link-email.component.ts b/src/login/pages/login-idp-link-email/login-idp-link-email.component.ts index 3f34ea71..e2494174 100644 --- a/src/login/pages/login-idp-link-email/login-idp-link-email.component.ts +++ b/src/login/pages/login-idp-link-email/login-idp-link-email.component.ts @@ -1,7 +1,7 @@ import { ChangeDetectionStrategy, Component, forwardRef, inject, input } from '@angular/core'; import { CLASSES, KC_CONTEXT, USE_DEFAULT_CSS } from '@keycloakify/angular/lib/public-api'; import { ClassKey } from 'keycloakify/login/lib/kcClsx'; -import { KcContext } from 'keycloakify/login/KcContext'; +import { KcContext } from '../../KcContext'; import { ComponentReference } from '@keycloakify/angular/login/classes/component-reference.class'; import { TemplateComponent } from '@keycloakify/angular/login/containers/template.component'; import { KcClassDirective } from '@keycloakify/angular/login/directives/kc-class.directive'; diff --git a/src/login/pages/login-oauth-grant/login-oauth-grant.component.ts b/src/login/pages/login-oauth-grant/login-oauth-grant.component.ts index 8312d949..f462529a 100644 --- a/src/login/pages/login-oauth-grant/login-oauth-grant.component.ts +++ b/src/login/pages/login-oauth-grant/login-oauth-grant.component.ts @@ -1,7 +1,7 @@ import { ChangeDetectionStrategy, Component, forwardRef, inject, input } from '@angular/core'; import { CLASSES, KC_CONTEXT, USE_DEFAULT_CSS } from '@keycloakify/angular/lib/public-api'; import { ClassKey } from 'keycloakify/login/lib/kcClsx'; -import { KcContext } from 'keycloakify/login/KcContext'; +import { KcContext } from '../../KcContext'; import { ComponentReference } from '@keycloakify/angular/login/classes/component-reference.class'; import { TemplateComponent } from '@keycloakify/angular/login/containers/template.component'; import { KcClassDirective } from '@keycloakify/angular/login/directives/kc-class.directive'; diff --git a/src/login/pages/login-oauth2-device-verify-user-code/login-oauth2-device-verify-user-code.component.ts b/src/login/pages/login-oauth2-device-verify-user-code/login-oauth2-device-verify-user-code.component.ts index 85c5a5da..e124615a 100644 --- a/src/login/pages/login-oauth2-device-verify-user-code/login-oauth2-device-verify-user-code.component.ts +++ b/src/login/pages/login-oauth2-device-verify-user-code/login-oauth2-device-verify-user-code.component.ts @@ -1,7 +1,7 @@ import { ChangeDetectionStrategy, Component, forwardRef, inject, input } from '@angular/core'; import { CLASSES, KC_CONTEXT, USE_DEFAULT_CSS } from '@keycloakify/angular/lib/public-api'; import { ClassKey } from 'keycloakify/login/lib/kcClsx'; -import { KcContext } from 'keycloakify/login/KcContext'; +import { KcContext } from '../../KcContext'; import { ComponentReference } from '@keycloakify/angular/login/classes/component-reference.class'; import { TemplateComponent } from '@keycloakify/angular/login/containers/template.component'; import { KcClassDirective } from '@keycloakify/angular/login/directives/kc-class.directive'; diff --git a/src/login/pages/login-otp/login-otp.component.ts b/src/login/pages/login-otp/login-otp.component.ts index 0dca5821..e256ef99 100644 --- a/src/login/pages/login-otp/login-otp.component.ts +++ b/src/login/pages/login-otp/login-otp.component.ts @@ -1,7 +1,7 @@ import { ChangeDetectionStrategy, Component, forwardRef, inject, input } from '@angular/core'; import { CLASSES, KC_CONTEXT, USE_DEFAULT_CSS } from '@keycloakify/angular/lib/public-api'; import { ClassKey } from 'keycloakify/login/lib/kcClsx'; -import { KcContext } from 'keycloakify/login/KcContext'; +import { KcContext } from '../../KcContext'; import { ComponentReference } from '@keycloakify/angular/login/classes/component-reference.class'; import { TemplateComponent } from '@keycloakify/angular/login/containers/template.component'; import { KcClassDirective } from '@keycloakify/angular/login/directives/kc-class.directive'; diff --git a/src/login/pages/login-page-expired/login-page-expired.component.ts b/src/login/pages/login-page-expired/login-page-expired.component.ts index fe6b953c..9a90da6b 100644 --- a/src/login/pages/login-page-expired/login-page-expired.component.ts +++ b/src/login/pages/login-page-expired/login-page-expired.component.ts @@ -1,7 +1,7 @@ import { ChangeDetectionStrategy, Component, forwardRef, inject, input } from '@angular/core'; import { CLASSES, KC_CONTEXT, USE_DEFAULT_CSS } from '@keycloakify/angular/lib/public-api'; import { ClassKey } from 'keycloakify/login/lib/kcClsx'; -import { KcContext } from 'keycloakify/login/KcContext'; +import { KcContext } from '../../KcContext'; import { ComponentReference } from '@keycloakify/angular/login/classes/component-reference.class'; import { TemplateComponent } from '@keycloakify/angular/login/containers/template.component'; import { MsgStrPipe } from '@keycloakify/angular/login/pipes/msg-str.pipe'; diff --git a/src/login/pages/login-passkeys-conditional-authenticate/login-passkeys-conditional-authenticate.component.ts b/src/login/pages/login-passkeys-conditional-authenticate/login-passkeys-conditional-authenticate.component.ts index 438dc06c..5d5ea1b4 100644 --- a/src/login/pages/login-passkeys-conditional-authenticate/login-passkeys-conditional-authenticate.component.ts +++ b/src/login/pages/login-passkeys-conditional-authenticate/login-passkeys-conditional-authenticate.component.ts @@ -2,7 +2,7 @@ import { ChangeDetectionStrategy, Component, forwardRef, inject } from '@angular import { CLASSES, KC_CONTEXT, USE_DEFAULT_CSS } from '@keycloakify/angular/lib/public-api'; import { Script } from '@keycloakify/angular/lib/models'; import { ClassKey } from 'keycloakify/login/lib/kcClsx'; -import { KcContext } from 'keycloakify/login/KcContext'; +import { KcContext } from '../../KcContext'; import { getKcClsx } from 'keycloakify/login/lib/kcClsx'; import { ComponentReference } from '@keycloakify/angular/login/classes/component-reference.class'; import { TemplateComponent } from '@keycloakify/angular/login/containers/template.component'; diff --git a/src/login/pages/login-password/login-password.component.ts b/src/login/pages/login-password/login-password.component.ts index 6de04e3d..2bace62e 100644 --- a/src/login/pages/login-password/login-password.component.ts +++ b/src/login/pages/login-password/login-password.component.ts @@ -1,7 +1,7 @@ import { ChangeDetectionStrategy, Component, forwardRef, inject, input, signal } from '@angular/core'; import { CLASSES, KC_CONTEXT, USE_DEFAULT_CSS } from '@keycloakify/angular/lib/public-api'; import { ClassKey } from 'keycloakify/login/lib/kcClsx'; -import { KcContext } from 'keycloakify/login/KcContext'; +import { KcContext } from '../../KcContext'; import { ComponentReference } from '@keycloakify/angular/login/classes/component-reference.class'; import { PasswordWrapperComponent } from '@keycloakify/angular/login/components/password-wrapper/password-wrapper.component'; import { TemplateComponent } from '@keycloakify/angular/login/containers/template.component'; diff --git a/src/login/pages/login-recovery-authn-code-config/login-recovery-authn-code-config.component.ts b/src/login/pages/login-recovery-authn-code-config/login-recovery-authn-code-config.component.ts index a142e1f3..0cac0f9f 100644 --- a/src/login/pages/login-recovery-authn-code-config/login-recovery-authn-code-config.component.ts +++ b/src/login/pages/login-recovery-authn-code-config/login-recovery-authn-code-config.component.ts @@ -1,7 +1,7 @@ import { ChangeDetectionStrategy, Component, forwardRef, inject, input, signal } from '@angular/core'; import { CLASSES, KC_CONTEXT, USE_DEFAULT_CSS } from '@keycloakify/angular/lib/public-api'; import { ClassKey } from 'keycloakify/login/lib/kcClsx'; -import { KcContext } from 'keycloakify/login/KcContext'; +import { KcContext } from '../../KcContext'; import { ComponentReference } from '@keycloakify/angular/login/classes/component-reference.class'; import { LogoutOtherSessionsComponent } from '@keycloakify/angular/login/components/logout-other-sessions/logout-other-sessions.component'; import { TemplateComponent } from '@keycloakify/angular/login/containers/template.component'; diff --git a/src/login/pages/login-recovery-authn-code-input/login-recovery-authn-code-input.component.ts b/src/login/pages/login-recovery-authn-code-input/login-recovery-authn-code-input.component.ts index df93d6ed..89ca8dd0 100644 --- a/src/login/pages/login-recovery-authn-code-input/login-recovery-authn-code-input.component.ts +++ b/src/login/pages/login-recovery-authn-code-input/login-recovery-authn-code-input.component.ts @@ -1,7 +1,7 @@ import { ChangeDetectionStrategy, Component, forwardRef, inject, input } from '@angular/core'; import { CLASSES, KC_CONTEXT, USE_DEFAULT_CSS } from '@keycloakify/angular/lib/public-api'; import { ClassKey } from 'keycloakify/login/lib/kcClsx'; -import { KcContext } from 'keycloakify/login/KcContext'; +import { KcContext } from '../../KcContext'; import { ComponentReference } from '@keycloakify/angular/login/classes/component-reference.class'; import { TemplateComponent } from '@keycloakify/angular/login/containers/template.component'; import { KcClassDirective } from '@keycloakify/angular/login/directives'; diff --git a/src/login/pages/login-reset-otp/login-reset-otp.component.ts b/src/login/pages/login-reset-otp/login-reset-otp.component.ts index 98e871b7..7aa58383 100644 --- a/src/login/pages/login-reset-otp/login-reset-otp.component.ts +++ b/src/login/pages/login-reset-otp/login-reset-otp.component.ts @@ -1,7 +1,7 @@ import { ChangeDetectionStrategy, Component, forwardRef, inject, input } from '@angular/core'; import { CLASSES, KC_CONTEXT, USE_DEFAULT_CSS } from '@keycloakify/angular/lib/public-api'; import { ClassKey } from 'keycloakify/login/lib/kcClsx'; -import { KcContext } from 'keycloakify/login/KcContext'; +import { KcContext } from '../../KcContext'; import { ComponentReference } from '@keycloakify/angular/login/classes/component-reference.class'; import { TemplateComponent } from '@keycloakify/angular/login/containers/template.component'; import { KcClassDirective } from '@keycloakify/angular/login/directives'; diff --git a/src/login/pages/login-reset-password/login-reset-password.component.ts b/src/login/pages/login-reset-password/login-reset-password.component.ts index 0b26a3a9..1fb4b032 100644 --- a/src/login/pages/login-reset-password/login-reset-password.component.ts +++ b/src/login/pages/login-reset-password/login-reset-password.component.ts @@ -1,7 +1,7 @@ import { ChangeDetectionStrategy, Component, forwardRef, inject, input } from '@angular/core'; import { CLASSES, KC_CONTEXT, USE_DEFAULT_CSS } from '@keycloakify/angular/lib/public-api'; import { ClassKey } from 'keycloakify/login/lib/kcClsx'; -import { KcContext } from 'keycloakify/login/KcContext'; +import { KcContext } from '../../KcContext'; import { ComponentReference } from '@keycloakify/angular/login/classes/component-reference.class'; import { TemplateComponent } from '@keycloakify/angular/login/containers/template.component'; import { KcClassDirective } from '@keycloakify/angular/login/directives'; diff --git a/src/login/pages/login-update-password/login-update-password.component.ts b/src/login/pages/login-update-password/login-update-password.component.ts index c33ed6af..d88ab3e6 100644 --- a/src/login/pages/login-update-password/login-update-password.component.ts +++ b/src/login/pages/login-update-password/login-update-password.component.ts @@ -1,7 +1,7 @@ import { ChangeDetectionStrategy, Component, forwardRef, inject, input } from '@angular/core'; import { CLASSES, KC_CONTEXT, USE_DEFAULT_CSS } from '@keycloakify/angular/lib/public-api'; import { ClassKey } from 'keycloakify/login/lib/kcClsx'; -import { KcContext } from 'keycloakify/login/KcContext'; +import { KcContext } from '../../KcContext'; import { ComponentReference } from '@keycloakify/angular/login/classes/component-reference.class'; import { LogoutOtherSessionsComponent } from '@keycloakify/angular/login/components/logout-other-sessions/logout-other-sessions.component'; import { PasswordWrapperComponent } from '@keycloakify/angular/login/components/password-wrapper/password-wrapper.component'; diff --git a/src/login/pages/login-update-profile/login-update-profile.component.ts b/src/login/pages/login-update-profile/login-update-profile.component.ts index c61d1495..0c80dac1 100644 --- a/src/login/pages/login-update-profile/login-update-profile.component.ts +++ b/src/login/pages/login-update-profile/login-update-profile.component.ts @@ -1,7 +1,7 @@ import { ChangeDetectionStrategy, Component, forwardRef, inject, input, signal } from '@angular/core'; import { CLASSES, KC_CONTEXT, USE_DEFAULT_CSS } from '@keycloakify/angular/lib/public-api'; import { ClassKey } from 'keycloakify/login/lib/kcClsx'; -import { KcContext } from 'keycloakify/login/KcContext'; +import { KcContext } from '../../KcContext'; import { ComponentReference } from '@keycloakify/angular/login/classes/component-reference.class'; import { UserProfileFormFieldsComponent } from '@keycloakify/angular/login/components/user-profile-form-fields/user-profile-form-fields.component'; import { TemplateComponent } from '@keycloakify/angular/login/containers/template.component'; diff --git a/src/login/pages/login-username/login-username.component.ts b/src/login/pages/login-username/login-username.component.ts index cf40ac8c..a4393bca 100644 --- a/src/login/pages/login-username/login-username.component.ts +++ b/src/login/pages/login-username/login-username.component.ts @@ -2,7 +2,7 @@ import { AsyncPipe, NgClass } from '@angular/common'; import { ChangeDetectionStrategy, Component, forwardRef, inject, input, signal } from '@angular/core'; import { CLASSES, KC_CONTEXT, USE_DEFAULT_CSS } from '@keycloakify/angular/lib/public-api'; import { ClassKey } from 'keycloakify/login/lib/kcClsx'; -import { KcContext } from 'keycloakify/login/KcContext'; +import { KcContext } from '../../KcContext'; import { ComponentReference } from '@keycloakify/angular/login/classes/component-reference.class'; import { TemplateComponent } from '@keycloakify/angular/login/containers/template.component'; import { KcClassDirective } from '@keycloakify/angular/login/directives/kc-class.directive'; diff --git a/src/login/pages/login-verify-email/login-verify-email.component.ts b/src/login/pages/login-verify-email/login-verify-email.component.ts index 3b4e439a..e4056111 100644 --- a/src/login/pages/login-verify-email/login-verify-email.component.ts +++ b/src/login/pages/login-verify-email/login-verify-email.component.ts @@ -1,7 +1,7 @@ import { ChangeDetectionStrategy, Component, forwardRef, inject, input } from '@angular/core'; import { CLASSES, KC_CONTEXT, USE_DEFAULT_CSS } from '@keycloakify/angular/lib/public-api'; import { ClassKey } from 'keycloakify/login/lib/kcClsx'; -import { KcContext } from 'keycloakify/login/KcContext'; +import { KcContext } from '../../KcContext'; import { ComponentReference } from '@keycloakify/angular/login/classes/component-reference.class'; import { TemplateComponent } from '@keycloakify/angular/login/containers/template.component'; import { KcClassDirective } from '@keycloakify/angular/login/directives'; diff --git a/src/login/pages/login-x509-info/login-x509-info.component.ts b/src/login/pages/login-x509-info/login-x509-info.component.ts index 878a788b..0a1c01b2 100644 --- a/src/login/pages/login-x509-info/login-x509-info.component.ts +++ b/src/login/pages/login-x509-info/login-x509-info.component.ts @@ -1,7 +1,7 @@ import { ChangeDetectionStrategy, Component, forwardRef, inject, input } from '@angular/core'; import { CLASSES, KC_CONTEXT, USE_DEFAULT_CSS } from '@keycloakify/angular/lib/public-api'; import { ClassKey } from 'keycloakify/login/lib/kcClsx'; -import { KcContext } from 'keycloakify/login/KcContext'; +import { KcContext } from '../../KcContext'; import { ComponentReference } from '@keycloakify/angular/login/classes/component-reference.class'; import { TemplateComponent } from '@keycloakify/angular/login/containers/template.component'; import { KcClassDirective } from '@keycloakify/angular/login/directives'; diff --git a/src/login/pages/login/login.component.ts b/src/login/pages/login/login.component.ts index 41361f40..59e4cc2e 100644 --- a/src/login/pages/login/login.component.ts +++ b/src/login/pages/login/login.component.ts @@ -2,7 +2,7 @@ import { AsyncPipe, NgClass } from '@angular/common'; import { ChangeDetectionStrategy, Component, forwardRef, inject, input, signal } from '@angular/core'; import { CLASSES, KC_CONTEXT, USE_DEFAULT_CSS } from '@keycloakify/angular/lib/public-api'; import { ClassKey } from 'keycloakify/login/lib/kcClsx'; -import { KcContext } from 'keycloakify/login/KcContext'; +import { KcContext } from '../../KcContext'; import { ComponentReference } from '@keycloakify/angular/login/classes/component-reference.class'; import { PasswordWrapperComponent } from '@keycloakify/angular/login/components/password-wrapper/password-wrapper.component'; import { TemplateComponent } from '@keycloakify/angular/login/containers/template.component'; diff --git a/src/login/pages/logout-confirm/logout-confirm.component.ts b/src/login/pages/logout-confirm/logout-confirm.component.ts index 8cbd88b2..4b4c5052 100644 --- a/src/login/pages/logout-confirm/logout-confirm.component.ts +++ b/src/login/pages/logout-confirm/logout-confirm.component.ts @@ -1,7 +1,7 @@ import { ChangeDetectionStrategy, Component, forwardRef, inject, input } from '@angular/core'; import { CLASSES, KC_CONTEXT, USE_DEFAULT_CSS } from '@keycloakify/angular/lib/public-api'; import { ClassKey } from 'keycloakify/login/lib/kcClsx'; -import { KcContext } from 'keycloakify/login/KcContext'; +import { KcContext } from '../../KcContext'; import { ComponentReference } from '@keycloakify/angular/login/classes/component-reference.class'; import { TemplateComponent } from '@keycloakify/angular/login/containers/template.component'; import { KcClassDirective } from '@keycloakify/angular/login/directives'; diff --git a/src/login/pages/register/register.component.ts b/src/login/pages/register/register.component.ts index bb376aad..db3e5631 100644 --- a/src/login/pages/register/register.component.ts +++ b/src/login/pages/register/register.component.ts @@ -2,7 +2,7 @@ import { AsyncPipe, NgClass } from '@angular/common'; import { ChangeDetectionStrategy, Component, forwardRef, inject, input, signal } from '@angular/core'; import { CLASSES, KC_CONTEXT, USE_DEFAULT_CSS } from '@keycloakify/angular/lib/public-api'; import { ClassKey } from 'keycloakify/login/lib/kcClsx'; -import { KcContext } from 'keycloakify/login/KcContext'; +import { KcContext } from '../../KcContext'; import { ComponentReference } from '@keycloakify/angular/login/classes/component-reference.class'; import { UserProfileFormFieldsComponent } from '@keycloakify/angular/login/components/user-profile-form-fields/user-profile-form-fields.component'; import { TemplateComponent } from '@keycloakify/angular/login/containers/template.component'; diff --git a/src/login/pages/saml-post-form/saml-post-form.component.ts b/src/login/pages/saml-post-form/saml-post-form.component.ts index 9e24ea93..fad1a4bb 100644 --- a/src/login/pages/saml-post-form/saml-post-form.component.ts +++ b/src/login/pages/saml-post-form/saml-post-form.component.ts @@ -1,7 +1,7 @@ import { AfterViewInit, ChangeDetectionStrategy, Component, forwardRef, inject, input, ViewChild } from '@angular/core'; import { CLASSES, KC_CONTEXT, USE_DEFAULT_CSS } from '@keycloakify/angular/lib/public-api'; import { ClassKey } from 'keycloakify/login/lib/kcClsx'; -import { KcContext } from 'keycloakify/login/KcContext'; +import { KcContext } from '../../KcContext'; import { ComponentReference } from '@keycloakify/angular/login/classes/component-reference.class'; import { TemplateComponent } from '@keycloakify/angular/login/containers/template.component'; import { MsgStrPipe } from '@keycloakify/angular/login/pipes/msg-str.pipe'; diff --git a/src/login/pages/select-authenticator/select-authenticator.component.ts b/src/login/pages/select-authenticator/select-authenticator.component.ts index c38306de..04eb16d7 100644 --- a/src/login/pages/select-authenticator/select-authenticator.component.ts +++ b/src/login/pages/select-authenticator/select-authenticator.component.ts @@ -2,7 +2,7 @@ import { NgClass } from '@angular/common'; import { ChangeDetectionStrategy, Component, forwardRef, inject, input } from '@angular/core'; import { CLASSES, KC_CONTEXT, USE_DEFAULT_CSS } from '@keycloakify/angular/lib/public-api'; import { ClassKey } from 'keycloakify/login/lib/kcClsx'; -import { KcContext } from 'keycloakify/login/KcContext'; +import { KcContext } from '../../KcContext'; import { ComponentReference } from '@keycloakify/angular/login/classes/component-reference.class'; import { TemplateComponent } from '@keycloakify/angular/login/containers/template.component'; import { KcClassDirective } from '@keycloakify/angular/login/directives'; diff --git a/src/login/pages/terms/terms.component.ts b/src/login/pages/terms/terms.component.ts index 53859f6c..521d9a94 100644 --- a/src/login/pages/terms/terms.component.ts +++ b/src/login/pages/terms/terms.component.ts @@ -1,7 +1,7 @@ import { ChangeDetectionStrategy, Component, forwardRef, inject, input } from '@angular/core'; import { CLASSES, KC_CONTEXT, USE_DEFAULT_CSS } from '@keycloakify/angular/lib/public-api'; import { ClassKey } from 'keycloakify/login/lib/kcClsx'; -import { KcContext } from 'keycloakify/login/KcContext'; +import { KcContext } from '../../KcContext'; import { ComponentReference } from '@keycloakify/angular/login/classes/component-reference.class'; import { TemplateComponent } from '@keycloakify/angular/login/containers/template.component'; import { KcClassDirective } from '@keycloakify/angular/login/directives'; diff --git a/src/login/pages/update-email/update-email.component.ts b/src/login/pages/update-email/update-email.component.ts index 270fd4b3..dfbfc3fc 100644 --- a/src/login/pages/update-email/update-email.component.ts +++ b/src/login/pages/update-email/update-email.component.ts @@ -1,7 +1,7 @@ import { ChangeDetectionStrategy, Component, forwardRef, inject, input, signal } from '@angular/core'; import { CLASSES, KC_CONTEXT, USE_DEFAULT_CSS } from '@keycloakify/angular/lib/public-api'; import { ClassKey } from 'keycloakify/login/lib/kcClsx'; -import { KcContext } from 'keycloakify/login/KcContext'; +import { KcContext } from '../../KcContext'; import { ComponentReference } from '@keycloakify/angular/login/classes/component-reference.class'; import { LogoutOtherSessionsComponent } from '@keycloakify/angular/login/components/logout-other-sessions/logout-other-sessions.component'; import { UserProfileFormFieldsComponent } from '@keycloakify/angular/login/components/user-profile-form-fields/user-profile-form-fields.component'; diff --git a/src/login/pages/webauthn-authenticate/webauthn-authenticate.component.ts b/src/login/pages/webauthn-authenticate/webauthn-authenticate.component.ts index 87353e82..3ea397ea 100644 --- a/src/login/pages/webauthn-authenticate/webauthn-authenticate.component.ts +++ b/src/login/pages/webauthn-authenticate/webauthn-authenticate.component.ts @@ -2,7 +2,7 @@ import { ChangeDetectionStrategy, Component, forwardRef, inject, input } from '@ import { CLASSES, KC_CONTEXT, USE_DEFAULT_CSS } from '@keycloakify/angular/lib/public-api'; import { Script } from '@keycloakify/angular/lib/models'; import { ClassKey } from 'keycloakify/login/lib/kcClsx'; -import { KcContext } from 'keycloakify/login/KcContext'; +import { KcContext } from '../../KcContext'; import { getKcClsx } from 'keycloakify/login/lib/kcClsx'; import { ComponentReference } from '@keycloakify/angular/login/classes/component-reference.class'; import { LogoutOtherSessionsComponent } from '@keycloakify/angular/login/components/logout-other-sessions/logout-other-sessions.component'; diff --git a/src/login/pages/webauthn-error/webauthn-error.component.ts b/src/login/pages/webauthn-error/webauthn-error.component.ts index c652b949..68c41db6 100644 --- a/src/login/pages/webauthn-error/webauthn-error.component.ts +++ b/src/login/pages/webauthn-error/webauthn-error.component.ts @@ -1,7 +1,7 @@ import { ChangeDetectionStrategy, Component, forwardRef, inject, input } from '@angular/core'; import { CLASSES, KC_CONTEXT, USE_DEFAULT_CSS } from '@keycloakify/angular/lib/public-api'; import { ClassKey } from 'keycloakify/login/lib/kcClsx'; -import { KcContext } from 'keycloakify/login/KcContext'; +import { KcContext } from '../../KcContext'; import { ComponentReference } from '@keycloakify/angular/login/classes/component-reference.class'; import { LogoutOtherSessionsComponent } from '@keycloakify/angular/login/components/logout-other-sessions/logout-other-sessions.component'; import { TemplateComponent } from '@keycloakify/angular/login/containers/template.component'; diff --git a/src/login/pages/webauthn-register/webauthn-register.component.ts b/src/login/pages/webauthn-register/webauthn-register.component.ts index cdcc0544..d159f934 100644 --- a/src/login/pages/webauthn-register/webauthn-register.component.ts +++ b/src/login/pages/webauthn-register/webauthn-register.component.ts @@ -2,7 +2,7 @@ import { ChangeDetectionStrategy, Component, forwardRef, inject, input } from '@ import { CLASSES, KC_CONTEXT, USE_DEFAULT_CSS } from '@keycloakify/angular/lib/public-api'; import { Script } from '@keycloakify/angular/lib/models'; import { ClassKey } from 'keycloakify/login/lib/kcClsx'; -import { KcContext } from 'keycloakify/login/KcContext'; +import { KcContext } from '../../KcContext'; import { ComponentReference } from '@keycloakify/angular/login/classes/component-reference.class'; import { LogoutOtherSessionsComponent } from '@keycloakify/angular/login/components/logout-other-sessions/logout-other-sessions.component'; import { TemplateComponent } from '@keycloakify/angular/login/containers/template.component'; From fa640a4abf410563d5b083ecff3dd82c1a6bfbb2 Mon Sep 17 00:00:00 2001 From: Luca Peruzzo Date: Mon, 30 Sep 2024 14:34:24 +0200 Subject: [PATCH 41/64] code refactor --- src/lib/i18n.ts | 9 -- src/lib/models/index.ts | 1 - .../keycloakify-angular.providers.ts | 92 ------------------- src/lib/public-api.ts | 12 --- src/lib/services/i18n.service.ts | 5 - src/lib/services/index.ts | 2 - src/lib/tokens/use-default-css.token.ts | 3 + ...tons-multi-valued-attribute.component.html | 4 +- ...uttons-multi-valued-attribute.component.ts | 10 +- .../field-errors/field-errors.component.ts | 9 +- .../group-label/group-label.component.html | 4 +- .../group-label/group-label.component.ts | 15 +-- .../hello-world/hello-world.component.css | 0 .../hello-world/hello-world.component.html | 1 - .../hello-world/hello-world.component.ts | 10 -- src/login/components/index.ts | 11 --- .../input-field-by-type.component.ts | 5 +- .../input-tag-selects.component.html | 2 +- .../input-tag-selects.component.ts | 15 +-- .../input-tag/input-tag.component.html | 2 +- .../input-tag/input-tag.component.ts | 20 ++-- .../logout-other-sessions.component.html | 2 +- .../logout-other-sessions.component.ts | 13 ++- .../password-wrapper.component.html | 2 +- .../password-wrapper.component.ts | 13 ++- .../select-tag/select-tag.component.html | 4 +- .../select-tag/select-tag.component.ts | 15 +-- .../textarea-tag/textarea-tag.component.ts | 5 +- .../user-profile-form-fields.component.html | 6 +- .../user-profile-form-fields.component.ts | 23 +++-- src/login/containers/template.component.html | 12 +-- src/login/containers/template.component.ts | 16 ++-- src/login/directives/index.ts | 2 - src/login/pages/code/code.component.html | 8 +- src/login/pages/code/code.component.ts | 18 ++-- .../delete-account-confirm.component.html | 16 ++-- .../delete-account-confirm.component.ts | 20 ++-- .../delete-credential.component.html | 8 +- .../delete-credential.component.ts | 18 ++-- src/login/pages/error/error.component.html | 4 +- src/login/pages/error/error.component.ts | 18 ++-- .../frontchannel-logout.component.html | 8 +- .../frontchannel-logout.component.ts | 18 ++-- .../idp-review-user-profile.component.html | 4 +- .../idp-review-user-profile.component.ts | 18 ++-- src/login/pages/info/info.component.html | 8 +- src/login/pages/info/info.component.ts | 29 +++--- .../login-config-totp.component.html | 48 +++++----- .../login-config-totp.component.ts | 20 ++-- ...n-idp-link-confirm-override.component.html | 8 +- ...gin-idp-link-confirm-override.component.ts | 18 ++-- .../login-idp-link-confirm.component.html | 6 +- .../login-idp-link-confirm.component.ts | 18 ++-- .../login-idp-link-email.component.html | 16 ++-- .../login-idp-link-email.component.ts | 18 ++-- .../login-oauth-grant.component.html | 18 ++-- .../login-oauth-grant.component.ts | 19 ++-- ...th2-device-verify-user-code.component.html | 6 +- ...auth2-device-verify-user-code.component.ts | 18 ++-- .../pages/login-otp/login-otp.component.html | 6 +- .../pages/login-otp/login-otp.component.ts | 18 ++-- .../login-page-expired.component.html | 10 +- .../login-page-expired.component.ts | 18 ++-- ...ys-conditional-authenticate.component.html | 18 ++-- ...keys-conditional-authenticate.component.ts | 30 +++--- .../login-password.component.html | 10 +- .../login-password.component.ts | 18 ++-- ...-recovery-authn-code-config.component.html | 22 ++--- ...in-recovery-authn-code-config.component.ts | 20 ++-- ...n-recovery-authn-code-input.component.html | 6 +- ...gin-recovery-authn-code-input.component.ts | 20 ++-- .../login-reset-otp.component.html | 6 +- .../login-reset-otp.component.ts | 20 ++-- .../login-reset-password.component.html | 16 ++-- .../login-reset-password.component.ts | 20 ++-- .../login-update-password.component.html | 10 +- .../login-update-password.component.ts | 20 ++-- .../login-update-profile.component.html | 6 +- .../login-update-profile.component.ts | 20 ++-- .../login-username.component.html | 20 ++-- .../login-username.component.ts | 18 ++-- .../login-verify-email.component.html | 10 +- .../login-verify-email.component.ts | 20 ++-- .../login-x509-info.component.html | 12 +-- .../login-x509-info.component.ts | 20 ++-- src/login/pages/login/login.component.html | 26 +++--- src/login/pages/login/login.component.ts | 18 ++-- .../logout-confirm.component.html | 8 +- .../logout-confirm.component.ts | 20 ++-- .../pages/register/register.component.html | 14 +-- .../pages/register/register.component.ts | 28 +++--- .../saml-post-form.component.html | 8 +- .../saml-post-form.component.ts | 18 ++-- .../select-authenticator.component.html | 6 +- .../select-authenticator.component.ts | 21 +++-- src/login/pages/terms/terms.component.html | 8 +- src/login/pages/terms/terms.component.ts | 20 ++-- .../update-email/update-email.component.html | 6 +- .../update-email/update-email.component.ts | 20 ++-- .../webauthn-authenticate.component.html | 16 ++-- .../webauthn-authenticate.component.ts | 30 +++--- .../webauthn-error.component.html | 6 +- .../webauthn-error.component.ts | 20 ++-- .../webauthn-register.component.html | 6 +- .../webauthn-register.component.ts | 32 ++++--- src/login/pipes/advanced-msg-str.pipe.ts | 13 --- src/login/pipes/index.ts | 6 -- src/login/pipes/kc-sanitize.pipe.ts | 20 ++-- src/login/pipes/msg-str.pipe.ts | 14 --- src/login/pipes/to-array.pipe.ts | 1 - .../keycloakify-angular.providers.ts | 65 +++++++++++++ src/login/services/index.ts | 2 - .../login-resource-injector.service.ts | 7 +- .../services/user-profile-form.service.ts | 12 +-- src/login/tokens/classes.token.ts | 6 ++ src/login/tokens/i18n.token.ts | 3 + src/login/tokens/kc-context.token.ts | 4 + .../make-user-confirm-password.token.ts | 5 + src/tsconfig.json | 6 ++ 119 files changed, 855 insertions(+), 807 deletions(-) delete mode 100644 src/lib/i18n.ts delete mode 100644 src/lib/models/index.ts delete mode 100644 src/lib/providers/keycloakify-angular.providers.ts delete mode 100644 src/lib/public-api.ts delete mode 100644 src/lib/services/i18n.service.ts delete mode 100644 src/lib/services/index.ts create mode 100644 src/lib/tokens/use-default-css.token.ts delete mode 100644 src/login/components/hello-world/hello-world.component.css delete mode 100644 src/login/components/hello-world/hello-world.component.html delete mode 100644 src/login/components/hello-world/hello-world.component.ts delete mode 100644 src/login/components/index.ts delete mode 100644 src/login/directives/index.ts delete mode 100644 src/login/pipes/advanced-msg-str.pipe.ts delete mode 100644 src/login/pipes/index.ts delete mode 100644 src/login/pipes/msg-str.pipe.ts create mode 100644 src/login/providers/keycloakify-angular.providers.ts delete mode 100644 src/login/services/index.ts create mode 100644 src/login/tokens/classes.token.ts create mode 100644 src/login/tokens/i18n.token.ts create mode 100644 src/login/tokens/kc-context.token.ts create mode 100644 src/login/tokens/make-user-confirm-password.token.ts diff --git a/src/lib/i18n.ts b/src/lib/i18n.ts deleted file mode 100644 index bdac5c77..00000000 --- a/src/lib/i18n.ts +++ /dev/null @@ -1,9 +0,0 @@ -/* eslint-disable @typescript-eslint/no-unused-vars */ - -import { i18nBuilder as accountI18nBuilder } from 'keycloakify/account/i18n/noJsx'; -import { i18nBuilder as loginI18nBuilder } from 'keycloakify/login/i18n/noJsx'; - -const { ofTypeI18n: I18nlogin } = loginI18nBuilder.build(); -const { ofTypeI18n: I18nAccount } = accountI18nBuilder.build(); -type I18n = typeof I18nAccount | typeof I18nlogin; -export { type I18n }; diff --git a/src/lib/models/index.ts b/src/lib/models/index.ts deleted file mode 100644 index 462e4dc1..00000000 --- a/src/lib/models/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from './script.model'; diff --git a/src/lib/providers/keycloakify-angular.providers.ts b/src/lib/providers/keycloakify-angular.providers.ts deleted file mode 100644 index e2e95afc..00000000 --- a/src/lib/providers/keycloakify-angular.providers.ts +++ /dev/null @@ -1,92 +0,0 @@ -import { DOCUMENT } from '@angular/common'; -import { - APP_INITIALIZER, - InjectionToken, - LOCALE_ID, - makeEnvironmentProviders -} from '@angular/core'; -import { I18n } from '../i18n'; -import { I18nService } from '../services'; - -export const I18N = new InjectionToken('i18n'); -export const KC_CONTEXT = new InjectionToken('keycloak context'); -export const USE_DEFAULT_CSS = new InjectionToken('use default css'); -export const CLASSES = new InjectionToken<{ [key in ClassKey]?: string }>('classes'); -export const DO_MAKE_USER_CONFIRM_PASSWORD = new InjectionToken( - 'doMakeUserConfirmPassword' -); - -type ClassKey = - | import('keycloakify/login/lib/kcClsx').ClassKey - | import('keycloakify/account/lib/kcClsx').ClassKey; -type KcContextLike = - | import('keycloakify/login/i18n/noJsx').KcContextLike - | import('keycloakify/account/i18n/noJsx').KcContextLike; -type KcContext = - | import('keycloakify/login/KcContext').KcContext - | import('keycloakify/account/KcContext').KcContext; - -export type KeycloakifyAngularConfig = { - doMakeUserConfirmPassword?: boolean; - doUseDefaultCss?: boolean; - classes?: { [key in ClassKey]?: string }; - getI18n: (params: { kcContext: KcContextLike }) => { - i18n: unknown; - prI18n_currentLanguage: Promise | undefined; - }; -}; - -export const provideKeycloakifyAngular = (config: KeycloakifyAngularConfig) => - makeEnvironmentProviders([ - { - provide: KC_CONTEXT, - useValue: window.kcContext - }, - { - provide: DO_MAKE_USER_CONFIRM_PASSWORD, - useValue: config?.doMakeUserConfirmPassword ?? true - }, - { - provide: LOCALE_ID, - useFactory: (document: Document) => { - return document.documentElement.lang ?? 'en'; - }, - deps: [DOCUMENT] - }, - { - provide: APP_INITIALIZER, - multi: true, - useFactory: - ( - i18nService: I18nService['i18n']>, - kcContext: KcContext - ) => - async () => { - const getI18n = config.getI18n; - - const { i18n, prI18n_currentLanguage } = getI18n({ - kcContext - }); - let i18nPromise = new Promise(resolve => resolve(i18n)); - if (prI18n_currentLanguage) { - i18nPromise = prI18n_currentLanguage; - } - return i18nPromise.then(i18n => { - i18nService.i18n = i18n; - return true; - }); - }, - deps: [I18nService, KC_CONTEXT] - }, - { provide: USE_DEFAULT_CSS, useValue: config?.doUseDefaultCss ?? true }, - { provide: CLASSES, useValue: config?.classes ?? {} }, - { - provide: I18N, - useFactory: ( - i18nService: I18nService['i18n']> - ) => { - return i18nService.i18n; - }, - deps: [I18nService] - } - ]); diff --git a/src/lib/public-api.ts b/src/lib/public-api.ts deleted file mode 100644 index 9f22ab71..00000000 --- a/src/lib/public-api.ts +++ /dev/null @@ -1,12 +0,0 @@ -import { KcContext as KcAccountContext } from 'keycloakify/account/KcContext'; -import { KcContext as KcLoginContext } from 'keycloakify/login/KcContext'; - -declare global { - interface Window { - kcContext?: KcLoginContext | KcAccountContext; - } -} - -export * from './models'; -export * from './providers/keycloakify-angular.providers'; -export * from './services'; diff --git a/src/lib/services/i18n.service.ts b/src/lib/services/i18n.service.ts deleted file mode 100644 index 4a78228f..00000000 --- a/src/lib/services/i18n.service.ts +++ /dev/null @@ -1,5 +0,0 @@ -import { Injectable } from '@angular/core'; -@Injectable({ providedIn: 'root' }) -export class I18nService { - i18n!: T; -} diff --git a/src/lib/services/index.ts b/src/lib/services/index.ts deleted file mode 100644 index 4e7b77e0..00000000 --- a/src/lib/services/index.ts +++ /dev/null @@ -1,2 +0,0 @@ -export * from './resource-injector.service'; -export * from './i18n.service'; diff --git a/src/lib/tokens/use-default-css.token.ts b/src/lib/tokens/use-default-css.token.ts new file mode 100644 index 00000000..5496b8e5 --- /dev/null +++ b/src/lib/tokens/use-default-css.token.ts @@ -0,0 +1,3 @@ +import { InjectionToken } from '@angular/core'; + +export const USE_DEFAULT_CSS = new InjectionToken('use default css'); diff --git a/src/login/components/add-remove-buttons-multi-valued-attribute/add-remove-buttons-multi-valued-attribute.component.html b/src/login/components/add-remove-buttons-multi-valued-attribute/add-remove-buttons-multi-valued-attribute.component.html index 6b118761..0179711d 100644 --- a/src/login/components/add-remove-buttons-multi-valued-attribute/add-remove-buttons-multi-valued-attribute.component.html +++ b/src/login/components/add-remove-buttons-multi-valued-attribute/add-remove-buttons-multi-valued-attribute.component.html @@ -6,7 +6,7 @@ class="pf-c-button pf-m-inline pf-m-link" (click)="onRemove()" > - {{ 'remove' | msgStr }} + {{ i18n.msgStr('remove') }} @if (hasAdd()) {  |  @@ -19,6 +19,6 @@ class="pf-c-button pf-m-inline pf-m-link" (click)="onAdd()" > - {{ 'addValue' | msgStr }} + {{ i18n.msgStr('addValue') }} } diff --git a/src/login/components/add-remove-buttons-multi-valued-attribute/add-remove-buttons-multi-valued-attribute.component.ts b/src/login/components/add-remove-buttons-multi-valued-attribute/add-remove-buttons-multi-valued-attribute.component.ts index 6f2fba71..67c25897 100644 --- a/src/login/components/add-remove-buttons-multi-valued-attribute/add-remove-buttons-multi-valued-attribute.component.ts +++ b/src/login/components/add-remove-buttons-multi-valued-attribute/add-remove-buttons-multi-valued-attribute.component.ts @@ -1,7 +1,8 @@ -import { ChangeDetectionStrategy, Component, computed, input, output } from '@angular/core'; -import { Attribute } from 'keycloakify/login/KcContext'; -import { MsgStrPipe } from '@keycloakify/angular/login/pipes/msg-str.pipe'; +import { ChangeDetectionStrategy, Component, computed, inject, input, output } from '@angular/core'; import { FormAction } from '@keycloakify/angular/login/services/user-profile-form.service'; +import { LOGIN_I18N } from '@keycloakify/angular/login/tokens/i18n.token'; +import { Attribute } from 'keycloakify/login/KcContext'; +import { I18n } from '../../i18n'; @Component({ standalone: true, @@ -12,12 +13,13 @@ import { FormAction } from '@keycloakify/angular/login/services/user-profile-for } ` ], - imports: [MsgStrPipe], + imports: [], selector: 'kc-add-remove-buttons-multi-valued-attribute', templateUrl: 'add-remove-buttons-multi-valued-attribute.component.html', changeDetection: ChangeDetectionStrategy.OnPush }) export class AddRemoveButtonsMultiValuedAttributeComponent { + i18n = inject(LOGIN_I18N); attribute = input(); values = input(); fieldIndex = input(); diff --git a/src/login/components/field-errors/field-errors.component.ts b/src/login/components/field-errors/field-errors.component.ts index 57d94eb1..e2ce538e 100644 --- a/src/login/components/field-errors/field-errors.component.ts +++ b/src/login/components/field-errors/field-errors.component.ts @@ -1,10 +1,11 @@ import { ChangeDetectionStrategy, Component, forwardRef, inject, input } from '@angular/core'; -import { CLASSES, USE_DEFAULT_CSS } from '@keycloakify/angular/lib/public-api'; -import { Attribute } from 'keycloakify/login/KcContext'; -import { ClassKey } from 'keycloakify/login/lib/kcClsx'; +import { USE_DEFAULT_CSS } from '@keycloakify/angular/lib/tokens/use-default-css.token'; import { ComponentReference } from '@keycloakify/angular/login/classes/component-reference.class'; import { KcClassDirective } from '@keycloakify/angular/login/directives/kc-class.directive'; import { FormFieldError } from '@keycloakify/angular/login/services/user-profile-form.service'; +import { LOGIN_CLASSES } from '@keycloakify/angular/login/tokens/classes.token'; +import { Attribute } from 'keycloakify/login/KcContext'; +import { ClassKey } from 'keycloakify/login/lib/kcClsx'; @Component({ standalone: true, @@ -31,5 +32,5 @@ export class FieldErrorsComponent extends ComponentReference { displayableErrors = input(); fieldIndex = input(); override doUseDefaultCss = inject(USE_DEFAULT_CSS); - override classes = inject>>(CLASSES); + override classes = inject>>(LOGIN_CLASSES); } diff --git a/src/login/components/group-label/group-label.component.html b/src/login/components/group-label/group-label.component.html index 95332ffb..df6ada3e 100644 --- a/src/login/components/group-label/group-label.component.html +++ b/src/login/components/group-label/group-label.component.html @@ -12,7 +12,7 @@ [id]="'header-' + attr.group?.name" [kcClass]="'kcFormGroupHeader'" > - {{ groupHeaderText | advancedMsgStr }} + {{ i18n.advancedMsgStr(groupHeaderText) }}
@let groupDisplayDescription = attr.group?.displayDescription ?? ''; @@ -22,7 +22,7 @@ [id]="'description-' + attr.group?.name" [kcClass]="'kcLabelClass'" > - {{ groupDisplayDescription | advancedMsgStr }} + {{ i18n.advancedMsgStr(groupDisplayDescription) }}
} diff --git a/src/login/components/group-label/group-label.component.ts b/src/login/components/group-label/group-label.component.ts index 8cd3f6cc..4958ed01 100644 --- a/src/login/components/group-label/group-label.component.ts +++ b/src/login/components/group-label/group-label.component.ts @@ -1,11 +1,13 @@ import { ChangeDetectionStrategy, Component, computed, forwardRef, inject, input } from '@angular/core'; -import { CLASSES, USE_DEFAULT_CSS } from '@keycloakify/angular/lib/public-api'; -import { Attribute } from 'keycloakify/login/KcContext'; -import { ClassKey } from 'keycloakify/login/lib/kcClsx'; +import { USE_DEFAULT_CSS } from '@keycloakify/angular/lib/tokens/use-default-css.token'; import { ComponentReference } from '@keycloakify/angular/login/classes/component-reference.class'; import { AttributesDirective } from '@keycloakify/angular/login/directives/attributes.directive'; import { KcClassDirective } from '@keycloakify/angular/login/directives/kc-class.directive'; -import { AdvancedMsgStrPipe } from '@keycloakify/angular/login/pipes/advanced-msg-str.pipe'; +import { LOGIN_CLASSES } from '@keycloakify/angular/login/tokens/classes.token'; +import { LOGIN_I18N } from '@keycloakify/angular/login/tokens/i18n.token'; +import { Attribute } from 'keycloakify/login/KcContext'; +import { ClassKey } from 'keycloakify/login/lib/kcClsx'; +import { I18n } from '../../i18n'; @Component({ standalone: true, @@ -16,7 +18,7 @@ import { AdvancedMsgStrPipe } from '@keycloakify/angular/login/pipes/advanced-ms } ` ], - imports: [KcClassDirective, AttributesDirective, AdvancedMsgStrPipe], + imports: [KcClassDirective, AttributesDirective], selector: 'kc-group-label', templateUrl: 'group-label.component.html', changeDetection: ChangeDetectionStrategy.OnPush, @@ -28,10 +30,11 @@ import { AdvancedMsgStrPipe } from '@keycloakify/angular/login/pipes/advanced-ms ] }) export class GroupLabelComponent extends ComponentReference { + i18n = inject(LOGIN_I18N); attribute = input(); groupName = input(); override doUseDefaultCss = inject(USE_DEFAULT_CSS); - override classes = inject>>(CLASSES); + override classes = inject>>(LOGIN_CLASSES); groupNameRef = computed(() => { const attribute = this.attribute(); const groupName = this.groupName(); diff --git a/src/login/components/hello-world/hello-world.component.css b/src/login/components/hello-world/hello-world.component.css deleted file mode 100644 index e69de29b..00000000 diff --git a/src/login/components/hello-world/hello-world.component.html b/src/login/components/hello-world/hello-world.component.html deleted file mode 100644 index 589144d4..00000000 --- a/src/login/components/hello-world/hello-world.component.html +++ /dev/null @@ -1 +0,0 @@ -

hello-world works!

diff --git a/src/login/components/hello-world/hello-world.component.ts b/src/login/components/hello-world/hello-world.component.ts deleted file mode 100644 index 312d8a07..00000000 --- a/src/login/components/hello-world/hello-world.component.ts +++ /dev/null @@ -1,10 +0,0 @@ -import { Component } from '@angular/core'; - -@Component({ - selector: 'kc-hello-world', - standalone: true, - imports: [], - templateUrl: './hello-world.component.html', - styleUrl: './hello-world.component.css' -}) -export class HelloWorldComponent {} diff --git a/src/login/components/index.ts b/src/login/components/index.ts deleted file mode 100644 index 33bcf2b8..00000000 --- a/src/login/components/index.ts +++ /dev/null @@ -1,11 +0,0 @@ -export * from './add-remove-buttons-multi-valued-attribute/add-remove-buttons-multi-valued-attribute.component'; -export * from './field-errors/field-errors.component'; -export * from './group-label/group-label.component'; -export * from './input-field-by-type/input-field-by-type.component'; -export * from './input-tag/input-tag.component'; -export * from './input-tag-selects/input-tag-selects.component'; -export * from './logout-other-sessions/logout-other-sessions.component'; -export * from './password-wrapper/password-wrapper.component'; -export * from './select-tag/select-tag.component'; -export * from './textarea-tag/textarea-tag.component'; -export * from './user-profile-form-fields/user-profile-form-fields.component'; diff --git a/src/login/components/input-field-by-type/input-field-by-type.component.ts b/src/login/components/input-field-by-type/input-field-by-type.component.ts index ee770364..b505571a 100644 --- a/src/login/components/input-field-by-type/input-field-by-type.component.ts +++ b/src/login/components/input-field-by-type/input-field-by-type.component.ts @@ -1,5 +1,6 @@ import { ChangeDetectionStrategy, Component, computed, forwardRef, inject, input, output } from '@angular/core'; -import { CLASSES, USE_DEFAULT_CSS } from '@keycloakify/angular/lib/public-api'; +import { USE_DEFAULT_CSS } from '@keycloakify/angular/lib/tokens/use-default-css.token'; +import { LOGIN_CLASSES } from '@keycloakify/angular/login/tokens/classes.token'; import { Attribute } from 'keycloakify/login/KcContext'; import { ClassKey } from 'keycloakify/login/lib/kcClsx'; import { ComponentReference } from '@keycloakify/angular/login/classes/component-reference.class'; @@ -37,7 +38,7 @@ export class InputFieldByTypeComponent extends ComponentReference { displayableErrors = input(); dispatchFormAction = output(); override doUseDefaultCss = inject(USE_DEFAULT_CSS); - override classes = inject>>(CLASSES); + override classes = inject>>(LOGIN_CLASSES); attributePassword = computed(() => { const attribute: Attribute = this.attribute() ?? ({} as Attribute); diff --git a/src/login/components/input-tag-selects/input-tag-selects.component.html b/src/login/components/input-tag-selects/input-tag-selects.component.html index 439f40b9..a0d3f1ff 100644 --- a/src/login/components/input-tag-selects/input-tag-selects.component.html +++ b/src/login/components/input-tag-selects/input-tag-selects.component.html @@ -22,7 +22,7 @@ [for]="attr.name + '-' + option" [kcClass]="[classLabel!, attr.readOnly ? 'kcInputClassRadioCheckboxLabelDisabled' : $any('')]" > - {{ option | advancedMsgStr }} + {{ i18n.advancedMsgStr(option) }}
} diff --git a/src/login/components/input-tag-selects/input-tag-selects.component.ts b/src/login/components/input-tag-selects/input-tag-selects.component.ts index 91c8fdc8..484ac00c 100644 --- a/src/login/components/input-tag-selects/input-tag-selects.component.ts +++ b/src/login/components/input-tag-selects/input-tag-selects.component.ts @@ -1,11 +1,13 @@ import { ChangeDetectionStrategy, Component, computed, forwardRef, inject, input, output, Signal } from '@angular/core'; -import { CLASSES, USE_DEFAULT_CSS } from '@keycloakify/angular/lib/public-api'; -import { Attribute } from 'keycloakify/login/KcContext'; -import { ClassKey } from 'keycloakify/login/lib/kcClsx'; +import { USE_DEFAULT_CSS } from '@keycloakify/angular/lib/tokens/use-default-css.token'; import { ComponentReference } from '@keycloakify/angular/login/classes/component-reference.class'; import { KcClassDirective } from '@keycloakify/angular/login/directives/kc-class.directive'; -import { AdvancedMsgStrPipe } from '@keycloakify/angular/login/pipes/advanced-msg-str.pipe'; import { FormAction, FormFieldError } from '@keycloakify/angular/login/services/user-profile-form.service'; +import { LOGIN_CLASSES } from '@keycloakify/angular/login/tokens/classes.token'; +import { LOGIN_I18N } from '@keycloakify/angular/login/tokens/i18n.token'; +import { Attribute } from 'keycloakify/login/KcContext'; +import { ClassKey } from 'keycloakify/login/lib/kcClsx'; +import { I18n } from '../../i18n'; @Component({ standalone: true, @@ -16,7 +18,7 @@ import { FormAction, FormFieldError } from '@keycloakify/angular/login/services/ } ` ], - imports: [KcClassDirective, AdvancedMsgStrPipe], + imports: [KcClassDirective], selector: 'kc-input-tag-selects', templateUrl: 'input-tag-selects.component.html', changeDetection: ChangeDetectionStrategy.OnPush, @@ -28,12 +30,13 @@ import { FormAction, FormFieldError } from '@keycloakify/angular/login/services/ ] }) export class InputTagSelectsComponent extends ComponentReference { + i18n = inject(LOGIN_I18N); attribute = input(); valueOrValues = input(); dispatchFormAction = output(); displayableErrors = input(); override doUseDefaultCss = inject(USE_DEFAULT_CSS); - override classes = inject>>(CLASSES); + override classes = inject>>(LOGIN_CLASSES); context: Signal<{ inputType: 'radio' | 'checkbox'; diff --git a/src/login/components/input-tag/input-tag.component.html b/src/login/components/input-tag/input-tag.component.html index 5588d31d..5dae32a2 100644 --- a/src/login/components/input-tag/input-tag.component.html +++ b/src/login/components/input-tag/input-tag.component.html @@ -10,7 +10,7 @@ [attr.aria-invalid]="index && displayableErrors()?.[index] !== undefined" [disabled]="attr.readOnly" [autocomplete]="attr.autocomplete" - [placeholder]="attr.annotations.inputTypePlaceholder ?? '' | advancedMsgStr" + [placeholder]="i18n.advancedMsgStr(attr.annotations.inputTypePlaceholder ?? '')" [attr.pattern]="attr.annotations.inputTypePattern" [attr.size]=" !attr.annotations.inputTypeSize diff --git a/src/login/components/input-tag/input-tag.component.ts b/src/login/components/input-tag/input-tag.component.ts index dec02f38..cbe91541 100644 --- a/src/login/components/input-tag/input-tag.component.ts +++ b/src/login/components/input-tag/input-tag.component.ts @@ -1,17 +1,19 @@ import { ChangeDetectionStrategy, Component, computed, forwardRef, inject, input, output } from '@angular/core'; -import { CLASSES, USE_DEFAULT_CSS } from '@keycloakify/angular/lib/public-api'; -import { Attribute } from 'keycloakify/login/KcContext'; -import { ClassKey } from 'keycloakify/login/lib/kcClsx'; +import { USE_DEFAULT_CSS } from '@keycloakify/angular/lib/tokens/use-default-css.token'; import { ComponentReference } from '@keycloakify/angular/login/classes/component-reference.class'; +import { AddRemoveButtonsMultiValuedAttributeComponent } from '@keycloakify/angular/login/components/add-remove-buttons-multi-valued-attribute/add-remove-buttons-multi-valued-attribute.component'; +import { FieldErrorsComponent } from '@keycloakify/angular/login/components/field-errors/field-errors.component'; import { AttributesDirective } from '@keycloakify/angular/login/directives/attributes.directive'; import { KcClassDirective } from '@keycloakify/angular/login/directives/kc-class.directive'; -import { AdvancedMsgStrPipe } from '@keycloakify/angular/login/pipes/advanced-msg-str.pipe'; import { InputTypePipe } from '@keycloakify/angular/login/pipes/input-type.pipe'; import { ToArrayPipe } from '@keycloakify/angular/login/pipes/to-array.pipe'; import { ToNumberPipe } from '@keycloakify/angular/login/pipes/to-number.pipe'; import { FormAction, FormFieldError } from '@keycloakify/angular/login/services/user-profile-form.service'; -import { AddRemoveButtonsMultiValuedAttributeComponent } from '@keycloakify/angular/login/components/add-remove-buttons-multi-valued-attribute/add-remove-buttons-multi-valued-attribute.component'; -import { FieldErrorsComponent } from '@keycloakify/angular/login/components/field-errors/field-errors.component'; +import { LOGIN_CLASSES } from '@keycloakify/angular/login/tokens/classes.token'; +import { LOGIN_I18N } from '@keycloakify/angular/login/tokens/i18n.token'; +import { Attribute } from 'keycloakify/login/KcContext'; +import { ClassKey } from 'keycloakify/login/lib/kcClsx'; +import { I18n } from '../../i18n'; @Component({ standalone: true, @@ -29,8 +31,7 @@ import { FieldErrorsComponent } from '@keycloakify/angular/login/components/fiel AttributesDirective, ToArrayPipe, FieldErrorsComponent, - AddRemoveButtonsMultiValuedAttributeComponent, - AdvancedMsgStrPipe + AddRemoveButtonsMultiValuedAttributeComponent ], selector: 'kc-input-tag', templateUrl: 'input-tag.component.html', @@ -43,6 +44,7 @@ import { FieldErrorsComponent } from '@keycloakify/angular/login/components/fiel ] }) export class InputTagComponent extends ComponentReference { + i18n = inject(LOGIN_I18N); attribute = input(); valueOrValues = input(); fieldIndex = input(undefined); @@ -50,7 +52,7 @@ export class InputTagComponent extends ComponentReference { displayableErrors = input(); dispatchFormAction = output(); override doUseDefaultCss = inject(USE_DEFAULT_CSS); - override classes = inject>>(CLASSES); + override classes = inject>>(LOGIN_CLASSES); value = computed(() => { const valueOrValues = this.valueOrValues(); diff --git a/src/login/components/logout-other-sessions/logout-other-sessions.component.html b/src/login/components/logout-other-sessions/logout-other-sessions.component.html index 76575806..8f10ae88 100644 --- a/src/login/components/logout-other-sessions/logout-other-sessions.component.html +++ b/src/login/components/logout-other-sessions/logout-other-sessions.component.html @@ -12,7 +12,7 @@ value="on" defaultChecked="true" /> - {{ 'logoutOtherSessions' | msgStr }} + {{ i18n.msgStr('logoutOtherSessions') }}
diff --git a/src/login/components/logout-other-sessions/logout-other-sessions.component.ts b/src/login/components/logout-other-sessions/logout-other-sessions.component.ts index d715cf28..0dbda2a0 100644 --- a/src/login/components/logout-other-sessions/logout-other-sessions.component.ts +++ b/src/login/components/logout-other-sessions/logout-other-sessions.component.ts @@ -1,9 +1,11 @@ import { ChangeDetectionStrategy, Component, forwardRef, inject } from '@angular/core'; -import { CLASSES, USE_DEFAULT_CSS } from '@keycloakify/angular/lib/public-api'; -import { ClassKey } from 'keycloakify/login/lib/kcClsx'; +import { USE_DEFAULT_CSS } from '@keycloakify/angular/lib/tokens/use-default-css.token'; import { ComponentReference } from '@keycloakify/angular/login/classes/component-reference.class'; import { KcClassDirective } from '@keycloakify/angular/login/directives/kc-class.directive'; -import { MsgStrPipe } from '@keycloakify/angular/login/pipes/msg-str.pipe'; +import { LOGIN_CLASSES } from '@keycloakify/angular/login/tokens/classes.token'; +import { LOGIN_I18N } from '@keycloakify/angular/login/tokens/i18n.token'; +import { ClassKey } from 'keycloakify/login/lib/kcClsx'; +import { I18n } from '../../i18n'; @Component({ selector: 'kc-logout-other-sessions', @@ -15,7 +17,7 @@ import { MsgStrPipe } from '@keycloakify/angular/login/pipes/msg-str.pipe'; ` ], standalone: true, - imports: [KcClassDirective, MsgStrPipe], + imports: [KcClassDirective], changeDetection: ChangeDetectionStrategy.OnPush, templateUrl: './logout-other-sessions.component.html', providers: [ @@ -26,6 +28,7 @@ import { MsgStrPipe } from '@keycloakify/angular/login/pipes/msg-str.pipe'; ] }) export class LogoutOtherSessionsComponent extends ComponentReference { + i18n = inject(LOGIN_I18N); override doUseDefaultCss = inject(USE_DEFAULT_CSS); - override classes = inject>>(CLASSES); + override classes = inject>>(LOGIN_CLASSES); } diff --git a/src/login/components/password-wrapper/password-wrapper.component.html b/src/login/components/password-wrapper/password-wrapper.component.html index b4e4c7a0..b975aff3 100644 --- a/src/login/components/password-wrapper/password-wrapper.component.html +++ b/src/login/components/password-wrapper/password-wrapper.component.html @@ -3,7 +3,7 @@
} @@ -64,7 +64,7 @@ [id]="'form-help-text-after-' + fieldState.attribute.name" aria-live="polite" > - {{ fieldState.attribute.annotations.inputHelperTextAfter | advancedMsgStr }} + {{ i18n.advancedMsgStr(fieldState.attribute.annotations.inputHelperTextAfter) }}
} diff --git a/src/login/components/user-profile-form-fields/user-profile-form-fields.component.ts b/src/login/components/user-profile-form-fields/user-profile-form-fields.component.ts index 37974a81..d7f2b8b6 100644 --- a/src/login/components/user-profile-form-fields/user-profile-form-fields.component.ts +++ b/src/login/components/user-profile-form-fields/user-profile-form-fields.component.ts @@ -1,15 +1,19 @@ import { NgTemplateOutlet } from '@angular/common'; import { ChangeDetectionStrategy, Component, ContentChild, effect, forwardRef, inject, output, TemplateRef } from '@angular/core'; -import { DO_MAKE_USER_CONFIRM_PASSWORD, KC_CONTEXT, CLASSES, USE_DEFAULT_CSS } from '@keycloakify/angular/lib/public-api'; -import { ClassKey } from 'keycloakify/login/lib/kcClsx'; -import { KcContext } from 'keycloakify/login/KcContext'; +import { USE_DEFAULT_CSS } from '@keycloakify/angular/lib/tokens/use-default-css.token'; import { ComponentReference } from '@keycloakify/angular/login/classes/component-reference.class'; -import { KcClassDirective } from '@keycloakify/angular/login/directives/kc-class.directive'; -import { AdvancedMsgStrPipe } from '@keycloakify/angular/login/pipes/advanced-msg-str.pipe'; -import { FormAction, UserProfileFormService } from '@keycloakify/angular/login/services/user-profile-form.service'; import { FieldErrorsComponent } from '@keycloakify/angular/login/components/field-errors/field-errors.component'; import { GroupLabelComponent } from '@keycloakify/angular/login/components/group-label/group-label.component'; import { InputFieldByTypeComponent } from '@keycloakify/angular/login/components/input-field-by-type/input-field-by-type.component'; +import { KcClassDirective } from '@keycloakify/angular/login/directives/kc-class.directive'; +import { FormAction, UserProfileFormService } from '@keycloakify/angular/login/services/user-profile-form.service'; +import { LOGIN_CLASSES } from '@keycloakify/angular/login/tokens/classes.token'; +import { LOGIN_I18N } from '@keycloakify/angular/login/tokens/i18n.token'; +import { KC_LOGIN_CONTEXT } from '@keycloakify/angular/login/tokens/kc-context.token'; +import { DO_MAKE_USER_CONFIRM_PASSWORD } from '@keycloakify/angular/login/tokens/make-user-confirm-password.token'; +import { KcContext } from 'keycloakify/login/KcContext'; +import { ClassKey } from 'keycloakify/login/lib/kcClsx'; +import { I18n } from '../../i18n'; @Component({ standalone: true, @@ -20,7 +24,7 @@ import { InputFieldByTypeComponent } from '@keycloakify/angular/login/components } ` ], - imports: [KcClassDirective, FieldErrorsComponent, InputFieldByTypeComponent, GroupLabelComponent, NgTemplateOutlet, AdvancedMsgStrPipe], + imports: [KcClassDirective, FieldErrorsComponent, InputFieldByTypeComponent, GroupLabelComponent, NgTemplateOutlet], selector: 'kc-user-profile-form-fields', templateUrl: 'user-profile-form-fields.component.html', changeDetection: ChangeDetectionStrategy.OnPush, @@ -33,11 +37,12 @@ import { InputFieldByTypeComponent } from '@keycloakify/angular/login/components ] }) export class UserProfileFormFieldsComponent extends ComponentReference { - kcContext = inject(KC_CONTEXT); + i18n = inject(LOGIN_I18N); + kcContext = inject(KC_LOGIN_CONTEXT); userProfileFormService = inject(UserProfileFormService); doMakeUserConfirmPassword = inject(DO_MAKE_USER_CONFIRM_PASSWORD); override doUseDefaultCss = inject(USE_DEFAULT_CSS); - override classes = inject>>(CLASSES); + override classes = inject>>(LOGIN_CLASSES); onIsFormSubmittable = output(); diff --git a/src/login/containers/template.component.html b/src/login/containers/template.component.html index fd2014c2..38b09cad 100644 --- a/src/login/containers/template.component.html +++ b/src/login/containers/template.component.html @@ -15,7 +15,7 @@ id="kc-header-wrapper" [kcClass]="'kcHeaderWrapperClass'" > -
+
@@ -39,7 +39,7 @@ } diff --git a/src/login/pages/delete-account-confirm/delete-account-confirm.component.ts b/src/login/pages/delete-account-confirm/delete-account-confirm.component.ts index c6ab13a1..df58911b 100644 --- a/src/login/pages/delete-account-confirm/delete-account-confirm.component.ts +++ b/src/login/pages/delete-account-confirm/delete-account-confirm.component.ts @@ -1,15 +1,18 @@ import { ChangeDetectionStrategy, Component, forwardRef, inject } from '@angular/core'; -import { CLASSES, KC_CONTEXT, USE_DEFAULT_CSS } from '@keycloakify/angular/lib/public-api'; -import { ClassKey } from 'keycloakify/login/lib/kcClsx'; -import { KcContext } from '../../KcContext'; +import { USE_DEFAULT_CSS } from '@keycloakify/angular/lib/tokens/use-default-css.token'; import { ComponentReference } from '@keycloakify/angular/login/classes/component-reference.class'; import { TemplateComponent } from '@keycloakify/angular/login/containers/template.component'; -import { KcClassDirective } from '@keycloakify/angular/login/directives'; -import { MsgStrPipe } from '@keycloakify/angular/login/pipes/msg-str.pipe'; +import { KcClassDirective } from '@keycloakify/angular/login/directives/kc-class.directive'; +import { LOGIN_CLASSES } from '@keycloakify/angular/login/tokens/classes.token'; +import { LOGIN_I18N } from '@keycloakify/angular/login/tokens/i18n.token'; +import { KC_LOGIN_CONTEXT } from '@keycloakify/angular/login/tokens/kc-context.token'; +import { ClassKey } from 'keycloakify/login/lib/kcClsx'; +import { I18n } from '../../i18n'; +import { KcContext } from '../../KcContext'; @Component({ standalone: true, - imports: [TemplateComponent, MsgStrPipe, KcClassDirective], + imports: [TemplateComponent, KcClassDirective], selector: 'kc-root', templateUrl: 'delete-account-confirm.component.html', changeDetection: ChangeDetectionStrategy.OnPush, @@ -21,7 +24,8 @@ import { MsgStrPipe } from '@keycloakify/angular/login/pipes/msg-str.pipe'; ] }) export class DeleteAccountConfirmComponent extends ComponentReference { - kcContext = inject>(KC_CONTEXT); + kcContext = inject>(KC_LOGIN_CONTEXT); + i18n = inject(LOGIN_I18N); override doUseDefaultCss = inject(USE_DEFAULT_CSS); - override classes = inject>>(CLASSES); + override classes = inject>>(LOGIN_CLASSES); } diff --git a/src/login/pages/delete-credential/delete-credential.component.html b/src/login/pages/delete-credential/delete-credential.component.html index f71a82b6..836e7b65 100644 --- a/src/login/pages/delete-credential/delete-credential.component.html +++ b/src/login/pages/delete-credential/delete-credential.component.html @@ -2,11 +2,11 @@ @let credentialLabel = kcContext.credentialLabel; - {{ 'deleteCredentialTitle' | msgStr: credentialLabel }} + {{ i18n.msgStr('deleteCredentialTitle', credentialLabel) }}
- {{ 'deleteCredentialMessage' | msgStr: credentialLabel }} + {{ i18n.msgStr('deleteCredentialMessage', credentialLabel) }}
diff --git a/src/login/pages/delete-credential/delete-credential.component.ts b/src/login/pages/delete-credential/delete-credential.component.ts index 4bdefa19..1751a639 100644 --- a/src/login/pages/delete-credential/delete-credential.component.ts +++ b/src/login/pages/delete-credential/delete-credential.component.ts @@ -1,15 +1,18 @@ import { ChangeDetectionStrategy, Component, forwardRef, inject, input } from '@angular/core'; -import { CLASSES, KC_CONTEXT, USE_DEFAULT_CSS } from '@keycloakify/angular/lib/public-api'; -import { ClassKey } from 'keycloakify/login/lib/kcClsx'; -import { KcContext } from '../../KcContext'; +import { USE_DEFAULT_CSS } from '@keycloakify/angular/lib/tokens/use-default-css.token'; import { ComponentReference } from '@keycloakify/angular/login/classes/component-reference.class'; import { TemplateComponent } from '@keycloakify/angular/login/containers/template.component'; import { KcClassDirective } from '@keycloakify/angular/login/directives/kc-class.directive'; -import { MsgStrPipe } from '@keycloakify/angular/login/pipes/msg-str.pipe'; +import { LOGIN_CLASSES } from '@keycloakify/angular/login/tokens/classes.token'; +import { LOGIN_I18N } from '@keycloakify/angular/login/tokens/i18n.token'; +import { KC_LOGIN_CONTEXT } from '@keycloakify/angular/login/tokens/kc-context.token'; +import { ClassKey } from 'keycloakify/login/lib/kcClsx'; +import { I18n } from '../../i18n'; +import { KcContext } from '../../KcContext'; @Component({ standalone: true, - imports: [MsgStrPipe, TemplateComponent, KcClassDirective], + imports: [TemplateComponent, KcClassDirective], selector: 'kc-root', templateUrl: 'delete-credential.component.html', changeDetection: ChangeDetectionStrategy.OnPush, @@ -21,9 +24,10 @@ import { MsgStrPipe } from '@keycloakify/angular/login/pipes/msg-str.pipe'; ] }) export class DeleteCredentialComponent extends ComponentReference { - kcContext = inject>(KC_CONTEXT); + kcContext = inject>(KC_LOGIN_CONTEXT); + i18n = inject(LOGIN_I18N); override doUseDefaultCss = inject(USE_DEFAULT_CSS); - override classes = inject>>(CLASSES); + override classes = inject>>(LOGIN_CLASSES); displayRequiredFields = input(false); documentTitle = input(); bodyClassName = input(); diff --git a/src/login/pages/error/error.component.html b/src/login/pages/error/error.component.html index 74479db4..ce124199 100644 --- a/src/login/pages/error/error.component.html +++ b/src/login/pages/error/error.component.html @@ -3,7 +3,7 @@ @let client = kcContext.client; - {{ 'errorTitle' | msgStr }} + {{ i18n.msgStr('errorTitle') }}
@@ -16,7 +16,7 @@

} diff --git a/src/login/pages/error/error.component.ts b/src/login/pages/error/error.component.ts index 6d59c878..27a07d46 100644 --- a/src/login/pages/error/error.component.ts +++ b/src/login/pages/error/error.component.ts @@ -1,15 +1,18 @@ import { ChangeDetectionStrategy, Component, forwardRef, inject } from '@angular/core'; -import { CLASSES, KC_CONTEXT, USE_DEFAULT_CSS } from '@keycloakify/angular/lib/public-api'; -import { ClassKey } from 'keycloakify/login/lib/kcClsx'; -import { KcContext } from '../../KcContext'; +import { USE_DEFAULT_CSS } from '@keycloakify/angular/lib/tokens/use-default-css.token'; import { ComponentReference } from '@keycloakify/angular/login/classes/component-reference.class'; import { TemplateComponent } from '@keycloakify/angular/login/containers/template.component'; import { KcSanitizePipe } from '@keycloakify/angular/login/pipes/kc-sanitize.pipe'; -import { MsgStrPipe } from '@keycloakify/angular/login/pipes/msg-str.pipe'; +import { LOGIN_I18N } from '@keycloakify/angular/login/tokens/i18n.token'; +import { I18n } from '../../i18n'; +import { LOGIN_CLASSES } from '@keycloakify/angular/login/tokens/classes.token'; +import { KC_LOGIN_CONTEXT } from '@keycloakify/angular/login/tokens/kc-context.token'; +import { ClassKey } from 'keycloakify/login/lib/kcClsx'; +import { KcContext } from '../../KcContext'; @Component({ standalone: true, - imports: [TemplateComponent, MsgStrPipe, KcSanitizePipe], + imports: [TemplateComponent, KcSanitizePipe], selector: 'kc-root', templateUrl: 'error.component.html', changeDetection: ChangeDetectionStrategy.OnPush, @@ -21,7 +24,8 @@ import { MsgStrPipe } from '@keycloakify/angular/login/pipes/msg-str.pipe'; ] }) export class ErrorComponent extends ComponentReference { - kcContext = inject>(KC_CONTEXT); + kcContext = inject>(KC_LOGIN_CONTEXT); + i18n = inject(LOGIN_I18N); override doUseDefaultCss = inject(USE_DEFAULT_CSS); - override classes = inject>>(CLASSES); + override classes = inject>>(LOGIN_CLASSES); } diff --git a/src/login/pages/frontchannel-logout/frontchannel-logout.component.html b/src/login/pages/frontchannel-logout/frontchannel-logout.component.html index 9954042e..dbb2d7ba 100644 --- a/src/login/pages/frontchannel-logout/frontchannel-logout.component.html +++ b/src/login/pages/frontchannel-logout/frontchannel-logout.component.html @@ -4,13 +4,13 @@ [bodyClassName]="bodyClassName()" [displayMessage]="displayMessage" [displayRequiredFields]="displayRequiredFields()" - [documentTitle]="'frontchannel-logout.title' | msgStr" + [documentTitle]="i18n.msgStr('frontchannel-logout.title')" > - {{ 'frontchannel-logout.title' | msgStr }} + {{ i18n.msgStr('frontchannel-logout.title') }} -

{{ 'frontchannel-logout.message' | msgStr }}

+

{{ i18n.msgStr('frontchannel-logout.message') }}

    @for (client of logout.clients; track client.name; let idx = $index) {
  • @@ -28,7 +28,7 @@ class="btn btn-primary" [href]="logout.logoutRedirectUri" > - {{ 'doContinue' | msgStr }} + {{ i18n.msgStr('doContinue') }} } diff --git a/src/login/pages/frontchannel-logout/frontchannel-logout.component.ts b/src/login/pages/frontchannel-logout/frontchannel-logout.component.ts index a0d8223e..fd10a821 100644 --- a/src/login/pages/frontchannel-logout/frontchannel-logout.component.ts +++ b/src/login/pages/frontchannel-logout/frontchannel-logout.component.ts @@ -1,15 +1,18 @@ import { ChangeDetectionStrategy, Component, forwardRef, inject, input, OnInit } from '@angular/core'; -import { CLASSES, KC_CONTEXT, USE_DEFAULT_CSS } from '@keycloakify/angular/lib/public-api'; -import { ClassKey } from 'keycloakify/login/lib/kcClsx'; -import { KcContext } from '../../KcContext'; +import { USE_DEFAULT_CSS } from '@keycloakify/angular/lib/tokens/use-default-css.token'; import { ComponentReference } from '@keycloakify/angular/login/classes/component-reference.class'; import { TemplateComponent } from '@keycloakify/angular/login/containers/template.component'; import { KcSanitizePipe } from '@keycloakify/angular/login/pipes/kc-sanitize.pipe'; -import { MsgStrPipe } from '@keycloakify/angular/login/pipes/msg-str.pipe'; +import { LOGIN_I18N } from '@keycloakify/angular/login/tokens/i18n.token'; +import { I18n } from '../../i18n'; +import { LOGIN_CLASSES } from '@keycloakify/angular/login/tokens/classes.token'; +import { KC_LOGIN_CONTEXT } from '@keycloakify/angular/login/tokens/kc-context.token'; +import { ClassKey } from 'keycloakify/login/lib/kcClsx'; +import { KcContext } from '../../KcContext'; @Component({ standalone: true, - imports: [TemplateComponent, MsgStrPipe, KcSanitizePipe], + imports: [TemplateComponent, KcSanitizePipe], selector: 'kc-root', templateUrl: 'frontchannel-logout.component.html', changeDetection: ChangeDetectionStrategy.OnPush, @@ -21,9 +24,10 @@ import { MsgStrPipe } from '@keycloakify/angular/login/pipes/msg-str.pipe'; ] }) export class FrontchannelLogoutComponent extends ComponentReference implements OnInit { - kcContext = inject>(KC_CONTEXT); + kcContext = inject>(KC_LOGIN_CONTEXT); + i18n = inject(LOGIN_I18N); override doUseDefaultCss = inject(USE_DEFAULT_CSS); - override classes = inject>>(CLASSES); + override classes = inject>>(LOGIN_CLASSES); displayRequiredFields = input(false); bodyClassName = input(); displayInfo: boolean = false; diff --git a/src/login/pages/idp-review-user-profile/idp-review-user-profile.component.html b/src/login/pages/idp-review-user-profile/idp-review-user-profile.component.html index 88e1818f..45d3746d 100644 --- a/src/login/pages/idp-review-user-profile/idp-review-user-profile.component.html +++ b/src/login/pages/idp-review-user-profile/idp-review-user-profile.component.html @@ -7,7 +7,7 @@ [documentTitle]="documentTitle()" > - {{ 'loginIdpReviewProfileTitle' | msgStr }} + {{ i18n.msgStr('loginIdpReviewProfileTitle') }}
diff --git a/src/login/pages/idp-review-user-profile/idp-review-user-profile.component.ts b/src/login/pages/idp-review-user-profile/idp-review-user-profile.component.ts index a6524c60..f8d6908e 100644 --- a/src/login/pages/idp-review-user-profile/idp-review-user-profile.component.ts +++ b/src/login/pages/idp-review-user-profile/idp-review-user-profile.component.ts @@ -1,16 +1,19 @@ import { ChangeDetectionStrategy, Component, forwardRef, inject, input, signal } from '@angular/core'; -import { CLASSES, KC_CONTEXT, USE_DEFAULT_CSS } from '@keycloakify/angular/lib/public-api'; -import { ClassKey } from 'keycloakify/login/lib/kcClsx'; -import { KcContext } from '../../KcContext'; +import { USE_DEFAULT_CSS } from '@keycloakify/angular/lib/tokens/use-default-css.token'; import { ComponentReference } from '@keycloakify/angular/login/classes/component-reference.class'; import { UserProfileFormFieldsComponent } from '@keycloakify/angular/login/components/user-profile-form-fields/user-profile-form-fields.component'; import { TemplateComponent } from '@keycloakify/angular/login/containers/template.component'; import { KcClassDirective } from '@keycloakify/angular/login/directives/kc-class.directive'; -import { MsgStrPipe } from '@keycloakify/angular/login/pipes/msg-str.pipe'; +import { LOGIN_I18N } from '@keycloakify/angular/login/tokens/i18n.token'; +import { I18n } from '../../i18n'; +import { LOGIN_CLASSES } from '@keycloakify/angular/login/tokens/classes.token'; +import { KC_LOGIN_CONTEXT } from '@keycloakify/angular/login/tokens/kc-context.token'; +import { ClassKey } from 'keycloakify/login/lib/kcClsx'; +import { KcContext } from '../../KcContext'; @Component({ standalone: true, - imports: [TemplateComponent, MsgStrPipe, UserProfileFormFieldsComponent, KcClassDirective], + imports: [TemplateComponent, UserProfileFormFieldsComponent, KcClassDirective], selector: 'kc-root', templateUrl: 'idp-review-user-profile.component.html', changeDetection: ChangeDetectionStrategy.OnPush, @@ -22,12 +25,13 @@ import { MsgStrPipe } from '@keycloakify/angular/login/pipes/msg-str.pipe'; ] }) export class IdpReviewUserProfileComponent extends ComponentReference { - kcContext = inject>(KC_CONTEXT); + kcContext = inject>(KC_LOGIN_CONTEXT); displayRequiredFields = input(true); documentTitle = input(); bodyClassName = input(); + i18n = inject(LOGIN_I18N); override doUseDefaultCss = inject(USE_DEFAULT_CSS); - override classes = inject>>(CLASSES); + override classes = inject>>(LOGIN_CLASSES); isFormSubmittable = signal(false); displayInfo: boolean = false; displayMessage: boolean = !this.kcContext?.messagesPerField?.existsError('global'); diff --git a/src/login/pages/info/info.component.html b/src/login/pages/info/info.component.html index 6e252b6b..246b8f9e 100644 --- a/src/login/pages/info/info.component.html +++ b/src/login/pages/info/info.component.html @@ -12,7 +12,7 @@ [documentTitle]="documentTitle()" > - +
@@ -25,7 +25,7 @@

@@ -34,7 +34,7 @@

@@ -43,7 +43,7 @@

diff --git a/src/login/pages/info/info.component.ts b/src/login/pages/info/info.component.ts index d29c40cf..80b47350 100644 --- a/src/login/pages/info/info.component.ts +++ b/src/login/pages/info/info.component.ts @@ -1,23 +1,22 @@ import { ChangeDetectionStrategy, Component, forwardRef, inject, input } from '@angular/core'; -import { CLASSES, KC_CONTEXT, USE_DEFAULT_CSS } from '@keycloakify/angular/lib/public-api'; -import { ClassKey } from 'keycloakify/login/lib/kcClsx'; -import { KcContext } from '../../KcContext'; +import { USE_DEFAULT_CSS } from '@keycloakify/angular/lib/tokens/use-default-css.token'; import { ComponentReference } from '@keycloakify/angular/login/classes/component-reference.class'; import { TemplateComponent } from '@keycloakify/angular/login/containers/template.component'; -import { AdvancedMsgStrPipe } from '@keycloakify/angular/login/pipes/advanced-msg-str.pipe'; import { KcSanitizePipe } from '@keycloakify/angular/login/pipes/kc-sanitize.pipe'; -import { MsgStrPipe } from '@keycloakify/angular/login/pipes/msg-str.pipe'; +import { LOGIN_CLASSES } from '@keycloakify/angular/login/tokens/classes.token'; +import { LOGIN_I18N } from '@keycloakify/angular/login/tokens/i18n.token'; +import { KC_LOGIN_CONTEXT } from '@keycloakify/angular/login/tokens/kc-context.token'; +import { ClassKey } from 'keycloakify/login/lib/kcClsx'; +import { I18n } from '../../i18n'; +import { KcContext } from '../../KcContext'; @Component({ standalone: true, - imports: [TemplateComponent, MsgStrPipe, KcSanitizePipe, AdvancedMsgStrPipe], + imports: [TemplateComponent, KcSanitizePipe], selector: 'kc-root', templateUrl: 'info.component.html', changeDetection: ChangeDetectionStrategy.OnPush, providers: [ - AdvancedMsgStrPipe, - MsgStrPipe, - KcSanitizePipe, { provide: ComponentReference, useExisting: forwardRef(() => InfoComponent) @@ -25,12 +24,10 @@ import { MsgStrPipe } from '@keycloakify/angular/login/pipes/msg-str.pipe'; ] }) export class InfoComponent extends ComponentReference { - kcContext = inject>(KC_CONTEXT); - advancedMsgStr = inject(AdvancedMsgStrPipe); - kcSanitize = inject(KcSanitizePipe); - msgStr = inject(MsgStrPipe); + kcContext = inject>(KC_LOGIN_CONTEXT); + i18n = inject(LOGIN_I18N); override doUseDefaultCss = inject(USE_DEFAULT_CSS); - override classes = inject>>(CLASSES); + override classes = inject>>(LOGIN_CLASSES); displayRequiredFields = input(false); documentTitle = input(); bodyClassName = input(); @@ -42,9 +39,7 @@ export class InfoComponent extends ComponentReference { if (this.kcContext.requiredActions) { html += ''; - html += this.kcContext.requiredActions - .map(requiredAction => this.advancedMsgStr.transform(`requiredAction.${requiredAction}`)) - .join(', '); + html += this.kcContext.requiredActions.map(requiredAction => this.i18n.advancedMsgStr(`requiredAction.${requiredAction}`)).join(', '); html += ''; } diff --git a/src/login/pages/login-config-totp/login-config-totp.component.html b/src/login/pages/login-config-totp/login-config-totp.component.html index 44df0c78..80cc8d8a 100644 --- a/src/login/pages/login-config-totp/login-config-totp.component.html +++ b/src/login/pages/login-config-totp/login-config-totp.component.html @@ -11,54 +11,54 @@ [documentTitle]="documentTitle()" > - {{ 'loginTotpStep1' | msgStr }} + {{ i18n.msgStr('loginTotpStep1') }}
  1. -

    {{ 'loginTotpStep1' | msgStr }}

    +

    {{ i18n.msgStr('loginTotpStep1') }}

      @for (app of totp.supportedApplications; track app) { -
    • {{ app | advancedMsgStr }}
    • +
    • {{ i18n.advancedMsgStr(app) }}
    • }
  2. @if (kcContext.mode === 'manual') {
  3. -

    {{ 'loginTotpManualStep2' | msgStr }}

    +

    {{ i18n.msgStr('loginTotpManualStep2') }}

    {{ totp.totpSecretEncoded }}

    - {{ 'loginTotpScanBarcode' | msgStr }} + {{ i18n.msgStr('loginTotpScanBarcode') }}

  4. -

    {{ 'loginTotpManualStep3' | msgStr }}

    +

    {{ i18n.msgStr('loginTotpManualStep3') }}

    • - {{ 'loginTotpType' | msgStr }}: - {{ 'loginTotp.' + totp.policy.type | advancedMsgStr }} + {{ i18n.msgStr('loginTotpType') }}: + {{ i18n.advancedMsgStr('loginTotp.' + totp.policy.type) }}
    • - {{ 'loginTotpAlgorithm' | msgStr }}: + {{ i18n.msgStr('loginTotpAlgorithm') }}: {{ totp.policy.getAlgorithmKey() }}
    • -
    • {{ 'loginTotpDigits' | msgStr }}: {{ totp.policy.digits }}
    • +
    • {{ i18n.msgStr('loginTotpDigits') }}: {{ totp.policy.digits }}
    • @if (totp.policy.type === 'totp') {
    • - {{ 'loginTotpInterval' | msgStr }}: + {{ i18n.msgStr('loginTotpInterval') }}: {{ totp.policy.period }}
    • } @else {
    • - {{ 'loginTotpCounter' | msgStr }}: + {{ i18n.msgStr('loginTotpCounter') }}: {{ totp.policy.initialCounter }}
    • } @@ -66,26 +66,26 @@ } @else {
    • -

      {{ 'loginTotpStep2' | msgStr }}

      +

      {{ i18n.msgStr('loginTotpStep2') }}

      Figure: Barcode

      - {{ 'loginTotpUnableToScan' | msgStr }} + {{ i18n.msgStr('loginTotpUnableToScan') }}

    • }
    • -

      {{ 'loginTotpStep3' | msgStr }}

      -

      {{ 'loginTotpStep3DeviceName' | msgStr }}

      +

      {{ i18n.msgStr('loginTotpStep3') }}

      +

      {{ i18n.msgStr('loginTotpStep3DeviceName') }}

- {{ 'authenticatorCode' | msgStr }} + {{ i18n.msgStr('authenticatorCode') }} *
@@ -142,7 +142,7 @@ for="userLabel" [kcClass]="'kcLabelClass'" > - {{ 'loginTotpDeviceName' | msgStr }} + {{ i18n.msgStr('loginTotpDeviceName') }} @if (totp.otpCredentials.length >= 1) { * @@ -176,7 +176,7 @@ type="submit" [kcClass]="['kcButtonClass', 'kcButtonPrimaryClass', 'kcButtonLargeClass']" id="saveTOTPBtn" - [value]="'doSubmit' | msgStr" + [value]="i18n.msgStr('doSubmit')" /> } @else { } diff --git a/src/login/pages/login-config-totp/login-config-totp.component.ts b/src/login/pages/login-config-totp/login-config-totp.component.ts index 3fdb748a..daeb0f18 100644 --- a/src/login/pages/login-config-totp/login-config-totp.component.ts +++ b/src/login/pages/login-config-totp/login-config-totp.component.ts @@ -1,18 +1,20 @@ import { ChangeDetectionStrategy, Component, forwardRef, inject, input } from '@angular/core'; -import { CLASSES, KC_CONTEXT, USE_DEFAULT_CSS } from '@keycloakify/angular/lib/public-api'; -import { ClassKey } from 'keycloakify/login/lib/kcClsx'; -import { KcContext } from '../../KcContext'; +import { USE_DEFAULT_CSS } from '@keycloakify/angular/lib/tokens/use-default-css.token'; import { ComponentReference } from '@keycloakify/angular/login/classes/component-reference.class'; import { LogoutOtherSessionsComponent } from '@keycloakify/angular/login/components/logout-other-sessions/logout-other-sessions.component'; import { TemplateComponent } from '@keycloakify/angular/login/containers/template.component'; import { KcClassDirective } from '@keycloakify/angular/login/directives/kc-class.directive'; -import { AdvancedMsgStrPipe } from '@keycloakify/angular/login/pipes/advanced-msg-str.pipe'; import { KcSanitizePipe } from '@keycloakify/angular/login/pipes/kc-sanitize.pipe'; -import { MsgStrPipe } from '@keycloakify/angular/login/pipes/msg-str.pipe'; +import { LOGIN_CLASSES } from '@keycloakify/angular/login/tokens/classes.token'; +import { LOGIN_I18N } from '@keycloakify/angular/login/tokens/i18n.token'; +import { KC_LOGIN_CONTEXT } from '@keycloakify/angular/login/tokens/kc-context.token'; +import { ClassKey } from 'keycloakify/login/lib/kcClsx'; +import { I18n } from '../../i18n'; +import { KcContext } from '../../KcContext'; @Component({ standalone: true, - imports: [TemplateComponent, MsgStrPipe, AdvancedMsgStrPipe, KcClassDirective, KcSanitizePipe, LogoutOtherSessionsComponent], + imports: [TemplateComponent, KcClassDirective, KcSanitizePipe, LogoutOtherSessionsComponent], selector: 'kc-root', templateUrl: 'login-config-totp.component.html', changeDetection: ChangeDetectionStrategy.OnPush, @@ -24,10 +26,10 @@ import { MsgStrPipe } from '@keycloakify/angular/login/pipes/msg-str.pipe'; ] }) export class LoginConfigTotpComponent extends ComponentReference { - kcContext = inject>(KC_CONTEXT); - + kcContext = inject>(KC_LOGIN_CONTEXT); + i18n = inject(LOGIN_I18N); override doUseDefaultCss = inject(USE_DEFAULT_CSS); - override classes = inject>>(CLASSES); + override classes = inject>>(LOGIN_CLASSES); displayRequiredFields = input(false); documentTitle = input(); bodyClassName = input(); diff --git a/src/login/pages/login-idp-link-confirm-override/login-idp-link-confirm-override.component.html b/src/login/pages/login-idp-link-confirm-override/login-idp-link-confirm-override.component.html index 5e6ba57f..97fa099f 100644 --- a/src/login/pages/login-idp-link-confirm-override/login-idp-link-confirm-override.component.html +++ b/src/login/pages/login-idp-link-confirm-override/login-idp-link-confirm-override.component.html @@ -9,7 +9,7 @@ [documentTitle]="documentTitle()" > - {{ 'confirmOverrideIdpTitle' | msgStr }} + {{ i18n.msgStr('confirmOverrideIdpTitle') }}
- {{ 'pageExpiredMsg1' | msgStr }} + {{ i18n.msgStr('pageExpiredMsg1') }} - {{ 'doClickHere' | msgStr }} + {{ i18n.msgStr('doClickHere') }}

@@ -33,7 +33,7 @@ id="confirmOverride" value="confirmOverride" > - {{ 'confirmOverrideIdpContinue' | msgStr: idpDisplayName }} + {{ i18n.msgStr('confirmOverrideIdpContinue', idpDisplayName) }}
diff --git a/src/login/pages/login-idp-link-confirm-override/login-idp-link-confirm-override.component.ts b/src/login/pages/login-idp-link-confirm-override/login-idp-link-confirm-override.component.ts index da878fc0..4198ee7e 100644 --- a/src/login/pages/login-idp-link-confirm-override/login-idp-link-confirm-override.component.ts +++ b/src/login/pages/login-idp-link-confirm-override/login-idp-link-confirm-override.component.ts @@ -1,15 +1,18 @@ import { ChangeDetectionStrategy, Component, forwardRef, inject, input } from '@angular/core'; -import { CLASSES, KC_CONTEXT, USE_DEFAULT_CSS } from '@keycloakify/angular/lib/public-api'; -import { ClassKey } from 'keycloakify/login/lib/kcClsx'; -import { KcContext } from '../../KcContext'; +import { USE_DEFAULT_CSS } from '@keycloakify/angular/lib/tokens/use-default-css.token'; import { ComponentReference } from '@keycloakify/angular/login/classes/component-reference.class'; import { TemplateComponent } from '@keycloakify/angular/login/containers/template.component'; import { KcClassDirective } from '@keycloakify/angular/login/directives/kc-class.directive'; -import { MsgStrPipe } from '@keycloakify/angular/login/pipes/msg-str.pipe'; +import { LOGIN_I18N } from '@keycloakify/angular/login/tokens/i18n.token'; +import { I18n } from '../../i18n'; +import { LOGIN_CLASSES } from '@keycloakify/angular/login/tokens/classes.token'; +import { KC_LOGIN_CONTEXT } from '@keycloakify/angular/login/tokens/kc-context.token'; +import { ClassKey } from 'keycloakify/login/lib/kcClsx'; +import { KcContext } from '../../KcContext'; @Component({ standalone: true, - imports: [KcClassDirective, TemplateComponent, MsgStrPipe], + imports: [KcClassDirective, TemplateComponent], selector: 'kc-root', templateUrl: 'login-idp-link-confirm-override.component.html', changeDetection: ChangeDetectionStrategy.OnPush, @@ -21,9 +24,10 @@ import { MsgStrPipe } from '@keycloakify/angular/login/pipes/msg-str.pipe'; ] }) export class LoginIdpLinkConfirmOverrideComponent extends ComponentReference { - kcContext = inject>(KC_CONTEXT); + kcContext = inject>(KC_LOGIN_CONTEXT); + i18n = inject(LOGIN_I18N); override doUseDefaultCss = inject(USE_DEFAULT_CSS); - override classes = inject>>(CLASSES); + override classes = inject>>(LOGIN_CLASSES); displayRequiredFields = input(false); documentTitle = input(); bodyClassName = input(); diff --git a/src/login/pages/login-idp-link-confirm/login-idp-link-confirm.component.html b/src/login/pages/login-idp-link-confirm/login-idp-link-confirm.component.html index 1c37a509..0416c82f 100644 --- a/src/login/pages/login-idp-link-confirm/login-idp-link-confirm.component.html +++ b/src/login/pages/login-idp-link-confirm/login-idp-link-confirm.component.html @@ -8,7 +8,7 @@ [documentTitle]="documentTitle()" > - {{ 'confirmLinkIdpTitle' | msgStr }} + {{ i18n.msgStr('confirmLinkIdpTitle') }}
- {{ 'confirmLinkIdpReviewProfile' | msgStr }} + {{ i18n.msgStr('confirmLinkIdpReviewProfile') }}
diff --git a/src/login/pages/login-idp-link-confirm/login-idp-link-confirm.component.ts b/src/login/pages/login-idp-link-confirm/login-idp-link-confirm.component.ts index c3491002..b91c0e48 100644 --- a/src/login/pages/login-idp-link-confirm/login-idp-link-confirm.component.ts +++ b/src/login/pages/login-idp-link-confirm/login-idp-link-confirm.component.ts @@ -1,15 +1,18 @@ import { ChangeDetectionStrategy, Component, forwardRef, inject, input } from '@angular/core'; -import { CLASSES, KC_CONTEXT, USE_DEFAULT_CSS } from '@keycloakify/angular/lib/public-api'; -import { ClassKey } from 'keycloakify/login/lib/kcClsx'; -import { KcContext } from '../../KcContext'; +import { USE_DEFAULT_CSS } from '@keycloakify/angular/lib/tokens/use-default-css.token'; import { ComponentReference } from '@keycloakify/angular/login/classes/component-reference.class'; import { TemplateComponent } from '@keycloakify/angular/login/containers/template.component'; import { KcClassDirective } from '@keycloakify/angular/login/directives/kc-class.directive'; -import { MsgStrPipe } from '@keycloakify/angular/login/pipes/msg-str.pipe'; +import { LOGIN_CLASSES } from '@keycloakify/angular/login/tokens/classes.token'; +import { LOGIN_I18N } from '@keycloakify/angular/login/tokens/i18n.token'; +import { KC_LOGIN_CONTEXT } from '@keycloakify/angular/login/tokens/kc-context.token'; +import { ClassKey } from 'keycloakify/login/lib/kcClsx'; +import { I18n } from '../../i18n'; +import { KcContext } from '../../KcContext'; @Component({ standalone: true, - imports: [TemplateComponent, MsgStrPipe, KcClassDirective], + imports: [TemplateComponent, KcClassDirective], selector: 'kc-root', templateUrl: 'login-idp-link-confirm.component.html', changeDetection: ChangeDetectionStrategy.OnPush, @@ -21,9 +24,10 @@ import { MsgStrPipe } from '@keycloakify/angular/login/pipes/msg-str.pipe'; ] }) export class LoginIdpLinkConfirmComponent extends ComponentReference { - kcContext = inject>(KC_CONTEXT); + kcContext = inject>(KC_LOGIN_CONTEXT); + i18n = inject(LOGIN_I18N); override doUseDefaultCss = inject(USE_DEFAULT_CSS); - override classes = inject>>(CLASSES); + override classes = inject>>(LOGIN_CLASSES); displayRequiredFields = input(false); documentTitle = input(); bodyClassName = input(); diff --git a/src/login/pages/login-idp-link-email/login-idp-link-email.component.html b/src/login/pages/login-idp-link-email/login-idp-link-email.component.html index 5909fbc9..358951d7 100644 --- a/src/login/pages/login-idp-link-email/login-idp-link-email.component.html +++ b/src/login/pages/login-idp-link-email/login-idp-link-email.component.html @@ -10,30 +10,30 @@ [documentTitle]="documentTitle()" > - {{ 'emailLinkIdpTitle' | msgStr: idpAlias }} + {{ i18n.msgStr('emailLinkIdpTitle', idpAlias) }}

- {{ 'emailLinkIdp1' | msgStr: idpAlias : brokerContext.username : realm.displayName }} + {{ i18n.msgStr('emailLinkIdp1', idpAlias, brokerContext.username, realm.displayName) }}

- {{ 'emailLinkIdp2' | msgStr }} - {{ 'doClickHere' | msgStr }} - {{ 'emailLinkIdp3' | msgStr }} + {{ i18n.msgStr('emailLinkIdp2') }} + {{ i18n.msgStr('doClickHere') }} + {{ i18n.msgStr('emailLinkIdp3') }}

- {{ 'emailLinkIdp4' | msgStr }} - {{ 'doClickHere' | msgStr }} - {{ 'emailLinkIdp5' | msgStr }} + {{ i18n.msgStr('emailLinkIdp4') }} + {{ i18n.msgStr('doClickHere') }} + {{ i18n.msgStr('emailLinkIdp5') }}

diff --git a/src/login/pages/login-idp-link-email/login-idp-link-email.component.ts b/src/login/pages/login-idp-link-email/login-idp-link-email.component.ts index e2494174..0fcb1d8c 100644 --- a/src/login/pages/login-idp-link-email/login-idp-link-email.component.ts +++ b/src/login/pages/login-idp-link-email/login-idp-link-email.component.ts @@ -1,15 +1,18 @@ import { ChangeDetectionStrategy, Component, forwardRef, inject, input } from '@angular/core'; -import { CLASSES, KC_CONTEXT, USE_DEFAULT_CSS } from '@keycloakify/angular/lib/public-api'; -import { ClassKey } from 'keycloakify/login/lib/kcClsx'; -import { KcContext } from '../../KcContext'; +import { USE_DEFAULT_CSS } from '@keycloakify/angular/lib/tokens/use-default-css.token'; import { ComponentReference } from '@keycloakify/angular/login/classes/component-reference.class'; import { TemplateComponent } from '@keycloakify/angular/login/containers/template.component'; import { KcClassDirective } from '@keycloakify/angular/login/directives/kc-class.directive'; -import { MsgStrPipe } from '@keycloakify/angular/login/pipes/msg-str.pipe'; +import { LOGIN_I18N } from '@keycloakify/angular/login/tokens/i18n.token'; +import { I18n } from '../../i18n'; +import { LOGIN_CLASSES } from '@keycloakify/angular/login/tokens/classes.token'; +import { KC_LOGIN_CONTEXT } from '@keycloakify/angular/login/tokens/kc-context.token'; +import { ClassKey } from 'keycloakify/login/lib/kcClsx'; +import { KcContext } from '../../KcContext'; @Component({ standalone: true, - imports: [TemplateComponent, MsgStrPipe, KcClassDirective], + imports: [TemplateComponent, KcClassDirective], selector: 'kc-root', templateUrl: 'login-idp-link-email.component.html', changeDetection: ChangeDetectionStrategy.OnPush, @@ -21,9 +24,10 @@ import { MsgStrPipe } from '@keycloakify/angular/login/pipes/msg-str.pipe'; ] }) export class LoginIdpLinkEmailComponent extends ComponentReference { - kcContext = inject>(KC_CONTEXT); + kcContext = inject>(KC_LOGIN_CONTEXT); + i18n = inject(LOGIN_I18N); override doUseDefaultCss = inject(USE_DEFAULT_CSS); - override classes = inject>>(CLASSES); + override classes = inject>>(LOGIN_CLASSES); displayRequiredFields = input(false); documentTitle = input(); bodyClassName = input(); diff --git a/src/login/pages/login-oauth-grant/login-oauth-grant.component.html b/src/login/pages/login-oauth-grant/login-oauth-grant.component.html index cba30b7e..606daf2c 100644 --- a/src/login/pages/login-oauth-grant/login-oauth-grant.component.html +++ b/src/login/pages/login-oauth-grant/login-oauth-grant.component.html @@ -16,7 +16,7 @@ /> }

- {{ 'oauthGrantTitle' | msgStr: (client.name ? (client.name | advancedMsgStr) : client.clientId) }} + {{ i18n.msgStr('oauthGrantTitle', client.name ? i18n.advancedMsgStr(client.name) : client.clientId) }}

@@ -25,12 +25,12 @@ id="kc-oauth" class="content-area" > -

{{ 'oauthGrantRequest' | msgStr }}

+

{{ i18n.msgStr('oauthGrantRequest') }}

    @for (clientScope of oauth.clientScopesRequested; track clientScope) {
  • - {{ clientScope.consentScreenText | advancedMsgStr }} + {{ i18n.advancedMsgStr(clientScope.consentScreenText) }} @if (clientScope.dynamicScopeParameter) { : {{ clientScope.dynamicScopeParameter }} } @@ -42,17 +42,17 @@

    {{ 'oauthGrantRequest' | msgStr }}

    @if (client.attributes['policyUri'] || client.attributes['tosUri']) {

    @if (client.name) { - {{ 'oauthGrantInformation' | msgStr: (client.name | advancedMsgStr) }} + {{ i18n.msgStr('oauthGrantInformation', i18n.advancedMsgStr(client.name)) }} } @else { - {{ 'oauthGrantInformation' | msgStr: client.clientId }} + {{ i18n.msgStr('oauthGrantInformation', client.clientId) }} } @if (client.attributes['policyUri']) { - {{ 'oauthGrantReview' | msgStr }} + {{ i18n.msgStr('oauthGrantReview') }} - {{ 'oauthGrantPolicy' | msgStr }} + {{ i18n.msgStr('oauthGrantPolicy') }} }

    @@ -77,12 +77,12 @@

    diff --git a/src/login/pages/login-oauth-grant/login-oauth-grant.component.ts b/src/login/pages/login-oauth-grant/login-oauth-grant.component.ts index f462529a..71a8e476 100644 --- a/src/login/pages/login-oauth-grant/login-oauth-grant.component.ts +++ b/src/login/pages/login-oauth-grant/login-oauth-grant.component.ts @@ -1,16 +1,18 @@ import { ChangeDetectionStrategy, Component, forwardRef, inject, input } from '@angular/core'; -import { CLASSES, KC_CONTEXT, USE_DEFAULT_CSS } from '@keycloakify/angular/lib/public-api'; -import { ClassKey } from 'keycloakify/login/lib/kcClsx'; -import { KcContext } from '../../KcContext'; +import { USE_DEFAULT_CSS } from '@keycloakify/angular/lib/tokens/use-default-css.token'; import { ComponentReference } from '@keycloakify/angular/login/classes/component-reference.class'; import { TemplateComponent } from '@keycloakify/angular/login/containers/template.component'; import { KcClassDirective } from '@keycloakify/angular/login/directives/kc-class.directive'; -import { AdvancedMsgStrPipe } from '@keycloakify/angular/login/pipes/advanced-msg-str.pipe'; -import { MsgStrPipe } from '@keycloakify/angular/login/pipes/msg-str.pipe'; +import { LOGIN_CLASSES } from '@keycloakify/angular/login/tokens/classes.token'; +import { LOGIN_I18N } from '@keycloakify/angular/login/tokens/i18n.token'; +import { KC_LOGIN_CONTEXT } from '@keycloakify/angular/login/tokens/kc-context.token'; +import { ClassKey } from 'keycloakify/login/lib/kcClsx'; +import { I18n } from '../../i18n'; +import { KcContext } from '../../KcContext'; @Component({ standalone: true, - imports: [KcClassDirective, TemplateComponent, MsgStrPipe, AdvancedMsgStrPipe], + imports: [KcClassDirective, TemplateComponent], selector: 'kc-root', templateUrl: 'login-oauth-grant.component.html', changeDetection: ChangeDetectionStrategy.OnPush, @@ -22,9 +24,10 @@ import { MsgStrPipe } from '@keycloakify/angular/login/pipes/msg-str.pipe'; ] }) export class LoginOauthGrantComponent extends ComponentReference { - kcContext = inject>(KC_CONTEXT); + kcContext = inject>(KC_LOGIN_CONTEXT); + i18n = inject(LOGIN_I18N); override doUseDefaultCss = inject(USE_DEFAULT_CSS); - override classes = inject>>(CLASSES); + override classes = inject>>(LOGIN_CLASSES); displayRequiredFields = input(false); documentTitle = input(); bodyClassName = input('oauth'); diff --git a/src/login/pages/login-oauth2-device-verify-user-code/login-oauth2-device-verify-user-code.component.html b/src/login/pages/login-oauth2-device-verify-user-code/login-oauth2-device-verify-user-code.component.html index c4668691..149564b1 100644 --- a/src/login/pages/login-oauth2-device-verify-user-code/login-oauth2-device-verify-user-code.component.html +++ b/src/login/pages/login-oauth2-device-verify-user-code/login-oauth2-device-verify-user-code.component.html @@ -7,7 +7,7 @@ [documentTitle]="documentTitle()" > - {{ 'oauth2DeviceVerificationTitle' | msgStr }} + {{ i18n.msgStr('oauth2DeviceVerificationTitle') }}
    - {{ 'verifyOAuth2DeviceUserCode' | msgStr }} + {{ i18n.msgStr('verifyOAuth2DeviceUserCode') }} @@ -53,7 +53,7 @@ diff --git a/src/login/pages/login-oauth2-device-verify-user-code/login-oauth2-device-verify-user-code.component.ts b/src/login/pages/login-oauth2-device-verify-user-code/login-oauth2-device-verify-user-code.component.ts index e124615a..5791523a 100644 --- a/src/login/pages/login-oauth2-device-verify-user-code/login-oauth2-device-verify-user-code.component.ts +++ b/src/login/pages/login-oauth2-device-verify-user-code/login-oauth2-device-verify-user-code.component.ts @@ -1,15 +1,18 @@ import { ChangeDetectionStrategy, Component, forwardRef, inject, input } from '@angular/core'; -import { CLASSES, KC_CONTEXT, USE_DEFAULT_CSS } from '@keycloakify/angular/lib/public-api'; -import { ClassKey } from 'keycloakify/login/lib/kcClsx'; -import { KcContext } from '../../KcContext'; +import { USE_DEFAULT_CSS } from '@keycloakify/angular/lib/tokens/use-default-css.token'; import { ComponentReference } from '@keycloakify/angular/login/classes/component-reference.class'; import { TemplateComponent } from '@keycloakify/angular/login/containers/template.component'; import { KcClassDirective } from '@keycloakify/angular/login/directives/kc-class.directive'; -import { MsgStrPipe } from '@keycloakify/angular/login/pipes/msg-str.pipe'; +import { LOGIN_CLASSES } from '@keycloakify/angular/login/tokens/classes.token'; +import { LOGIN_I18N } from '@keycloakify/angular/login/tokens/i18n.token'; +import { KC_LOGIN_CONTEXT } from '@keycloakify/angular/login/tokens/kc-context.token'; +import { ClassKey } from 'keycloakify/login/lib/kcClsx'; +import { I18n } from '../../i18n'; +import { KcContext } from '../../KcContext'; @Component({ standalone: true, - imports: [TemplateComponent, MsgStrPipe, KcClassDirective], + imports: [TemplateComponent, KcClassDirective], selector: 'kc-root', templateUrl: 'login-oauth2-device-verify-user-code.component.html', changeDetection: ChangeDetectionStrategy.OnPush, @@ -21,9 +24,10 @@ import { MsgStrPipe } from '@keycloakify/angular/login/pipes/msg-str.pipe'; ] }) export class LoginOauth2DeviceVerifyUserCodeComponent extends ComponentReference { - kcContext = inject>(KC_CONTEXT); + kcContext = inject>(KC_LOGIN_CONTEXT); + i18n = inject(LOGIN_I18N); override doUseDefaultCss = inject(USE_DEFAULT_CSS); - override classes = inject>>(CLASSES); + override classes = inject>>(LOGIN_CLASSES); displayRequiredFields = input(false); documentTitle = input(); bodyClassName = input(); diff --git a/src/login/pages/login-otp/login-otp.component.html b/src/login/pages/login-otp/login-otp.component.html index 91d6ad80..1c36b492 100644 --- a/src/login/pages/login-otp/login-otp.component.html +++ b/src/login/pages/login-otp/login-otp.component.html @@ -9,7 +9,7 @@ [documentTitle]="documentTitle()" > - {{ 'doLogIn' | msgStr }} + {{ i18n.msgStr('doLogIn') }} - {{ 'loginOtpOneTime' | msgStr }} + {{ i18n.msgStr('loginOtpOneTime') }}
    @@ -94,7 +94,7 @@ name="login" id="kc-login" type="submit" - value="{{ 'doLogIn' | msgStr }}" + [value]="i18n.msgStr('doLogIn')" />
    diff --git a/src/login/pages/login-otp/login-otp.component.ts b/src/login/pages/login-otp/login-otp.component.ts index e256ef99..d231922f 100644 --- a/src/login/pages/login-otp/login-otp.component.ts +++ b/src/login/pages/login-otp/login-otp.component.ts @@ -1,16 +1,19 @@ import { ChangeDetectionStrategy, Component, forwardRef, inject, input } from '@angular/core'; -import { CLASSES, KC_CONTEXT, USE_DEFAULT_CSS } from '@keycloakify/angular/lib/public-api'; -import { ClassKey } from 'keycloakify/login/lib/kcClsx'; -import { KcContext } from '../../KcContext'; +import { USE_DEFAULT_CSS } from '@keycloakify/angular/lib/tokens/use-default-css.token'; import { ComponentReference } from '@keycloakify/angular/login/classes/component-reference.class'; import { TemplateComponent } from '@keycloakify/angular/login/containers/template.component'; import { KcClassDirective } from '@keycloakify/angular/login/directives/kc-class.directive'; import { KcSanitizePipe } from '@keycloakify/angular/login/pipes/kc-sanitize.pipe'; -import { MsgStrPipe } from '@keycloakify/angular/login/pipes/msg-str.pipe'; +import { LOGIN_CLASSES } from '@keycloakify/angular/login/tokens/classes.token'; +import { LOGIN_I18N } from '@keycloakify/angular/login/tokens/i18n.token'; +import { KC_LOGIN_CONTEXT } from '@keycloakify/angular/login/tokens/kc-context.token'; +import { ClassKey } from 'keycloakify/login/lib/kcClsx'; +import { I18n } from '../../i18n'; +import { KcContext } from '../../KcContext'; @Component({ standalone: true, - imports: [TemplateComponent, KcClassDirective, MsgStrPipe, KcSanitizePipe], + imports: [TemplateComponent, KcClassDirective, KcSanitizePipe], selector: 'kc-root', templateUrl: 'login-otp.component.html', changeDetection: ChangeDetectionStrategy.OnPush, @@ -22,9 +25,10 @@ import { MsgStrPipe } from '@keycloakify/angular/login/pipes/msg-str.pipe'; ] }) export class LoginOtpComponent extends ComponentReference { - kcContext = inject>(KC_CONTEXT); + kcContext = inject>(KC_LOGIN_CONTEXT); + i18n = inject(LOGIN_I18N); override doUseDefaultCss = inject(USE_DEFAULT_CSS); - override classes = inject>>(CLASSES); + override classes = inject>>(LOGIN_CLASSES); displayRequiredFields = input(false); documentTitle = input(); bodyClassName = input(); diff --git a/src/login/pages/login-page-expired/login-page-expired.component.html b/src/login/pages/login-page-expired/login-page-expired.component.html index 09a86a38..6da9dff9 100644 --- a/src/login/pages/login-page-expired/login-page-expired.component.html +++ b/src/login/pages/login-page-expired/login-page-expired.component.html @@ -7,27 +7,27 @@ [documentTitle]="documentTitle()" > - {{ 'pageExpiredTitle' | msgStr }} + {{ i18n.msgStr('pageExpiredTitle') }}

    - {{ 'pageExpiredMsg1' | msgStr }} + {{ i18n.msgStr('pageExpiredMsg1') }} - {{ 'doClickHere' | msgStr }} + {{ i18n.msgStr('doClickHere') }} .
    - {{ 'pageExpiredMsg2' | msgStr }} + {{ i18n.msgStr('pageExpiredMsg2') }} - {{ 'doClickHere' | msgStr }} + {{ i18n.msgStr('doClickHere') }} .

    diff --git a/src/login/pages/login-page-expired/login-page-expired.component.ts b/src/login/pages/login-page-expired/login-page-expired.component.ts index 9a90da6b..bf05a9c8 100644 --- a/src/login/pages/login-page-expired/login-page-expired.component.ts +++ b/src/login/pages/login-page-expired/login-page-expired.component.ts @@ -1,14 +1,17 @@ import { ChangeDetectionStrategy, Component, forwardRef, inject, input } from '@angular/core'; -import { CLASSES, KC_CONTEXT, USE_DEFAULT_CSS } from '@keycloakify/angular/lib/public-api'; -import { ClassKey } from 'keycloakify/login/lib/kcClsx'; -import { KcContext } from '../../KcContext'; +import { USE_DEFAULT_CSS } from '@keycloakify/angular/lib/tokens/use-default-css.token'; import { ComponentReference } from '@keycloakify/angular/login/classes/component-reference.class'; import { TemplateComponent } from '@keycloakify/angular/login/containers/template.component'; -import { MsgStrPipe } from '@keycloakify/angular/login/pipes/msg-str.pipe'; +import { LOGIN_CLASSES } from '@keycloakify/angular/login/tokens/classes.token'; +import { LOGIN_I18N } from '@keycloakify/angular/login/tokens/i18n.token'; +import { KC_LOGIN_CONTEXT } from '@keycloakify/angular/login/tokens/kc-context.token'; +import { ClassKey } from 'keycloakify/login/lib/kcClsx'; +import { I18n } from '../../i18n'; +import { KcContext } from '../../KcContext'; @Component({ standalone: true, - imports: [TemplateComponent, MsgStrPipe], + imports: [TemplateComponent], selector: 'kc-root', templateUrl: 'login-page-expired.component.html', changeDetection: ChangeDetectionStrategy.OnPush, @@ -20,9 +23,10 @@ import { MsgStrPipe } from '@keycloakify/angular/login/pipes/msg-str.pipe'; ] }) export class LoginPageExpiredComponent extends ComponentReference { - kcContext = inject>(KC_CONTEXT); + kcContext = inject>(KC_LOGIN_CONTEXT); + i18n = inject(LOGIN_I18N); override doUseDefaultCss = inject(USE_DEFAULT_CSS); - override classes = inject>>(CLASSES); + override classes = inject>>(LOGIN_CLASSES); displayRequiredFields = input(false); documentTitle = input(); bodyClassName = input(); diff --git a/src/login/pages/login-passkeys-conditional-authenticate/login-passkeys-conditional-authenticate.component.html b/src/login/pages/login-passkeys-conditional-authenticate/login-passkeys-conditional-authenticate.component.html index a874c6ad..d66a81ed 100644 --- a/src/login/pages/login-passkeys-conditional-authenticate/login-passkeys-conditional-authenticate.component.html +++ b/src/login/pages/login-passkeys-conditional-authenticate/login-passkeys-conditional-authenticate.component.html @@ -8,18 +8,18 @@ @let registrationDisabled = kcContext.registrationDisabled; - {{ 'passkey-login-title' | msgStr }} + {{ i18n.msgStr('passkey-login-title') }} @if (realm.registrationAllowed && !registrationDisabled) {
    - {{ 'noAccount' | msgStr }} + {{ i18n.msgStr('noAccount') }} - {{ 'doRegister' | msgStr }} + {{ i18n.msgStr('doRegister') }}
    @@ -86,7 +86,7 @@ @if (shouldDisplayAuthenticators) { @if (authenticators.authenticators.length > 1) {

    - {{ 'passkey-available-authenticators' | msgStr }} + {{ i18n.msgStr('passkey-available-authenticators') }}

    } @@ -106,7 +106,7 @@ [id]="'kc-webauthn-authenticator-label-' + i" [kcClass]="'kcSelectAuthListItemHeadingClass'" > - {{ authenticator.label | advancedMsgStr }} + {{ i18n.advancedMsgStr(authenticator.label) }} @if ( authenticator.transports !== undefined && @@ -123,7 +123,7 @@ let i = $index ) { - {{ nameProperty | advancedMsgStr }} + {{ i18n.advancedMsgStr(nameProperty) }} @if (i !== authenticator.transports.displayNameProperties.length - 1) { , @@ -132,7 +132,7 @@
    - {{ 'passkey-createdAt-label' | msgStr }} + {{ i18n.msgStr('passkey-createdAt-label') }} {{ authenticator.createdAt }} @@ -160,7 +160,7 @@ for="username" [kcClass]="'kcLabelClass'" > - {{ 'passkey-autofill-select' | msgStr }} + {{ i18n.msgStr('passkey-autofill-select') }}
    diff --git a/src/login/pages/login-passkeys-conditional-authenticate/login-passkeys-conditional-authenticate.component.ts b/src/login/pages/login-passkeys-conditional-authenticate/login-passkeys-conditional-authenticate.component.ts index 5d5ea1b4..beab3fcf 100644 --- a/src/login/pages/login-passkeys-conditional-authenticate/login-passkeys-conditional-authenticate.component.ts +++ b/src/login/pages/login-passkeys-conditional-authenticate/login-passkeys-conditional-authenticate.component.ts @@ -1,24 +1,24 @@ import { ChangeDetectionStrategy, Component, forwardRef, inject } from '@angular/core'; -import { CLASSES, KC_CONTEXT, USE_DEFAULT_CSS } from '@keycloakify/angular/lib/public-api'; -import { Script } from '@keycloakify/angular/lib/models'; -import { ClassKey } from 'keycloakify/login/lib/kcClsx'; -import { KcContext } from '../../KcContext'; -import { getKcClsx } from 'keycloakify/login/lib/kcClsx'; +import { Script } from '@keycloakify/angular/lib/models/script.model'; +import { USE_DEFAULT_CSS } from '@keycloakify/angular/lib/tokens/use-default-css.token'; import { ComponentReference } from '@keycloakify/angular/login/classes/component-reference.class'; import { TemplateComponent } from '@keycloakify/angular/login/containers/template.component'; import { KcClassDirective } from '@keycloakify/angular/login/directives/kc-class.directive'; -import { AdvancedMsgStrPipe } from '@keycloakify/angular/login/pipes/advanced-msg-str.pipe'; -import { MsgStrPipe } from '@keycloakify/angular/login/pipes/msg-str.pipe'; -import { LoginResourceInjectorService } from '@keycloakify/angular/login/services'; +import { LoginResourceInjectorService } from '@keycloakify/angular/login/services/login-resource-injector.service'; +import { LOGIN_CLASSES } from '@keycloakify/angular/login/tokens/classes.token'; +import { LOGIN_I18N } from '@keycloakify/angular/login/tokens/i18n.token'; +import { KC_LOGIN_CONTEXT } from '@keycloakify/angular/login/tokens/kc-context.token'; +import { ClassKey, getKcClsx } from 'keycloakify/login/lib/kcClsx'; +import { I18n } from '../../i18n'; +import { KcContext } from '../../KcContext'; @Component({ standalone: true, - imports: [TemplateComponent, MsgStrPipe, KcClassDirective, AdvancedMsgStrPipe], + imports: [TemplateComponent, KcClassDirective], selector: 'kc-root', templateUrl: 'login-passkeys-conditional-authenticate.component.html', changeDetection: ChangeDetectionStrategy.OnPush, providers: [ - MsgStrPipe, { provide: ComponentReference, useExisting: forwardRef(() => LoginPasskeysConditionalAuthenticateComponent) @@ -26,11 +26,11 @@ import { LoginResourceInjectorService } from '@keycloakify/angular/login/service ] }) export class LoginPasskeysConditionalAuthenticateComponent extends ComponentReference { - kcContext = inject>(KC_CONTEXT); + kcContext = inject>(KC_LOGIN_CONTEXT); loginResourceInjectorService = inject(LoginResourceInjectorService); - msgStr = inject(MsgStrPipe); + i18n = inject(LOGIN_I18N); override doUseDefaultCss = inject(USE_DEFAULT_CSS); - override classes = inject>>(CLASSES); + override classes = inject>>(LOGIN_CLASSES); displayInfo: boolean = true; authButtonId = 'authenticateWebAuthnButton'; @@ -65,13 +65,13 @@ export class LoginPasskeysConditionalAuthenticateComponent extends ComponentRefe authButton.addEventListener("click", () => { authenticateByWebAuthn({ ...input, - errmsg : ${JSON.stringify(this.msgStr.transform('webauthn-unsupported-browser-text'))} + errmsg : ${JSON.stringify(this.i18n.msgStr('webauthn-unsupported-browser-text'))} }); }); initAuthenticate({ ...input, - errmsg : ${JSON.stringify(this.msgStr.transform('passkey-unsupported-browser-text'))} + errmsg : ${JSON.stringify(this.i18n.msgStr('passkey-unsupported-browser-text'))} }); ` } diff --git a/src/login/pages/login-password/login-password.component.html b/src/login/pages/login-password/login-password.component.html index f7e94cd3..e1c2de4b 100644 --- a/src/login/pages/login-password/login-password.component.html +++ b/src/login/pages/login-password/login-password.component.html @@ -9,7 +9,7 @@ [documentTitle]="documentTitle()" > - {{ 'doLogIn' | msgStr }} + {{ i18n.msgStr('doLogIn') }}
    @@ -29,7 +29,7 @@ for="password" [kcClass]="'kcLabelClass'" > - {{ 'password' | msgStr }} + {{ i18n.msgStr('password') }} - {{ 'doForgotPassword' | msgStr }} + {{ i18n.msgStr('doForgotPassword') }} } @@ -77,7 +77,7 @@ type="submit" id="kc-login" name="login" - [value]="'doLogIn' | msgStr" + [value]="i18n.msgStr('doLogIn')" [disabled]="isLoginButtonDisabled()" [kcClass]="['kcButtonClass', 'kcButtonPrimaryClass', 'kcButtonBlockClass', 'kcButtonLargeClass']" [tabindex]="4" diff --git a/src/login/pages/login-password/login-password.component.ts b/src/login/pages/login-password/login-password.component.ts index 2bace62e..e6ada9c8 100644 --- a/src/login/pages/login-password/login-password.component.ts +++ b/src/login/pages/login-password/login-password.component.ts @@ -1,17 +1,20 @@ import { ChangeDetectionStrategy, Component, forwardRef, inject, input, signal } from '@angular/core'; -import { CLASSES, KC_CONTEXT, USE_DEFAULT_CSS } from '@keycloakify/angular/lib/public-api'; -import { ClassKey } from 'keycloakify/login/lib/kcClsx'; -import { KcContext } from '../../KcContext'; +import { USE_DEFAULT_CSS } from '@keycloakify/angular/lib/tokens/use-default-css.token'; import { ComponentReference } from '@keycloakify/angular/login/classes/component-reference.class'; import { PasswordWrapperComponent } from '@keycloakify/angular/login/components/password-wrapper/password-wrapper.component'; import { TemplateComponent } from '@keycloakify/angular/login/containers/template.component'; import { KcClassDirective } from '@keycloakify/angular/login/directives/kc-class.directive'; import { KcSanitizePipe } from '@keycloakify/angular/login/pipes/kc-sanitize.pipe'; -import { MsgStrPipe } from '@keycloakify/angular/login/pipes/msg-str.pipe'; +import { LOGIN_CLASSES } from '@keycloakify/angular/login/tokens/classes.token'; +import { LOGIN_I18N } from '@keycloakify/angular/login/tokens/i18n.token'; +import { KC_LOGIN_CONTEXT } from '@keycloakify/angular/login/tokens/kc-context.token'; +import { ClassKey } from 'keycloakify/login/lib/kcClsx'; +import { I18n } from '../../i18n'; +import { KcContext } from '../../KcContext'; @Component({ standalone: true, - imports: [TemplateComponent, MsgStrPipe, KcClassDirective, PasswordWrapperComponent, KcSanitizePipe], + imports: [TemplateComponent, KcClassDirective, PasswordWrapperComponent, KcSanitizePipe], selector: 'kc-root', templateUrl: 'login-password.component.html', changeDetection: ChangeDetectionStrategy.OnPush, @@ -23,9 +26,10 @@ import { MsgStrPipe } from '@keycloakify/angular/login/pipes/msg-str.pipe'; ] }) export class LoginPasswordComponent extends ComponentReference { - kcContext = inject>(KC_CONTEXT); + kcContext = inject>(KC_LOGIN_CONTEXT); + i18n = inject(LOGIN_I18N); override doUseDefaultCss = inject(USE_DEFAULT_CSS); - override classes = inject>>(CLASSES); + override classes = inject>>(LOGIN_CLASSES); displayRequiredFields = input(false); documentTitle = input(); bodyClassName = input(); diff --git a/src/login/pages/login-recovery-authn-code-config/login-recovery-authn-code-config.component.html b/src/login/pages/login-recovery-authn-code-config/login-recovery-authn-code-config.component.html index 551776ad..bf337725 100644 --- a/src/login/pages/login-recovery-authn-code-config/login-recovery-authn-code-config.component.html +++ b/src/login/pages/login-recovery-authn-code-config/login-recovery-authn-code-config.component.html @@ -8,7 +8,7 @@ [documentTitle]="documentTitle()" > - {{ 'recovery-code-config-header' | msgStr }} + {{ i18n.msgStr('recovery-code-config-header') }} @@ -25,10 +25,10 @@

    Warning alert: - {{ 'recovery-code-config-warning-title' | msgStr }} + {{ i18n.msgStr('recovery-code-config-warning-title') }}

    -

    {{ 'recovery-code-config-warning-message' | msgStr }}

    +

    {{ i18n.msgStr('recovery-code-config-warning-message') }}

    @@ -54,7 +54,7 @@

    class="pficon-print" aria-hidden="true" > - {{ 'recovery-codes-print' | msgStr }} + {{ i18n.msgStr('recovery-codes-print') }} @@ -95,7 +95,7 @@

    [checked]="toggleRecoveryCodesConfirmation()" (change)="toggleRecoveryCodesConfirmation.set($any($event.target).checked)" /> - {{ 'recovery-codes-confirmation-message' | msgStr }} + {{ i18n.msgStr('recovery-codes-confirmation-message') }} @@ -119,7 +119,7 @@

    type="hidden" id="userLabel" name="userLabel" - [value]="'recovery-codes-label-default' | msgStr" + [value]="i18n.msgStr('recovery-codes-label-default')" /> @@ -129,7 +129,7 @@

    type="submit" [kcClass]="['kcButtonClass', 'kcButtonPrimaryClass', 'kcButtonLargeClass']" id="saveRecoveryAuthnCodesBtn" - [value]="'recovery-codes-action-complete' | msgStr" + [value]="i18n.msgStr('recovery-codes-action-complete')" [disabled]="!toggleRecoveryCodesConfirmation()" /> } @else { } diff --git a/src/login/pages/login-recovery-authn-code-config/login-recovery-authn-code-config.component.ts b/src/login/pages/login-recovery-authn-code-config/login-recovery-authn-code-config.component.ts index 0cac0f9f..b706036e 100644 --- a/src/login/pages/login-recovery-authn-code-config/login-recovery-authn-code-config.component.ts +++ b/src/login/pages/login-recovery-authn-code-config/login-recovery-authn-code-config.component.ts @@ -1,16 +1,19 @@ import { ChangeDetectionStrategy, Component, forwardRef, inject, input, signal } from '@angular/core'; -import { CLASSES, KC_CONTEXT, USE_DEFAULT_CSS } from '@keycloakify/angular/lib/public-api'; -import { ClassKey } from 'keycloakify/login/lib/kcClsx'; -import { KcContext } from '../../KcContext'; +import { USE_DEFAULT_CSS } from '@keycloakify/angular/lib/tokens/use-default-css.token'; import { ComponentReference } from '@keycloakify/angular/login/classes/component-reference.class'; import { LogoutOtherSessionsComponent } from '@keycloakify/angular/login/components/logout-other-sessions/logout-other-sessions.component'; import { TemplateComponent } from '@keycloakify/angular/login/containers/template.component'; -import { KcClassDirective } from '@keycloakify/angular/login/directives'; -import { MsgStrPipe } from '@keycloakify/angular/login/pipes/msg-str.pipe'; +import { KcClassDirective } from '@keycloakify/angular/login/directives/kc-class.directive'; +import { LOGIN_CLASSES } from '@keycloakify/angular/login/tokens/classes.token'; +import { LOGIN_I18N } from '@keycloakify/angular/login/tokens/i18n.token'; +import { KC_LOGIN_CONTEXT } from '@keycloakify/angular/login/tokens/kc-context.token'; +import { ClassKey } from 'keycloakify/login/lib/kcClsx'; +import { I18n } from '../../i18n'; +import { KcContext } from '../../KcContext'; @Component({ standalone: true, - imports: [MsgStrPipe, TemplateComponent, KcClassDirective, LogoutOtherSessionsComponent], + imports: [TemplateComponent, KcClassDirective, LogoutOtherSessionsComponent], selector: 'kc-root', templateUrl: 'login-recovery-authn-code-config.component.html', changeDetection: ChangeDetectionStrategy.OnPush, @@ -22,9 +25,10 @@ import { MsgStrPipe } from '@keycloakify/angular/login/pipes/msg-str.pipe'; ] }) export class LoginRecoveryAuthnCodeConfigComponent extends ComponentReference { - kcContext = inject>(KC_CONTEXT); + kcContext = inject>(KC_LOGIN_CONTEXT); + i18n = inject(LOGIN_I18N); override doUseDefaultCss = inject(USE_DEFAULT_CSS); - override classes = inject>>(CLASSES); + override classes = inject>>(LOGIN_CLASSES); displayRequiredFields = input(false); documentTitle = input(); bodyClassName = input(); diff --git a/src/login/pages/login-recovery-authn-code-input/login-recovery-authn-code-input.component.html b/src/login/pages/login-recovery-authn-code-input/login-recovery-authn-code-input.component.html index c16ea6c8..cec97fb1 100644 --- a/src/login/pages/login-recovery-authn-code-input/login-recovery-authn-code-input.component.html +++ b/src/login/pages/login-recovery-authn-code-input/login-recovery-authn-code-input.component.html @@ -10,7 +10,7 @@ [documentTitle]="documentTitle()" > - {{ 'auth-recovery-code-header' | msgStr }} + {{ i18n.msgStr('auth-recovery-code-header') }} @@ -26,7 +26,7 @@ for="recoveryCodeInput" [kcClass]="'kcLabelClass'" > - {{ 'auth-recovery-code-prompt' | msgStr: recoveryAuthnCodesInputBean.codeNumber.toString() }} + {{ i18n.msgStr('auth-recovery-code-prompt', recoveryAuthnCodesInputBean.codeNumber.toString()) }}
    @@ -67,7 +67,7 @@ name="login" id="kc-login" type="submit" - [value]="'doLogIn' | msgStr" + [value]="i18n.msgStr('doLogIn')" />
    diff --git a/src/login/pages/login-recovery-authn-code-input/login-recovery-authn-code-input.component.ts b/src/login/pages/login-recovery-authn-code-input/login-recovery-authn-code-input.component.ts index 89ca8dd0..59bcf2c1 100644 --- a/src/login/pages/login-recovery-authn-code-input/login-recovery-authn-code-input.component.ts +++ b/src/login/pages/login-recovery-authn-code-input/login-recovery-authn-code-input.component.ts @@ -1,16 +1,19 @@ import { ChangeDetectionStrategy, Component, forwardRef, inject, input } from '@angular/core'; -import { CLASSES, KC_CONTEXT, USE_DEFAULT_CSS } from '@keycloakify/angular/lib/public-api'; -import { ClassKey } from 'keycloakify/login/lib/kcClsx'; -import { KcContext } from '../../KcContext'; +import { USE_DEFAULT_CSS } from '@keycloakify/angular/lib/tokens/use-default-css.token'; import { ComponentReference } from '@keycloakify/angular/login/classes/component-reference.class'; import { TemplateComponent } from '@keycloakify/angular/login/containers/template.component'; -import { KcClassDirective } from '@keycloakify/angular/login/directives'; +import { KcClassDirective } from '@keycloakify/angular/login/directives/kc-class.directive'; import { KcSanitizePipe } from '@keycloakify/angular/login/pipes/kc-sanitize.pipe'; -import { MsgStrPipe } from '@keycloakify/angular/login/pipes/msg-str.pipe'; +import { LOGIN_CLASSES } from '@keycloakify/angular/login/tokens/classes.token'; +import { LOGIN_I18N } from '@keycloakify/angular/login/tokens/i18n.token'; +import { KC_LOGIN_CONTEXT } from '@keycloakify/angular/login/tokens/kc-context.token'; +import { ClassKey } from 'keycloakify/login/lib/kcClsx'; +import { I18n } from '../../i18n'; +import { KcContext } from '../../KcContext'; @Component({ standalone: true, - imports: [TemplateComponent, MsgStrPipe, KcClassDirective, KcSanitizePipe], + imports: [TemplateComponent, KcClassDirective, KcSanitizePipe], selector: 'kc-root', templateUrl: 'login-recovery-authn-code-input.component.html', changeDetection: ChangeDetectionStrategy.OnPush, @@ -22,9 +25,10 @@ import { MsgStrPipe } from '@keycloakify/angular/login/pipes/msg-str.pipe'; ] }) export class LoginRecoveryAuthnCodeInputComponent extends ComponentReference { - kcContext = inject>(KC_CONTEXT); + kcContext = inject>(KC_LOGIN_CONTEXT); + i18n = inject(LOGIN_I18N); override doUseDefaultCss = inject(USE_DEFAULT_CSS); - override classes = inject>>(CLASSES); + override classes = inject>>(LOGIN_CLASSES); displayRequiredFields = input(false); documentTitle = input(); bodyClassName = input(); diff --git a/src/login/pages/login-reset-otp/login-reset-otp.component.html b/src/login/pages/login-reset-otp/login-reset-otp.component.html index 6b747370..b3b3b215 100644 --- a/src/login/pages/login-reset-otp/login-reset-otp.component.html +++ b/src/login/pages/login-reset-otp/login-reset-otp.component.html @@ -8,7 +8,7 @@ [documentTitle]="documentTitle()" > - {{ 'doLogIn' | msgStr }} + {{ i18n.msgStr('doLogIn') }}

    - {{ 'otp-reset-description' | msgStr }} + {{ i18n.msgStr('otp-reset-description') }}

    @for (otpCredential of configuredOtpCredentials.userOtpCredentials; track otpCredential; let i = $index) {
    diff --git a/src/login/pages/login-reset-otp/login-reset-otp.component.ts b/src/login/pages/login-reset-otp/login-reset-otp.component.ts index 7aa58383..7efef33b 100644 --- a/src/login/pages/login-reset-otp/login-reset-otp.component.ts +++ b/src/login/pages/login-reset-otp/login-reset-otp.component.ts @@ -1,15 +1,18 @@ import { ChangeDetectionStrategy, Component, forwardRef, inject, input } from '@angular/core'; -import { CLASSES, KC_CONTEXT, USE_DEFAULT_CSS } from '@keycloakify/angular/lib/public-api'; -import { ClassKey } from 'keycloakify/login/lib/kcClsx'; -import { KcContext } from '../../KcContext'; +import { USE_DEFAULT_CSS } from '@keycloakify/angular/lib/tokens/use-default-css.token'; import { ComponentReference } from '@keycloakify/angular/login/classes/component-reference.class'; import { TemplateComponent } from '@keycloakify/angular/login/containers/template.component'; -import { KcClassDirective } from '@keycloakify/angular/login/directives'; -import { MsgStrPipe } from '@keycloakify/angular/login/pipes/msg-str.pipe'; +import { KcClassDirective } from '@keycloakify/angular/login/directives/kc-class.directive'; +import { LOGIN_CLASSES } from '@keycloakify/angular/login/tokens/classes.token'; +import { LOGIN_I18N } from '@keycloakify/angular/login/tokens/i18n.token'; +import { KC_LOGIN_CONTEXT } from '@keycloakify/angular/login/tokens/kc-context.token'; +import { ClassKey } from 'keycloakify/login/lib/kcClsx'; +import { I18n } from '../../i18n'; +import { KcContext } from '../../KcContext'; @Component({ standalone: true, - imports: [KcClassDirective, MsgStrPipe, TemplateComponent], + imports: [KcClassDirective, TemplateComponent], selector: 'kc-root', templateUrl: 'login-reset-otp.component.html', changeDetection: ChangeDetectionStrategy.OnPush, @@ -21,9 +24,10 @@ import { MsgStrPipe } from '@keycloakify/angular/login/pipes/msg-str.pipe'; ] }) export class LoginResetOtpComponent extends ComponentReference { - kcContext = inject>(KC_CONTEXT); + kcContext = inject>(KC_LOGIN_CONTEXT); + i18n = inject(LOGIN_I18N); override doUseDefaultCss = inject(USE_DEFAULT_CSS); - override classes = inject>>(CLASSES); + override classes = inject>>(LOGIN_CLASSES); displayRequiredFields = input(false); documentTitle = input(); bodyClassName = input(); diff --git a/src/login/pages/login-reset-password/login-reset-password.component.html b/src/login/pages/login-reset-password/login-reset-password.component.html index 74ef6fd5..e216a332 100644 --- a/src/login/pages/login-reset-password/login-reset-password.component.html +++ b/src/login/pages/login-reset-password/login-reset-password.component.html @@ -10,13 +10,13 @@ [documentTitle]="documentTitle()" > - {{ 'emailForgotTitle' | msgStr }} + {{ i18n.msgStr('emailForgotTitle') }} @if (realm.duplicateEmailsAllowed) { - {{ 'emailInstructionUsername' | msgStr }} + {{ i18n.msgStr('emailInstructionUsername') }} } @else { - {{ 'emailInstruction' | msgStr }} + {{ i18n.msgStr('emailInstruction') }} } @@ -34,11 +34,11 @@ [kcClass]="'kcLabelClass'" > @if (realm.loginWithEmailAllowed) { - {{ 'username' | msgStr }} + {{ i18n.msgStr('username') }} } @else if (!realm.registrationEmailAsUsername) { - {{ 'usernameOrEmail' | msgStr }} + {{ i18n.msgStr('usernameOrEmail') }} } @else { - {{ 'email' | msgStr }} + {{ i18n.msgStr('email') }} } @@ -74,7 +74,7 @@ @@ -86,7 +86,7 @@ diff --git a/src/login/pages/login-reset-password/login-reset-password.component.ts b/src/login/pages/login-reset-password/login-reset-password.component.ts index 1fb4b032..96db3744 100644 --- a/src/login/pages/login-reset-password/login-reset-password.component.ts +++ b/src/login/pages/login-reset-password/login-reset-password.component.ts @@ -1,16 +1,19 @@ import { ChangeDetectionStrategy, Component, forwardRef, inject, input } from '@angular/core'; -import { CLASSES, KC_CONTEXT, USE_DEFAULT_CSS } from '@keycloakify/angular/lib/public-api'; -import { ClassKey } from 'keycloakify/login/lib/kcClsx'; -import { KcContext } from '../../KcContext'; +import { USE_DEFAULT_CSS } from '@keycloakify/angular/lib/tokens/use-default-css.token'; import { ComponentReference } from '@keycloakify/angular/login/classes/component-reference.class'; import { TemplateComponent } from '@keycloakify/angular/login/containers/template.component'; -import { KcClassDirective } from '@keycloakify/angular/login/directives'; +import { KcClassDirective } from '@keycloakify/angular/login/directives/kc-class.directive'; import { KcSanitizePipe } from '@keycloakify/angular/login/pipes/kc-sanitize.pipe'; -import { MsgStrPipe } from '@keycloakify/angular/login/pipes/msg-str.pipe'; +import { LOGIN_CLASSES } from '@keycloakify/angular/login/tokens/classes.token'; +import { LOGIN_I18N } from '@keycloakify/angular/login/tokens/i18n.token'; +import { KC_LOGIN_CONTEXT } from '@keycloakify/angular/login/tokens/kc-context.token'; +import { ClassKey } from 'keycloakify/login/lib/kcClsx'; +import { I18n } from '../../i18n'; +import { KcContext } from '../../KcContext'; @Component({ standalone: true, - imports: [TemplateComponent, MsgStrPipe, KcClassDirective, KcSanitizePipe], + imports: [TemplateComponent, KcClassDirective, KcSanitizePipe], selector: 'kc-root', templateUrl: 'login-reset-password.component.html', changeDetection: ChangeDetectionStrategy.OnPush, @@ -22,9 +25,10 @@ import { MsgStrPipe } from '@keycloakify/angular/login/pipes/msg-str.pipe'; ] }) export class LoginResetPasswordComponent extends ComponentReference { - kcContext = inject>(KC_CONTEXT); + kcContext = inject>(KC_LOGIN_CONTEXT); + i18n = inject(LOGIN_I18N); override doUseDefaultCss = inject(USE_DEFAULT_CSS); - override classes = inject>>(CLASSES); + override classes = inject>>(LOGIN_CLASSES); displayRequiredFields = input(false); documentTitle = input(); bodyClassName = input(); diff --git a/src/login/pages/login-update-password/login-update-password.component.html b/src/login/pages/login-update-password/login-update-password.component.html index 1ac826f4..71246818 100644 --- a/src/login/pages/login-update-password/login-update-password.component.html +++ b/src/login/pages/login-update-password/login-update-password.component.html @@ -10,7 +10,7 @@ [documentTitle]="documentTitle()" > - {{ 'updatePasswordTitle' | msgStr }} + {{ i18n.msgStr('updatePasswordTitle') }} - {{ 'passwordNew' | msgStr }} + {{ i18n.msgStr('passwordNew') }}
    @@ -58,7 +58,7 @@ for="password-confirm" [kcClass]="'kcLabelClass'" > - {{ 'passwordConfirm' | msgStr }} + {{ i18n.msgStr('passwordConfirm') }}
    @@ -97,7 +97,7 @@ kcButtonLargeClass: true }" type="submit" - value="{{ 'doSubmit' | msgStr }}" + [value]="i18n.msgStr('doSubmit')" /> @if (isAppInitiatedAction) { }
    diff --git a/src/login/pages/login-update-password/login-update-password.component.ts b/src/login/pages/login-update-password/login-update-password.component.ts index d88ab3e6..067433c7 100644 --- a/src/login/pages/login-update-password/login-update-password.component.ts +++ b/src/login/pages/login-update-password/login-update-password.component.ts @@ -1,18 +1,21 @@ import { ChangeDetectionStrategy, Component, forwardRef, inject, input } from '@angular/core'; -import { CLASSES, KC_CONTEXT, USE_DEFAULT_CSS } from '@keycloakify/angular/lib/public-api'; -import { ClassKey } from 'keycloakify/login/lib/kcClsx'; -import { KcContext } from '../../KcContext'; +import { USE_DEFAULT_CSS } from '@keycloakify/angular/lib/tokens/use-default-css.token'; import { ComponentReference } from '@keycloakify/angular/login/classes/component-reference.class'; import { LogoutOtherSessionsComponent } from '@keycloakify/angular/login/components/logout-other-sessions/logout-other-sessions.component'; import { PasswordWrapperComponent } from '@keycloakify/angular/login/components/password-wrapper/password-wrapper.component'; import { TemplateComponent } from '@keycloakify/angular/login/containers/template.component'; -import { KcClassDirective } from '@keycloakify/angular/login/directives'; +import { KcClassDirective } from '@keycloakify/angular/login/directives/kc-class.directive'; import { KcSanitizePipe } from '@keycloakify/angular/login/pipes/kc-sanitize.pipe'; -import { MsgStrPipe } from '@keycloakify/angular/login/pipes/msg-str.pipe'; +import { LOGIN_CLASSES } from '@keycloakify/angular/login/tokens/classes.token'; +import { LOGIN_I18N } from '@keycloakify/angular/login/tokens/i18n.token'; +import { KC_LOGIN_CONTEXT } from '@keycloakify/angular/login/tokens/kc-context.token'; +import { ClassKey } from 'keycloakify/login/lib/kcClsx'; +import { I18n } from '../../i18n'; +import { KcContext } from '../../KcContext'; @Component({ standalone: true, - imports: [TemplateComponent, MsgStrPipe, KcClassDirective, PasswordWrapperComponent, KcSanitizePipe, LogoutOtherSessionsComponent], + imports: [TemplateComponent, KcClassDirective, PasswordWrapperComponent, KcSanitizePipe, LogoutOtherSessionsComponent], selector: 'kc-root', templateUrl: 'login-update-password.component.html', changeDetection: ChangeDetectionStrategy.OnPush, @@ -24,9 +27,10 @@ import { MsgStrPipe } from '@keycloakify/angular/login/pipes/msg-str.pipe'; ] }) export class LoginUpdatePasswordComponent extends ComponentReference { - kcContext = inject>(KC_CONTEXT); + kcContext = inject>(KC_LOGIN_CONTEXT); + i18n = inject(LOGIN_I18N); override doUseDefaultCss = inject(USE_DEFAULT_CSS); - override classes = inject>>(CLASSES); + override classes = inject>>(LOGIN_CLASSES); displayRequiredFields = input(false); documentTitle = input(); bodyClassName = input(); diff --git a/src/login/pages/login-update-profile/login-update-profile.component.html b/src/login/pages/login-update-profile/login-update-profile.component.html index cd8d65e1..0b5aef45 100644 --- a/src/login/pages/login-update-profile/login-update-profile.component.html +++ b/src/login/pages/login-update-profile/login-update-profile.component.html @@ -8,7 +8,7 @@ [documentTitle]="documentTitle()" > - {{ 'loginProfileTitle' | msgStr }} + {{ i18n.msgStr('loginProfileTitle') }} @if (isAppInitiatedAction) { } diff --git a/src/login/pages/login-update-profile/login-update-profile.component.ts b/src/login/pages/login-update-profile/login-update-profile.component.ts index 0c80dac1..1e5d7ac6 100644 --- a/src/login/pages/login-update-profile/login-update-profile.component.ts +++ b/src/login/pages/login-update-profile/login-update-profile.component.ts @@ -1,16 +1,19 @@ import { ChangeDetectionStrategy, Component, forwardRef, inject, input, signal } from '@angular/core'; -import { CLASSES, KC_CONTEXT, USE_DEFAULT_CSS } from '@keycloakify/angular/lib/public-api'; -import { ClassKey } from 'keycloakify/login/lib/kcClsx'; -import { KcContext } from '../../KcContext'; +import { USE_DEFAULT_CSS } from '@keycloakify/angular/lib/tokens/use-default-css.token'; import { ComponentReference } from '@keycloakify/angular/login/classes/component-reference.class'; import { UserProfileFormFieldsComponent } from '@keycloakify/angular/login/components/user-profile-form-fields/user-profile-form-fields.component'; import { TemplateComponent } from '@keycloakify/angular/login/containers/template.component'; -import { KcClassDirective } from '@keycloakify/angular/login/directives'; -import { MsgStrPipe } from '@keycloakify/angular/login/pipes/msg-str.pipe'; +import { KcClassDirective } from '@keycloakify/angular/login/directives/kc-class.directive'; +import { LOGIN_CLASSES } from '@keycloakify/angular/login/tokens/classes.token'; +import { LOGIN_I18N } from '@keycloakify/angular/login/tokens/i18n.token'; +import { KC_LOGIN_CONTEXT } from '@keycloakify/angular/login/tokens/kc-context.token'; +import { ClassKey } from 'keycloakify/login/lib/kcClsx'; +import { I18n } from '../../i18n'; +import { KcContext } from '../../KcContext'; @Component({ standalone: true, - imports: [TemplateComponent, KcClassDirective, MsgStrPipe, UserProfileFormFieldsComponent], + imports: [TemplateComponent, KcClassDirective, UserProfileFormFieldsComponent], selector: 'kc-root', templateUrl: 'login-update-profile.component.html', changeDetection: ChangeDetectionStrategy.OnPush, @@ -22,9 +25,10 @@ import { MsgStrPipe } from '@keycloakify/angular/login/pipes/msg-str.pipe'; ] }) export class LoginUpdateProfileComponent extends ComponentReference { - kcContext = inject>(KC_CONTEXT); + kcContext = inject>(KC_LOGIN_CONTEXT); + i18n = inject(LOGIN_I18N); override doUseDefaultCss = inject(USE_DEFAULT_CSS); - override classes = inject>>(CLASSES); + override classes = inject>>(LOGIN_CLASSES); displayRequiredFields = input(true); documentTitle = input(); bodyClassName = input(); diff --git a/src/login/pages/login-username/login-username.component.html b/src/login/pages/login-username/login-username.component.html index 342c96e4..b73b1f49 100644 --- a/src/login/pages/login-username/login-username.component.html +++ b/src/login/pages/login-username/login-username.component.html @@ -13,17 +13,17 @@ [documentTitle]="documentTitle()" > - {{ 'doLogIn' | msgStr }} + {{ i18n.msgStr('doLogIn') }}
    - {{ 'noAccount' | msgStr }} + {{ i18n.msgStr('noAccount') }} - {{ 'doRegister' | msgStr }} + {{ i18n.msgStr('doRegister') }}
    @@ -35,7 +35,7 @@ [kcClass]="'kcFormSocialAccountSectionClass'" >
    -

    {{ 'identity-provider-login-label' | msgStr }}

    +

    {{ i18n.msgStr('identity-provider-login-label') }}

      @if (!realm?.loginWithEmailAllowed) { - {{ 'username' | msgStr }} + {{ i18n.msgStr('username') }} } @else if (!realm?.registrationEmailAsUsername) { - {{ 'usernameOrEmail' | msgStr }} + {{ i18n.msgStr('usernameOrEmail') }} } @else { - {{ 'email' | msgStr }} + {{ i18n.msgStr('email') }} } {{ 'identity-provider-login-label' | msgStr }}

    id="input-error" [kcClass]="'kcInputErrorMessageClass'" aria-live="polite" - [innerHTML]="messagesPerField?.getFirstError('username') | kcSanitize: 'html'" + [innerHTML]="messagesPerField.getFirstError('username') | kcSanitize: 'html'" > } @@ -134,7 +134,7 @@

    {{ 'identity-provider-login-label' | msgStr }}

    type="checkbox" [defaultChecked]="!!login?.rememberMe" /> - {{ 'rememberMe' | msgStr }} + {{ i18n.msgStr('rememberMe') }} } @@ -150,7 +150,7 @@

    {{ 'identity-provider-login-label' | msgStr }}

    name="login" id="kc-login" type="submit" - [value]="'doLogIn' | msgStr" + [value]="i18n.msgStr('doLogIn')" /> diff --git a/src/login/pages/login-username/login-username.component.ts b/src/login/pages/login-username/login-username.component.ts index a4393bca..d7af7cac 100644 --- a/src/login/pages/login-username/login-username.component.ts +++ b/src/login/pages/login-username/login-username.component.ts @@ -1,20 +1,23 @@ import { AsyncPipe, NgClass } from '@angular/common'; import { ChangeDetectionStrategy, Component, forwardRef, inject, input, signal } from '@angular/core'; -import { CLASSES, KC_CONTEXT, USE_DEFAULT_CSS } from '@keycloakify/angular/lib/public-api'; -import { ClassKey } from 'keycloakify/login/lib/kcClsx'; -import { KcContext } from '../../KcContext'; +import { USE_DEFAULT_CSS } from '@keycloakify/angular/lib/tokens/use-default-css.token'; import { ComponentReference } from '@keycloakify/angular/login/classes/component-reference.class'; import { TemplateComponent } from '@keycloakify/angular/login/containers/template.component'; import { KcClassDirective } from '@keycloakify/angular/login/directives/kc-class.directive'; import { KcSanitizePipe } from '@keycloakify/angular/login/pipes/kc-sanitize.pipe'; -import { MsgStrPipe } from '@keycloakify/angular/login/pipes/msg-str.pipe'; +import { LOGIN_CLASSES } from '@keycloakify/angular/login/tokens/classes.token'; +import { LOGIN_I18N } from '@keycloakify/angular/login/tokens/i18n.token'; +import { KC_LOGIN_CONTEXT } from '@keycloakify/angular/login/tokens/kc-context.token'; +import { ClassKey } from 'keycloakify/login/lib/kcClsx'; +import { I18n } from '../../i18n'; +import { KcContext } from '../../KcContext'; @Component({ selector: 'kc-root', templateUrl: './login-username.component.html', standalone: true, changeDetection: ChangeDetectionStrategy.OnPush, - imports: [KcClassDirective, AsyncPipe, KcSanitizePipe, NgClass, TemplateComponent, MsgStrPipe], + imports: [KcClassDirective, AsyncPipe, KcSanitizePipe, NgClass, TemplateComponent], providers: [ { provide: ComponentReference, @@ -23,12 +26,13 @@ import { MsgStrPipe } from '@keycloakify/angular/login/pipes/msg-str.pipe'; ] }) export class LoginUsernameComponent extends ComponentReference { - kcContext = inject>(KC_CONTEXT); + kcContext = inject>(KC_LOGIN_CONTEXT); displayRequiredFields = input(false); documentTitle = input(); bodyClassName = input(); + i18n = inject(LOGIN_I18N); override doUseDefaultCss = inject(USE_DEFAULT_CSS); - override classes = inject>>(CLASSES); + override classes = inject>>(LOGIN_CLASSES); isLoginButtonDisabled = signal(false); displayInfo: boolean = !!this.kcContext?.realm?.password && !!this.kcContext?.realm?.registrationAllowed && !this.kcContext?.registrationDisabled; displayMessage: boolean = !this.kcContext?.messagesPerField?.existsError('username'); diff --git a/src/login/pages/login-verify-email/login-verify-email.component.html b/src/login/pages/login-verify-email/login-verify-email.component.html index 35689676..43c7c605 100644 --- a/src/login/pages/login-verify-email/login-verify-email.component.html +++ b/src/login/pages/login-verify-email/login-verify-email.component.html @@ -8,20 +8,20 @@ [documentTitle]="documentTitle()" > - {{ 'emailVerifyTitle' | msgStr }} + {{ i18n.msgStr('emailVerifyTitle') }}

    - {{ 'emailVerifyInstruction2' | msgStr }} + {{ i18n.msgStr('emailVerifyInstruction2') }}
    - {{ 'doClickHere' | msgStr }} + {{ i18n.msgStr('doClickHere') }}   - {{ 'emailVerifyInstruction3' | msgStr }} + {{ i18n.msgStr('emailVerifyInstruction3') }}

    - {{ 'emailVerifyInstruction1' | msgStr: user?.email ?? '' }} + {{ i18n.msgStr('emailVerifyInstruction1', user?.email ?? '') }}

    diff --git a/src/login/pages/login-verify-email/login-verify-email.component.ts b/src/login/pages/login-verify-email/login-verify-email.component.ts index e4056111..ce63673e 100644 --- a/src/login/pages/login-verify-email/login-verify-email.component.ts +++ b/src/login/pages/login-verify-email/login-verify-email.component.ts @@ -1,15 +1,18 @@ import { ChangeDetectionStrategy, Component, forwardRef, inject, input } from '@angular/core'; -import { CLASSES, KC_CONTEXT, USE_DEFAULT_CSS } from '@keycloakify/angular/lib/public-api'; -import { ClassKey } from 'keycloakify/login/lib/kcClsx'; -import { KcContext } from '../../KcContext'; +import { USE_DEFAULT_CSS } from '@keycloakify/angular/lib/tokens/use-default-css.token'; import { ComponentReference } from '@keycloakify/angular/login/classes/component-reference.class'; import { TemplateComponent } from '@keycloakify/angular/login/containers/template.component'; -import { KcClassDirective } from '@keycloakify/angular/login/directives'; -import { MsgStrPipe } from '@keycloakify/angular/login/pipes/msg-str.pipe'; +import { KcClassDirective } from '@keycloakify/angular/login/directives/kc-class.directive'; +import { LOGIN_CLASSES } from '@keycloakify/angular/login/tokens/classes.token'; +import { LOGIN_I18N } from '@keycloakify/angular/login/tokens/i18n.token'; +import { KC_LOGIN_CONTEXT } from '@keycloakify/angular/login/tokens/kc-context.token'; +import { ClassKey } from 'keycloakify/login/lib/kcClsx'; +import { I18n } from '../../i18n'; +import { KcContext } from '../../KcContext'; @Component({ standalone: true, - imports: [KcClassDirective, TemplateComponent, MsgStrPipe], + imports: [KcClassDirective, TemplateComponent], selector: 'kc-root', templateUrl: 'login-verify-email.component.html', changeDetection: ChangeDetectionStrategy.OnPush, @@ -21,9 +24,10 @@ import { MsgStrPipe } from '@keycloakify/angular/login/pipes/msg-str.pipe'; ] }) export class LoginVerifyEmailComponent extends ComponentReference { - kcContext = inject>(KC_CONTEXT); + kcContext = inject>(KC_LOGIN_CONTEXT); + i18n = inject(LOGIN_I18N); override doUseDefaultCss = inject(USE_DEFAULT_CSS); - override classes = inject>>(CLASSES); + override classes = inject>>(LOGIN_CLASSES); displayRequiredFields = input(false); documentTitle = input(); bodyClassName = input(); diff --git a/src/login/pages/login-x509-info/login-x509-info.component.html b/src/login/pages/login-x509-info/login-x509-info.component.html index 916fadaa..487e0155 100644 --- a/src/login/pages/login-x509-info/login-x509-info.component.html +++ b/src/login/pages/login-x509-info/login-x509-info.component.html @@ -8,7 +8,7 @@ [documentTitle]="documentTitle()" > - {{ 'doLogIn' | msgStr }} + {{ i18n.msgStr('doLogIn') }}
    - {{ 'clientCertificate' | msgStr }} + {{ i18n.msgStr('clientCertificate') }} @if (x509.formData.subjectDN) { @@ -41,7 +41,7 @@ id="certificate_subjectDN" [kcClass]="'kcLabelClass'" > - {{ 'noCertificate' | msgStr }} + {{ i18n.msgStr('noCertificate') }} } @@ -53,7 +53,7 @@ for="username" [kcClass]="'kcLabelClass'" > - {{ 'doX509Login' | msgStr }} + {{ i18n.msgStr('doX509Login') }}
    @@ -83,7 +83,7 @@ name="login" id="kc-login" type="submit" - [value]="'doContinue' | msgStr" + [value]="i18n.msgStr('doContinue')" /> @if (x509.formData.isUserEnabled) { }
    diff --git a/src/login/pages/login-x509-info/login-x509-info.component.ts b/src/login/pages/login-x509-info/login-x509-info.component.ts index 0a1c01b2..2667647b 100644 --- a/src/login/pages/login-x509-info/login-x509-info.component.ts +++ b/src/login/pages/login-x509-info/login-x509-info.component.ts @@ -1,15 +1,18 @@ import { ChangeDetectionStrategy, Component, forwardRef, inject, input } from '@angular/core'; -import { CLASSES, KC_CONTEXT, USE_DEFAULT_CSS } from '@keycloakify/angular/lib/public-api'; -import { ClassKey } from 'keycloakify/login/lib/kcClsx'; -import { KcContext } from '../../KcContext'; +import { USE_DEFAULT_CSS } from '@keycloakify/angular/lib/tokens/use-default-css.token'; import { ComponentReference } from '@keycloakify/angular/login/classes/component-reference.class'; import { TemplateComponent } from '@keycloakify/angular/login/containers/template.component'; -import { KcClassDirective } from '@keycloakify/angular/login/directives'; -import { MsgStrPipe } from '@keycloakify/angular/login/pipes/msg-str.pipe'; +import { KcClassDirective } from '@keycloakify/angular/login/directives/kc-class.directive'; +import { LOGIN_CLASSES } from '@keycloakify/angular/login/tokens/classes.token'; +import { LOGIN_I18N } from '@keycloakify/angular/login/tokens/i18n.token'; +import { KC_LOGIN_CONTEXT } from '@keycloakify/angular/login/tokens/kc-context.token'; +import { ClassKey } from 'keycloakify/login/lib/kcClsx'; +import { I18n } from '../../i18n'; +import { KcContext } from '../../KcContext'; @Component({ standalone: true, - imports: [TemplateComponent, MsgStrPipe, KcClassDirective], + imports: [TemplateComponent, KcClassDirective], selector: 'kc-root', templateUrl: 'login-x509-info.component.html', changeDetection: ChangeDetectionStrategy.OnPush, @@ -21,9 +24,10 @@ import { MsgStrPipe } from '@keycloakify/angular/login/pipes/msg-str.pipe'; ] }) export class LoginX509InfoComponent extends ComponentReference { - kcContext = inject>(KC_CONTEXT); + kcContext = inject>(KC_LOGIN_CONTEXT); + i18n = inject(LOGIN_I18N); override doUseDefaultCss = inject(USE_DEFAULT_CSS); - override classes = inject>>(CLASSES); + override classes = inject>>(LOGIN_CLASSES); displayRequiredFields = input(false); documentTitle = input(); bodyClassName = input(); diff --git a/src/login/pages/login/login.component.html b/src/login/pages/login/login.component.html index 02de5f3e..8c15dde3 100644 --- a/src/login/pages/login/login.component.html +++ b/src/login/pages/login/login.component.html @@ -14,18 +14,18 @@ [documentTitle]="documentTitle()" > - {{ 'loginAccountTitle' | msgStr }} + {{ i18n.msgStr('loginAccountTitle') }}
    - {{ 'noAccount' | msgStr }} + {{ i18n.msgStr('noAccount') }} - {{ 'doRegister' | msgStr }} + {{ i18n.msgStr('doRegister') }}
    @@ -38,7 +38,7 @@ [kcClass]="'kcFormSocialAccountSectionClass'" >
    -

    {{ 'identity-provider-login-label' | msgStr }}

    +

    {{ i18n.msgStr('identity-provider-login-label') }}

      @if (!realm?.loginWithEmailAllowed) { - {{ 'username' | msgStr }} + {{ i18n.msgStr('username') }} } @else if (!realm?.registrationEmailAsUsername) { - {{ 'usernameOrEmail' | msgStr }} + {{ i18n.msgStr('usernameOrEmail') }} } @else { - {{ 'email' | msgStr }} + {{ i18n.msgStr('email') }} } {{ 'identity-provider-login-label' | msgStr }}

    id="input-error" [kcClass]="'kcInputErrorMessageClass'" aria-live="polite" - [innerHTML]="messagesPerField?.getFirstError('username', 'password') | kcSanitize: 'html'" + [innerHTML]="messagesPerField.getFirstError('username', 'password') | kcSanitize: 'html'" >
    } @@ -129,7 +129,7 @@

    {{ 'identity-provider-login-label' | msgStr }}

    for="password" [kcClass]="'kcLabelClass'" > - {{ 'password' | msgStr }} + {{ i18n.msgStr('password') }} @@ -148,7 +148,7 @@

    {{ 'identity-provider-login-label' | msgStr }}

    id="input-error" [kcClass]="'kcInputErrorMessageClass'" aria-live="polite" - [innerHTML]="messagesPerField?.getFirstError('username', 'password') | kcSanitize: 'html'" + [innerHTML]="messagesPerField.getFirstError('username', 'password') | kcSanitize: 'html'" > } @@ -166,7 +166,7 @@

    {{ 'identity-provider-login-label' | msgStr }}

    type="checkbox" [defaultChecked]="!!login?.rememberMe" /> - {{ 'rememberMe' | msgStr }} + {{ i18n.msgStr('rememberMe') }} } @@ -178,7 +178,7 @@

    {{ 'identity-provider-login-label' | msgStr }}

    {{ 'doForgotPassword' | msgStr }}{{ i18n.msgStr('doForgotPassword') }} } @@ -200,7 +200,7 @@

    {{ 'identity-provider-login-label' | msgStr }}

    name="login" id="kc-login" type="submit" - [value]="'doLogIn' | msgStr" + [value]="i18n.msgStr('doLogIn')" [disabled]="isLoginButtonDisabled()" /> diff --git a/src/login/pages/login/login.component.ts b/src/login/pages/login/login.component.ts index 59e4cc2e..c063812d 100644 --- a/src/login/pages/login/login.component.ts +++ b/src/login/pages/login/login.component.ts @@ -1,21 +1,24 @@ import { AsyncPipe, NgClass } from '@angular/common'; import { ChangeDetectionStrategy, Component, forwardRef, inject, input, signal } from '@angular/core'; -import { CLASSES, KC_CONTEXT, USE_DEFAULT_CSS } from '@keycloakify/angular/lib/public-api'; -import { ClassKey } from 'keycloakify/login/lib/kcClsx'; -import { KcContext } from '../../KcContext'; +import { USE_DEFAULT_CSS } from '@keycloakify/angular/lib/tokens/use-default-css.token'; import { ComponentReference } from '@keycloakify/angular/login/classes/component-reference.class'; import { PasswordWrapperComponent } from '@keycloakify/angular/login/components/password-wrapper/password-wrapper.component'; import { TemplateComponent } from '@keycloakify/angular/login/containers/template.component'; import { KcClassDirective } from '@keycloakify/angular/login/directives/kc-class.directive'; import { KcSanitizePipe } from '@keycloakify/angular/login/pipes/kc-sanitize.pipe'; -import { MsgStrPipe } from '@keycloakify/angular/login/pipes/msg-str.pipe'; +import { LOGIN_CLASSES } from '@keycloakify/angular/login/tokens/classes.token'; +import { LOGIN_I18N } from '@keycloakify/angular/login/tokens/i18n.token'; +import { KC_LOGIN_CONTEXT } from '@keycloakify/angular/login/tokens/kc-context.token'; +import { ClassKey } from 'keycloakify/login/lib/kcClsx'; +import { I18n } from '../../i18n'; +import { KcContext } from '../../KcContext'; @Component({ selector: 'kc-root', templateUrl: './login.component.html', standalone: true, changeDetection: ChangeDetectionStrategy.OnPush, - imports: [KcClassDirective, AsyncPipe, KcSanitizePipe, PasswordWrapperComponent, NgClass, TemplateComponent, MsgStrPipe], + imports: [KcClassDirective, AsyncPipe, KcSanitizePipe, PasswordWrapperComponent, NgClass, TemplateComponent], providers: [ { provide: ComponentReference, @@ -24,12 +27,13 @@ import { MsgStrPipe } from '@keycloakify/angular/login/pipes/msg-str.pipe'; ] }) export class LoginComponent extends ComponentReference { - kcContext = inject>(KC_CONTEXT); + kcContext = inject>(KC_LOGIN_CONTEXT); displayRequiredFields = input(false); documentTitle = input(); bodyClassName = input(); + i18n = inject(LOGIN_I18N); override doUseDefaultCss = inject(USE_DEFAULT_CSS); - override classes = inject>>(CLASSES); + override classes = inject>>(LOGIN_CLASSES); isLoginButtonDisabled = signal(false); displayInfo: boolean = !!this.kcContext?.realm?.password && !!this.kcContext?.realm?.registrationAllowed && !this.kcContext?.registrationDisabled; displayMessage: boolean = !this.kcContext?.messagesPerField?.existsError('username', 'password'); diff --git a/src/login/pages/logout-confirm/logout-confirm.component.html b/src/login/pages/logout-confirm/logout-confirm.component.html index 9af004d0..c4990875 100644 --- a/src/login/pages/logout-confirm/logout-confirm.component.html +++ b/src/login/pages/logout-confirm/logout-confirm.component.html @@ -10,14 +10,14 @@ [documentTitle]="documentTitle()" > - {{ 'logoutConfirmTitle' | msgStr }} + {{ i18n.msgStr('logoutConfirmTitle') }}
    -

    {{ 'logoutConfirmHeader' | msgStr }}

    +

    {{ i18n.msgStr('logoutConfirmHeader') }}

    @@ -50,7 +50,7 @@
    @if (!logoutConfirm.skipLink && client.baseUrl) {

    - {{ 'backToApplication' | msgStr }} + {{ i18n.msgStr('backToApplication') }}

    }
    diff --git a/src/login/pages/logout-confirm/logout-confirm.component.ts b/src/login/pages/logout-confirm/logout-confirm.component.ts index 4b4c5052..662cecd7 100644 --- a/src/login/pages/logout-confirm/logout-confirm.component.ts +++ b/src/login/pages/logout-confirm/logout-confirm.component.ts @@ -1,15 +1,18 @@ import { ChangeDetectionStrategy, Component, forwardRef, inject, input } from '@angular/core'; -import { CLASSES, KC_CONTEXT, USE_DEFAULT_CSS } from '@keycloakify/angular/lib/public-api'; -import { ClassKey } from 'keycloakify/login/lib/kcClsx'; -import { KcContext } from '../../KcContext'; +import { USE_DEFAULT_CSS } from '@keycloakify/angular/lib/tokens/use-default-css.token'; import { ComponentReference } from '@keycloakify/angular/login/classes/component-reference.class'; import { TemplateComponent } from '@keycloakify/angular/login/containers/template.component'; -import { KcClassDirective } from '@keycloakify/angular/login/directives'; -import { MsgStrPipe } from '@keycloakify/angular/login/pipes/msg-str.pipe'; +import { KcClassDirective } from '@keycloakify/angular/login/directives/kc-class.directive'; +import { LOGIN_CLASSES } from '@keycloakify/angular/login/tokens/classes.token'; +import { LOGIN_I18N } from '@keycloakify/angular/login/tokens/i18n.token'; +import { KC_LOGIN_CONTEXT } from '@keycloakify/angular/login/tokens/kc-context.token'; +import { ClassKey } from 'keycloakify/login/lib/kcClsx'; +import { I18n } from '../../i18n'; +import { KcContext } from '../../KcContext'; @Component({ standalone: true, - imports: [MsgStrPipe, TemplateComponent, KcClassDirective], + imports: [TemplateComponent, KcClassDirective], selector: 'kc-root', templateUrl: 'logout-confirm.component.html', changeDetection: ChangeDetectionStrategy.OnPush, @@ -21,9 +24,10 @@ import { MsgStrPipe } from '@keycloakify/angular/login/pipes/msg-str.pipe'; ] }) export class LogoutConfirmComponent extends ComponentReference { - kcContext = inject>(KC_CONTEXT); + kcContext = inject>(KC_LOGIN_CONTEXT); + i18n = inject(LOGIN_I18N); override doUseDefaultCss = inject(USE_DEFAULT_CSS); - override classes = inject>>(CLASSES); + override classes = inject>>(LOGIN_CLASSES); displayRequiredFields = input(false); documentTitle = input(); bodyClassName = input(); diff --git a/src/login/pages/register/register.component.html b/src/login/pages/register/register.component.html index 641aee32..e2f60a69 100644 --- a/src/login/pages/register/register.component.html +++ b/src/login/pages/register/register.component.html @@ -15,7 +15,7 @@ [documentTitle]="documentTitle()" > - {{ messageHeader ?? 'registerTitle' | advancedMsgStr }} + {{ messageHeader ?? i18n.advancedMsgStr('registerTitle') }}
    - {{ 'termsTitle' | msgStr }} + {{ i18n.msgStr('termsTitle') }}
    - {{ 'termsText' | msgStr }} + {{ i18n.msgStr('termsText') }}
    @@ -49,7 +49,7 @@ for="termsAccepted" [kcClass]="'kcLabelClass'" > - {{ 'acceptTerms' | msgStr }} + {{ i18n.msgStr('acceptTerms') }} @if (messagesPerField.existsError('termsAccepted')) { @@ -86,7 +86,7 @@ @@ -104,7 +104,7 @@ [attr.data-action]="recaptchaAction" type="submit" > - {{ 'doRegister' | msgStr }} + {{ i18n.msgStr('doRegister') }} } @else { @@ -116,7 +116,7 @@ [disabled]="!isFormSubmittable || (termsAcceptanceRequired && !areTermsAccepted)" [kcClass]="['kcButtonClass', 'kcButtonPrimaryClass', 'kcButtonBlockClass', 'kcButtonLargeClass']" type="submit" - [value]="'doRegister' | msgStr" + [value]="i18n.msgStr('doRegister')" /> } diff --git a/src/login/pages/register/register.component.ts b/src/login/pages/register/register.component.ts index db3e5631..f8216239 100644 --- a/src/login/pages/register/register.component.ts +++ b/src/login/pages/register/register.component.ts @@ -1,31 +1,24 @@ import { AsyncPipe, NgClass } from '@angular/common'; import { ChangeDetectionStrategy, Component, forwardRef, inject, input, signal } from '@angular/core'; -import { CLASSES, KC_CONTEXT, USE_DEFAULT_CSS } from '@keycloakify/angular/lib/public-api'; -import { ClassKey } from 'keycloakify/login/lib/kcClsx'; -import { KcContext } from '../../KcContext'; +import { USE_DEFAULT_CSS } from '@keycloakify/angular/lib/tokens/use-default-css.token'; import { ComponentReference } from '@keycloakify/angular/login/classes/component-reference.class'; import { UserProfileFormFieldsComponent } from '@keycloakify/angular/login/components/user-profile-form-fields/user-profile-form-fields.component'; import { TemplateComponent } from '@keycloakify/angular/login/containers/template.component'; import { KcClassDirective } from '@keycloakify/angular/login/directives/kc-class.directive'; -import { AdvancedMsgStrPipe } from '@keycloakify/angular/login/pipes/advanced-msg-str.pipe'; import { KcSanitizePipe } from '@keycloakify/angular/login/pipes/kc-sanitize.pipe'; -import { MsgStrPipe } from '@keycloakify/angular/login/pipes/msg-str.pipe'; +import { LOGIN_CLASSES } from '@keycloakify/angular/login/tokens/classes.token'; +import { LOGIN_I18N } from '@keycloakify/angular/login/tokens/i18n.token'; +import { KC_LOGIN_CONTEXT } from '@keycloakify/angular/login/tokens/kc-context.token'; +import { ClassKey } from 'keycloakify/login/lib/kcClsx'; +import { I18n } from '../../i18n'; +import { KcContext } from '../../KcContext'; @Component({ selector: 'kc-root', templateUrl: './register.component.html', standalone: true, changeDetection: ChangeDetectionStrategy.OnPush, - imports: [ - KcClassDirective, - AsyncPipe, - KcSanitizePipe, - NgClass, - TemplateComponent, - UserProfileFormFieldsComponent, - MsgStrPipe, - AdvancedMsgStrPipe - ], + imports: [KcClassDirective, AsyncPipe, KcSanitizePipe, NgClass, TemplateComponent, UserProfileFormFieldsComponent], providers: [ { provide: ComponentReference, @@ -34,12 +27,13 @@ import { MsgStrPipe } from '@keycloakify/angular/login/pipes/msg-str.pipe'; ] }) export class RegisterComponent extends ComponentReference { - kcContext = inject>(KC_CONTEXT); + kcContext = inject>(KC_LOGIN_CONTEXT); displayRequiredFields = input(false); documentTitle = input(); bodyClassName = input(); + i18n = inject(LOGIN_I18N); override doUseDefaultCss = inject(USE_DEFAULT_CSS); - override classes = inject>>(CLASSES); + override classes = inject>>(LOGIN_CLASSES); isFormSubmittable = signal(false); areTermsAccepted = signal(false); displayInfo: boolean = false; diff --git a/src/login/pages/saml-post-form/saml-post-form.component.html b/src/login/pages/saml-post-form/saml-post-form.component.html index b1cbd36f..07757418 100644 --- a/src/login/pages/saml-post-form/saml-post-form.component.html +++ b/src/login/pages/saml-post-form/saml-post-form.component.html @@ -7,10 +7,10 @@ [documentTitle]="documentTitle()" > - {{ 'saml.post-form.title' | msgStr }} + {{ i18n.msgStr('saml.post-form.title') }} -

    {{ 'saml.post-form.message' | msgStr }}

    +

    {{ i18n.msgStr('saml.post-form.message') }}

    } diff --git a/src/login/pages/saml-post-form/saml-post-form.component.ts b/src/login/pages/saml-post-form/saml-post-form.component.ts index fad1a4bb..e6c810f8 100644 --- a/src/login/pages/saml-post-form/saml-post-form.component.ts +++ b/src/login/pages/saml-post-form/saml-post-form.component.ts @@ -1,14 +1,17 @@ import { AfterViewInit, ChangeDetectionStrategy, Component, forwardRef, inject, input, ViewChild } from '@angular/core'; -import { CLASSES, KC_CONTEXT, USE_DEFAULT_CSS } from '@keycloakify/angular/lib/public-api'; -import { ClassKey } from 'keycloakify/login/lib/kcClsx'; -import { KcContext } from '../../KcContext'; +import { USE_DEFAULT_CSS } from '@keycloakify/angular/lib/tokens/use-default-css.token'; import { ComponentReference } from '@keycloakify/angular/login/classes/component-reference.class'; import { TemplateComponent } from '@keycloakify/angular/login/containers/template.component'; -import { MsgStrPipe } from '@keycloakify/angular/login/pipes/msg-str.pipe'; +import { LOGIN_CLASSES } from '@keycloakify/angular/login/tokens/classes.token'; +import { LOGIN_I18N } from '@keycloakify/angular/login/tokens/i18n.token'; +import { KC_LOGIN_CONTEXT } from '@keycloakify/angular/login/tokens/kc-context.token'; +import { ClassKey } from 'keycloakify/login/lib/kcClsx'; +import { I18n } from '../../i18n'; +import { KcContext } from '../../KcContext'; @Component({ standalone: true, - imports: [TemplateComponent, MsgStrPipe], + imports: [TemplateComponent], selector: 'kc-root', templateUrl: 'saml-post-form.component.html', changeDetection: ChangeDetectionStrategy.OnPush, @@ -20,9 +23,10 @@ import { MsgStrPipe } from '@keycloakify/angular/login/pipes/msg-str.pipe'; ] }) export class SamlPostFormComponent extends ComponentReference implements AfterViewInit { - kcContext = inject>(KC_CONTEXT); + kcContext = inject>(KC_LOGIN_CONTEXT); + i18n = inject(LOGIN_I18N); override doUseDefaultCss = inject(USE_DEFAULT_CSS); - override classes = inject>>(CLASSES); + override classes = inject>>(LOGIN_CLASSES); displayRequiredFields = input(false); documentTitle = input(); bodyClassName = input(); diff --git a/src/login/pages/select-authenticator/select-authenticator.component.html b/src/login/pages/select-authenticator/select-authenticator.component.html index 1c976dc5..a7206b69 100644 --- a/src/login/pages/select-authenticator/select-authenticator.component.html +++ b/src/login/pages/select-authenticator/select-authenticator.component.html @@ -8,7 +8,7 @@ [documentTitle]="documentTitle()" > - {{ 'loginChooseAuthenticator' | msgStr }} + {{ i18n.msgStr('loginChooseAuthenticator') }}
    - {{ authenticationSelection.displayName | advancedMsgStr }} + {{ i18n.advancedMsgStr(authenticationSelection.displayName) }}
    - {{ authenticationSelection.helpText | advancedMsgStr }} + {{ i18n.advancedMsgStr(authenticationSelection.helpText) }}
    diff --git a/src/login/pages/select-authenticator/select-authenticator.component.ts b/src/login/pages/select-authenticator/select-authenticator.component.ts index 04eb16d7..4ed4ae4c 100644 --- a/src/login/pages/select-authenticator/select-authenticator.component.ts +++ b/src/login/pages/select-authenticator/select-authenticator.component.ts @@ -1,17 +1,19 @@ import { NgClass } from '@angular/common'; import { ChangeDetectionStrategy, Component, forwardRef, inject, input } from '@angular/core'; -import { CLASSES, KC_CONTEXT, USE_DEFAULT_CSS } from '@keycloakify/angular/lib/public-api'; -import { ClassKey } from 'keycloakify/login/lib/kcClsx'; -import { KcContext } from '../../KcContext'; +import { USE_DEFAULT_CSS } from '@keycloakify/angular/lib/tokens/use-default-css.token'; import { ComponentReference } from '@keycloakify/angular/login/classes/component-reference.class'; import { TemplateComponent } from '@keycloakify/angular/login/containers/template.component'; -import { KcClassDirective } from '@keycloakify/angular/login/directives'; -import { AdvancedMsgStrPipe } from '@keycloakify/angular/login/pipes'; -import { MsgStrPipe } from '@keycloakify/angular/login/pipes/msg-str.pipe'; +import { KcClassDirective } from '@keycloakify/angular/login/directives/kc-class.directive'; +import { LOGIN_CLASSES } from '@keycloakify/angular/login/tokens/classes.token'; +import { LOGIN_I18N } from '@keycloakify/angular/login/tokens/i18n.token'; +import { KC_LOGIN_CONTEXT } from '@keycloakify/angular/login/tokens/kc-context.token'; +import { ClassKey } from 'keycloakify/login/lib/kcClsx'; +import { I18n } from '../../i18n'; +import { KcContext } from '../../KcContext'; @Component({ standalone: true, - imports: [TemplateComponent, MsgStrPipe, AdvancedMsgStrPipe, KcClassDirective, NgClass], + imports: [TemplateComponent, KcClassDirective, NgClass], selector: 'kc-root', templateUrl: 'select-authenticator.component.html', changeDetection: ChangeDetectionStrategy.OnPush, @@ -23,9 +25,10 @@ import { MsgStrPipe } from '@keycloakify/angular/login/pipes/msg-str.pipe'; ] }) export class SelectAuthenticatorComponent extends ComponentReference { - kcContext = inject>(KC_CONTEXT); + kcContext = inject>(KC_LOGIN_CONTEXT); + i18n = inject(LOGIN_I18N); override doUseDefaultCss = inject(USE_DEFAULT_CSS); - override classes = inject>>(CLASSES); + override classes = inject>>(LOGIN_CLASSES); displayRequiredFields = input(false); documentTitle = input(); bodyClassName = input(); diff --git a/src/login/pages/terms/terms.component.html b/src/login/pages/terms/terms.component.html index a5e8039e..90cb5150 100644 --- a/src/login/pages/terms/terms.component.html +++ b/src/login/pages/terms/terms.component.html @@ -7,10 +7,10 @@ [documentTitle]="documentTitle()" > - {{ 'termsTitle' | msgStr }} + {{ i18n.msgStr('termsTitle') }} -
    {{ 'termsText' | msgStr }}
    +
    {{ i18n.msgStr('termsText') }}
    diff --git a/src/login/pages/terms/terms.component.ts b/src/login/pages/terms/terms.component.ts index 521d9a94..07c59cb7 100644 --- a/src/login/pages/terms/terms.component.ts +++ b/src/login/pages/terms/terms.component.ts @@ -1,15 +1,18 @@ import { ChangeDetectionStrategy, Component, forwardRef, inject, input } from '@angular/core'; -import { CLASSES, KC_CONTEXT, USE_DEFAULT_CSS } from '@keycloakify/angular/lib/public-api'; -import { ClassKey } from 'keycloakify/login/lib/kcClsx'; -import { KcContext } from '../../KcContext'; +import { USE_DEFAULT_CSS } from '@keycloakify/angular/lib/tokens/use-default-css.token'; import { ComponentReference } from '@keycloakify/angular/login/classes/component-reference.class'; import { TemplateComponent } from '@keycloakify/angular/login/containers/template.component'; -import { KcClassDirective } from '@keycloakify/angular/login/directives'; -import { MsgStrPipe } from '@keycloakify/angular/login/pipes/msg-str.pipe'; +import { KcClassDirective } from '@keycloakify/angular/login/directives/kc-class.directive'; +import { LOGIN_CLASSES } from '@keycloakify/angular/login/tokens/classes.token'; +import { LOGIN_I18N } from '@keycloakify/angular/login/tokens/i18n.token'; +import { KC_LOGIN_CONTEXT } from '@keycloakify/angular/login/tokens/kc-context.token'; +import { ClassKey } from 'keycloakify/login/lib/kcClsx'; +import { I18n } from '../../i18n'; +import { KcContext } from '../../KcContext'; @Component({ standalone: true, - imports: [MsgStrPipe, TemplateComponent, KcClassDirective], + imports: [TemplateComponent, KcClassDirective], selector: 'kc-root', templateUrl: 'terms.component.html', changeDetection: ChangeDetectionStrategy.OnPush, @@ -21,9 +24,10 @@ import { MsgStrPipe } from '@keycloakify/angular/login/pipes/msg-str.pipe'; ] }) export class TermsComponent extends ComponentReference { - kcContext = inject>(KC_CONTEXT); + kcContext = inject>(KC_LOGIN_CONTEXT); + i18n = inject(LOGIN_I18N); override doUseDefaultCss = inject(USE_DEFAULT_CSS); - override classes = inject>>(CLASSES); + override classes = inject>>(LOGIN_CLASSES); displayRequiredFields = input(false); documentTitle = input(); bodyClassName = input(); diff --git a/src/login/pages/update-email/update-email.component.html b/src/login/pages/update-email/update-email.component.html index e19580b5..0ee016b6 100644 --- a/src/login/pages/update-email/update-email.component.html +++ b/src/login/pages/update-email/update-email.component.html @@ -8,7 +8,7 @@ [documentTitle]="documentTitle()" > - {{ 'updateEmailTitle' | msgStr }} + {{ i18n.msgStr('updateEmailTitle') }}
    @if (isAppInitiatedAction) { } diff --git a/src/login/pages/update-email/update-email.component.ts b/src/login/pages/update-email/update-email.component.ts index dfbfc3fc..9ba21a73 100644 --- a/src/login/pages/update-email/update-email.component.ts +++ b/src/login/pages/update-email/update-email.component.ts @@ -1,17 +1,20 @@ import { ChangeDetectionStrategy, Component, forwardRef, inject, input, signal } from '@angular/core'; -import { CLASSES, KC_CONTEXT, USE_DEFAULT_CSS } from '@keycloakify/angular/lib/public-api'; -import { ClassKey } from 'keycloakify/login/lib/kcClsx'; -import { KcContext } from '../../KcContext'; +import { USE_DEFAULT_CSS } from '@keycloakify/angular/lib/tokens/use-default-css.token'; import { ComponentReference } from '@keycloakify/angular/login/classes/component-reference.class'; import { LogoutOtherSessionsComponent } from '@keycloakify/angular/login/components/logout-other-sessions/logout-other-sessions.component'; import { UserProfileFormFieldsComponent } from '@keycloakify/angular/login/components/user-profile-form-fields/user-profile-form-fields.component'; import { TemplateComponent } from '@keycloakify/angular/login/containers/template.component'; -import { KcClassDirective } from '@keycloakify/angular/login/directives'; -import { MsgStrPipe } from '@keycloakify/angular/login/pipes/msg-str.pipe'; +import { KcClassDirective } from '@keycloakify/angular/login/directives/kc-class.directive'; +import { LOGIN_CLASSES } from '@keycloakify/angular/login/tokens/classes.token'; +import { LOGIN_I18N } from '@keycloakify/angular/login/tokens/i18n.token'; +import { KC_LOGIN_CONTEXT } from '@keycloakify/angular/login/tokens/kc-context.token'; +import { ClassKey } from 'keycloakify/login/lib/kcClsx'; +import { I18n } from '../../i18n'; +import { KcContext } from '../../KcContext'; @Component({ standalone: true, - imports: [TemplateComponent, MsgStrPipe, KcClassDirective, UserProfileFormFieldsComponent, LogoutOtherSessionsComponent], + imports: [TemplateComponent, KcClassDirective, UserProfileFormFieldsComponent, LogoutOtherSessionsComponent], selector: 'kc-root', templateUrl: 'update-email.component.html', changeDetection: ChangeDetectionStrategy.OnPush, @@ -23,9 +26,10 @@ import { MsgStrPipe } from '@keycloakify/angular/login/pipes/msg-str.pipe'; ] }) export class UpdateEmailComponent extends ComponentReference { - kcContext = inject>(KC_CONTEXT); + kcContext = inject>(KC_LOGIN_CONTEXT); + i18n = inject(LOGIN_I18N); override doUseDefaultCss = inject(USE_DEFAULT_CSS); - override classes = inject>>(CLASSES); + override classes = inject>>(LOGIN_CLASSES); displayRequiredFields = input(true); documentTitle = input(); bodyClassName = input(); diff --git a/src/login/pages/webauthn-authenticate/webauthn-authenticate.component.html b/src/login/pages/webauthn-authenticate/webauthn-authenticate.component.html index 1e5537be..4c66acd4 100644 --- a/src/login/pages/webauthn-authenticate/webauthn-authenticate.component.html +++ b/src/login/pages/webauthn-authenticate/webauthn-authenticate.component.html @@ -10,17 +10,17 @@ [documentTitle]="documentTitle()" > - {{ 'webauthn-login-title' | msgStr }} + {{ i18n.msgStr('webauthn-login-title') }}
    - {{ 'noAccount' | msgStr }} + {{ i18n.msgStr('noAccount') }} - {{ 'doRegister' | msgStr }} + {{ i18n.msgStr('doRegister') }}
    @@ -86,7 +86,7 @@ @if (shouldDisplayAuthenticators) { @if (authenticators.authenticators.length > 1) {

    - {{ 'webauthn-available-authenticators' | msgStr }} + {{ i18n.msgStr('webauthn-available-authenticators') }}

    }
    @@ -105,7 +105,7 @@ [id]="'kc-webauthn-authenticator-label-' + i" [kcClass]="'kcSelectAuthListItemHeadingClass'" > - {{ authenticator.label | advancedMsgStr }} + {{ i18n.advancedMsgStr(authenticator.label) }}
    @if (authenticator.transports.displayNameProperties?.length) {
    , } @@ -125,7 +125,7 @@
    - {{ 'webauthn-createdAt-label' | msgStr }} + {{ i18n.msgStr('webauthn-createdAt-label') }} {{ authenticator.createdAt }}
    @@ -151,7 +151,7 @@ [kcClass]="['kcButtonClass', 'kcButtonDefaultClass', 'kcButtonBlockClass', 'kcButtonLargeClass']" id="cancelWebAuthnAIA" name="cancel-aia" - [value]="'webauthn-doAuthenticate' | msgStr" + [value]="i18n.msgStr('webauthn-doAuthenticate')" /> diff --git a/src/login/pages/webauthn-authenticate/webauthn-authenticate.component.ts b/src/login/pages/webauthn-authenticate/webauthn-authenticate.component.ts index 3ea397ea..37238ddc 100644 --- a/src/login/pages/webauthn-authenticate/webauthn-authenticate.component.ts +++ b/src/login/pages/webauthn-authenticate/webauthn-authenticate.component.ts @@ -1,25 +1,25 @@ import { ChangeDetectionStrategy, Component, forwardRef, inject, input } from '@angular/core'; -import { CLASSES, KC_CONTEXT, USE_DEFAULT_CSS } from '@keycloakify/angular/lib/public-api'; -import { Script } from '@keycloakify/angular/lib/models'; -import { ClassKey } from 'keycloakify/login/lib/kcClsx'; -import { KcContext } from '../../KcContext'; -import { getKcClsx } from 'keycloakify/login/lib/kcClsx'; +import { Script } from '@keycloakify/angular/lib/models/script.model'; +import { USE_DEFAULT_CSS } from '@keycloakify/angular/lib/tokens/use-default-css.token'; import { ComponentReference } from '@keycloakify/angular/login/classes/component-reference.class'; import { LogoutOtherSessionsComponent } from '@keycloakify/angular/login/components/logout-other-sessions/logout-other-sessions.component'; import { TemplateComponent } from '@keycloakify/angular/login/containers/template.component'; -import { KcClassDirective } from '@keycloakify/angular/login/directives'; -import { AdvancedMsgStrPipe } from '@keycloakify/angular/login/pipes/advanced-msg-str.pipe'; -import { MsgStrPipe } from '@keycloakify/angular/login/pipes/msg-str.pipe'; -import { LoginResourceInjectorService } from '@keycloakify/angular/login/services'; +import { KcClassDirective } from '@keycloakify/angular/login/directives/kc-class.directive'; +import { LoginResourceInjectorService } from '@keycloakify/angular/login/services/login-resource-injector.service'; +import { LOGIN_CLASSES } from '@keycloakify/angular/login/tokens/classes.token'; +import { LOGIN_I18N } from '@keycloakify/angular/login/tokens/i18n.token'; +import { KC_LOGIN_CONTEXT } from '@keycloakify/angular/login/tokens/kc-context.token'; +import { ClassKey, getKcClsx } from 'keycloakify/login/lib/kcClsx'; +import { I18n } from '../../i18n'; +import { KcContext } from '../../KcContext'; @Component({ standalone: true, - imports: [TemplateComponent, MsgStrPipe, AdvancedMsgStrPipe, KcClassDirective, LogoutOtherSessionsComponent], + imports: [TemplateComponent, KcClassDirective, LogoutOtherSessionsComponent], selector: 'kc-root', templateUrl: 'webauthn-authenticate.component.html', changeDetection: ChangeDetectionStrategy.OnPush, providers: [ - MsgStrPipe, { provide: ComponentReference, useExisting: forwardRef(() => WebauthnAuthenticateComponent) @@ -27,11 +27,11 @@ import { LoginResourceInjectorService } from '@keycloakify/angular/login/service ] }) export class WebauthnAuthenticateComponent extends ComponentReference { - kcContext = inject>(KC_CONTEXT); + kcContext = inject>(KC_LOGIN_CONTEXT); loginResourceInjectorService = inject(LoginResourceInjectorService); - msgStr = inject(MsgStrPipe); + i18n = inject(LOGIN_I18N); override doUseDefaultCss = inject(USE_DEFAULT_CSS); - override classes = inject>>(CLASSES); + override classes = inject>>(LOGIN_CLASSES); displayRequiredFields = input(false); documentTitle = input(); bodyClassName = input(); @@ -57,7 +57,7 @@ export class WebauthnAuthenticateComponent extends ComponentReference { userVerification : '${userVerification}', rpId : '${rpId}', createTimeout : ${createTimeout}, - errmsg : ${JSON.stringify(this.msgStr.transform('webauthn-unsupported-browser-text'))} + errmsg : ${JSON.stringify(this.i18n.msgStr('webauthn-unsupported-browser-text'))} }; authenticateByWebAuthn(input); }); diff --git a/src/login/pages/webauthn-error/webauthn-error.component.html b/src/login/pages/webauthn-error/webauthn-error.component.html index 587e5069..19f84292 100644 --- a/src/login/pages/webauthn-error/webauthn-error.component.html +++ b/src/login/pages/webauthn-error/webauthn-error.component.html @@ -9,7 +9,7 @@ [documentTitle]="documentTitle()" > - {{ 'webauthn-error-title' | msgStr }} + {{ i18n.msgStr('webauthn-error-title') }} @if (isAppInitiatedAction) { - {{ 'doCancel' | msgStr }} + {{ i18n.msgStr('doCancel') }} } diff --git a/src/login/pages/webauthn-error/webauthn-error.component.ts b/src/login/pages/webauthn-error/webauthn-error.component.ts index 68c41db6..4e45cf1f 100644 --- a/src/login/pages/webauthn-error/webauthn-error.component.ts +++ b/src/login/pages/webauthn-error/webauthn-error.component.ts @@ -1,16 +1,19 @@ import { ChangeDetectionStrategy, Component, forwardRef, inject, input } from '@angular/core'; -import { CLASSES, KC_CONTEXT, USE_DEFAULT_CSS } from '@keycloakify/angular/lib/public-api'; -import { ClassKey } from 'keycloakify/login/lib/kcClsx'; -import { KcContext } from '../../KcContext'; +import { USE_DEFAULT_CSS } from '@keycloakify/angular/lib/tokens/use-default-css.token'; import { ComponentReference } from '@keycloakify/angular/login/classes/component-reference.class'; import { LogoutOtherSessionsComponent } from '@keycloakify/angular/login/components/logout-other-sessions/logout-other-sessions.component'; import { TemplateComponent } from '@keycloakify/angular/login/containers/template.component'; -import { KcClassDirective } from '@keycloakify/angular/login/directives'; -import { MsgStrPipe } from '@keycloakify/angular/login/pipes/msg-str.pipe'; +import { KcClassDirective } from '@keycloakify/angular/login/directives/kc-class.directive'; +import { LOGIN_I18N } from '@keycloakify/angular/login/tokens/i18n.token'; +import { I18n } from '../../i18n'; +import { LOGIN_CLASSES } from '@keycloakify/angular/login/tokens/classes.token'; +import { KC_LOGIN_CONTEXT } from '@keycloakify/angular/login/tokens/kc-context.token'; +import { ClassKey } from 'keycloakify/login/lib/kcClsx'; +import { KcContext } from '../../KcContext'; @Component({ standalone: true, - imports: [TemplateComponent, MsgStrPipe, KcClassDirective, LogoutOtherSessionsComponent], + imports: [TemplateComponent, KcClassDirective, LogoutOtherSessionsComponent], selector: 'kc-root', templateUrl: 'webauthn-error.component.html', changeDetection: ChangeDetectionStrategy.OnPush, @@ -22,9 +25,10 @@ import { MsgStrPipe } from '@keycloakify/angular/login/pipes/msg-str.pipe'; ] }) export class WebauthnErrorComponent extends ComponentReference { - kcContext = inject>(KC_CONTEXT); + kcContext = inject>(KC_LOGIN_CONTEXT); + i18n = inject(LOGIN_I18N); override doUseDefaultCss = inject(USE_DEFAULT_CSS); - override classes = inject>>(CLASSES); + override classes = inject>>(LOGIN_CLASSES); displayRequiredFields = input(false); documentTitle = input(); bodyClassName = input(); diff --git a/src/login/pages/webauthn-register/webauthn-register.component.html b/src/login/pages/webauthn-register/webauthn-register.component.html index 26e1777e..94e71629 100644 --- a/src/login/pages/webauthn-register/webauthn-register.component.html +++ b/src/login/pages/webauthn-register/webauthn-register.component.html @@ -11,7 +11,7 @@ > - {{ 'webauthn-registration-title' | msgStr }} + {{ i18n.msgStr('webauthn-registration-title') }}
    @if (!isSetRetry && isAppInitiatedAction) { - {{ 'doCancel' | msgStr }} + {{ i18n.msgStr('doCancel') }}
    } diff --git a/src/login/pages/webauthn-register/webauthn-register.component.ts b/src/login/pages/webauthn-register/webauthn-register.component.ts index d159f934..9d4273a9 100644 --- a/src/login/pages/webauthn-register/webauthn-register.component.ts +++ b/src/login/pages/webauthn-register/webauthn-register.component.ts @@ -1,23 +1,25 @@ import { ChangeDetectionStrategy, Component, forwardRef, inject, input } from '@angular/core'; -import { CLASSES, KC_CONTEXT, USE_DEFAULT_CSS } from '@keycloakify/angular/lib/public-api'; -import { Script } from '@keycloakify/angular/lib/models'; -import { ClassKey } from 'keycloakify/login/lib/kcClsx'; -import { KcContext } from '../../KcContext'; +import { Script } from '@keycloakify/angular/lib/models/script.model'; +import { USE_DEFAULT_CSS } from '@keycloakify/angular/lib/tokens/use-default-css.token'; import { ComponentReference } from '@keycloakify/angular/login/classes/component-reference.class'; import { LogoutOtherSessionsComponent } from '@keycloakify/angular/login/components/logout-other-sessions/logout-other-sessions.component'; import { TemplateComponent } from '@keycloakify/angular/login/containers/template.component'; -import { KcClassDirective } from '@keycloakify/angular/login/directives'; -import { MsgStrPipe } from '@keycloakify/angular/login/pipes/msg-str.pipe'; -import { LoginResourceInjectorService } from '@keycloakify/angular/login/services'; +import { KcClassDirective } from '@keycloakify/angular/login/directives/kc-class.directive'; +import { LoginResourceInjectorService } from '@keycloakify/angular/login/services/login-resource-injector.service'; +import { LOGIN_CLASSES } from '@keycloakify/angular/login/tokens/classes.token'; +import { KC_LOGIN_CONTEXT } from '@keycloakify/angular/login/tokens/kc-context.token'; +import { ClassKey } from 'keycloakify/login/lib/kcClsx'; +import { KcContext } from '../../KcContext'; +import { LOGIN_I18N } from '@keycloakify/angular/login/tokens/i18n.token'; +import { I18n } from '../../i18n'; @Component({ standalone: true, - imports: [TemplateComponent, MsgStrPipe, KcClassDirective, LogoutOtherSessionsComponent], + imports: [TemplateComponent, KcClassDirective, LogoutOtherSessionsComponent], selector: 'kc-root', templateUrl: 'webauthn-register.component.html', changeDetection: ChangeDetectionStrategy.OnPush, providers: [ - MsgStrPipe, { provide: ComponentReference, useExisting: forwardRef(() => WebauthnRegisterComponent) @@ -25,11 +27,11 @@ import { LoginResourceInjectorService } from '@keycloakify/angular/login/service ] }) export class WebauthnRegisterComponent extends ComponentReference { - kcContext = inject>(KC_CONTEXT); + kcContext = inject>(KC_LOGIN_CONTEXT); loginResourceInjectorService = inject(LoginResourceInjectorService); - msgStr = inject(MsgStrPipe); + i18n = inject(LOGIN_I18N); override doUseDefaultCss = inject(USE_DEFAULT_CSS); - override classes = inject>>(CLASSES); + override classes = inject>>(LOGIN_CLASSES); displayRequiredFields = input(false); documentTitle = input(); bodyClassName = input(); @@ -76,9 +78,9 @@ export class WebauthnRegisterComponent extends ComponentReference { userVerificationRequirement : ${JSON.stringify(userVerificationRequirement)}, createTimeout : ${createTimeout}, excludeCredentialIds : ${JSON.stringify(excludeCredentialIds)}, - initLabel : ${JSON.stringify(this.msgStr.transform('webauthn-registration-init-label'))}, - initLabelPrompt : ${JSON.stringify(this.msgStr.transform('webauthn-registration-init-label-prompt'))}, - errmsg : ${JSON.stringify(this.msgStr.transform('webauthn-unsupported-browser-text'))} + initLabel : ${JSON.stringify(this.i18n.msgStr('webauthn-registration-init-label'))}, + initLabelPrompt : ${JSON.stringify(this.i18n.msgStr('webauthn-registration-init-label-prompt'))}, + errmsg : ${JSON.stringify(this.i18n.msgStr('webauthn-unsupported-browser-text'))} }; registerByWebAuthn(input); }); diff --git a/src/login/pipes/advanced-msg-str.pipe.ts b/src/login/pipes/advanced-msg-str.pipe.ts deleted file mode 100644 index 1b902f11..00000000 --- a/src/login/pipes/advanced-msg-str.pipe.ts +++ /dev/null @@ -1,13 +0,0 @@ -import { inject, Pipe, PipeTransform } from '@angular/core'; -import { I18N } from '@keycloakify/angular/lib/public-api'; -import { I18n } from '../i18n'; -@Pipe({ - name: 'advancedMsgStr', - standalone: true -}) -export class AdvancedMsgStrPipe implements PipeTransform { - readonly #i18n = inject(I18N); - transform(value: string, ...args: (string | undefined)[]): string { - return this.#i18n.advancedMsgStr(value, ...args); - } -} diff --git a/src/login/pipes/index.ts b/src/login/pipes/index.ts deleted file mode 100644 index e5a9aa7f..00000000 --- a/src/login/pipes/index.ts +++ /dev/null @@ -1,6 +0,0 @@ -export * from './advanced-msg-str.pipe'; -export * from './input-type.pipe'; -export * from './kc-sanitize.pipe'; -export * from './msg-str.pipe'; -export * from './to-array.pipe'; -export * from './to-number.pipe'; diff --git a/src/login/pipes/kc-sanitize.pipe.ts b/src/login/pipes/kc-sanitize.pipe.ts index 5abf6529..1d3a090a 100644 --- a/src/login/pipes/kc-sanitize.pipe.ts +++ b/src/login/pipes/kc-sanitize.pipe.ts @@ -1,4 +1,4 @@ -import { Pipe, PipeTransform } from '@angular/core'; +import { inject, Pipe, PipeTransform } from '@angular/core'; import { DomSanitizer, SafeHtml, @@ -10,25 +10,23 @@ import { @Pipe({ name: 'kcSanitize', standalone: true }) export class KcSanitizePipe implements PipeTransform { - constructor(private sanitizer: DomSanitizer) {} - // TODO: Fix typing + #sanitizer = inject(DomSanitizer); transform( - // eslint-disable-next-line @typescript-eslint/no-explicit-any - value: any, - type: string + value: string, + type: 'html' | 'style' | 'script' | 'url' | 'resourceUrl' ): SafeHtml | SafeStyle | SafeScript | SafeUrl | SafeResourceUrl { switch (type) { case 'html': - return this.sanitizer.bypassSecurityTrustHtml(value); + return this.#sanitizer.bypassSecurityTrustHtml(value); case 'style': - return this.sanitizer.bypassSecurityTrustStyle(value); + return this.#sanitizer.bypassSecurityTrustStyle(value); case 'script': - return this.sanitizer.bypassSecurityTrustScript(value); + return this.#sanitizer.bypassSecurityTrustScript(value); case 'url': - return this.sanitizer.bypassSecurityTrustUrl(value); + return this.#sanitizer.bypassSecurityTrustUrl(value); case 'resourceUrl': - return this.sanitizer.bypassSecurityTrustResourceUrl(value); + return this.#sanitizer.bypassSecurityTrustResourceUrl(value); default: throw new Error(`Invalid safe type specified: ${type}`); } diff --git a/src/login/pipes/msg-str.pipe.ts b/src/login/pipes/msg-str.pipe.ts deleted file mode 100644 index 58a544f5..00000000 --- a/src/login/pipes/msg-str.pipe.ts +++ /dev/null @@ -1,14 +0,0 @@ -import { inject, Pipe, PipeTransform } from '@angular/core'; -import { I18N } from '@keycloakify/angular/lib/public-api'; -import { I18n } from '../i18n'; -import { MessageKey } from 'keycloakify/login/i18n/messages_defaultSet/types'; -@Pipe({ - name: 'msgStr', - standalone: true -}) -export class MsgStrPipe implements PipeTransform { - readonly #i18n = inject(I18N); - transform(value: MessageKey, ...args: (string | undefined)[]): string { - return this.#i18n.msgStr(value, ...args); - } -} diff --git a/src/login/pipes/to-array.pipe.ts b/src/login/pipes/to-array.pipe.ts index 9c43a34c..57900489 100644 --- a/src/login/pipes/to-array.pipe.ts +++ b/src/login/pipes/to-array.pipe.ts @@ -6,7 +6,6 @@ import { Pipe, PipeTransform } from '@angular/core'; }) export class ToArrayPipe implements PipeTransform { transform(value: string | string[], emptyWhenString = false): string[] { - // if (!value) throw new Error('must pass a value'); if (value instanceof Array) { return value; } diff --git a/src/login/providers/keycloakify-angular.providers.ts b/src/login/providers/keycloakify-angular.providers.ts new file mode 100644 index 00000000..66d45a1c --- /dev/null +++ b/src/login/providers/keycloakify-angular.providers.ts @@ -0,0 +1,65 @@ +import { DOCUMENT } from '@angular/common'; +import { APP_INITIALIZER, LOCALE_ID, makeEnvironmentProviders } from '@angular/core'; +import { USE_DEFAULT_CSS } from '@keycloakify/angular/lib/tokens/use-default-css.token'; +import { LOGIN_CLASSES } from '@keycloakify/angular/login/tokens/classes.token'; +import { LOGIN_I18N } from '@keycloakify/angular/login/tokens/i18n.token'; +import { KC_LOGIN_CONTEXT } from '@keycloakify/angular/login/tokens/kc-context.token'; +import { DO_MAKE_USER_CONFIRM_PASSWORD } from '@keycloakify/angular/login/tokens/make-user-confirm-password.token'; +import { KcContextLike } from 'keycloakify/login/i18n/noJsx'; +import { ClassKey } from 'keycloakify/login/lib/kcClsx'; +import { I18n } from '../i18n'; +import { KcContext } from '../KcContext'; + +export type KeycloakifyAngularLoginConfig = { + doMakeUserConfirmPassword?: boolean; + doUseDefaultCss?: boolean; + classes?: { [key in ClassKey]?: string }; + getI18n: (params: { + kcContext: KcContextLike; + }) => { + i18n: T; + prI18n_currentLanguage: Promise | undefined; + }; +}; + +export const provideKeycloakifyAngularLogin = (config: KeycloakifyAngularLoginConfig) => + makeEnvironmentProviders([ + { + provide: KC_LOGIN_CONTEXT, + // @ts-ignore + useValue: window.kcContext + }, + { + provide: DO_MAKE_USER_CONFIRM_PASSWORD, + useValue: config?.doMakeUserConfirmPassword ?? true + }, + { + provide: LOCALE_ID, + useFactory: (document: Document) => { + return document.documentElement.lang ?? 'en'; + }, + deps: [DOCUMENT] + }, + { + provide: APP_INITIALIZER, + multi: true, + useFactory: (_i18n: unknown, kcContext: KcContext) => async () => { + const getI18n = config.getI18n; + + const { i18n, prI18n_currentLanguage } = getI18n({ + kcContext + }); + let i18nPromise = new Promise(resolve => resolve(i18n)); + if (prI18n_currentLanguage) { + i18nPromise = prI18n_currentLanguage; + } + return i18nPromise.then(i18n => { + _i18n = i18n; + return true; + }); + }, + deps: [LOGIN_I18N, KC_LOGIN_CONTEXT] + }, + { provide: USE_DEFAULT_CSS, useValue: config?.doUseDefaultCss ?? true }, + { provide: LOGIN_CLASSES, useValue: config?.classes ?? {} } + ]); diff --git a/src/login/services/index.ts b/src/login/services/index.ts deleted file mode 100644 index 0f434f6c..00000000 --- a/src/login/services/index.ts +++ /dev/null @@ -1,2 +0,0 @@ -export * from './login-resource-injector.service'; -export * from './user-profile-form.service'; diff --git a/src/login/services/login-resource-injector.service.ts b/src/login/services/login-resource-injector.service.ts index 7fbaf96f..b592dde0 100644 --- a/src/login/services/login-resource-injector.service.ts +++ b/src/login/services/login-resource-injector.service.ts @@ -1,14 +1,15 @@ import { inject, Injectable } from '@angular/core'; -import { KC_CONTEXT } from '@keycloakify/angular/lib/public-api'; -import { ResourceInjectorService, Script } from '@keycloakify/angular/lib/public-api'; +import { KC_LOGIN_CONTEXT } from '@keycloakify/angular/login/tokens/kc-context.token'; +import { ResourceInjectorService } from '@keycloakify/angular/lib/services/resource-injector.service'; import { KcContext } from 'keycloakify/login/KcContext'; import { catchError, forkJoin, of, switchMap } from 'rxjs'; +import { Script } from '@keycloakify/angular/lib/models/script.model'; @Injectable({ providedIn: 'root' }) export class LoginResourceInjectorService { - private kcContext: KcContext = inject(KC_CONTEXT); + private kcContext: KcContext = inject(KC_LOGIN_CONTEXT); private resourceInjectorService: ResourceInjectorService = inject( ResourceInjectorService ); diff --git a/src/login/services/user-profile-form.service.ts b/src/login/services/user-profile-form.service.ts index 498ca38a..8fe0e306 100644 --- a/src/login/services/user-profile-form.service.ts +++ b/src/login/services/user-profile-form.service.ts @@ -10,11 +10,6 @@ import { WritableSignal } from '@angular/core'; import { DomSanitizer, SafeHtml } from '@angular/platform-browser'; -import { - DO_MAKE_USER_CONFIRM_PASSWORD, - I18N, - KC_CONTEXT -} from '@keycloakify/angular/lib/public-api'; import { Attribute, KcContext, @@ -31,6 +26,9 @@ import { formatNumber } from 'keycloakify/tools/formatNumber'; import { structuredCloneButFunctions } from 'keycloakify/tools/structuredCloneButFunctions'; import { assert, id } from 'tsafe'; import { LoginResourceInjectorService } from './login-resource-injector.service'; +import { KC_LOGIN_CONTEXT } from '@keycloakify/angular/login/tokens/kc-context.token'; +import { LOGIN_I18N } from '@keycloakify/angular/login/tokens/i18n.token'; +import { DO_MAKE_USER_CONFIRM_PASSWORD } from '@keycloakify/angular/login/tokens/make-user-confirm-password.token'; type KcContextLike_useGetErrors = KcContextLike_i18n & { messagesPerField: Pick; @@ -119,8 +117,8 @@ export type FormAction = @Injectable({ providedIn: 'root' }) export class UserProfileFormService { private kcContext: KcContextLike = - inject>(KC_CONTEXT); - private i18n = inject(I18N); + inject>(KC_LOGIN_CONTEXT); + private i18n = inject(LOGIN_I18N); private doMakeUserConfirmPassword = inject(DO_MAKE_USER_CONFIRM_PASSWORD); private loginResourceInjectorService = inject(LoginResourceInjectorService); private sanitizer: DomSanitizer = inject(DomSanitizer); diff --git a/src/login/tokens/classes.token.ts b/src/login/tokens/classes.token.ts new file mode 100644 index 00000000..3d2fc698 --- /dev/null +++ b/src/login/tokens/classes.token.ts @@ -0,0 +1,6 @@ +import { InjectionToken } from '@angular/core'; +import { ClassKey } from 'keycloakify/login/lib/kcClsx'; + +export const LOGIN_CLASSES = new InjectionToken<{ [key in ClassKey]?: string }>( + 'login classes' +); diff --git a/src/login/tokens/i18n.token.ts b/src/login/tokens/i18n.token.ts new file mode 100644 index 00000000..b6082438 --- /dev/null +++ b/src/login/tokens/i18n.token.ts @@ -0,0 +1,3 @@ +import { InjectionToken } from '@angular/core'; + +export const LOGIN_I18N = new InjectionToken('login i18n'); diff --git a/src/login/tokens/kc-context.token.ts b/src/login/tokens/kc-context.token.ts new file mode 100644 index 00000000..f9db97bf --- /dev/null +++ b/src/login/tokens/kc-context.token.ts @@ -0,0 +1,4 @@ +import { InjectionToken } from '@angular/core'; +import { KcContext } from '../KcContext'; + +export const KC_LOGIN_CONTEXT = new InjectionToken('keycloak login context'); diff --git a/src/login/tokens/make-user-confirm-password.token.ts b/src/login/tokens/make-user-confirm-password.token.ts new file mode 100644 index 00000000..83c8c364 --- /dev/null +++ b/src/login/tokens/make-user-confirm-password.token.ts @@ -0,0 +1,5 @@ +import { InjectionToken } from '@angular/core'; + +export const DO_MAKE_USER_CONFIRM_PASSWORD = new InjectionToken( + 'doMakeUserConfirmPassword' +); diff --git a/src/tsconfig.json b/src/tsconfig.json index 8dc713da..5b2cb6cd 100644 --- a/src/tsconfig.json +++ b/src/tsconfig.json @@ -13,5 +13,11 @@ }, "allowSyntheticDefaultImports": true, "experimentalDecorators": true + }, + "angularCompilerOptions": { + "enableI18nLegacyMessageIdFormat": false, + "strictInjectionParameters": true, + "strictInputAccessModifiers": true, + "strictTemplates": true } } From 1537b2ba3be2e53c44593b55c4b229d12be1ca46 Mon Sep 17 00:00:00 2001 From: Luca Peruzzo Date: Mon, 30 Sep 2024 15:06:40 +0200 Subject: [PATCH 42/64] missing dependencies --- package.json | 2 ++ .../keycloakify-angular.providers.ts | 7 +++---- yarn.lock | 21 +++++++++++++++++++ 3 files changed, 26 insertions(+), 4 deletions(-) diff --git a/package.json b/package.json index 1d8c30b0..dc03783a 100644 --- a/package.json +++ b/package.json @@ -64,6 +64,8 @@ "@angular/compiler-cli": "^18.2.6", "@angular/compiler": "^18.2.6", "ng-packagr": "^18.2.1", + "run-exclusive":"^2.2.19", + "evt":"^2.5.7", "tslib": "^2.7.0" }, "publishConfig": { diff --git a/src/login/providers/keycloakify-angular.providers.ts b/src/login/providers/keycloakify-angular.providers.ts index 66d45a1c..be5b5872 100644 --- a/src/login/providers/keycloakify-angular.providers.ts +++ b/src/login/providers/keycloakify-angular.providers.ts @@ -7,18 +7,17 @@ import { KC_LOGIN_CONTEXT } from '@keycloakify/angular/login/tokens/kc-context.t import { DO_MAKE_USER_CONFIRM_PASSWORD } from '@keycloakify/angular/login/tokens/make-user-confirm-password.token'; import { KcContextLike } from 'keycloakify/login/i18n/noJsx'; import { ClassKey } from 'keycloakify/login/lib/kcClsx'; -import { I18n } from '../i18n'; import { KcContext } from '../KcContext'; export type KeycloakifyAngularLoginConfig = { doMakeUserConfirmPassword?: boolean; doUseDefaultCss?: boolean; classes?: { [key in ClassKey]?: string }; - getI18n: (params: { + getI18n: (params: { kcContext: KcContextLike; }) => { - i18n: T; - prI18n_currentLanguage: Promise | undefined; + i18n: unknown; + prI18n_currentLanguage: Promise | undefined; }; }; diff --git a/yarn.lock b/yarn.lock index 8336bb9c..eda1645e 100644 --- a/yarn.lock +++ b/yarn.lock @@ -3835,6 +3835,15 @@ events@^3.2.0: resolved "https://registry.yarnpkg.com/events/-/events-3.3.0.tgz#31a95ad0a924e2d2c419a813aeb2c4e878ea7400" integrity sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q== +evt@^2.5.7: + version "2.5.7" + resolved "https://verdaccio.internal.euronovate.com/evt/-/evt-2.5.7.tgz#55c5f8ff910f4b7531bfac91e963d4cb3231f253" + integrity sha512-dr7Wd16ry5F8WNU1xXLKpFpO3HsoAGg8zC48e08vDdzMzGWCP9/QFGt1PQptEEDh8SwYP3EL8M+d/Gb0kgUp6g== + dependencies: + minimal-polyfills "^2.2.3" + run-exclusive "^2.2.19" + tsafe "^1.6.6" + execa@^5.0.0, execa@^5.1.1: version "5.1.1" resolved "https://registry.yarnpkg.com/execa/-/execa-5.1.1.tgz#f80ad9cbf4298f7bd1d4c9555c21e93741c411dd" @@ -5050,6 +5059,11 @@ mini-css-extract-plugin@2.9.0: schema-utils "^4.0.0" tapable "^2.2.1" +minimal-polyfills@^2.2.3: + version "2.2.3" + resolved "https://verdaccio.internal.euronovate.com/minimal-polyfills/-/minimal-polyfills-2.2.3.tgz#22af58de16807b325f29b83ca38ffb83e75ec3f4" + integrity sha512-oxdmJ9cL+xV72h0xYxp4tP2d5/fTBpP45H8DIOn9pASuF8a3IYTf+25fMGDYGiWW+MFsuog6KD6nfmhZJQ+uUw== + minimalistic-assert@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz#2e194de044626d4a10e7f7fbc00ce73e83e4d5c7" @@ -6111,6 +6125,13 @@ run-applescript@^7.0.0: resolved "https://registry.yarnpkg.com/run-applescript/-/run-applescript-7.0.0.tgz#e5a553c2bffd620e169d276c1cd8f1b64778fbeb" integrity sha512-9by4Ij99JUr/MCFBUkDKLWK3G9HVXmabKz9U5MlIAIuvuzkiOicRYs8XJLxX+xahD+mLiiCYDqF9dKAgtzKP1A== +run-exclusive@^2.2.19: + version "2.2.19" + resolved "https://verdaccio.internal.euronovate.com/run-exclusive/-/run-exclusive-2.2.19.tgz#37a2fb6e3671f8ae0d63521ebd1865fc796cf307" + integrity sha512-K3mdoAi7tjJ/qT7Flj90L7QyPozwUaAG+CVhkdDje4HLKXUYC3N/Jzkau3flHVDLQVhiHBtcimVodMjN9egYbA== + dependencies: + minimal-polyfills "^2.2.3" + run-parallel@^1.1.9: version "1.2.0" resolved "https://registry.yarnpkg.com/run-parallel/-/run-parallel-1.2.0.tgz#66d1368da7bdf921eb9d95bd1a9229e7f21a43ee" From 0edb48d152133831df7275c858355a06f721a132 Mon Sep 17 00:00:00 2001 From: Luca Peruzzo Date: Mon, 30 Sep 2024 18:43:06 +0200 Subject: [PATCH 43/64] spacing --- package.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index dc03783a..9b264067 100644 --- a/package.json +++ b/package.json @@ -64,8 +64,8 @@ "@angular/compiler-cli": "^18.2.6", "@angular/compiler": "^18.2.6", "ng-packagr": "^18.2.1", - "run-exclusive":"^2.2.19", - "evt":"^2.5.7", + "run-exclusive": "^2.2.19", + "evt": "^2.5.7", "tslib": "^2.7.0" }, "publishConfig": { From 796d457ad020fb15fa93f7023df0f22fb9107da4 Mon Sep 17 00:00:00 2001 From: Joseph Garrone Date: Mon, 30 Sep 2024 18:55:09 +0200 Subject: [PATCH 44/64] We don't need evt --- package.json | 1 - yarn.lock | 13 ++----------- 2 files changed, 2 insertions(+), 12 deletions(-) diff --git a/package.json b/package.json index 9b264067..b157d345 100644 --- a/package.json +++ b/package.json @@ -65,7 +65,6 @@ "@angular/compiler": "^18.2.6", "ng-packagr": "^18.2.1", "run-exclusive": "^2.2.19", - "evt": "^2.5.7", "tslib": "^2.7.0" }, "publishConfig": { diff --git a/yarn.lock b/yarn.lock index eda1645e..008dd956 100644 --- a/yarn.lock +++ b/yarn.lock @@ -3835,15 +3835,6 @@ events@^3.2.0: resolved "https://registry.yarnpkg.com/events/-/events-3.3.0.tgz#31a95ad0a924e2d2c419a813aeb2c4e878ea7400" integrity sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q== -evt@^2.5.7: - version "2.5.7" - resolved "https://verdaccio.internal.euronovate.com/evt/-/evt-2.5.7.tgz#55c5f8ff910f4b7531bfac91e963d4cb3231f253" - integrity sha512-dr7Wd16ry5F8WNU1xXLKpFpO3HsoAGg8zC48e08vDdzMzGWCP9/QFGt1PQptEEDh8SwYP3EL8M+d/Gb0kgUp6g== - dependencies: - minimal-polyfills "^2.2.3" - run-exclusive "^2.2.19" - tsafe "^1.6.6" - execa@^5.0.0, execa@^5.1.1: version "5.1.1" resolved "https://registry.yarnpkg.com/execa/-/execa-5.1.1.tgz#f80ad9cbf4298f7bd1d4c9555c21e93741c411dd" @@ -5061,7 +5052,7 @@ mini-css-extract-plugin@2.9.0: minimal-polyfills@^2.2.3: version "2.2.3" - resolved "https://verdaccio.internal.euronovate.com/minimal-polyfills/-/minimal-polyfills-2.2.3.tgz#22af58de16807b325f29b83ca38ffb83e75ec3f4" + resolved "https://registry.yarnpkg.com/minimal-polyfills/-/minimal-polyfills-2.2.3.tgz#22af58de16807b325f29b83ca38ffb83e75ec3f4" integrity sha512-oxdmJ9cL+xV72h0xYxp4tP2d5/fTBpP45H8DIOn9pASuF8a3IYTf+25fMGDYGiWW+MFsuog6KD6nfmhZJQ+uUw== minimalistic-assert@^1.0.0: @@ -6127,7 +6118,7 @@ run-applescript@^7.0.0: run-exclusive@^2.2.19: version "2.2.19" - resolved "https://verdaccio.internal.euronovate.com/run-exclusive/-/run-exclusive-2.2.19.tgz#37a2fb6e3671f8ae0d63521ebd1865fc796cf307" + resolved "https://registry.yarnpkg.com/run-exclusive/-/run-exclusive-2.2.19.tgz#37a2fb6e3671f8ae0d63521ebd1865fc796cf307" integrity sha512-K3mdoAi7tjJ/qT7Flj90L7QyPozwUaAG+CVhkdDje4HLKXUYC3N/Jzkau3flHVDLQVhiHBtcimVodMjN9egYbA== dependencies: minimal-polyfills "^2.2.3" From 5d647a8b6d77dfb5e01bc37d8240d6362bbd1faf Mon Sep 17 00:00:00 2001 From: Joseph Garrone Date: Mon, 30 Sep 2024 18:55:49 +0200 Subject: [PATCH 45/64] Use internal implem Deferred --- scripts/shared/startRebuildOnSrcChange.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/shared/startRebuildOnSrcChange.ts b/scripts/shared/startRebuildOnSrcChange.ts index 93766aae..8ac4c578 100644 --- a/scripts/shared/startRebuildOnSrcChange.ts +++ b/scripts/shared/startRebuildOnSrcChange.ts @@ -2,7 +2,7 @@ import * as child_process from 'child_process'; import { waitForDebounceFactory } from '../tools/waitForDebounce'; import chokidar from 'chokidar'; import * as runExclusive from 'run-exclusive'; -import { Deferred } from 'evt/tools/Deferred'; +import { Deferred } from '../tools/Deferred'; import chalk from 'chalk'; export function startRebuildOnSrcChange() { From 3d8c45478523d7310ad32eb55a7f1f261bc9dfa3 Mon Sep 17 00:00:00 2001 From: Joseph Garrone Date: Mon, 30 Sep 2024 18:56:08 +0200 Subject: [PATCH 46/64] Use .js instead of .mjs ext --- scripts/build/main.ts | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/scripts/build/main.ts b/scripts/build/main.ts index 4ec44283..39205de3 100644 --- a/scripts/build/main.ts +++ b/scripts/build/main.ts @@ -90,7 +90,12 @@ import { crawl } from '../tools/crawl'; return undefined; } - return { modifiedSourceCode: sourceCode }; + return { + newFileName: !fileRelativePath.endsWith('.mjs') + ? undefined + : pathBasename(fileRelativePath).replace(/\.mjs$/, '.js'), + modifiedSourceCode: sourceCode + }; } }); From b53eb9f09ba80fa1fee1544e6e1b1e71d49fc7da Mon Sep 17 00:00:00 2001 From: Joseph Garrone Date: Mon, 30 Sep 2024 18:56:24 +0200 Subject: [PATCH 47/64] Release candidate --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index b157d345..23191aba 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@keycloakify/angular", - "version": "0.0.1-rc.3", + "version": "0.0.1-rc.4", "description": "Angular components for Keycloakify", "repository": { "type": "git", From 8bf0f5ee4c5896634726af98fa8fe84d9a21b6f8 Mon Sep 17 00:00:00 2001 From: Luca Peruzzo Date: Mon, 30 Sep 2024 18:57:31 +0200 Subject: [PATCH 48/64] fix null injector --- .../providers/keycloakify-angular.providers.ts | 16 ++++++++++------ src/login/services/i18n.service.ts | 6 ++++++ 2 files changed, 16 insertions(+), 6 deletions(-) create mode 100644 src/login/services/i18n.service.ts diff --git a/src/login/providers/keycloakify-angular.providers.ts b/src/login/providers/keycloakify-angular.providers.ts index be5b5872..e052f99f 100644 --- a/src/login/providers/keycloakify-angular.providers.ts +++ b/src/login/providers/keycloakify-angular.providers.ts @@ -8,14 +8,13 @@ import { DO_MAKE_USER_CONFIRM_PASSWORD } from '@keycloakify/angular/login/tokens import { KcContextLike } from 'keycloakify/login/i18n/noJsx'; import { ClassKey } from 'keycloakify/login/lib/kcClsx'; import { KcContext } from '../KcContext'; +import { I18nService } from '@keycloakify/angular/login/services/i18n.service'; export type KeycloakifyAngularLoginConfig = { doMakeUserConfirmPassword?: boolean; doUseDefaultCss?: boolean; classes?: { [key in ClassKey]?: string }; - getI18n: (params: { - kcContext: KcContextLike; - }) => { + getI18n: (params: { kcContext: KcContextLike }) => { i18n: unknown; prI18n_currentLanguage: Promise | undefined; }; @@ -42,7 +41,7 @@ export const provideKeycloakifyAngularLogin = (config: KeycloakifyAngularLoginCo { provide: APP_INITIALIZER, multi: true, - useFactory: (_i18n: unknown, kcContext: KcContext) => async () => { + useFactory: (i18nService: I18nService, kcContext: KcContext) => async () => { const getI18n = config.getI18n; const { i18n, prI18n_currentLanguage } = getI18n({ @@ -53,11 +52,16 @@ export const provideKeycloakifyAngularLogin = (config: KeycloakifyAngularLoginCo i18nPromise = prI18n_currentLanguage; } return i18nPromise.then(i18n => { - _i18n = i18n; + i18nService.i18n = i18n; return true; }); }, - deps: [LOGIN_I18N, KC_LOGIN_CONTEXT] + deps: [I18nService, KC_LOGIN_CONTEXT] + }, + { + provide: LOGIN_I18N, + useFactory: (i18nService: I18nService) => i18nService.i18n, + deps: [I18nService] }, { provide: USE_DEFAULT_CSS, useValue: config?.doUseDefaultCss ?? true }, { provide: LOGIN_CLASSES, useValue: config?.classes ?? {} } diff --git a/src/login/services/i18n.service.ts b/src/login/services/i18n.service.ts new file mode 100644 index 00000000..77c99a99 --- /dev/null +++ b/src/login/services/i18n.service.ts @@ -0,0 +1,6 @@ +import { Injectable } from '@angular/core'; + +@Injectable({ providedIn: 'root' }) +export class I18nService { + i18n!: unknown; +} From 3df76cc7c410ede36c2e63f1c9baf145852b78d2 Mon Sep 17 00:00:00 2001 From: Luca Peruzzo Date: Mon, 30 Sep 2024 19:00:23 +0200 Subject: [PATCH 49/64] Release candidate --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 23191aba..d016f643 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@keycloakify/angular", - "version": "0.0.1-rc.4", + "version": "0.0.1-rc.5", "description": "Angular components for Keycloakify", "repository": { "type": "git", From 12187a59a449bdc99d64550a6490349181fe8cb6 Mon Sep 17 00:00:00 2001 From: Luca Peruzzo Date: Mon, 30 Sep 2024 19:44:50 +0200 Subject: [PATCH 50/64] import type --- src/login/DefaultPage.ts | 4 ++-- src/login/classes/component-reference.class.ts | 2 +- ...e-buttons-multi-valued-attribute.component.ts | 6 +++--- .../field-errors/field-errors.component.ts | 6 +++--- .../group-label/group-label.component.ts | 6 +++--- .../input-field-by-type.component.ts | 4 ++-- .../input-tag-selects.component.ts | 8 ++++---- .../components/input-tag/input-tag.component.ts | 6 +++--- .../logout-other-sessions.component.ts | 4 ++-- .../password-wrapper.component.ts | 4 ++-- .../select-tag/select-tag.component.ts | 8 ++++---- .../textarea-tag/textarea-tag.component.ts | 8 ++++---- .../user-profile-form-fields.component.ts | 8 ++++---- src/login/containers/template.component.ts | 12 ++++++------ src/login/directives/kc-class.directive.ts | 2 +- src/login/i18n.ts | 2 +- src/login/pages/code/code.component.ts | 6 +++--- .../delete-account-confirm.component.ts | 6 +++--- .../delete-credential.component.ts | 6 +++--- src/login/pages/error/error.component.ts | 6 +++--- .../frontchannel-logout.component.ts | 6 +++--- .../idp-review-user-profile.component.ts | 6 +++--- src/login/pages/info/info.component.ts | 6 +++--- .../login-config-totp.component.ts | 6 +++--- .../login-idp-link-confirm-override.component.ts | 6 +++--- .../login-idp-link-confirm.component.ts | 6 +++--- .../login-idp-link-email.component.ts | 6 +++--- .../login-oauth-grant.component.ts | 6 +++--- ...n-oauth2-device-verify-user-code.component.ts | 6 +++--- src/login/pages/login-otp/login-otp.component.ts | 6 +++--- .../login-page-expired.component.ts | 6 +++--- ...asskeys-conditional-authenticate.component.ts | 8 ++++---- .../login-password/login-password.component.ts | 6 +++--- ...login-recovery-authn-code-config.component.ts | 6 +++--- .../login-recovery-authn-code-input.component.ts | 6 +++--- .../login-reset-otp/login-reset-otp.component.ts | 6 +++--- .../login-reset-password.component.ts | 6 +++--- .../login-update-password.component.ts | 6 +++--- .../login-update-profile.component.ts | 6 +++--- .../login-username/login-username.component.ts | 6 +++--- .../login-verify-email.component.ts | 6 +++--- .../login-x509-info/login-x509-info.component.ts | 6 +++--- src/login/pages/login/login.component.ts | 6 +++--- .../logout-confirm/logout-confirm.component.ts | 6 +++--- src/login/pages/register/register.component.ts | 6 +++--- .../saml-post-form/saml-post-form.component.ts | 6 +++--- .../select-authenticator.component.ts | 6 +++--- src/login/pages/terms/terms.component.ts | 6 +++--- .../pages/update-email/update-email.component.ts | 6 +++--- .../webauthn-authenticate.component.ts | 8 ++++---- .../webauthn-error/webauthn-error.component.ts | 6 +++--- .../webauthn-register.component.ts | 10 +++++----- .../providers/keycloakify-angular.providers.ts | 6 +++--- src/login/services/i18n.service.ts | 1 + .../services/login-resource-injector.service.ts | 4 ++-- src/login/services/user-profile-form.service.ts | 16 ++++++++-------- src/login/tokens/classes.token.ts | 2 +- 57 files changed, 172 insertions(+), 171 deletions(-) diff --git a/src/login/DefaultPage.ts b/src/login/DefaultPage.ts index 612060f6..613b64a1 100644 --- a/src/login/DefaultPage.ts +++ b/src/login/DefaultPage.ts @@ -1,6 +1,6 @@ import { Type } from '@angular/core'; -import { ClassKey } from 'keycloakify/login/lib/kcClsx'; -import { KcContext } from 'keycloakify/login/KcContext'; +import { type ClassKey } from 'keycloakify/login/lib/kcClsx'; +import { type KcContext } from './KcContext'; const DefaultPage = async ( pageId: KcContext['pageId'], diff --git a/src/login/classes/component-reference.class.ts b/src/login/classes/component-reference.class.ts index ff7fe22e..713b2504 100644 --- a/src/login/classes/component-reference.class.ts +++ b/src/login/classes/component-reference.class.ts @@ -1,4 +1,4 @@ -import { ClassKey } from 'keycloakify/login/lib/kcClsx'; +import { type ClassKey } from 'keycloakify/login/lib/kcClsx'; export abstract class ComponentReference { doUseDefaultCss: boolean | undefined; classes: Partial> | undefined; diff --git a/src/login/components/add-remove-buttons-multi-valued-attribute/add-remove-buttons-multi-valued-attribute.component.ts b/src/login/components/add-remove-buttons-multi-valued-attribute/add-remove-buttons-multi-valued-attribute.component.ts index 67c25897..a33b205f 100644 --- a/src/login/components/add-remove-buttons-multi-valued-attribute/add-remove-buttons-multi-valued-attribute.component.ts +++ b/src/login/components/add-remove-buttons-multi-valued-attribute/add-remove-buttons-multi-valued-attribute.component.ts @@ -1,8 +1,8 @@ import { ChangeDetectionStrategy, Component, computed, inject, input, output } from '@angular/core'; -import { FormAction } from '@keycloakify/angular/login/services/user-profile-form.service'; +import { type FormAction } from '@keycloakify/angular/login/services/user-profile-form.service'; import { LOGIN_I18N } from '@keycloakify/angular/login/tokens/i18n.token'; -import { Attribute } from 'keycloakify/login/KcContext'; -import { I18n } from '../../i18n'; +import { type Attribute } from 'keycloakify/login/KcContext'; +import { type I18n } from '../../i18n'; @Component({ standalone: true, diff --git a/src/login/components/field-errors/field-errors.component.ts b/src/login/components/field-errors/field-errors.component.ts index e2ce538e..acfe387a 100644 --- a/src/login/components/field-errors/field-errors.component.ts +++ b/src/login/components/field-errors/field-errors.component.ts @@ -2,10 +2,10 @@ import { ChangeDetectionStrategy, Component, forwardRef, inject, input } from '@ import { USE_DEFAULT_CSS } from '@keycloakify/angular/lib/tokens/use-default-css.token'; import { ComponentReference } from '@keycloakify/angular/login/classes/component-reference.class'; import { KcClassDirective } from '@keycloakify/angular/login/directives/kc-class.directive'; -import { FormFieldError } from '@keycloakify/angular/login/services/user-profile-form.service'; +import { type FormFieldError } from '@keycloakify/angular/login/services/user-profile-form.service'; import { LOGIN_CLASSES } from '@keycloakify/angular/login/tokens/classes.token'; -import { Attribute } from 'keycloakify/login/KcContext'; -import { ClassKey } from 'keycloakify/login/lib/kcClsx'; +import { type Attribute } from 'keycloakify/login/KcContext'; +import { type ClassKey } from 'keycloakify/login/lib/kcClsx'; @Component({ standalone: true, diff --git a/src/login/components/group-label/group-label.component.ts b/src/login/components/group-label/group-label.component.ts index 4958ed01..c9daa65c 100644 --- a/src/login/components/group-label/group-label.component.ts +++ b/src/login/components/group-label/group-label.component.ts @@ -5,9 +5,9 @@ import { AttributesDirective } from '@keycloakify/angular/login/directives/attri import { KcClassDirective } from '@keycloakify/angular/login/directives/kc-class.directive'; import { LOGIN_CLASSES } from '@keycloakify/angular/login/tokens/classes.token'; import { LOGIN_I18N } from '@keycloakify/angular/login/tokens/i18n.token'; -import { Attribute } from 'keycloakify/login/KcContext'; -import { ClassKey } from 'keycloakify/login/lib/kcClsx'; -import { I18n } from '../../i18n'; +import { type Attribute } from 'keycloakify/login/KcContext'; +import { type ClassKey } from 'keycloakify/login/lib/kcClsx'; +import { type I18n } from '../../i18n'; @Component({ standalone: true, diff --git a/src/login/components/input-field-by-type/input-field-by-type.component.ts b/src/login/components/input-field-by-type/input-field-by-type.component.ts index b505571a..b89db71d 100644 --- a/src/login/components/input-field-by-type/input-field-by-type.component.ts +++ b/src/login/components/input-field-by-type/input-field-by-type.component.ts @@ -1,8 +1,8 @@ import { ChangeDetectionStrategy, Component, computed, forwardRef, inject, input, output } from '@angular/core'; import { USE_DEFAULT_CSS } from '@keycloakify/angular/lib/tokens/use-default-css.token'; import { LOGIN_CLASSES } from '@keycloakify/angular/login/tokens/classes.token'; -import { Attribute } from 'keycloakify/login/KcContext'; -import { ClassKey } from 'keycloakify/login/lib/kcClsx'; +import { type Attribute } from 'keycloakify/login/KcContext'; +import { type ClassKey } from 'keycloakify/login/lib/kcClsx'; import { ComponentReference } from '@keycloakify/angular/login/classes/component-reference.class'; import { ToArrayPipe } from '@keycloakify/angular/login/pipes/to-array.pipe'; import { FormAction, FormFieldError } from '@keycloakify/angular/login/services/user-profile-form.service'; diff --git a/src/login/components/input-tag-selects/input-tag-selects.component.ts b/src/login/components/input-tag-selects/input-tag-selects.component.ts index 484ac00c..e7ded529 100644 --- a/src/login/components/input-tag-selects/input-tag-selects.component.ts +++ b/src/login/components/input-tag-selects/input-tag-selects.component.ts @@ -2,12 +2,12 @@ import { ChangeDetectionStrategy, Component, computed, forwardRef, inject, input import { USE_DEFAULT_CSS } from '@keycloakify/angular/lib/tokens/use-default-css.token'; import { ComponentReference } from '@keycloakify/angular/login/classes/component-reference.class'; import { KcClassDirective } from '@keycloakify/angular/login/directives/kc-class.directive'; -import { FormAction, FormFieldError } from '@keycloakify/angular/login/services/user-profile-form.service'; +import { type FormAction, type FormFieldError } from '@keycloakify/angular/login/services/user-profile-form.service'; import { LOGIN_CLASSES } from '@keycloakify/angular/login/tokens/classes.token'; import { LOGIN_I18N } from '@keycloakify/angular/login/tokens/i18n.token'; -import { Attribute } from 'keycloakify/login/KcContext'; -import { ClassKey } from 'keycloakify/login/lib/kcClsx'; -import { I18n } from '../../i18n'; +import { type Attribute } from 'keycloakify/login/KcContext'; +import { type ClassKey } from 'keycloakify/login/lib/kcClsx'; +import { type I18n } from '../../i18n'; @Component({ standalone: true, diff --git a/src/login/components/input-tag/input-tag.component.ts b/src/login/components/input-tag/input-tag.component.ts index cbe91541..59db626c 100644 --- a/src/login/components/input-tag/input-tag.component.ts +++ b/src/login/components/input-tag/input-tag.component.ts @@ -11,9 +11,9 @@ import { ToNumberPipe } from '@keycloakify/angular/login/pipes/to-number.pipe'; import { FormAction, FormFieldError } from '@keycloakify/angular/login/services/user-profile-form.service'; import { LOGIN_CLASSES } from '@keycloakify/angular/login/tokens/classes.token'; import { LOGIN_I18N } from '@keycloakify/angular/login/tokens/i18n.token'; -import { Attribute } from 'keycloakify/login/KcContext'; -import { ClassKey } from 'keycloakify/login/lib/kcClsx'; -import { I18n } from '../../i18n'; +import { type Attribute } from 'keycloakify/login/KcContext'; +import { type ClassKey } from 'keycloakify/login/lib/kcClsx'; +import { type I18n } from '../../i18n'; @Component({ standalone: true, diff --git a/src/login/components/logout-other-sessions/logout-other-sessions.component.ts b/src/login/components/logout-other-sessions/logout-other-sessions.component.ts index 0dbda2a0..148f75f2 100644 --- a/src/login/components/logout-other-sessions/logout-other-sessions.component.ts +++ b/src/login/components/logout-other-sessions/logout-other-sessions.component.ts @@ -4,8 +4,8 @@ import { ComponentReference } from '@keycloakify/angular/login/classes/component import { KcClassDirective } from '@keycloakify/angular/login/directives/kc-class.directive'; import { LOGIN_CLASSES } from '@keycloakify/angular/login/tokens/classes.token'; import { LOGIN_I18N } from '@keycloakify/angular/login/tokens/i18n.token'; -import { ClassKey } from 'keycloakify/login/lib/kcClsx'; -import { I18n } from '../../i18n'; +import { type ClassKey } from 'keycloakify/login/lib/kcClsx'; +import { type I18n } from '../../i18n'; @Component({ selector: 'kc-logout-other-sessions', diff --git a/src/login/components/password-wrapper/password-wrapper.component.ts b/src/login/components/password-wrapper/password-wrapper.component.ts index e93ef7b9..2b277ae3 100644 --- a/src/login/components/password-wrapper/password-wrapper.component.ts +++ b/src/login/components/password-wrapper/password-wrapper.component.ts @@ -5,8 +5,8 @@ import { ComponentReference } from '@keycloakify/angular/login/classes/component import { KcClassDirective } from '@keycloakify/angular/login/directives/kc-class.directive'; import { LOGIN_CLASSES } from '@keycloakify/angular/login/tokens/classes.token'; import { LOGIN_I18N } from '@keycloakify/angular/login/tokens/i18n.token'; -import { ClassKey } from 'keycloakify/login/lib/kcClsx'; -import { I18n } from '../../i18n'; +import { type ClassKey } from 'keycloakify/login/lib/kcClsx'; +import { type I18n } from '../../i18n'; @Component({ selector: 'kc-password-wrapper', diff --git a/src/login/components/select-tag/select-tag.component.ts b/src/login/components/select-tag/select-tag.component.ts index f252d51a..d4933fee 100644 --- a/src/login/components/select-tag/select-tag.component.ts +++ b/src/login/components/select-tag/select-tag.component.ts @@ -3,12 +3,12 @@ import { USE_DEFAULT_CSS } from '@keycloakify/angular/lib/tokens/use-default-css import { ComponentReference } from '@keycloakify/angular/login/classes/component-reference.class'; import { KcClassDirective } from '@keycloakify/angular/login/directives/kc-class.directive'; import { ToNumberPipe } from '@keycloakify/angular/login/pipes/to-number.pipe'; -import { FormAction, FormFieldError } from '@keycloakify/angular/login/services/user-profile-form.service'; +import { type FormAction, type FormFieldError } from '@keycloakify/angular/login/services/user-profile-form.service'; import { LOGIN_CLASSES } from '@keycloakify/angular/login/tokens/classes.token'; import { LOGIN_I18N } from '@keycloakify/angular/login/tokens/i18n.token'; -import { Attribute } from 'keycloakify/login/KcContext'; -import { ClassKey } from 'keycloakify/login/lib/kcClsx'; -import { I18n } from '../../i18n'; +import { type Attribute } from 'keycloakify/login/KcContext'; +import { type ClassKey } from 'keycloakify/login/lib/kcClsx'; +import { type I18n } from '../../i18n'; @Component({ standalone: true, diff --git a/src/login/components/textarea-tag/textarea-tag.component.ts b/src/login/components/textarea-tag/textarea-tag.component.ts index 59db33d1..66876ff0 100644 --- a/src/login/components/textarea-tag/textarea-tag.component.ts +++ b/src/login/components/textarea-tag/textarea-tag.component.ts @@ -1,12 +1,12 @@ import { ChangeDetectionStrategy, Component, forwardRef, inject, input, output } from '@angular/core'; import { USE_DEFAULT_CSS } from '@keycloakify/angular/lib/tokens/use-default-css.token'; -import { LOGIN_CLASSES } from '@keycloakify/angular/login/tokens/classes.token'; -import { Attribute } from 'keycloakify/login/KcContext'; -import { ClassKey } from 'keycloakify/login/lib/kcClsx'; import { ComponentReference } from '@keycloakify/angular/login/classes/component-reference.class'; import { KcClassDirective } from '@keycloakify/angular/login/directives/kc-class.directive'; import { ToNumberPipe } from '@keycloakify/angular/login/pipes/to-number.pipe'; -import { FormAction, FormFieldError } from '@keycloakify/angular/login/services/user-profile-form.service'; +import { type FormAction, type FormFieldError } from '@keycloakify/angular/login/services/user-profile-form.service'; +import { LOGIN_CLASSES } from '@keycloakify/angular/login/tokens/classes.token'; +import { type Attribute } from 'keycloakify/login/KcContext'; +import { type ClassKey } from 'keycloakify/login/lib/kcClsx'; @Component({ standalone: true, diff --git a/src/login/components/user-profile-form-fields/user-profile-form-fields.component.ts b/src/login/components/user-profile-form-fields/user-profile-form-fields.component.ts index d7f2b8b6..ec7c5f2b 100644 --- a/src/login/components/user-profile-form-fields/user-profile-form-fields.component.ts +++ b/src/login/components/user-profile-form-fields/user-profile-form-fields.component.ts @@ -6,14 +6,14 @@ import { FieldErrorsComponent } from '@keycloakify/angular/login/components/fiel import { GroupLabelComponent } from '@keycloakify/angular/login/components/group-label/group-label.component'; import { InputFieldByTypeComponent } from '@keycloakify/angular/login/components/input-field-by-type/input-field-by-type.component'; import { KcClassDirective } from '@keycloakify/angular/login/directives/kc-class.directive'; -import { FormAction, UserProfileFormService } from '@keycloakify/angular/login/services/user-profile-form.service'; +import { type FormAction, UserProfileFormService } from '@keycloakify/angular/login/services/user-profile-form.service'; import { LOGIN_CLASSES } from '@keycloakify/angular/login/tokens/classes.token'; import { LOGIN_I18N } from '@keycloakify/angular/login/tokens/i18n.token'; import { KC_LOGIN_CONTEXT } from '@keycloakify/angular/login/tokens/kc-context.token'; import { DO_MAKE_USER_CONFIRM_PASSWORD } from '@keycloakify/angular/login/tokens/make-user-confirm-password.token'; -import { KcContext } from 'keycloakify/login/KcContext'; -import { ClassKey } from 'keycloakify/login/lib/kcClsx'; -import { I18n } from '../../i18n'; +import { type ClassKey } from 'keycloakify/login/lib/kcClsx'; +import { type I18n } from '../../i18n'; +import { type KcContext } from '../../KcContext'; @Component({ standalone: true, diff --git a/src/login/containers/template.component.ts b/src/login/containers/template.component.ts index 6a4b8d30..6f626a07 100644 --- a/src/login/containers/template.component.ts +++ b/src/login/containers/template.component.ts @@ -1,18 +1,18 @@ import { AsyncPipe, NgTemplateOutlet } from '@angular/common'; import { ChangeDetectionStrategy, Component, forwardRef, inject, input, OnInit, Renderer2 } from '@angular/core'; import { Meta, Title } from '@angular/platform-browser'; -import type { I18n } from '@keycloakify/angular/login/i18n'; -import { KcContext } from 'keycloakify/login/KcContext/KcContext'; -import { ClassKey, getKcClsx } from 'keycloakify/login/lib/kcClsx'; -import { Observable } from 'rxjs'; +import { USE_DEFAULT_CSS } from '@keycloakify/angular/lib/tokens/use-default-css.token'; import { ComponentReference } from '@keycloakify/angular/login/classes/component-reference.class'; import { KcClassDirective } from '@keycloakify/angular/login/directives/kc-class.directive'; +import type { I18n } from '@keycloakify/angular/login/i18n'; import { KcSanitizePipe } from '@keycloakify/angular/login/pipes/kc-sanitize.pipe'; import { LoginResourceInjectorService } from '@keycloakify/angular/login/services/login-resource-injector.service'; -import { LOGIN_I18N } from '@keycloakify/angular/login/tokens/i18n.token'; import { LOGIN_CLASSES } from '@keycloakify/angular/login/tokens/classes.token'; +import { LOGIN_I18N } from '@keycloakify/angular/login/tokens/i18n.token'; import { KC_LOGIN_CONTEXT } from '@keycloakify/angular/login/tokens/kc-context.token'; -import { USE_DEFAULT_CSS } from '@keycloakify/angular/lib/tokens/use-default-css.token'; +import { KcContext } from 'keycloakify/login/KcContext/KcContext'; +import { type ClassKey, getKcClsx } from 'keycloakify/login/lib/kcClsx'; +import { Observable } from 'rxjs'; @Component({ selector: 'kc-login-template', diff --git a/src/login/directives/kc-class.directive.ts b/src/login/directives/kc-class.directive.ts index 817aec91..c1b16580 100644 --- a/src/login/directives/kc-class.directive.ts +++ b/src/login/directives/kc-class.directive.ts @@ -10,7 +10,7 @@ import { Renderer2, ɵstringify as stringify } from '@angular/core'; -import { ClassKey } from 'keycloakify/login/lib/kcClsx'; +import { type ClassKey } from 'keycloakify/login/lib/kcClsx'; import { getKcClsx } from 'keycloakify/login/lib/kcClsx'; import { ComponentReference } from '../classes/component-reference.class'; diff --git a/src/login/i18n.ts b/src/login/i18n.ts index 1f9871ae..784441d0 100644 --- a/src/login/i18n.ts +++ b/src/login/i18n.ts @@ -1,4 +1,4 @@ import type { GenericI18n_noJsx } from 'keycloakify/login/i18n/noJsx/GenericI18n_noJsx'; -import { MessageKey as MessageKey_defaultSet } from 'keycloakify/login/i18n/messages_defaultSet/types'; +import { type MessageKey as MessageKey_defaultSet } from 'keycloakify/login/i18n/messages_defaultSet/types'; /** INTERNAL: DO NOT IMPORT THIS */ export type I18n = GenericI18n_noJsx; diff --git a/src/login/pages/code/code.component.ts b/src/login/pages/code/code.component.ts index ffb08f3f..6ed52c74 100644 --- a/src/login/pages/code/code.component.ts +++ b/src/login/pages/code/code.component.ts @@ -5,10 +5,10 @@ import { KC_LOGIN_CONTEXT } from '@keycloakify/angular/login/tokens/kc-context.t import { ComponentReference } from '@keycloakify/angular/login/classes/component-reference.class'; import { TemplateComponent } from '@keycloakify/angular/login/containers/template.component'; import { KcClassDirective } from '@keycloakify/angular/login/directives/kc-class.directive'; -import { ClassKey } from 'keycloakify/login/lib/kcClsx'; -import { KcContext } from '../../KcContext'; +import { type ClassKey } from 'keycloakify/login/lib/kcClsx'; +import { type KcContext } from '../../KcContext'; import { LOGIN_I18N } from '@keycloakify/angular/login/tokens/i18n.token'; -import { I18n } from '../../i18n'; +import { type I18n } from '../../i18n'; @Component({ standalone: true, diff --git a/src/login/pages/delete-account-confirm/delete-account-confirm.component.ts b/src/login/pages/delete-account-confirm/delete-account-confirm.component.ts index df58911b..4818476e 100644 --- a/src/login/pages/delete-account-confirm/delete-account-confirm.component.ts +++ b/src/login/pages/delete-account-confirm/delete-account-confirm.component.ts @@ -6,9 +6,9 @@ import { KcClassDirective } from '@keycloakify/angular/login/directives/kc-class import { LOGIN_CLASSES } from '@keycloakify/angular/login/tokens/classes.token'; import { LOGIN_I18N } from '@keycloakify/angular/login/tokens/i18n.token'; import { KC_LOGIN_CONTEXT } from '@keycloakify/angular/login/tokens/kc-context.token'; -import { ClassKey } from 'keycloakify/login/lib/kcClsx'; -import { I18n } from '../../i18n'; -import { KcContext } from '../../KcContext'; +import { type ClassKey } from 'keycloakify/login/lib/kcClsx'; +import { type I18n } from '../../i18n'; +import { type KcContext } from '../../KcContext'; @Component({ standalone: true, diff --git a/src/login/pages/delete-credential/delete-credential.component.ts b/src/login/pages/delete-credential/delete-credential.component.ts index 1751a639..e36135a6 100644 --- a/src/login/pages/delete-credential/delete-credential.component.ts +++ b/src/login/pages/delete-credential/delete-credential.component.ts @@ -6,9 +6,9 @@ import { KcClassDirective } from '@keycloakify/angular/login/directives/kc-class import { LOGIN_CLASSES } from '@keycloakify/angular/login/tokens/classes.token'; import { LOGIN_I18N } from '@keycloakify/angular/login/tokens/i18n.token'; import { KC_LOGIN_CONTEXT } from '@keycloakify/angular/login/tokens/kc-context.token'; -import { ClassKey } from 'keycloakify/login/lib/kcClsx'; -import { I18n } from '../../i18n'; -import { KcContext } from '../../KcContext'; +import { type ClassKey } from 'keycloakify/login/lib/kcClsx'; +import { type I18n } from '../../i18n'; +import { type KcContext } from '../../KcContext'; @Component({ standalone: true, diff --git a/src/login/pages/error/error.component.ts b/src/login/pages/error/error.component.ts index 27a07d46..03661c3c 100644 --- a/src/login/pages/error/error.component.ts +++ b/src/login/pages/error/error.component.ts @@ -4,11 +4,11 @@ import { ComponentReference } from '@keycloakify/angular/login/classes/component import { TemplateComponent } from '@keycloakify/angular/login/containers/template.component'; import { KcSanitizePipe } from '@keycloakify/angular/login/pipes/kc-sanitize.pipe'; import { LOGIN_I18N } from '@keycloakify/angular/login/tokens/i18n.token'; -import { I18n } from '../../i18n'; +import { type I18n } from '../../i18n'; import { LOGIN_CLASSES } from '@keycloakify/angular/login/tokens/classes.token'; import { KC_LOGIN_CONTEXT } from '@keycloakify/angular/login/tokens/kc-context.token'; -import { ClassKey } from 'keycloakify/login/lib/kcClsx'; -import { KcContext } from '../../KcContext'; +import { type ClassKey } from 'keycloakify/login/lib/kcClsx'; +import { type KcContext } from '../../KcContext'; @Component({ standalone: true, diff --git a/src/login/pages/frontchannel-logout/frontchannel-logout.component.ts b/src/login/pages/frontchannel-logout/frontchannel-logout.component.ts index fd10a821..e23defff 100644 --- a/src/login/pages/frontchannel-logout/frontchannel-logout.component.ts +++ b/src/login/pages/frontchannel-logout/frontchannel-logout.component.ts @@ -4,11 +4,11 @@ import { ComponentReference } from '@keycloakify/angular/login/classes/component import { TemplateComponent } from '@keycloakify/angular/login/containers/template.component'; import { KcSanitizePipe } from '@keycloakify/angular/login/pipes/kc-sanitize.pipe'; import { LOGIN_I18N } from '@keycloakify/angular/login/tokens/i18n.token'; -import { I18n } from '../../i18n'; +import { type I18n } from '../../i18n'; import { LOGIN_CLASSES } from '@keycloakify/angular/login/tokens/classes.token'; import { KC_LOGIN_CONTEXT } from '@keycloakify/angular/login/tokens/kc-context.token'; -import { ClassKey } from 'keycloakify/login/lib/kcClsx'; -import { KcContext } from '../../KcContext'; +import { type ClassKey } from 'keycloakify/login/lib/kcClsx'; +import { type KcContext } from '../../KcContext'; @Component({ standalone: true, diff --git a/src/login/pages/idp-review-user-profile/idp-review-user-profile.component.ts b/src/login/pages/idp-review-user-profile/idp-review-user-profile.component.ts index f8d6908e..793c1f88 100644 --- a/src/login/pages/idp-review-user-profile/idp-review-user-profile.component.ts +++ b/src/login/pages/idp-review-user-profile/idp-review-user-profile.component.ts @@ -5,11 +5,11 @@ import { UserProfileFormFieldsComponent } from '@keycloakify/angular/login/compo import { TemplateComponent } from '@keycloakify/angular/login/containers/template.component'; import { KcClassDirective } from '@keycloakify/angular/login/directives/kc-class.directive'; import { LOGIN_I18N } from '@keycloakify/angular/login/tokens/i18n.token'; -import { I18n } from '../../i18n'; +import { type I18n } from '../../i18n'; import { LOGIN_CLASSES } from '@keycloakify/angular/login/tokens/classes.token'; import { KC_LOGIN_CONTEXT } from '@keycloakify/angular/login/tokens/kc-context.token'; -import { ClassKey } from 'keycloakify/login/lib/kcClsx'; -import { KcContext } from '../../KcContext'; +import { type ClassKey } from 'keycloakify/login/lib/kcClsx'; +import { type KcContext } from '../../KcContext'; @Component({ standalone: true, diff --git a/src/login/pages/info/info.component.ts b/src/login/pages/info/info.component.ts index 80b47350..fdcd0d5a 100644 --- a/src/login/pages/info/info.component.ts +++ b/src/login/pages/info/info.component.ts @@ -6,9 +6,9 @@ import { KcSanitizePipe } from '@keycloakify/angular/login/pipes/kc-sanitize.pip import { LOGIN_CLASSES } from '@keycloakify/angular/login/tokens/classes.token'; import { LOGIN_I18N } from '@keycloakify/angular/login/tokens/i18n.token'; import { KC_LOGIN_CONTEXT } from '@keycloakify/angular/login/tokens/kc-context.token'; -import { ClassKey } from 'keycloakify/login/lib/kcClsx'; -import { I18n } from '../../i18n'; -import { KcContext } from '../../KcContext'; +import { type ClassKey } from 'keycloakify/login/lib/kcClsx'; +import { type I18n } from '../../i18n'; +import { type KcContext } from '../../KcContext'; @Component({ standalone: true, diff --git a/src/login/pages/login-config-totp/login-config-totp.component.ts b/src/login/pages/login-config-totp/login-config-totp.component.ts index daeb0f18..573c9912 100644 --- a/src/login/pages/login-config-totp/login-config-totp.component.ts +++ b/src/login/pages/login-config-totp/login-config-totp.component.ts @@ -8,9 +8,9 @@ import { KcSanitizePipe } from '@keycloakify/angular/login/pipes/kc-sanitize.pip import { LOGIN_CLASSES } from '@keycloakify/angular/login/tokens/classes.token'; import { LOGIN_I18N } from '@keycloakify/angular/login/tokens/i18n.token'; import { KC_LOGIN_CONTEXT } from '@keycloakify/angular/login/tokens/kc-context.token'; -import { ClassKey } from 'keycloakify/login/lib/kcClsx'; -import { I18n } from '../../i18n'; -import { KcContext } from '../../KcContext'; +import { type ClassKey } from 'keycloakify/login/lib/kcClsx'; +import { type I18n } from '../../i18n'; +import { type KcContext } from '../../KcContext'; @Component({ standalone: true, diff --git a/src/login/pages/login-idp-link-confirm-override/login-idp-link-confirm-override.component.ts b/src/login/pages/login-idp-link-confirm-override/login-idp-link-confirm-override.component.ts index 4198ee7e..ac584b3a 100644 --- a/src/login/pages/login-idp-link-confirm-override/login-idp-link-confirm-override.component.ts +++ b/src/login/pages/login-idp-link-confirm-override/login-idp-link-confirm-override.component.ts @@ -4,11 +4,11 @@ import { ComponentReference } from '@keycloakify/angular/login/classes/component import { TemplateComponent } from '@keycloakify/angular/login/containers/template.component'; import { KcClassDirective } from '@keycloakify/angular/login/directives/kc-class.directive'; import { LOGIN_I18N } from '@keycloakify/angular/login/tokens/i18n.token'; -import { I18n } from '../../i18n'; +import { type I18n } from '../../i18n'; import { LOGIN_CLASSES } from '@keycloakify/angular/login/tokens/classes.token'; import { KC_LOGIN_CONTEXT } from '@keycloakify/angular/login/tokens/kc-context.token'; -import { ClassKey } from 'keycloakify/login/lib/kcClsx'; -import { KcContext } from '../../KcContext'; +import { type ClassKey } from 'keycloakify/login/lib/kcClsx'; +import { type KcContext } from '../../KcContext'; @Component({ standalone: true, diff --git a/src/login/pages/login-idp-link-confirm/login-idp-link-confirm.component.ts b/src/login/pages/login-idp-link-confirm/login-idp-link-confirm.component.ts index b91c0e48..d59b16ed 100644 --- a/src/login/pages/login-idp-link-confirm/login-idp-link-confirm.component.ts +++ b/src/login/pages/login-idp-link-confirm/login-idp-link-confirm.component.ts @@ -6,9 +6,9 @@ import { KcClassDirective } from '@keycloakify/angular/login/directives/kc-class import { LOGIN_CLASSES } from '@keycloakify/angular/login/tokens/classes.token'; import { LOGIN_I18N } from '@keycloakify/angular/login/tokens/i18n.token'; import { KC_LOGIN_CONTEXT } from '@keycloakify/angular/login/tokens/kc-context.token'; -import { ClassKey } from 'keycloakify/login/lib/kcClsx'; -import { I18n } from '../../i18n'; -import { KcContext } from '../../KcContext'; +import { type ClassKey } from 'keycloakify/login/lib/kcClsx'; +import { type I18n } from '../../i18n'; +import { type KcContext } from '../../KcContext'; @Component({ standalone: true, diff --git a/src/login/pages/login-idp-link-email/login-idp-link-email.component.ts b/src/login/pages/login-idp-link-email/login-idp-link-email.component.ts index 0fcb1d8c..d8411d65 100644 --- a/src/login/pages/login-idp-link-email/login-idp-link-email.component.ts +++ b/src/login/pages/login-idp-link-email/login-idp-link-email.component.ts @@ -4,11 +4,11 @@ import { ComponentReference } from '@keycloakify/angular/login/classes/component import { TemplateComponent } from '@keycloakify/angular/login/containers/template.component'; import { KcClassDirective } from '@keycloakify/angular/login/directives/kc-class.directive'; import { LOGIN_I18N } from '@keycloakify/angular/login/tokens/i18n.token'; -import { I18n } from '../../i18n'; +import { type I18n } from '../../i18n'; import { LOGIN_CLASSES } from '@keycloakify/angular/login/tokens/classes.token'; import { KC_LOGIN_CONTEXT } from '@keycloakify/angular/login/tokens/kc-context.token'; -import { ClassKey } from 'keycloakify/login/lib/kcClsx'; -import { KcContext } from '../../KcContext'; +import { type ClassKey } from 'keycloakify/login/lib/kcClsx'; +import { type KcContext } from '../../KcContext'; @Component({ standalone: true, diff --git a/src/login/pages/login-oauth-grant/login-oauth-grant.component.ts b/src/login/pages/login-oauth-grant/login-oauth-grant.component.ts index 71a8e476..0cc781a6 100644 --- a/src/login/pages/login-oauth-grant/login-oauth-grant.component.ts +++ b/src/login/pages/login-oauth-grant/login-oauth-grant.component.ts @@ -6,9 +6,9 @@ import { KcClassDirective } from '@keycloakify/angular/login/directives/kc-class import { LOGIN_CLASSES } from '@keycloakify/angular/login/tokens/classes.token'; import { LOGIN_I18N } from '@keycloakify/angular/login/tokens/i18n.token'; import { KC_LOGIN_CONTEXT } from '@keycloakify/angular/login/tokens/kc-context.token'; -import { ClassKey } from 'keycloakify/login/lib/kcClsx'; -import { I18n } from '../../i18n'; -import { KcContext } from '../../KcContext'; +import { type ClassKey } from 'keycloakify/login/lib/kcClsx'; +import { type I18n } from '../../i18n'; +import { type KcContext } from '../../KcContext'; @Component({ standalone: true, diff --git a/src/login/pages/login-oauth2-device-verify-user-code/login-oauth2-device-verify-user-code.component.ts b/src/login/pages/login-oauth2-device-verify-user-code/login-oauth2-device-verify-user-code.component.ts index 5791523a..88e2e1d8 100644 --- a/src/login/pages/login-oauth2-device-verify-user-code/login-oauth2-device-verify-user-code.component.ts +++ b/src/login/pages/login-oauth2-device-verify-user-code/login-oauth2-device-verify-user-code.component.ts @@ -6,9 +6,9 @@ import { KcClassDirective } from '@keycloakify/angular/login/directives/kc-class import { LOGIN_CLASSES } from '@keycloakify/angular/login/tokens/classes.token'; import { LOGIN_I18N } from '@keycloakify/angular/login/tokens/i18n.token'; import { KC_LOGIN_CONTEXT } from '@keycloakify/angular/login/tokens/kc-context.token'; -import { ClassKey } from 'keycloakify/login/lib/kcClsx'; -import { I18n } from '../../i18n'; -import { KcContext } from '../../KcContext'; +import { type ClassKey } from 'keycloakify/login/lib/kcClsx'; +import { type I18n } from '../../i18n'; +import { type KcContext } from '../../KcContext'; @Component({ standalone: true, diff --git a/src/login/pages/login-otp/login-otp.component.ts b/src/login/pages/login-otp/login-otp.component.ts index d231922f..62e7c53d 100644 --- a/src/login/pages/login-otp/login-otp.component.ts +++ b/src/login/pages/login-otp/login-otp.component.ts @@ -7,9 +7,9 @@ import { KcSanitizePipe } from '@keycloakify/angular/login/pipes/kc-sanitize.pip import { LOGIN_CLASSES } from '@keycloakify/angular/login/tokens/classes.token'; import { LOGIN_I18N } from '@keycloakify/angular/login/tokens/i18n.token'; import { KC_LOGIN_CONTEXT } from '@keycloakify/angular/login/tokens/kc-context.token'; -import { ClassKey } from 'keycloakify/login/lib/kcClsx'; -import { I18n } from '../../i18n'; -import { KcContext } from '../../KcContext'; +import { type ClassKey } from 'keycloakify/login/lib/kcClsx'; +import { type I18n } from '../../i18n'; +import { type KcContext } from '../../KcContext'; @Component({ standalone: true, diff --git a/src/login/pages/login-page-expired/login-page-expired.component.ts b/src/login/pages/login-page-expired/login-page-expired.component.ts index bf05a9c8..fd454440 100644 --- a/src/login/pages/login-page-expired/login-page-expired.component.ts +++ b/src/login/pages/login-page-expired/login-page-expired.component.ts @@ -5,9 +5,9 @@ import { TemplateComponent } from '@keycloakify/angular/login/containers/templat import { LOGIN_CLASSES } from '@keycloakify/angular/login/tokens/classes.token'; import { LOGIN_I18N } from '@keycloakify/angular/login/tokens/i18n.token'; import { KC_LOGIN_CONTEXT } from '@keycloakify/angular/login/tokens/kc-context.token'; -import { ClassKey } from 'keycloakify/login/lib/kcClsx'; -import { I18n } from '../../i18n'; -import { KcContext } from '../../KcContext'; +import { type ClassKey } from 'keycloakify/login/lib/kcClsx'; +import { type I18n } from '../../i18n'; +import { type KcContext } from '../../KcContext'; @Component({ standalone: true, diff --git a/src/login/pages/login-passkeys-conditional-authenticate/login-passkeys-conditional-authenticate.component.ts b/src/login/pages/login-passkeys-conditional-authenticate/login-passkeys-conditional-authenticate.component.ts index beab3fcf..d4bc5312 100644 --- a/src/login/pages/login-passkeys-conditional-authenticate/login-passkeys-conditional-authenticate.component.ts +++ b/src/login/pages/login-passkeys-conditional-authenticate/login-passkeys-conditional-authenticate.component.ts @@ -1,5 +1,5 @@ import { ChangeDetectionStrategy, Component, forwardRef, inject } from '@angular/core'; -import { Script } from '@keycloakify/angular/lib/models/script.model'; +import { type Script } from '@keycloakify/angular/lib/models/script.model'; import { USE_DEFAULT_CSS } from '@keycloakify/angular/lib/tokens/use-default-css.token'; import { ComponentReference } from '@keycloakify/angular/login/classes/component-reference.class'; import { TemplateComponent } from '@keycloakify/angular/login/containers/template.component'; @@ -8,9 +8,9 @@ import { LoginResourceInjectorService } from '@keycloakify/angular/login/service import { LOGIN_CLASSES } from '@keycloakify/angular/login/tokens/classes.token'; import { LOGIN_I18N } from '@keycloakify/angular/login/tokens/i18n.token'; import { KC_LOGIN_CONTEXT } from '@keycloakify/angular/login/tokens/kc-context.token'; -import { ClassKey, getKcClsx } from 'keycloakify/login/lib/kcClsx'; -import { I18n } from '../../i18n'; -import { KcContext } from '../../KcContext'; +import { type ClassKey, getKcClsx } from 'keycloakify/login/lib/kcClsx'; +import { type I18n } from '../../i18n'; +import { type KcContext } from '../../KcContext'; @Component({ standalone: true, diff --git a/src/login/pages/login-password/login-password.component.ts b/src/login/pages/login-password/login-password.component.ts index e6ada9c8..37085956 100644 --- a/src/login/pages/login-password/login-password.component.ts +++ b/src/login/pages/login-password/login-password.component.ts @@ -8,9 +8,9 @@ import { KcSanitizePipe } from '@keycloakify/angular/login/pipes/kc-sanitize.pip import { LOGIN_CLASSES } from '@keycloakify/angular/login/tokens/classes.token'; import { LOGIN_I18N } from '@keycloakify/angular/login/tokens/i18n.token'; import { KC_LOGIN_CONTEXT } from '@keycloakify/angular/login/tokens/kc-context.token'; -import { ClassKey } from 'keycloakify/login/lib/kcClsx'; -import { I18n } from '../../i18n'; -import { KcContext } from '../../KcContext'; +import { type ClassKey } from 'keycloakify/login/lib/kcClsx'; +import { type I18n } from '../../i18n'; +import { type KcContext } from '../../KcContext'; @Component({ standalone: true, diff --git a/src/login/pages/login-recovery-authn-code-config/login-recovery-authn-code-config.component.ts b/src/login/pages/login-recovery-authn-code-config/login-recovery-authn-code-config.component.ts index b706036e..742a7038 100644 --- a/src/login/pages/login-recovery-authn-code-config/login-recovery-authn-code-config.component.ts +++ b/src/login/pages/login-recovery-authn-code-config/login-recovery-authn-code-config.component.ts @@ -7,9 +7,9 @@ import { KcClassDirective } from '@keycloakify/angular/login/directives/kc-class import { LOGIN_CLASSES } from '@keycloakify/angular/login/tokens/classes.token'; import { LOGIN_I18N } from '@keycloakify/angular/login/tokens/i18n.token'; import { KC_LOGIN_CONTEXT } from '@keycloakify/angular/login/tokens/kc-context.token'; -import { ClassKey } from 'keycloakify/login/lib/kcClsx'; -import { I18n } from '../../i18n'; -import { KcContext } from '../../KcContext'; +import { type ClassKey } from 'keycloakify/login/lib/kcClsx'; +import { type I18n } from '../../i18n'; +import { type KcContext } from '../../KcContext'; @Component({ standalone: true, diff --git a/src/login/pages/login-recovery-authn-code-input/login-recovery-authn-code-input.component.ts b/src/login/pages/login-recovery-authn-code-input/login-recovery-authn-code-input.component.ts index 59bcf2c1..4016e21f 100644 --- a/src/login/pages/login-recovery-authn-code-input/login-recovery-authn-code-input.component.ts +++ b/src/login/pages/login-recovery-authn-code-input/login-recovery-authn-code-input.component.ts @@ -7,9 +7,9 @@ import { KcSanitizePipe } from '@keycloakify/angular/login/pipes/kc-sanitize.pip import { LOGIN_CLASSES } from '@keycloakify/angular/login/tokens/classes.token'; import { LOGIN_I18N } from '@keycloakify/angular/login/tokens/i18n.token'; import { KC_LOGIN_CONTEXT } from '@keycloakify/angular/login/tokens/kc-context.token'; -import { ClassKey } from 'keycloakify/login/lib/kcClsx'; -import { I18n } from '../../i18n'; -import { KcContext } from '../../KcContext'; +import { type ClassKey } from 'keycloakify/login/lib/kcClsx'; +import { type I18n } from '../../i18n'; +import { type KcContext } from '../../KcContext'; @Component({ standalone: true, diff --git a/src/login/pages/login-reset-otp/login-reset-otp.component.ts b/src/login/pages/login-reset-otp/login-reset-otp.component.ts index 7efef33b..0362fb44 100644 --- a/src/login/pages/login-reset-otp/login-reset-otp.component.ts +++ b/src/login/pages/login-reset-otp/login-reset-otp.component.ts @@ -6,9 +6,9 @@ import { KcClassDirective } from '@keycloakify/angular/login/directives/kc-class import { LOGIN_CLASSES } from '@keycloakify/angular/login/tokens/classes.token'; import { LOGIN_I18N } from '@keycloakify/angular/login/tokens/i18n.token'; import { KC_LOGIN_CONTEXT } from '@keycloakify/angular/login/tokens/kc-context.token'; -import { ClassKey } from 'keycloakify/login/lib/kcClsx'; -import { I18n } from '../../i18n'; -import { KcContext } from '../../KcContext'; +import { type ClassKey } from 'keycloakify/login/lib/kcClsx'; +import { type I18n } from '../../i18n'; +import { type KcContext } from '../../KcContext'; @Component({ standalone: true, diff --git a/src/login/pages/login-reset-password/login-reset-password.component.ts b/src/login/pages/login-reset-password/login-reset-password.component.ts index 96db3744..890d0920 100644 --- a/src/login/pages/login-reset-password/login-reset-password.component.ts +++ b/src/login/pages/login-reset-password/login-reset-password.component.ts @@ -7,9 +7,9 @@ import { KcSanitizePipe } from '@keycloakify/angular/login/pipes/kc-sanitize.pip import { LOGIN_CLASSES } from '@keycloakify/angular/login/tokens/classes.token'; import { LOGIN_I18N } from '@keycloakify/angular/login/tokens/i18n.token'; import { KC_LOGIN_CONTEXT } from '@keycloakify/angular/login/tokens/kc-context.token'; -import { ClassKey } from 'keycloakify/login/lib/kcClsx'; -import { I18n } from '../../i18n'; -import { KcContext } from '../../KcContext'; +import { type ClassKey } from 'keycloakify/login/lib/kcClsx'; +import { type I18n } from '../../i18n'; +import { type KcContext } from '../../KcContext'; @Component({ standalone: true, diff --git a/src/login/pages/login-update-password/login-update-password.component.ts b/src/login/pages/login-update-password/login-update-password.component.ts index 067433c7..5dfa959b 100644 --- a/src/login/pages/login-update-password/login-update-password.component.ts +++ b/src/login/pages/login-update-password/login-update-password.component.ts @@ -9,9 +9,9 @@ import { KcSanitizePipe } from '@keycloakify/angular/login/pipes/kc-sanitize.pip import { LOGIN_CLASSES } from '@keycloakify/angular/login/tokens/classes.token'; import { LOGIN_I18N } from '@keycloakify/angular/login/tokens/i18n.token'; import { KC_LOGIN_CONTEXT } from '@keycloakify/angular/login/tokens/kc-context.token'; -import { ClassKey } from 'keycloakify/login/lib/kcClsx'; -import { I18n } from '../../i18n'; -import { KcContext } from '../../KcContext'; +import { type ClassKey } from 'keycloakify/login/lib/kcClsx'; +import { type I18n } from '../../i18n'; +import { type KcContext } from '../../KcContext'; @Component({ standalone: true, diff --git a/src/login/pages/login-update-profile/login-update-profile.component.ts b/src/login/pages/login-update-profile/login-update-profile.component.ts index 1e5d7ac6..cc810dbd 100644 --- a/src/login/pages/login-update-profile/login-update-profile.component.ts +++ b/src/login/pages/login-update-profile/login-update-profile.component.ts @@ -7,9 +7,9 @@ import { KcClassDirective } from '@keycloakify/angular/login/directives/kc-class import { LOGIN_CLASSES } from '@keycloakify/angular/login/tokens/classes.token'; import { LOGIN_I18N } from '@keycloakify/angular/login/tokens/i18n.token'; import { KC_LOGIN_CONTEXT } from '@keycloakify/angular/login/tokens/kc-context.token'; -import { ClassKey } from 'keycloakify/login/lib/kcClsx'; -import { I18n } from '../../i18n'; -import { KcContext } from '../../KcContext'; +import { type ClassKey } from 'keycloakify/login/lib/kcClsx'; +import { type I18n } from '../../i18n'; +import { type KcContext } from '../../KcContext'; @Component({ standalone: true, diff --git a/src/login/pages/login-username/login-username.component.ts b/src/login/pages/login-username/login-username.component.ts index d7af7cac..bce12ef4 100644 --- a/src/login/pages/login-username/login-username.component.ts +++ b/src/login/pages/login-username/login-username.component.ts @@ -8,9 +8,9 @@ import { KcSanitizePipe } from '@keycloakify/angular/login/pipes/kc-sanitize.pip import { LOGIN_CLASSES } from '@keycloakify/angular/login/tokens/classes.token'; import { LOGIN_I18N } from '@keycloakify/angular/login/tokens/i18n.token'; import { KC_LOGIN_CONTEXT } from '@keycloakify/angular/login/tokens/kc-context.token'; -import { ClassKey } from 'keycloakify/login/lib/kcClsx'; -import { I18n } from '../../i18n'; -import { KcContext } from '../../KcContext'; +import { type ClassKey } from 'keycloakify/login/lib/kcClsx'; +import { type I18n } from '../../i18n'; +import { type KcContext } from '../../KcContext'; @Component({ selector: 'kc-root', diff --git a/src/login/pages/login-verify-email/login-verify-email.component.ts b/src/login/pages/login-verify-email/login-verify-email.component.ts index ce63673e..5f5cc781 100644 --- a/src/login/pages/login-verify-email/login-verify-email.component.ts +++ b/src/login/pages/login-verify-email/login-verify-email.component.ts @@ -6,9 +6,9 @@ import { KcClassDirective } from '@keycloakify/angular/login/directives/kc-class import { LOGIN_CLASSES } from '@keycloakify/angular/login/tokens/classes.token'; import { LOGIN_I18N } from '@keycloakify/angular/login/tokens/i18n.token'; import { KC_LOGIN_CONTEXT } from '@keycloakify/angular/login/tokens/kc-context.token'; -import { ClassKey } from 'keycloakify/login/lib/kcClsx'; -import { I18n } from '../../i18n'; -import { KcContext } from '../../KcContext'; +import { type ClassKey } from 'keycloakify/login/lib/kcClsx'; +import { type I18n } from '../../i18n'; +import { type KcContext } from '../../KcContext'; @Component({ standalone: true, diff --git a/src/login/pages/login-x509-info/login-x509-info.component.ts b/src/login/pages/login-x509-info/login-x509-info.component.ts index 2667647b..7875db7c 100644 --- a/src/login/pages/login-x509-info/login-x509-info.component.ts +++ b/src/login/pages/login-x509-info/login-x509-info.component.ts @@ -6,9 +6,9 @@ import { KcClassDirective } from '@keycloakify/angular/login/directives/kc-class import { LOGIN_CLASSES } from '@keycloakify/angular/login/tokens/classes.token'; import { LOGIN_I18N } from '@keycloakify/angular/login/tokens/i18n.token'; import { KC_LOGIN_CONTEXT } from '@keycloakify/angular/login/tokens/kc-context.token'; -import { ClassKey } from 'keycloakify/login/lib/kcClsx'; -import { I18n } from '../../i18n'; -import { KcContext } from '../../KcContext'; +import { type ClassKey } from 'keycloakify/login/lib/kcClsx'; +import { type I18n } from '../../i18n'; +import { type KcContext } from '../../KcContext'; @Component({ standalone: true, diff --git a/src/login/pages/login/login.component.ts b/src/login/pages/login/login.component.ts index c063812d..ea03c0f2 100644 --- a/src/login/pages/login/login.component.ts +++ b/src/login/pages/login/login.component.ts @@ -9,9 +9,9 @@ import { KcSanitizePipe } from '@keycloakify/angular/login/pipes/kc-sanitize.pip import { LOGIN_CLASSES } from '@keycloakify/angular/login/tokens/classes.token'; import { LOGIN_I18N } from '@keycloakify/angular/login/tokens/i18n.token'; import { KC_LOGIN_CONTEXT } from '@keycloakify/angular/login/tokens/kc-context.token'; -import { ClassKey } from 'keycloakify/login/lib/kcClsx'; -import { I18n } from '../../i18n'; -import { KcContext } from '../../KcContext'; +import { type ClassKey } from 'keycloakify/login/lib/kcClsx'; +import { type I18n } from '../../i18n'; +import { type KcContext } from '../../KcContext'; @Component({ selector: 'kc-root', diff --git a/src/login/pages/logout-confirm/logout-confirm.component.ts b/src/login/pages/logout-confirm/logout-confirm.component.ts index 662cecd7..ad02c43b 100644 --- a/src/login/pages/logout-confirm/logout-confirm.component.ts +++ b/src/login/pages/logout-confirm/logout-confirm.component.ts @@ -6,9 +6,9 @@ import { KcClassDirective } from '@keycloakify/angular/login/directives/kc-class import { LOGIN_CLASSES } from '@keycloakify/angular/login/tokens/classes.token'; import { LOGIN_I18N } from '@keycloakify/angular/login/tokens/i18n.token'; import { KC_LOGIN_CONTEXT } from '@keycloakify/angular/login/tokens/kc-context.token'; -import { ClassKey } from 'keycloakify/login/lib/kcClsx'; -import { I18n } from '../../i18n'; -import { KcContext } from '../../KcContext'; +import { type ClassKey } from 'keycloakify/login/lib/kcClsx'; +import { type I18n } from '../../i18n'; +import { type KcContext } from '../../KcContext'; @Component({ standalone: true, diff --git a/src/login/pages/register/register.component.ts b/src/login/pages/register/register.component.ts index f8216239..4986de17 100644 --- a/src/login/pages/register/register.component.ts +++ b/src/login/pages/register/register.component.ts @@ -9,9 +9,9 @@ import { KcSanitizePipe } from '@keycloakify/angular/login/pipes/kc-sanitize.pip import { LOGIN_CLASSES } from '@keycloakify/angular/login/tokens/classes.token'; import { LOGIN_I18N } from '@keycloakify/angular/login/tokens/i18n.token'; import { KC_LOGIN_CONTEXT } from '@keycloakify/angular/login/tokens/kc-context.token'; -import { ClassKey } from 'keycloakify/login/lib/kcClsx'; -import { I18n } from '../../i18n'; -import { KcContext } from '../../KcContext'; +import { type ClassKey } from 'keycloakify/login/lib/kcClsx'; +import { type I18n } from '../../i18n'; +import { type KcContext } from '../../KcContext'; @Component({ selector: 'kc-root', diff --git a/src/login/pages/saml-post-form/saml-post-form.component.ts b/src/login/pages/saml-post-form/saml-post-form.component.ts index e6c810f8..aa29a225 100644 --- a/src/login/pages/saml-post-form/saml-post-form.component.ts +++ b/src/login/pages/saml-post-form/saml-post-form.component.ts @@ -5,9 +5,9 @@ import { TemplateComponent } from '@keycloakify/angular/login/containers/templat import { LOGIN_CLASSES } from '@keycloakify/angular/login/tokens/classes.token'; import { LOGIN_I18N } from '@keycloakify/angular/login/tokens/i18n.token'; import { KC_LOGIN_CONTEXT } from '@keycloakify/angular/login/tokens/kc-context.token'; -import { ClassKey } from 'keycloakify/login/lib/kcClsx'; -import { I18n } from '../../i18n'; -import { KcContext } from '../../KcContext'; +import { type ClassKey } from 'keycloakify/login/lib/kcClsx'; +import { type I18n } from '../../i18n'; +import { type KcContext } from '../../KcContext'; @Component({ standalone: true, diff --git a/src/login/pages/select-authenticator/select-authenticator.component.ts b/src/login/pages/select-authenticator/select-authenticator.component.ts index 4ed4ae4c..04762e0a 100644 --- a/src/login/pages/select-authenticator/select-authenticator.component.ts +++ b/src/login/pages/select-authenticator/select-authenticator.component.ts @@ -7,9 +7,9 @@ import { KcClassDirective } from '@keycloakify/angular/login/directives/kc-class import { LOGIN_CLASSES } from '@keycloakify/angular/login/tokens/classes.token'; import { LOGIN_I18N } from '@keycloakify/angular/login/tokens/i18n.token'; import { KC_LOGIN_CONTEXT } from '@keycloakify/angular/login/tokens/kc-context.token'; -import { ClassKey } from 'keycloakify/login/lib/kcClsx'; -import { I18n } from '../../i18n'; -import { KcContext } from '../../KcContext'; +import { type ClassKey } from 'keycloakify/login/lib/kcClsx'; +import { type I18n } from '../../i18n'; +import { type KcContext } from '../../KcContext'; @Component({ standalone: true, diff --git a/src/login/pages/terms/terms.component.ts b/src/login/pages/terms/terms.component.ts index 07c59cb7..2eff773a 100644 --- a/src/login/pages/terms/terms.component.ts +++ b/src/login/pages/terms/terms.component.ts @@ -6,9 +6,9 @@ import { KcClassDirective } from '@keycloakify/angular/login/directives/kc-class import { LOGIN_CLASSES } from '@keycloakify/angular/login/tokens/classes.token'; import { LOGIN_I18N } from '@keycloakify/angular/login/tokens/i18n.token'; import { KC_LOGIN_CONTEXT } from '@keycloakify/angular/login/tokens/kc-context.token'; -import { ClassKey } from 'keycloakify/login/lib/kcClsx'; -import { I18n } from '../../i18n'; -import { KcContext } from '../../KcContext'; +import { type ClassKey } from 'keycloakify/login/lib/kcClsx'; +import { type I18n } from '../../i18n'; +import { type KcContext } from '../../KcContext'; @Component({ standalone: true, diff --git a/src/login/pages/update-email/update-email.component.ts b/src/login/pages/update-email/update-email.component.ts index 9ba21a73..1c7e4240 100644 --- a/src/login/pages/update-email/update-email.component.ts +++ b/src/login/pages/update-email/update-email.component.ts @@ -8,9 +8,9 @@ import { KcClassDirective } from '@keycloakify/angular/login/directives/kc-class import { LOGIN_CLASSES } from '@keycloakify/angular/login/tokens/classes.token'; import { LOGIN_I18N } from '@keycloakify/angular/login/tokens/i18n.token'; import { KC_LOGIN_CONTEXT } from '@keycloakify/angular/login/tokens/kc-context.token'; -import { ClassKey } from 'keycloakify/login/lib/kcClsx'; -import { I18n } from '../../i18n'; -import { KcContext } from '../../KcContext'; +import { type ClassKey } from 'keycloakify/login/lib/kcClsx'; +import { type I18n } from '../../i18n'; +import { type KcContext } from '../../KcContext'; @Component({ standalone: true, diff --git a/src/login/pages/webauthn-authenticate/webauthn-authenticate.component.ts b/src/login/pages/webauthn-authenticate/webauthn-authenticate.component.ts index 37238ddc..98e315ed 100644 --- a/src/login/pages/webauthn-authenticate/webauthn-authenticate.component.ts +++ b/src/login/pages/webauthn-authenticate/webauthn-authenticate.component.ts @@ -1,5 +1,5 @@ import { ChangeDetectionStrategy, Component, forwardRef, inject, input } from '@angular/core'; -import { Script } from '@keycloakify/angular/lib/models/script.model'; +import { type Script } from '@keycloakify/angular/lib/models/script.model'; import { USE_DEFAULT_CSS } from '@keycloakify/angular/lib/tokens/use-default-css.token'; import { ComponentReference } from '@keycloakify/angular/login/classes/component-reference.class'; import { LogoutOtherSessionsComponent } from '@keycloakify/angular/login/components/logout-other-sessions/logout-other-sessions.component'; @@ -9,9 +9,9 @@ import { LoginResourceInjectorService } from '@keycloakify/angular/login/service import { LOGIN_CLASSES } from '@keycloakify/angular/login/tokens/classes.token'; import { LOGIN_I18N } from '@keycloakify/angular/login/tokens/i18n.token'; import { KC_LOGIN_CONTEXT } from '@keycloakify/angular/login/tokens/kc-context.token'; -import { ClassKey, getKcClsx } from 'keycloakify/login/lib/kcClsx'; -import { I18n } from '../../i18n'; -import { KcContext } from '../../KcContext'; +import { type ClassKey, getKcClsx } from 'keycloakify/login/lib/kcClsx'; +import { type I18n } from '../../i18n'; +import { type KcContext } from '../../KcContext'; @Component({ standalone: true, diff --git a/src/login/pages/webauthn-error/webauthn-error.component.ts b/src/login/pages/webauthn-error/webauthn-error.component.ts index 4e45cf1f..0bfd5525 100644 --- a/src/login/pages/webauthn-error/webauthn-error.component.ts +++ b/src/login/pages/webauthn-error/webauthn-error.component.ts @@ -5,11 +5,11 @@ import { LogoutOtherSessionsComponent } from '@keycloakify/angular/login/compone import { TemplateComponent } from '@keycloakify/angular/login/containers/template.component'; import { KcClassDirective } from '@keycloakify/angular/login/directives/kc-class.directive'; import { LOGIN_I18N } from '@keycloakify/angular/login/tokens/i18n.token'; -import { I18n } from '../../i18n'; +import { type I18n } from '../../i18n'; import { LOGIN_CLASSES } from '@keycloakify/angular/login/tokens/classes.token'; import { KC_LOGIN_CONTEXT } from '@keycloakify/angular/login/tokens/kc-context.token'; -import { ClassKey } from 'keycloakify/login/lib/kcClsx'; -import { KcContext } from '../../KcContext'; +import { type ClassKey } from 'keycloakify/login/lib/kcClsx'; +import { type KcContext } from '../../KcContext'; @Component({ standalone: true, diff --git a/src/login/pages/webauthn-register/webauthn-register.component.ts b/src/login/pages/webauthn-register/webauthn-register.component.ts index 9d4273a9..8cb8e9f4 100644 --- a/src/login/pages/webauthn-register/webauthn-register.component.ts +++ b/src/login/pages/webauthn-register/webauthn-register.component.ts @@ -1,5 +1,5 @@ import { ChangeDetectionStrategy, Component, forwardRef, inject, input } from '@angular/core'; -import { Script } from '@keycloakify/angular/lib/models/script.model'; +import { type Script } from '@keycloakify/angular/lib/models/script.model'; import { USE_DEFAULT_CSS } from '@keycloakify/angular/lib/tokens/use-default-css.token'; import { ComponentReference } from '@keycloakify/angular/login/classes/component-reference.class'; import { LogoutOtherSessionsComponent } from '@keycloakify/angular/login/components/logout-other-sessions/logout-other-sessions.component'; @@ -7,11 +7,11 @@ import { TemplateComponent } from '@keycloakify/angular/login/containers/templat import { KcClassDirective } from '@keycloakify/angular/login/directives/kc-class.directive'; import { LoginResourceInjectorService } from '@keycloakify/angular/login/services/login-resource-injector.service'; import { LOGIN_CLASSES } from '@keycloakify/angular/login/tokens/classes.token'; -import { KC_LOGIN_CONTEXT } from '@keycloakify/angular/login/tokens/kc-context.token'; -import { ClassKey } from 'keycloakify/login/lib/kcClsx'; -import { KcContext } from '../../KcContext'; import { LOGIN_I18N } from '@keycloakify/angular/login/tokens/i18n.token'; -import { I18n } from '../../i18n'; +import { KC_LOGIN_CONTEXT } from '@keycloakify/angular/login/tokens/kc-context.token'; +import { type ClassKey } from 'keycloakify/login/lib/kcClsx'; +import { type I18n } from '../../i18n'; +import { type KcContext } from '../../KcContext'; @Component({ standalone: true, diff --git a/src/login/providers/keycloakify-angular.providers.ts b/src/login/providers/keycloakify-angular.providers.ts index e052f99f..717f391e 100644 --- a/src/login/providers/keycloakify-angular.providers.ts +++ b/src/login/providers/keycloakify-angular.providers.ts @@ -5,9 +5,9 @@ import { LOGIN_CLASSES } from '@keycloakify/angular/login/tokens/classes.token'; import { LOGIN_I18N } from '@keycloakify/angular/login/tokens/i18n.token'; import { KC_LOGIN_CONTEXT } from '@keycloakify/angular/login/tokens/kc-context.token'; import { DO_MAKE_USER_CONFIRM_PASSWORD } from '@keycloakify/angular/login/tokens/make-user-confirm-password.token'; -import { KcContextLike } from 'keycloakify/login/i18n/noJsx'; -import { ClassKey } from 'keycloakify/login/lib/kcClsx'; -import { KcContext } from '../KcContext'; +import { type KcContextLike } from 'keycloakify/login/i18n/noJsx'; +import { type ClassKey } from 'keycloakify/login/lib/kcClsx'; +import { type KcContext } from '../KcContext'; import { I18nService } from '@keycloakify/angular/login/services/i18n.service'; export type KeycloakifyAngularLoginConfig = { diff --git a/src/login/services/i18n.service.ts b/src/login/services/i18n.service.ts index 77c99a99..d811dce8 100644 --- a/src/login/services/i18n.service.ts +++ b/src/login/services/i18n.service.ts @@ -1,6 +1,7 @@ import { Injectable } from '@angular/core'; @Injectable({ providedIn: 'root' }) +/** INTERNAL: DO NOT IMPORT THIS */ export class I18nService { i18n!: unknown; } diff --git a/src/login/services/login-resource-injector.service.ts b/src/login/services/login-resource-injector.service.ts index b592dde0..e65f067c 100644 --- a/src/login/services/login-resource-injector.service.ts +++ b/src/login/services/login-resource-injector.service.ts @@ -1,9 +1,9 @@ import { inject, Injectable } from '@angular/core'; import { KC_LOGIN_CONTEXT } from '@keycloakify/angular/login/tokens/kc-context.token'; import { ResourceInjectorService } from '@keycloakify/angular/lib/services/resource-injector.service'; -import { KcContext } from 'keycloakify/login/KcContext'; +import { type KcContext } from '../KcContext'; import { catchError, forkJoin, of, switchMap } from 'rxjs'; -import { Script } from '@keycloakify/angular/lib/models/script.model'; +import { type Script } from '@keycloakify/angular/lib/models/script.model'; @Injectable({ providedIn: 'root' diff --git a/src/login/services/user-profile-form.service.ts b/src/login/services/user-profile-form.service.ts index 8fe0e306..e4de8bf3 100644 --- a/src/login/services/user-profile-form.service.ts +++ b/src/login/services/user-profile-form.service.ts @@ -10,25 +10,25 @@ import { WritableSignal } from '@angular/core'; import { DomSanitizer, SafeHtml } from '@angular/platform-browser'; +import { LOGIN_I18N } from '@keycloakify/angular/login/tokens/i18n.token'; +import { KC_LOGIN_CONTEXT } from '@keycloakify/angular/login/tokens/kc-context.token'; +import { DO_MAKE_USER_CONFIRM_PASSWORD } from '@keycloakify/angular/login/tokens/make-user-confirm-password.token'; import { - Attribute, - KcContext, - PasswordPolicies, - Validators + type Attribute, + type PasswordPolicies, + type Validators } from 'keycloakify/login/KcContext'; import type { KcContextLike as KcContextLike_i18n, MessageKey_defaultSet } from 'keycloakify/login/i18n/noJsx'; -import type { I18n } from '../i18n'; import { emailRegexp } from 'keycloakify/tools/emailRegExp'; import { formatNumber } from 'keycloakify/tools/formatNumber'; import { structuredCloneButFunctions } from 'keycloakify/tools/structuredCloneButFunctions'; import { assert, id } from 'tsafe'; +import { type KcContext } from '../KcContext'; +import type { I18n } from '../i18n'; import { LoginResourceInjectorService } from './login-resource-injector.service'; -import { KC_LOGIN_CONTEXT } from '@keycloakify/angular/login/tokens/kc-context.token'; -import { LOGIN_I18N } from '@keycloakify/angular/login/tokens/i18n.token'; -import { DO_MAKE_USER_CONFIRM_PASSWORD } from '@keycloakify/angular/login/tokens/make-user-confirm-password.token'; type KcContextLike_useGetErrors = KcContextLike_i18n & { messagesPerField: Pick; diff --git a/src/login/tokens/classes.token.ts b/src/login/tokens/classes.token.ts index 3d2fc698..e9378fd0 100644 --- a/src/login/tokens/classes.token.ts +++ b/src/login/tokens/classes.token.ts @@ -1,5 +1,5 @@ import { InjectionToken } from '@angular/core'; -import { ClassKey } from 'keycloakify/login/lib/kcClsx'; +import { type ClassKey } from 'keycloakify/login/lib/kcClsx'; export const LOGIN_CLASSES = new InjectionToken<{ [key in ClassKey]?: string }>( 'login classes' From 38b5a453b6a4f09e022e84f9fd103fb5857bec2d Mon Sep 17 00:00:00 2001 From: Luca Peruzzo Date: Mon, 30 Sep 2024 19:45:34 +0200 Subject: [PATCH 51/64] Release Candidate --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index d016f643..1934977f 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@keycloakify/angular", - "version": "0.0.1-rc.5", + "version": "0.0.1-rc.6", "description": "Angular components for Keycloakify", "repository": { "type": "git", From c883fb70e7c6c0bcec5e5e574daaac77449b5f4a Mon Sep 17 00:00:00 2001 From: Luca Peruzzo Date: Tue, 1 Oct 2024 12:22:00 +0200 Subject: [PATCH 52/64] try to use user-profile-form-fields dynamically --- .../idp-review-user-profile.component.html | 2 +- .../idp-review-user-profile.component.ts | 31 ++++++++++++++++--- .../keycloakify-angular.providers.ts | 8 ++++- ...-profile-form-fields-ejected-path.token.ts | 3 ++ 4 files changed, 37 insertions(+), 7 deletions(-) create mode 100644 src/login/tokens/user-profile-form-fields-ejected-path.token.ts diff --git a/src/login/pages/idp-review-user-profile/idp-review-user-profile.component.html b/src/login/pages/idp-review-user-profile/idp-review-user-profile.component.html index 45d3746d..5f3fab90 100644 --- a/src/login/pages/idp-review-user-profile/idp-review-user-profile.component.html +++ b/src/login/pages/idp-review-user-profile/idp-review-user-profile.component.html @@ -16,7 +16,7 @@ [action]="url.loginAction" method="post" > - +
    >(KC_LOGIN_CONTEXT); displayRequiredFields = input(true); documentTitle = input(); @@ -36,6 +41,22 @@ export class IdpReviewUserProfileComponent extends ComponentReference { displayInfo: boolean = false; displayMessage: boolean = !this.kcContext?.messagesPerField?.existsError('global'); + userProfileFormFieldsComponent: Observable | null>; + userProfileFormFieldsEjectedPath = inject(USER_PROFILE_FORM_FIELDS_EJECTED_PATH); + constructor() { + super(); + this.userProfileFormFieldsComponent = from( + import(/* @vite-ignore */ + this.userProfileFormFieldsEjectedPath ?? + '../../components/user-profile-form-fields/user-profile-form-fields.component' + ).then(c => c.UserProfileFormFieldsComponent) + ); + } + + ngAfterContentInit(): void { + this.userProfileFormFields?.onIsFormSubmittable?.subscribe(submittable => this.isFormSubmittable.set(submittable)); + } + onCallback() { (document.getElementById('kc-register-form') as HTMLFormElement).submit(); } diff --git a/src/login/providers/keycloakify-angular.providers.ts b/src/login/providers/keycloakify-angular.providers.ts index 717f391e..330f3b7e 100644 --- a/src/login/providers/keycloakify-angular.providers.ts +++ b/src/login/providers/keycloakify-angular.providers.ts @@ -5,6 +5,7 @@ import { LOGIN_CLASSES } from '@keycloakify/angular/login/tokens/classes.token'; import { LOGIN_I18N } from '@keycloakify/angular/login/tokens/i18n.token'; import { KC_LOGIN_CONTEXT } from '@keycloakify/angular/login/tokens/kc-context.token'; import { DO_MAKE_USER_CONFIRM_PASSWORD } from '@keycloakify/angular/login/tokens/make-user-confirm-password.token'; +import { USER_PROFILE_FORM_FIELDS_EJECTED_PATH } from '@keycloakify/angular/login/tokens/user-profile-form-fields-ejected-path.token'; import { type KcContextLike } from 'keycloakify/login/i18n/noJsx'; import { type ClassKey } from 'keycloakify/login/lib/kcClsx'; import { type KcContext } from '../KcContext'; @@ -14,6 +15,7 @@ export type KeycloakifyAngularLoginConfig = { doMakeUserConfirmPassword?: boolean; doUseDefaultCss?: boolean; classes?: { [key in ClassKey]?: string }; + userProfileFormFieldsEjectedPath?: string; getI18n: (params: { kcContext: KcContextLike }) => { i18n: unknown; prI18n_currentLanguage: Promise | undefined; @@ -64,5 +66,9 @@ export const provideKeycloakifyAngularLogin = (config: KeycloakifyAngularLoginCo deps: [I18nService] }, { provide: USE_DEFAULT_CSS, useValue: config?.doUseDefaultCss ?? true }, - { provide: LOGIN_CLASSES, useValue: config?.classes ?? {} } + { provide: LOGIN_CLASSES, useValue: config?.classes ?? {} }, + { + provide: USER_PROFILE_FORM_FIELDS_EJECTED_PATH, + useValue: config.userProfileFormFieldsEjectedPath + } ]); diff --git a/src/login/tokens/user-profile-form-fields-ejected-path.token.ts b/src/login/tokens/user-profile-form-fields-ejected-path.token.ts new file mode 100644 index 00000000..79c38194 --- /dev/null +++ b/src/login/tokens/user-profile-form-fields-ejected-path.token.ts @@ -0,0 +1,3 @@ +import { InjectionToken } from "@angular/core"; + +export const USER_PROFILE_FORM_FIELDS_EJECTED_PATH = new InjectionToken('profile form fields ejected path') \ No newline at end of file From 6ccad3436b88811fddd92d81b2a966d330ed6ac2 Mon Sep 17 00:00:00 2001 From: Luca Peruzzo Date: Tue, 1 Oct 2024 12:22:36 +0200 Subject: [PATCH 53/64] Release Candidate --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 1934977f..2995c1a6 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@keycloakify/angular", - "version": "0.0.1-rc.6", + "version": "0.0.1-rc.7", "description": "Angular components for Keycloakify", "repository": { "type": "git", From 173649950ce9d1de88353516c4656bc6cb1aef99 Mon Sep 17 00:00:00 2001 From: Luca Peruzzo Date: Tue, 1 Oct 2024 12:28:58 +0200 Subject: [PATCH 54/64] try absolute path --- .../idp-review-user-profile.component.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/login/pages/idp-review-user-profile/idp-review-user-profile.component.ts b/src/login/pages/idp-review-user-profile/idp-review-user-profile.component.ts index c2201321..d62e64f0 100644 --- a/src/login/pages/idp-review-user-profile/idp-review-user-profile.component.ts +++ b/src/login/pages/idp-review-user-profile/idp-review-user-profile.component.ts @@ -48,7 +48,7 @@ export class IdpReviewUserProfileComponent extends ComponentReference implements this.userProfileFormFieldsComponent = from( import(/* @vite-ignore */ this.userProfileFormFieldsEjectedPath ?? - '../../components/user-profile-form-fields/user-profile-form-fields.component' + '@keycloakify/angular/login/components/user-profile-form-fields/user-profile-form-fields.component' ).then(c => c.UserProfileFormFieldsComponent) ); } From 020eb998170d7e8686b6a23981515b0ae4c6ed73 Mon Sep 17 00:00:00 2001 From: Luca Peruzzo Date: Tue, 1 Oct 2024 12:29:28 +0200 Subject: [PATCH 55/64] Release Candidate --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 2995c1a6..1e68f0d5 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@keycloakify/angular", - "version": "0.0.1-rc.7", + "version": "0.0.1-rc.8", "description": "Angular components for Keycloakify", "repository": { "type": "git", From 85fbf47e50c8258565533ab6244e73377dfd09a7 Mon Sep 17 00:00:00 2001 From: Luca Peruzzo Date: Tue, 1 Oct 2024 14:03:01 +0200 Subject: [PATCH 56/64] use user-profile-form-fields dynamically --- .../user-profile-form-fields.component.html | 3 -- .../user-profile-form-fields.component.ts | 13 +++++--- .../idp-review-user-profile.component.html | 4 +-- .../idp-review-user-profile.component.ts | 31 +++++++------------ .../login-update-profile.component.html | 5 ++- .../login-update-profile.component.ts | 16 ++++++++-- .../pages/register/register.component.html | 4 +-- .../pages/register/register.component.ts | 17 ++++++++-- .../update-email/update-email.component.html | 4 +-- .../update-email/update-email.component.ts | 17 ++++++++-- .../keycloakify-angular.providers.ts | 8 +---- src/login/services/submit.service.ts | 12 +++++++ ...-profile-form-fields-ejected-path.token.ts | 3 -- 13 files changed, 85 insertions(+), 52 deletions(-) create mode 100644 src/login/services/submit.service.ts delete mode 100644 src/login/tokens/user-profile-form-fields-ejected-path.token.ts diff --git a/src/login/components/user-profile-form-fields/user-profile-form-fields.component.html b/src/login/components/user-profile-form-fields/user-profile-form-fields.component.html index 2ee9f8ee..c2b412e5 100644 --- a/src/login/components/user-profile-form-fields/user-profile-form-fields.component.html +++ b/src/login/components/user-profile-form-fields/user-profile-form-fields.component.html @@ -1,9 +1,6 @@ @let formFieldStates = formState().formFieldStates; @for (fieldState of formFieldStates; track fieldState.attribute) { - @if (beforeField) { diff --git a/src/login/components/user-profile-form-fields/user-profile-form-fields.component.ts b/src/login/components/user-profile-form-fields/user-profile-form-fields.component.ts index ec7c5f2b..3932f15d 100644 --- a/src/login/components/user-profile-form-fields/user-profile-form-fields.component.ts +++ b/src/login/components/user-profile-form-fields/user-profile-form-fields.component.ts @@ -14,6 +14,7 @@ import { DO_MAKE_USER_CONFIRM_PASSWORD } from '@keycloakify/angular/login/tokens import { type ClassKey } from 'keycloakify/login/lib/kcClsx'; import { type I18n } from '../../i18n'; import { type KcContext } from '../../KcContext'; +import { SubmitService } from '@keycloakify/angular/login/services/submit.service'; @Component({ standalone: true, @@ -40,6 +41,7 @@ export class UserProfileFormFieldsComponent extends ComponentReference { i18n = inject(LOGIN_I18N); kcContext = inject(KC_LOGIN_CONTEXT); userProfileFormService = inject(UserProfileFormService); + #submitService = inject(SubmitService); doMakeUserConfirmPassword = inject(DO_MAKE_USER_CONFIRM_PASSWORD); override doUseDefaultCss = inject(USE_DEFAULT_CSS); override classes = inject>>(LOGIN_CLASSES); @@ -53,10 +55,13 @@ export class UserProfileFormFieldsComponent extends ComponentReference { constructor() { super(); - effect(() => { - const isFormSubmittable = this.formState().isFormSubmittable; - this.onIsFormSubmittable.emit(isFormSubmittable); - }); + effect( + () => { + const isFormSubmittable = this.formState().isFormSubmittable; + this.#submitService.setIsSubmittable(isFormSubmittable); + }, + { allowSignalWrites: true } + ); } onDispatch(formAction: FormAction) { diff --git a/src/login/pages/idp-review-user-profile/idp-review-user-profile.component.html b/src/login/pages/idp-review-user-profile/idp-review-user-profile.component.html index 5f3fab90..427268d4 100644 --- a/src/login/pages/idp-review-user-profile/idp-review-user-profile.component.html +++ b/src/login/pages/idp-review-user-profile/idp-review-user-profile.component.html @@ -16,7 +16,7 @@ [action]="url.loginAction" method="post" > - +
    diff --git a/src/login/pages/idp-review-user-profile/idp-review-user-profile.component.ts b/src/login/pages/idp-review-user-profile/idp-review-user-profile.component.ts index d62e64f0..525cb313 100644 --- a/src/login/pages/idp-review-user-profile/idp-review-user-profile.component.ts +++ b/src/login/pages/idp-review-user-profile/idp-review-user-profile.component.ts @@ -1,5 +1,6 @@ -import { AsyncPipe, NgComponentOutlet } from '@angular/common'; -import { AfterContentInit, ChangeDetectionStrategy, Component, ContentChild, forwardRef, inject, input, signal, Type } from '@angular/core'; +import { NgComponentOutlet } from '@angular/common'; +import { ChangeDetectionStrategy, Component, forwardRef, inject, input, signal, Type } from '@angular/core'; +import { takeUntilDestroyed } from '@angular/core/rxjs-interop'; import { USE_DEFAULT_CSS } from '@keycloakify/angular/lib/tokens/use-default-css.token'; import { ComponentReference } from '@keycloakify/angular/login/classes/component-reference.class'; import { UserProfileFormFieldsComponent } from '@keycloakify/angular/login/components/user-profile-form-fields/user-profile-form-fields.component'; @@ -8,15 +9,14 @@ import { KcClassDirective } from '@keycloakify/angular/login/directives/kc-class import { LOGIN_CLASSES } from '@keycloakify/angular/login/tokens/classes.token'; import { LOGIN_I18N } from '@keycloakify/angular/login/tokens/i18n.token'; import { KC_LOGIN_CONTEXT } from '@keycloakify/angular/login/tokens/kc-context.token'; -import { USER_PROFILE_FORM_FIELDS_EJECTED_PATH } from '@keycloakify/angular/login/tokens/user-profile-form-fields-ejected-path.token'; import { type ClassKey } from 'keycloakify/login/lib/kcClsx'; -import { from, Observable, tap } from 'rxjs'; import { type I18n } from '../../i18n'; import { type KcContext } from '../../KcContext'; +import { SubmitService } from '@keycloakify/angular/login/services/submit.service'; @Component({ standalone: true, - imports: [TemplateComponent, KcClassDirective, NgComponentOutlet, AsyncPipe], + imports: [TemplateComponent, KcClassDirective, NgComponentOutlet], selector: 'kc-root', templateUrl: 'idp-review-user-profile.component.html', changeDetection: ChangeDetectionStrategy.OnPush, @@ -27,8 +27,8 @@ import { type KcContext } from '../../KcContext'; } ] }) -export class IdpReviewUserProfileComponent extends ComponentReference implements AfterContentInit { - @ContentChild(UserProfileFormFieldsComponent, { descendants: true }) userProfileFormFields: UserProfileFormFieldsComponent | undefined; +export class IdpReviewUserProfileComponent extends ComponentReference { + #submitService = inject(SubmitService); kcContext = inject>(KC_LOGIN_CONTEXT); displayRequiredFields = input(true); @@ -41,20 +41,13 @@ export class IdpReviewUserProfileComponent extends ComponentReference implements displayInfo: boolean = false; displayMessage: boolean = !this.kcContext?.messagesPerField?.existsError('global'); - userProfileFormFieldsComponent: Observable | null>; - userProfileFormFieldsEjectedPath = inject(USER_PROFILE_FORM_FIELDS_EJECTED_PATH); + userProfileFormFields = input>(); + constructor() { super(); - this.userProfileFormFieldsComponent = from( - import(/* @vite-ignore */ - this.userProfileFormFieldsEjectedPath ?? - '@keycloakify/angular/login/components/user-profile-form-fields/user-profile-form-fields.component' - ).then(c => c.UserProfileFormFieldsComponent) - ); - } - - ngAfterContentInit(): void { - this.userProfileFormFields?.onIsFormSubmittable?.subscribe(submittable => this.isFormSubmittable.set(submittable)); + this.#submitService.isSubmittable.pipe(takeUntilDestroyed()).subscribe(submittable => { + this.isFormSubmittable.set(submittable); + }); } onCallback() { diff --git a/src/login/pages/login-update-profile/login-update-profile.component.html b/src/login/pages/login-update-profile/login-update-profile.component.html index 0b5aef45..3066484e 100644 --- a/src/login/pages/login-update-profile/login-update-profile.component.html +++ b/src/login/pages/login-update-profile/login-update-profile.component.html @@ -17,8 +17,7 @@ [action]="url.loginAction" method="post" > - - +
    - + @if (termsAcceptanceRequired) {
    @@ -113,7 +113,7 @@ [kcClass]="'kcFormButtonsClass'" > >(KC_LOGIN_CONTEXT); displayRequiredFields = input(false); documentTitle = input(); @@ -39,6 +42,14 @@ export class RegisterComponent extends ComponentReference { displayInfo: boolean = false; displayMessage: boolean = !this.kcContext?.messagesPerField?.existsError('global'); + userProfileFormFields = input>(); + + constructor() { + super(); + this.#submitService.isSubmittable.pipe(takeUntilDestroyed()).subscribe(submittable => { + this.isFormSubmittable.set(submittable); + }); + } onCallback() { (document.getElementById('kc-register-form') as HTMLFormElement).submit(); } diff --git a/src/login/pages/update-email/update-email.component.html b/src/login/pages/update-email/update-email.component.html index 0ee016b6..fe9eaf7f 100644 --- a/src/login/pages/update-email/update-email.component.html +++ b/src/login/pages/update-email/update-email.component.html @@ -17,7 +17,7 @@ [action]="url.loginAction" method="post" > - +
    ('profile form fields ejected path') \ No newline at end of file From 42b7389c9b328890b8608ad671d6f6ad265c5bd6 Mon Sep 17 00:00:00 2001 From: Luca Peruzzo Date: Tue, 1 Oct 2024 14:12:51 +0200 Subject: [PATCH 57/64] Release Candidate --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 1e68f0d5..81b34bfa 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@keycloakify/angular", - "version": "0.0.1-rc.8", + "version": "0.0.1-rc.9", "description": "Angular components for Keycloakify", "repository": { "type": "git", From 46084999a12f87ee288c4a4553d049a3a0871734 Mon Sep 17 00:00:00 2001 From: Luca Peruzzo Date: Tue, 1 Oct 2024 16:03:46 +0200 Subject: [PATCH 58/64] account implementation --- src/account/DefaultPage.ts | 49 ++++ src/account/KcContext.ts | 1 + .../classes/component-reference.class.ts | 6 + .../containers/template.component.html | 125 +++++++++ src/account/containers/template.component.ts | 71 +++++ src/account/directives/kc-class.directive.ts | 150 ++++++++++ src/account/i18n.ts | 4 + .../pages/account/account.component.html | 165 +++++++++++ .../pages/account/account.component.ts | 34 +++ .../applications/applications.component.html | 156 +++++++++++ .../applications/applications.component.ts | 32 +++ .../federatedIdentity.component.html | 97 +++++++ .../federatedIdentity.component.ts | 31 +++ src/account/pages/log/log.component.html | 44 +++ src/account/pages/log/log.component.ts | 31 +++ .../pages/password/password.component.html | 131 +++++++++ .../pages/password/password.component.ts | 110 ++++++++ .../pages/sessions/sessions.component.html | 63 +++++ .../pages/sessions/sessions.component.ts | 31 +++ src/account/pages/totp/totp.component.html | 258 ++++++++++++++++++ src/account/pages/totp/totp.component.ts | 32 +++ .../keycloakify-angular.providers.ts | 64 +++++ src/account/services/i18n.service.ts | 7 + .../services/resource-injector.service.ts | 37 +++ src/account/tokens/classes.token.ts | 6 + src/account/tokens/i18n.token.ts | 3 + src/account/tokens/kc-context.token.ts | 4 + .../directives/attributes.directive.ts | 0 src/{login => lib}/pipes/input-type.pipe.ts | 0 .../pipes/is-array-with-empty-object.pipe.ts | 16 ++ src/{login => lib}/pipes/kc-sanitize.pipe.ts | 0 src/lib/pipes/to-array.pipe.ts | 15 + src/lib/pipes/to-number.pipe.ts | 13 + .../group-label/group-label.component.ts | 2 +- .../input-field-by-type.component.ts | 2 +- .../input-tag/input-tag.component.ts | 8 +- .../select-tag/select-tag.component.ts | 2 +- .../textarea-tag/textarea-tag.component.ts | 2 +- src/login/containers/template.component.ts | 2 +- src/login/pages/error/error.component.ts | 2 +- .../frontchannel-logout.component.ts | 2 +- src/login/pages/info/info.component.ts | 2 +- .../login-config-totp.component.ts | 2 +- .../pages/login-otp/login-otp.component.ts | 2 +- .../login-password.component.ts | 2 +- ...gin-recovery-authn-code-input.component.ts | 2 +- .../login-reset-password.component.ts | 2 +- .../login-update-password.component.ts | 2 +- .../login-username.component.ts | 2 +- src/login/pages/login/login.component.ts | 2 +- .../pages/register/register.component.ts | 2 +- src/login/pipes/to-array.pipe.ts | 14 - src/login/pipes/to-number.pipe.ts | 13 - src/login/tokens/kc-context.token.ts | 2 +- 54 files changed, 1808 insertions(+), 49 deletions(-) create mode 100644 src/account/DefaultPage.ts create mode 100644 src/account/KcContext.ts create mode 100644 src/account/classes/component-reference.class.ts create mode 100644 src/account/containers/template.component.html create mode 100644 src/account/containers/template.component.ts create mode 100644 src/account/directives/kc-class.directive.ts create mode 100644 src/account/i18n.ts create mode 100644 src/account/pages/account/account.component.html create mode 100644 src/account/pages/account/account.component.ts create mode 100644 src/account/pages/applications/applications.component.html create mode 100644 src/account/pages/applications/applications.component.ts create mode 100644 src/account/pages/federatedIdentity/federatedIdentity.component.html create mode 100644 src/account/pages/federatedIdentity/federatedIdentity.component.ts create mode 100644 src/account/pages/log/log.component.html create mode 100644 src/account/pages/log/log.component.ts create mode 100644 src/account/pages/password/password.component.html create mode 100644 src/account/pages/password/password.component.ts create mode 100644 src/account/pages/sessions/sessions.component.html create mode 100644 src/account/pages/sessions/sessions.component.ts create mode 100644 src/account/pages/totp/totp.component.html create mode 100644 src/account/pages/totp/totp.component.ts create mode 100644 src/account/providers/keycloakify-angular.providers.ts create mode 100644 src/account/services/i18n.service.ts create mode 100644 src/account/services/resource-injector.service.ts create mode 100644 src/account/tokens/classes.token.ts create mode 100644 src/account/tokens/i18n.token.ts create mode 100644 src/account/tokens/kc-context.token.ts rename src/{login => lib}/directives/attributes.directive.ts (100%) rename src/{login => lib}/pipes/input-type.pipe.ts (100%) create mode 100644 src/lib/pipes/is-array-with-empty-object.pipe.ts rename src/{login => lib}/pipes/kc-sanitize.pipe.ts (100%) create mode 100644 src/lib/pipes/to-array.pipe.ts create mode 100644 src/lib/pipes/to-number.pipe.ts delete mode 100644 src/login/pipes/to-array.pipe.ts delete mode 100644 src/login/pipes/to-number.pipe.ts diff --git a/src/account/DefaultPage.ts b/src/account/DefaultPage.ts new file mode 100644 index 00000000..a8eedd4c --- /dev/null +++ b/src/account/DefaultPage.ts @@ -0,0 +1,49 @@ +import { Type } from '@angular/core'; +import { type ClassKey } from 'keycloakify/account'; +import { type KcContext } from './KcContext'; + +const DefaultPage = async ( + pageId: KcContext['pageId'], + doUseDefaultCss = true, + classes: { [key in ClassKey]?: string } = {}, +): Promise<{ + ComponentBootstrap: Type; + doUseDefaultCss: boolean; + classes: { [key in ClassKey]?: string }; +}> => { + let ComponentBootstrapPromise; + switch (pageId) { + case 'password.ftl': + ComponentBootstrapPromise = import('@keycloakify/angular/account/pages/password/password.component').then((c) => c.PasswordComponent); + break; + case 'account.ftl': + ComponentBootstrapPromise = import('@keycloakify/angular/account/pages/account/account.component').then((c) => c.AccountComponent); + break; + case 'sessions.ftl': + ComponentBootstrapPromise = import('@keycloakify/angular/account/pages/sessions/sessions.component').then((c) => c.SessionsComponent); + break; + case 'totp.ftl': + ComponentBootstrapPromise = import('@keycloakify/angular/account/pages/totp/totp.component').then((c) => c.TotpComponent); + break; + case 'applications.ftl': + ComponentBootstrapPromise = import('@keycloakify/angular/account/pages/applications/applications.component').then( + (c) => c.ApplicationsComponent, + ); + break; + case 'log.ftl': + ComponentBootstrapPromise = import('@keycloakify/angular/account/pages/log/log.component').then((c) => c.LogComponent); + break; + case 'federatedIdentity.ftl': + ComponentBootstrapPromise = import('@keycloakify/angular/account/pages/federatedIdentity/federatedIdentity.component').then( + (c) => c.FederatedIdentityComponent, + ); + break; + } + return ComponentBootstrapPromise?.then((ComponentBootstrap) => ({ + ComponentBootstrap, + doUseDefaultCss, + classes, + })); +}; + +export { DefaultPage }; diff --git a/src/account/KcContext.ts b/src/account/KcContext.ts new file mode 100644 index 00000000..520eb300 --- /dev/null +++ b/src/account/KcContext.ts @@ -0,0 +1 @@ +export type { KcContext } from 'keycloakify/account/KcContext'; diff --git a/src/account/classes/component-reference.class.ts b/src/account/classes/component-reference.class.ts new file mode 100644 index 00000000..e775835d --- /dev/null +++ b/src/account/classes/component-reference.class.ts @@ -0,0 +1,6 @@ +import { ClassKey } from 'keycloakify/account'; +export abstract class ComponentReference { + doUseDefaultCss!: boolean | undefined; + classes!: Partial> | undefined; + additionalClasses!: Partial>; +} diff --git a/src/account/containers/template.component.html b/src/account/containers/template.component.html new file mode 100644 index 00000000..0fba06be --- /dev/null +++ b/src/account/containers/template.component.html @@ -0,0 +1,125 @@ +@let enabledLanguages = i18n.enabledLanguages; +@let currentLanguage = i18n.currentLanguage; +@let url = kcContext.url; +@let features = kcContext.features; +@let realm = kcContext.realm; +@let message = kcContext.message; +@let referrer = kcContext.referrer; +@let activeLink = active(); +@let isReadyToRender = isReadyToRender$ | async; + +@if (isReadyToRender) { + + +
    +
    + +
    + +
    + @if (message) { +
    + @switch (message.type) { + @case ('success') { + + } + @case ('error') { + + } + } + +
    + } + +
    +
    +} diff --git a/src/account/containers/template.component.ts b/src/account/containers/template.component.ts new file mode 100644 index 00000000..0c424313 --- /dev/null +++ b/src/account/containers/template.component.ts @@ -0,0 +1,71 @@ +import { AsyncPipe, NgClass, NgTemplateOutlet } from '@angular/common'; +import { ChangeDetectionStrategy, Component, forwardRef, inject, input, OnInit, Renderer2 } from '@angular/core'; +import { Meta, Title } from '@angular/platform-browser'; +import { ComponentReference } from '@keycloakify/angular/account/classes/component-reference.class'; +import { KcClassDirective } from '@keycloakify/angular/account/directives/kc-class.directive'; +import { AccountResourceInjectorService } from '@keycloakify/angular/account/services/resource-injector.service'; +import { ACCOUNT_CLASSES } from '@keycloakify/angular/account/tokens/classes.token'; +import { ACCOUNT_I18N } from '@keycloakify/angular/account/tokens/i18n.token'; +import { KC_ACCOUNT_CONTEXT } from '@keycloakify/angular/account/tokens/kc-context.token'; +import { KcSanitizePipe } from '@keycloakify/angular/lib/pipes/kc-sanitize.pipe'; +import { USE_DEFAULT_CSS } from '@keycloakify/angular/lib/tokens/use-default-css.token'; +import { ClassKey, getKcClsx } from 'keycloakify/account/lib/kcClsx'; +import { Observable } from 'rxjs'; +import { I18n } from '../i18n'; +import { type KcContext } from '../KcContext'; + +@Component({ + selector: 'kc-account-template', + templateUrl: './template.component.html', + standalone: true, + imports: [AsyncPipe, KcSanitizePipe, NgTemplateOutlet, KcClassDirective, NgClass], + changeDetection: ChangeDetectionStrategy.OnPush, + providers: [ + { + provide: ComponentReference, + useExisting: forwardRef(() => TemplateComponent) + } + ] +}) +export class TemplateComponent extends ComponentReference implements OnInit { + i18n = inject(ACCOUNT_I18N); + renderer = inject(Renderer2); + meta = inject(Meta); + title = inject(Title); + kcContext = inject(KC_ACCOUNT_CONTEXT); + override doUseDefaultCss = inject(USE_DEFAULT_CSS); + override classes = inject>>(ACCOUNT_CLASSES); + accountResourceInjectorService = inject(AccountResourceInjectorService); + + active = input<'account' | 'password' | 'totp' | 'social' | 'sessions' | 'applications' | 'log' | 'authorization' | undefined>(undefined); + + isReadyToRender$: Observable; + + constructor() { + super(); + this.title.setTitle(this.i18n.msgStr('accountManagementTitle')); + this.isReadyToRender$ = this.accountResourceInjectorService.injectResource(this.doUseDefaultCss); + } + + ngOnInit() { + this.applyKcIndexClasses(); + } + + private applyKcIndexClasses() { + const kcClsx = getKcClsx({ + doUseDefaultCss: this.doUseDefaultCss, + classes: this.classes + }).kcClsx; + const kcBodyClass = kcClsx('kcBodyClass'); + const kcHtmlClass = kcClsx('kcHtmlClass'); + const kcBodyClasses = kcBodyClass.split(/\s+/); + const kcHtmlClasses = kcHtmlClass.split(/\s+/); + kcBodyClasses.push('admin-console', 'user'); + kcBodyClasses.forEach(klass => { + this.renderer.addClass(document.body, klass); + }); + kcHtmlClasses.forEach(klass => { + this.renderer.addClass(document.documentElement, klass); + }); + } +} diff --git a/src/account/directives/kc-class.directive.ts b/src/account/directives/kc-class.directive.ts new file mode 100644 index 00000000..20a803a4 --- /dev/null +++ b/src/account/directives/kc-class.directive.ts @@ -0,0 +1,150 @@ +/* eslint-disable @typescript-eslint/no-explicit-any */ +/* eslint-disable @typescript-eslint/consistent-indexed-object-style */ +import { + Directive, + DoCheck, + ElementRef, + inject, + Input, + isDevMode, + Renderer2, + ɵstringify as stringify, +} from '@angular/core'; +import { ClassKey } from 'keycloakify/account'; +import { getKcClsx } from 'keycloakify/account/lib/kcClsx'; +import { ComponentReference } from '../classes/component-reference.class'; + +interface CssClassState { + // PERF: could use a bit mask to represent state as all fields are boolean flags + enabled: boolean; + changed: boolean; + touched: boolean; +} + +type KcClassSupportedTypes = ClassKey[] | Set | Partial<{ [key in ClassKey]: any }> | null | undefined; + +type NgClassSupportedTypes = string[] | Set | { [key: string]: any } | null | undefined; + +@Directive({ selector: '[kcClass]', standalone: true }) +export class KcClassDirective implements DoCheck { + private initialClasses: string[] = []; + private rawClass: NgClassSupportedTypes; + private rawKcClass: KcClassSupportedTypes; + + private stateMap = new Map(); + readonly #renderer = inject(Renderer2); + readonly #el = inject(ElementRef); + readonly #host = inject(ComponentReference); + // eslint-disable-next-line @angular-eslint/no-input-rename + @Input('class') + set klass(value: string) { + this.initialClasses = value != null ? value.trim().split(/\s+/) : []; + } + + // eslint-disable-next-line @angular-eslint/no-input-rename + @Input('ngClass') + set ngClass(value: string | NgClassSupportedTypes) { + this.rawClass = typeof value === 'string' ? value.trim().split(/\s+/) : value; + } + + // eslint-disable-next-line @angular-eslint/no-input-rename + @Input('kcClass') + set kcClass(value: ClassKey | KcClassSupportedTypes) { + this.rawKcClass = typeof value === 'string' ? (value.trim().split(/\s+/) as ClassKey[]) : value; + } + + ngDoCheck(): void { + for (const klass of this.initialClasses) { + this._updateState(klass, true); + } + // classes from the [ngClass] binding + const rawClass = this.rawClass; + if (Array.isArray(rawClass) || rawClass instanceof Set) { + for (const klass of rawClass) { + this._updateState(klass, true); + } + } else if (rawClass != null) { + for (const klass of Object.keys(rawClass)) { + this._updateState(klass, Boolean(rawClass[klass])); + } + } + + // classes from the [kcClass] binding + const rawKcClass = this.rawKcClass; + if (Array.isArray(rawKcClass) || rawKcClass instanceof Set) { + for (const klass of rawKcClass) { + this._updateState(klass, true, true); + } + } else if (rawKcClass != null) { + for (const klass of Object.keys(rawKcClass)) { + this._updateState(klass, Boolean(rawKcClass[klass as ClassKey]), true); + } + } + + this._applyStateDiff(); + } + + private _updateState(klass: string | ClassKey, nextEnabled: boolean, kcClsxCheck = false) { + const state = this.stateMap.get(klass); + if (state !== undefined) { + if (state.enabled !== nextEnabled) { + state.changed = true; + state.enabled = nextEnabled; + } + state.touched = true; + } else { + let klassChecked = klass; + if (kcClsxCheck) { + const doUseDefaultCss = this.#host.doUseDefaultCss ?? true; + const classes = { ...(this.#host.classes ?? {}), ...(this.#host.additionalClasses ?? {}) }; + const kcClsx = getKcClsx({ doUseDefaultCss, classes }).kcClsx; + klassChecked = kcClsx(klass as ClassKey); + } + this.stateMap.set(klassChecked, { + enabled: nextEnabled, + changed: true, + touched: true, + }); + } + } + + private _applyStateDiff() { + for (const stateEntry of this.stateMap) { + const klass = stateEntry[0]; + const state = stateEntry[1]; + + if (state.changed) { + this._toggleClass(klass, state.enabled); + state.changed = false; + } else if (!state.touched) { + // A class that was previously active got removed from the new collection of classes - + // remove from the DOM as well. + if (state.enabled) { + this._toggleClass(klass, false); + } + this.stateMap.delete(klass); + } + + state.touched = false; + } + } + + private _toggleClass(klass: string, enabled: boolean): void { + if (isDevMode()) { + if (typeof klass !== 'string') { + throw new Error(`NgClass can only toggle CSS classes expressed as strings, got ${stringify(klass)}`); + } + } + + klass = klass.trim(); + if (klass.length > 0) { + klass.split(/\s+/).forEach((klass) => { + if (enabled) { + this.#renderer.addClass(this.#el.nativeElement, klass); + } else { + this.#renderer.removeClass(this.#el.nativeElement, klass); + } + }); + } + } +} diff --git a/src/account/i18n.ts b/src/account/i18n.ts new file mode 100644 index 00000000..a5a66f37 --- /dev/null +++ b/src/account/i18n.ts @@ -0,0 +1,4 @@ +import type { GenericI18n_noJsx } from 'keycloakify/account/i18n/noJsx/GenericI18n_noJsx'; +import { type MessageKey as MessageKey_defaultSet } from 'keycloakify/account/i18n/messages_defaultSet/types'; +/** INTERNAL: DO NOT IMPORT THIS */ +export type I18n = GenericI18n_noJsx; diff --git a/src/account/pages/account/account.component.html b/src/account/pages/account/account.component.html new file mode 100644 index 00000000..caa1d297 --- /dev/null +++ b/src/account/pages/account/account.component.html @@ -0,0 +1,165 @@ +@let url = kcContext.url; +@let realm = kcContext.realm; +@let messagesPerField = kcContext.messagesPerField; +@let stateChecker = kcContext.stateChecker; +@let account = kcContext.account; +@let referrer = kcContext.referrer; + + + +
    +
    +

    {{ i18n.msgStr('editAccountHtmlTitle') }}

    +
    +
    + * {{ i18n.msgStr('requiredFields') }} +
    +
    +
    + + @if (!realm.registrationEmailAsUsername) { +
    +
    + + @if (realm.editUsernameAllowed) { + * + } +
    + +
    + +
    +
    + } + +
    +
    + + * +
    + +
    + +
    +
    + +
    +
    + + * +
    + +
    + +
    +
    + +
    +
    + + * +
    + +
    + +
    +
    + +
    +
    +
    + @if (referrer) { + {{ i18n.msgStr('backToApplication') }} + } + + +
    +
    +
    +
    +
    +
    diff --git a/src/account/pages/account/account.component.ts b/src/account/pages/account/account.component.ts new file mode 100644 index 00000000..7dccbccc --- /dev/null +++ b/src/account/pages/account/account.component.ts @@ -0,0 +1,34 @@ +import { NgClass } from '@angular/common'; +import { Component, forwardRef, inject } from '@angular/core'; +import { ComponentReference } from '@keycloakify/angular/account/classes/component-reference.class'; +import { TemplateComponent } from '@keycloakify/angular/account/containers/template.component'; +import { KcClassDirective } from '@keycloakify/angular/account/directives/kc-class.directive'; +import { ACCOUNT_CLASSES } from '@keycloakify/angular/account/tokens/classes.token'; +import { ACCOUNT_I18N } from '@keycloakify/angular/account/tokens/i18n.token'; +import { KC_ACCOUNT_CONTEXT } from '@keycloakify/angular/account/tokens/kc-context.token'; +import { USE_DEFAULT_CSS } from '@keycloakify/angular/lib/tokens/use-default-css.token'; +import { type ClassKey } from 'keycloakify/account'; +import { type I18n } from '../../i18n'; +import { type KcContext } from '../../KcContext'; + +@Component({ + standalone: true, + imports: [KcClassDirective, TemplateComponent, NgClass], + selector: 'kc-root', + templateUrl: 'account.component.html', + providers: [ + { + provide: ComponentReference, + useExisting: forwardRef(() => AccountComponent) + } + ] +}) +export class AccountComponent extends ComponentReference { + i18n = inject(ACCOUNT_I18N); + kcContext = inject>(KC_ACCOUNT_CONTEXT); + override doUseDefaultCss = inject(USE_DEFAULT_CSS); + override classes = inject>>(ACCOUNT_CLASSES); + override additionalClasses: Partial> = { + kcBodyClass: `${this.classes?.kcBodyClass} user` + }; +} diff --git a/src/account/pages/applications/applications.component.html b/src/account/pages/applications/applications.component.html new file mode 100644 index 00000000..051487a7 --- /dev/null +++ b/src/account/pages/applications/applications.component.html @@ -0,0 +1,156 @@ +@let url = kcContext.url; +@let stateChecker = kcContext.stateChecker; +@let applications = kcContext.applications?.applications; + + + +
    +
    +

    {{ i18n.msgStr('applicationsHtmlTitle') }}

    +
    + +
    + + + + + + + + + + + + + + + + @for (application of applications ?? []; track application) { + + + + + + + + + + + + } + +
    {{ i18n.msgStr('application') }}{{ i18n.msgStr('availableRoles') }}{{ i18n.msgStr('grantedPermissions') }}{{ i18n.msgStr('additionalGrants') }}{{ i18n.msgStr('action') }}
    + @if (application.effectiveUrl) { + + @if (application.client.name) { + {{ i18n.advancedMsgStr(application.client.name) }} + } @else { + {{ application.client.clientId }} + } + + } @else { + @if (application.client.name) { + {{ i18n.advancedMsgStr(application.client.name) }} + } @else { + {{ application.client.clientId }} + } + } + + @if (!(application.realmRolesAvailable | isArrayWithEmptyObject)) { + @for (role of application.realmRolesAvailable; track role; let last = $last) { + + @if (role.description) { + {{ i18n.advancedMsgStr(role.description) }} + } @else { + {{ i18n.advancedMsgStr(role.name) }} + } + @if (!last) { + ,  + } + + } + } + @if (application.resourceRolesAvailable) { + @for (resource of application.resourceRolesAvailable | keyvalue; track resource.key) { + + @if (!(application.realmRolesAvailable | isArrayWithEmptyObject)) { + ,  + } + @for ( + clientRole of application.resourceRolesAvailable[resource.key]; + track clientRole; + let roleLast = $last + ) { + + {{ + i18n.advancedMsgStr( + clientRole.roleDescription ? clientRole.roleDescription : clientRole.roleName + ) + }} + {{ i18n.msgStr('inResource') }} + + {{ + clientRole.clientName + ? i18n.advancedMsgStr(clientRole.clientName) + : clientRole.clientId + }} + @if (!roleLast) { + ,  + } + + } + + } + } + + @if (application.client.consentRequired) { + @for (claim of application.clientScopesGranted; track claim; let last = $last) { + {{ i18n.advancedMsgStr(claim) }} + @if (!last) { + ,  + } + } + } @else { + {{ i18n.msgStr('fullAccess') }} + } + + @for (grant of application.additionalGrants; track grant; let last = $last) { + {{ i18n.advancedMsgStr(grant) }} + @if (!last) { + ,  + } + } + + @if ( + (application.client.consentRequired && application.clientScopesGranted.length > 0) || + application.additionalGrants.length > 0 + ) { + + } +
    +
    +
    +
    +
    diff --git a/src/account/pages/applications/applications.component.ts b/src/account/pages/applications/applications.component.ts new file mode 100644 index 00000000..7b667316 --- /dev/null +++ b/src/account/pages/applications/applications.component.ts @@ -0,0 +1,32 @@ +import { KeyValuePipe, NgClass } from '@angular/common'; +import { Component, forwardRef, inject } from '@angular/core'; +import { ComponentReference } from '@keycloakify/angular/account/classes/component-reference.class'; +import { TemplateComponent } from '@keycloakify/angular/account/containers/template.component'; +import { KcClassDirective } from '@keycloakify/angular/account/directives/kc-class.directive'; +import { ACCOUNT_CLASSES } from '@keycloakify/angular/account/tokens/classes.token'; +import { ACCOUNT_I18N } from '@keycloakify/angular/account/tokens/i18n.token'; +import { KC_ACCOUNT_CONTEXT } from '@keycloakify/angular/account/tokens/kc-context.token'; +import { IsArrayWithEmptyObjectPipe } from '@keycloakify/angular/lib/pipes/is-array-with-empty-object.pipe'; +import { USE_DEFAULT_CSS } from '@keycloakify/angular/lib/tokens/use-default-css.token'; +import { type ClassKey } from 'keycloakify/account'; +import { type I18n } from '../../i18n'; +import { type KcContext } from '../../KcContext'; + +@Component({ + standalone: true, + imports: [KcClassDirective, TemplateComponent, NgClass, KeyValuePipe, IsArrayWithEmptyObjectPipe], + selector: 'kc-root', + templateUrl: 'applications.component.html', + providers: [ + { + provide: ComponentReference, + useExisting: forwardRef(() => ApplicationsComponent) + } + ] +}) +export class ApplicationsComponent extends ComponentReference { + i18n = inject(ACCOUNT_I18N); + kcContext = inject>(KC_ACCOUNT_CONTEXT); + override doUseDefaultCss = inject(USE_DEFAULT_CSS); + override classes = inject>>(ACCOUNT_CLASSES); +} diff --git a/src/account/pages/federatedIdentity/federatedIdentity.component.html b/src/account/pages/federatedIdentity/federatedIdentity.component.html new file mode 100644 index 00000000..895a58a3 --- /dev/null +++ b/src/account/pages/federatedIdentity/federatedIdentity.component.html @@ -0,0 +1,97 @@ +@let url = kcContext.url; +@let federatedIdentity = kcContext.federatedIdentity; +@let stateChecker = kcContext.stateChecker; + + + + + + diff --git a/src/account/pages/federatedIdentity/federatedIdentity.component.ts b/src/account/pages/federatedIdentity/federatedIdentity.component.ts new file mode 100644 index 00000000..482dfb20 --- /dev/null +++ b/src/account/pages/federatedIdentity/federatedIdentity.component.ts @@ -0,0 +1,31 @@ +import { NgClass } from '@angular/common'; +import { Component, forwardRef, inject } from '@angular/core'; +import { ComponentReference } from '@keycloakify/angular/account/classes/component-reference.class'; +import { TemplateComponent } from '@keycloakify/angular/account/containers/template.component'; +import { KcClassDirective } from '@keycloakify/angular/account/directives/kc-class.directive'; +import { ACCOUNT_CLASSES } from '@keycloakify/angular/account/tokens/classes.token'; +import { ACCOUNT_I18N } from '@keycloakify/angular/account/tokens/i18n.token'; +import { KC_ACCOUNT_CONTEXT } from '@keycloakify/angular/account/tokens/kc-context.token'; +import { USE_DEFAULT_CSS } from '@keycloakify/angular/lib/tokens/use-default-css.token'; +import { type ClassKey } from 'keycloakify/account'; +import { type I18n } from '../../i18n'; +import { type KcContext } from '../../KcContext'; + +@Component({ + standalone: true, + imports: [KcClassDirective, TemplateComponent, NgClass], + selector: 'kc-root', + templateUrl: 'federatedIdentity.component.html', + providers: [ + { + provide: ComponentReference, + useExisting: forwardRef(() => FederatedIdentityComponent) + } + ] +}) +export class FederatedIdentityComponent extends ComponentReference { + i18n = inject(ACCOUNT_I18N); + kcContext = inject>(KC_ACCOUNT_CONTEXT); + override doUseDefaultCss = inject(USE_DEFAULT_CSS); + override classes = inject>>(ACCOUNT_CLASSES); +} diff --git a/src/account/pages/log/log.component.html b/src/account/pages/log/log.component.html new file mode 100644 index 00000000..e5ad4db8 --- /dev/null +++ b/src/account/pages/log/log.component.html @@ -0,0 +1,44 @@ +@let log = kcContext.log; + + + +
    +
    +

    {{ i18n.msgStr('accountLogHtmlTitle') }}

    +
    + + + + + + + + + + + + + + @for (event of log.events; track event) { + + + + + + + + } + +
    {{ i18n.msgStr('date') }}{{ i18n.msgStr('event') }}{{ i18n.msgStr('ip') }}{{ i18n.msgStr('client') }}{{ i18n.msgStr('details') }}
    {{ event.date ? (event.date | date) : '' }}{{ event.event }}{{ event.ipAddress }}{{ event.client || '' }} + @for (detail of event.details; track detail; let last = $last) { + + {{ detail.key }} = {{ detail.value }} + @if (!last) { + ,  + } + + } +
    +
    +
    +
    diff --git a/src/account/pages/log/log.component.ts b/src/account/pages/log/log.component.ts new file mode 100644 index 00000000..41b5e190 --- /dev/null +++ b/src/account/pages/log/log.component.ts @@ -0,0 +1,31 @@ +import { DatePipe, NgClass } from '@angular/common'; +import { Component, forwardRef, inject } from '@angular/core'; +import { ComponentReference } from '@keycloakify/angular/account/classes/component-reference.class'; +import { TemplateComponent } from '@keycloakify/angular/account/containers/template.component'; +import { KcClassDirective } from '@keycloakify/angular/account/directives/kc-class.directive'; +import { ACCOUNT_CLASSES } from '@keycloakify/angular/account/tokens/classes.token'; +import { ACCOUNT_I18N } from '@keycloakify/angular/account/tokens/i18n.token'; +import { KC_ACCOUNT_CONTEXT } from '@keycloakify/angular/account/tokens/kc-context.token'; +import { USE_DEFAULT_CSS } from '@keycloakify/angular/lib/tokens/use-default-css.token'; +import { type ClassKey } from 'keycloakify/account'; +import { type I18n } from '../../i18n'; +import { type KcContext } from '../../KcContext'; + +@Component({ + standalone: true, + imports: [KcClassDirective, TemplateComponent, NgClass, DatePipe], + selector: 'kc-root', + templateUrl: 'log.component.html', + providers: [ + { + provide: ComponentReference, + useExisting: forwardRef(() => LogComponent) + } + ] +}) +export class LogComponent extends ComponentReference { + i18n = inject(ACCOUNT_I18N); + kcContext = inject>(KC_ACCOUNT_CONTEXT); + override doUseDefaultCss = inject(USE_DEFAULT_CSS); + override classes = inject>>(ACCOUNT_CLASSES); +} diff --git a/src/account/pages/password/password.component.html b/src/account/pages/password/password.component.html new file mode 100644 index 00000000..7eaa67e6 --- /dev/null +++ b/src/account/pages/password/password.component.html @@ -0,0 +1,131 @@ +@let url = kcContext.url; +@let password = kcContext.password; +@let account = kcContext.account; +@let stateChecker = kcContext.stateChecker; + + + +
    +
    +

    {{ i18n.msgStr('changePasswordHtmlTitle') }}

    +
    +
    + {{ i18n.msgStr('allFieldsRequired') }} +
    +
    + +
    + + + @if (password.passwordSet) { +
    +
    + +
    +
    + +
    +
    + } + + + +
    +
    + +
    +
    + +
    +
    + +
    +
    + +
    + +
    + +
    +
    + +
    +
    +
    + +
    +
    +
    +
    +
    +
    diff --git a/src/account/pages/password/password.component.ts b/src/account/pages/password/password.component.ts new file mode 100644 index 00000000..257b1ab4 --- /dev/null +++ b/src/account/pages/password/password.component.ts @@ -0,0 +1,110 @@ +import { NgClass } from '@angular/common'; +import { Component, forwardRef, inject, signal } from '@angular/core'; +import { ComponentReference } from '@keycloakify/angular/account/classes/component-reference.class'; +import { TemplateComponent } from '@keycloakify/angular/account/containers/template.component'; +import { KcClassDirective } from '@keycloakify/angular/account/directives/kc-class.directive'; +import { ACCOUNT_CLASSES } from '@keycloakify/angular/account/tokens/classes.token'; +import { ACCOUNT_I18N } from '@keycloakify/angular/account/tokens/i18n.token'; +import { KC_ACCOUNT_CONTEXT } from '@keycloakify/angular/account/tokens/kc-context.token'; +import { USE_DEFAULT_CSS } from '@keycloakify/angular/lib/tokens/use-default-css.token'; +import { type ClassKey } from 'keycloakify/account'; +import { type I18n } from '../../i18n'; +import { type KcContext } from '../../KcContext'; + +@Component({ + standalone: true, + imports: [KcClassDirective, TemplateComponent, NgClass], + selector: 'kc-root', + templateUrl: 'password.component.html', + providers: [ + { + provide: ComponentReference, + useExisting: forwardRef(() => PasswordComponent) + } + ] +}) +export class PasswordComponent extends ComponentReference { + i18n = inject(ACCOUNT_I18N); + kcContext = inject>(KC_ACCOUNT_CONTEXT); + override doUseDefaultCss = inject(USE_DEFAULT_CSS); + override classes = inject>>(ACCOUNT_CLASSES); + override additionalClasses: Partial> = { + kcBodyClass: `${this.classes?.kcBodyClass} password` + }; + + currentPassword = signal(''); + newPassword = signal(''); + newPasswordConfirm = signal(''); + newPasswordError = signal(''); + newPasswordConfirmError = signal(''); + hasNewPasswordBlurred = signal(false); + hasNewPasswordConfirmBlurred = signal(false); + + constructor() { + super(); + // @ts-ignore + window.kcContext = { + ...this.kcContext, + message: (() => { + if (this.newPasswordError() !== '') { + return { + type: 'error', + summary: this.newPasswordError() + }; + } + if (this.newPasswordConfirmError() !== '') { + return { + type: 'error', + summary: this.newPasswordConfirmError() + }; + } + return this.kcContext.message; + })() + }; + } + + checkNewPassword(newPassword: string) { + if (!this.kcContext.password.passwordSet) return; + if (newPassword === this.currentPassword()) { + this.newPasswordError.set('newPasswordSameAsOld'); + } else { + this.newPasswordError.set(''); + } + } + checkNewPasswordConfirm(newPasswordConfirm: string) { + if (newPasswordConfirm === '') return; + if (newPasswordConfirm !== this.newPassword()) { + this.newPasswordConfirmError.set('passwordConfirmNotMatch'); + } else { + this.newPasswordConfirmError.set(''); + } + } + + onNewPasswordChange(value: string) { + const newPassword = value; + + this.newPassword.set(newPassword); + if (this.hasNewPasswordBlurred()) { + this.checkNewPassword(newPassword); + } + } + + onNewPasswordBlur() { + this.hasNewPasswordBlurred.set(true); + this.checkNewPassword(this.newPassword()); + } + + onNewPasswordConfirmChange(value: string) { + const newPasswordConfirm = value; + + this.newPasswordConfirm.set(newPasswordConfirm); + if (this.hasNewPasswordConfirmBlurred()) { + this.checkNewPasswordConfirm(newPasswordConfirm); + } + } + + onNewPasswordConfirmBlur() { + this.hasNewPasswordConfirmBlurred.set(true); + this.checkNewPasswordConfirm(this.newPasswordConfirm()); + } +} diff --git a/src/account/pages/sessions/sessions.component.html b/src/account/pages/sessions/sessions.component.html new file mode 100644 index 00000000..7fcf0b8e --- /dev/null +++ b/src/account/pages/sessions/sessions.component.html @@ -0,0 +1,63 @@ +@let url = kcContext.url; +@let sessions = kcContext.sessions; +@let stateChecker = kcContext.stateChecker; + + + +
    +
    +

    {{ i18n.msgStr('sessionsHtmlTitle') }}

    +
    +
    + + + + + + + + + + + + + + @for (session of sessions.sessions; track session) { + + + + + + + + } + +
    {{ i18n.msgStr('ip') }}{{ i18n.msgStr('started') }}{{ i18n.msgStr('lastAccess') }}{{ i18n.msgStr('expires') }}{{ i18n.msgStr('clients') }}
    {{ session.ipAddress }}{{ session?.started }}{{ session?.lastAccess }}{{ session?.expires }} + @for (client of session.clients; track client) { +
    + {{ client }} +
    +
    + } +
    + +
    + + +
    +
    +
    diff --git a/src/account/pages/sessions/sessions.component.ts b/src/account/pages/sessions/sessions.component.ts new file mode 100644 index 00000000..ed2d7c77 --- /dev/null +++ b/src/account/pages/sessions/sessions.component.ts @@ -0,0 +1,31 @@ +import { NgClass } from '@angular/common'; +import { Component, forwardRef, inject } from '@angular/core'; +import { ComponentReference } from '@keycloakify/angular/account/classes/component-reference.class'; +import { TemplateComponent } from '@keycloakify/angular/account/containers/template.component'; +import { KcClassDirective } from '@keycloakify/angular/account/directives/kc-class.directive'; +import { ACCOUNT_CLASSES } from '@keycloakify/angular/account/tokens/classes.token'; +import { ACCOUNT_I18N } from '@keycloakify/angular/account/tokens/i18n.token'; +import { KC_ACCOUNT_CONTEXT } from '@keycloakify/angular/account/tokens/kc-context.token'; +import { USE_DEFAULT_CSS } from '@keycloakify/angular/lib/tokens/use-default-css.token'; +import { type ClassKey } from 'keycloakify/account'; +import { type I18n } from '../../i18n'; +import { type KcContext } from '../../KcContext'; + +@Component({ + standalone: true, + imports: [KcClassDirective, TemplateComponent, NgClass], + selector: 'kc-root', + templateUrl: 'sessions.component.html', + providers: [ + { + provide: ComponentReference, + useExisting: forwardRef(() => SessionsComponent) + } + ] +}) +export class SessionsComponent extends ComponentReference { + i18n = inject(ACCOUNT_I18N); + kcContext = inject>(KC_ACCOUNT_CONTEXT); + override doUseDefaultCss = inject(USE_DEFAULT_CSS); + override classes = inject>>(ACCOUNT_CLASSES); +} diff --git a/src/account/pages/totp/totp.component.html b/src/account/pages/totp/totp.component.html new file mode 100644 index 00000000..3fe0f605 --- /dev/null +++ b/src/account/pages/totp/totp.component.html @@ -0,0 +1,258 @@ +@let url = kcContext.url; +@let mode = kcContext.mode; +@let messagesPerField = kcContext.messagesPerField; +@let stateChecker = kcContext.stateChecker; +@let totp = kcContext.totp; + + + +
    +
    +

    {{ i18n.msgStr('authenticatorTitle') }}

    +
    + @if (totp.otpCredentials.length) { +
    + * + {{ i18n.msgStr('requiredFields') }} +
    + } +
    + @if (totp.enabled) { + + + @if (totp.otpCredentials.length > 1) { + + + + } @else { + + + + } + + + @for (credential of totp.otpCredentials; track credential; let index = $index) { + + + @if (totp.otpCredentials.length > 1) { + + } + + + + } + +
    {{ i18n.msgStr('configureAuthenticators') }}
    {{ i18n.msgStr('configureAuthenticators') }}
    {{ i18n.msgStr('mobile') }}{{ credential.id }}{{ credential.userLabel || '' }} +
    + + + + +
    +
    + } @else { +
    +
    +
      +
    1. +

      {{ i18n.msgStr('totpStep1') }}

      + +
        + @for (app of totp.supportedApplications; track app) { +
      • {{ i18n.advancedMsgStr(app) }}
      • + } +
      +
    2. + @if (mode && mode === 'manual') { +
    3. +

      {{ i18n.msgStr('totpManualStep2') }}

      +

      + {{ totp.totpSecretEncoded }} +

      +

      + + {{ i18n.msgStr('totpScanBarcode') }} + +

      +
    4. +
    5. +

      {{ i18n.msgStr('totpManualStep3') }}

      +
        +
      • {{ i18n.msgStr('totpType') }}: {{ i18n.msgStr($any('totp.' + totp.policy.type)) }}
      • +
      • {{ i18n.msgStr('totpAlgorithm') }}: {{ totp.policy.getAlgorithmKey() }}
      • +
      • {{ i18n.msgStr('totpDigits') }}: {{ totp.policy.digits }}
      • + @if (totp.policy.type === 'totp') { +
      • {{ i18n.msgStr('totpInterval') }}: {{ totp.policy.period }}
      • + } @else { +
      • {{ i18n.msgStr('totpCounter') }}: {{ totp.policy.initialCounter }}
      • + } +
      +
    6. + } @else { +
    7. +

      {{ i18n.msgStr('totpStep2') }}

      +

      + Figure: Barcode +

      +

      + + {{ i18n.msgStr('totpUnableToScan') }} + +

      +
    8. + } +
    9. +

      {{ i18n.msgStr('totpStep3') }}

      +

      {{ i18n.msgStr('totpStep3DeviceName') }}

      +
    10. +
    +
    +
    + +
    +
    + + * +
    +
    + + @if (messagesPerField.existsError('totp')) { + + } +
    + + @if (mode) { + + } +
    + +
    +
    + + @if (totp.otpCredentials.length >= 1) { + * + } +
    +
    + + @if (messagesPerField.existsError('userLabel')) { + + } +
    +
    + +
    +
    + + +
    +
    +
    +
    + } +
    +
    diff --git a/src/account/pages/totp/totp.component.ts b/src/account/pages/totp/totp.component.ts new file mode 100644 index 00000000..b5ad12e6 --- /dev/null +++ b/src/account/pages/totp/totp.component.ts @@ -0,0 +1,32 @@ +import { NgClass } from '@angular/common'; +import { Component, forwardRef, inject } from '@angular/core'; +import { ComponentReference } from '@keycloakify/angular/account/classes/component-reference.class'; +import { TemplateComponent } from '@keycloakify/angular/account/containers/template.component'; +import { KcClassDirective } from '@keycloakify/angular/account/directives/kc-class.directive'; +import { ACCOUNT_CLASSES } from '@keycloakify/angular/account/tokens/classes.token'; +import { ACCOUNT_I18N } from '@keycloakify/angular/account/tokens/i18n.token'; +import { KC_ACCOUNT_CONTEXT } from '@keycloakify/angular/account/tokens/kc-context.token'; +import { KcSanitizePipe } from '@keycloakify/angular/lib/pipes/kc-sanitize.pipe'; +import { USE_DEFAULT_CSS } from '@keycloakify/angular/lib/tokens/use-default-css.token'; +import { type ClassKey } from 'keycloakify/account'; +import { type I18n } from '../../i18n'; +import { type KcContext } from '../../KcContext'; + +@Component({ + standalone: true, + imports: [KcClassDirective, TemplateComponent, KcSanitizePipe, NgClass], + selector: 'kc-root', + templateUrl: 'totp.component.html', + providers: [ + { + provide: ComponentReference, + useExisting: forwardRef(() => TotpComponent) + } + ] +}) +export class TotpComponent extends ComponentReference { + i18n = inject(ACCOUNT_I18N); + kcContext = inject>(KC_ACCOUNT_CONTEXT); + override doUseDefaultCss = inject(USE_DEFAULT_CSS); + override classes = inject>>(ACCOUNT_CLASSES); +} diff --git a/src/account/providers/keycloakify-angular.providers.ts b/src/account/providers/keycloakify-angular.providers.ts new file mode 100644 index 00000000..eafcfff2 --- /dev/null +++ b/src/account/providers/keycloakify-angular.providers.ts @@ -0,0 +1,64 @@ +import { DOCUMENT } from '@angular/common'; +import { APP_INITIALIZER, LOCALE_ID, makeEnvironmentProviders } from '@angular/core'; +import { I18nService } from '@keycloakify/angular/account/services/i18n.service'; +import { ACCOUNT_CLASSES } from '@keycloakify/angular/account/tokens/classes.token'; +import { ACCOUNT_I18N } from '@keycloakify/angular/account/tokens/i18n.token'; +import { KC_ACCOUNT_CONTEXT } from '@keycloakify/angular/account/tokens/kc-context.token'; +import { USE_DEFAULT_CSS } from '@keycloakify/angular/lib/tokens/use-default-css.token'; +import { type KcContextLike } from 'keycloakify/account/i18n/noJsx'; +import { type ClassKey } from 'keycloakify/account/lib/kcClsx'; +import { type KcContext } from '../KcContext'; + +export type KeycloakifyAngularAccountConfig = { + doUseDefaultCss?: boolean; + classes?: { [key in ClassKey]?: string }; + getI18n: (params: { kcContext: KcContextLike }) => { + i18n: unknown; + prI18n_currentLanguage: Promise | undefined; + }; +}; + +export const provideKeycloakifyAngularAccount = ( + config: KeycloakifyAngularAccountConfig +) => + makeEnvironmentProviders([ + { + provide: KC_ACCOUNT_CONTEXT, + // @ts-ignore + useValue: window.kcContext + }, + { + provide: LOCALE_ID, + useFactory: (document: Document) => { + return document.documentElement.lang ?? 'en'; + }, + deps: [DOCUMENT] + }, + { + provide: APP_INITIALIZER, + multi: true, + useFactory: (i18nService: I18nService, kcContext: KcContext) => async () => { + const getI18n = config.getI18n; + + const { i18n, prI18n_currentLanguage } = getI18n({ + kcContext + }); + let i18nPromise = new Promise(resolve => resolve(i18n)); + if (prI18n_currentLanguage) { + i18nPromise = prI18n_currentLanguage; + } + return i18nPromise.then(i18n => { + i18nService.i18n = i18n; + return true; + }); + }, + deps: [I18nService, KC_ACCOUNT_CONTEXT] + }, + { + provide: ACCOUNT_I18N, + useFactory: (i18nService: I18nService) => i18nService.i18n, + deps: [I18nService] + }, + { provide: USE_DEFAULT_CSS, useValue: config?.doUseDefaultCss ?? true }, + { provide: ACCOUNT_CLASSES, useValue: config?.classes ?? {} } + ]); diff --git a/src/account/services/i18n.service.ts b/src/account/services/i18n.service.ts new file mode 100644 index 00000000..d811dce8 --- /dev/null +++ b/src/account/services/i18n.service.ts @@ -0,0 +1,7 @@ +import { Injectable } from '@angular/core'; + +@Injectable({ providedIn: 'root' }) +/** INTERNAL: DO NOT IMPORT THIS */ +export class I18nService { + i18n!: unknown; +} diff --git a/src/account/services/resource-injector.service.ts b/src/account/services/resource-injector.service.ts new file mode 100644 index 00000000..c75e4d83 --- /dev/null +++ b/src/account/services/resource-injector.service.ts @@ -0,0 +1,37 @@ +import { inject, Injectable } from '@angular/core'; +import { KC_ACCOUNT_CONTEXT } from '@keycloakify/angular/account/tokens/kc-context.token'; +import { Script } from '@keycloakify/angular/lib/models/script.model'; +import { ResourceInjectorService } from '@keycloakify/angular/lib/services/resource-injector.service'; +import { catchError, forkJoin, of, switchMap } from 'rxjs'; +import { type KcContext } from '../KcContext'; + +@Injectable({ + providedIn: 'root', +}) +export class AccountResourceInjectorService { + private kcContext: KcContext = inject(KC_ACCOUNT_CONTEXT); + private resourceInjectorService: ResourceInjectorService = inject(ResourceInjectorService); + + injectResource(doUseDefaultCss = true) { + if (!doUseDefaultCss) { + return of(true); + } + const stylesheets = [ + `${this.kcContext.url.resourcesCommonPath}/node_modules/patternfly/dist/css/patternfly.min.css`, + `${this.kcContext.url.resourcesCommonPath}/node_modules/patternfly/dist/css/patternfly-additions.min.css`, + `${this.kcContext.url.resourcesPath}/css/account.css`, + ]; + + return forkJoin(stylesheets.map((url) => this.resourceInjectorService.createLink(url))).pipe( + switchMap(() => of(true)), + catchError((error) => { + console.error('Error loading styles:', error); + return of(false); + }), + ); + } + + insertAdditionalScripts(scripts: Script[]) { + scripts.map((script) => this.resourceInjectorService.createScript(script)); + } +} diff --git a/src/account/tokens/classes.token.ts b/src/account/tokens/classes.token.ts new file mode 100644 index 00000000..76d13955 --- /dev/null +++ b/src/account/tokens/classes.token.ts @@ -0,0 +1,6 @@ +import { InjectionToken } from '@angular/core'; +import { type ClassKey } from 'keycloakify/account/lib/kcClsx'; + +export const ACCOUNT_CLASSES = new InjectionToken<{ [key in ClassKey]?: string }>( + 'account classes' +); diff --git a/src/account/tokens/i18n.token.ts b/src/account/tokens/i18n.token.ts new file mode 100644 index 00000000..d63a08f0 --- /dev/null +++ b/src/account/tokens/i18n.token.ts @@ -0,0 +1,3 @@ +import { InjectionToken } from '@angular/core'; + +export const ACCOUNT_I18N = new InjectionToken('account i18n'); diff --git a/src/account/tokens/kc-context.token.ts b/src/account/tokens/kc-context.token.ts new file mode 100644 index 00000000..49c89449 --- /dev/null +++ b/src/account/tokens/kc-context.token.ts @@ -0,0 +1,4 @@ +import { InjectionToken } from '@angular/core'; +import { type KcContext } from '../KcContext'; + +export const KC_ACCOUNT_CONTEXT = new InjectionToken('keycloak account context'); diff --git a/src/login/directives/attributes.directive.ts b/src/lib/directives/attributes.directive.ts similarity index 100% rename from src/login/directives/attributes.directive.ts rename to src/lib/directives/attributes.directive.ts diff --git a/src/login/pipes/input-type.pipe.ts b/src/lib/pipes/input-type.pipe.ts similarity index 100% rename from src/login/pipes/input-type.pipe.ts rename to src/lib/pipes/input-type.pipe.ts diff --git a/src/lib/pipes/is-array-with-empty-object.pipe.ts b/src/lib/pipes/is-array-with-empty-object.pipe.ts new file mode 100644 index 00000000..9bd17bc5 --- /dev/null +++ b/src/lib/pipes/is-array-with-empty-object.pipe.ts @@ -0,0 +1,16 @@ +import { Pipe, PipeTransform } from '@angular/core'; + +@Pipe({ + name: 'isArrayWithEmptyObject', + standalone: true, +}) +export class IsArrayWithEmptyObjectPipe implements PipeTransform { + transform(variable: unknown): boolean { + return ( + Array.isArray(variable) && + variable.length === 1 && + typeof variable[0] === 'object' && + Object.keys(variable[0]).length === 0 + ); + } +} diff --git a/src/login/pipes/kc-sanitize.pipe.ts b/src/lib/pipes/kc-sanitize.pipe.ts similarity index 100% rename from src/login/pipes/kc-sanitize.pipe.ts rename to src/lib/pipes/kc-sanitize.pipe.ts diff --git a/src/lib/pipes/to-array.pipe.ts b/src/lib/pipes/to-array.pipe.ts new file mode 100644 index 00000000..76a28455 --- /dev/null +++ b/src/lib/pipes/to-array.pipe.ts @@ -0,0 +1,15 @@ +import { Pipe, PipeTransform } from '@angular/core'; + +@Pipe({ + name: 'toArray', + standalone: true, +}) +export class ToArrayPipe implements PipeTransform { + transform(value: string | string[], emptyWhenString = false): string[] { + // if (!value) throw new Error('must pass a value'); + if (value instanceof Array) { + return value; + } + return emptyWhenString ? [] : [value]; + } +} diff --git a/src/lib/pipes/to-number.pipe.ts b/src/lib/pipes/to-number.pipe.ts new file mode 100644 index 00000000..8f6fd952 --- /dev/null +++ b/src/lib/pipes/to-number.pipe.ts @@ -0,0 +1,13 @@ +import { Pipe, PipeTransform } from '@angular/core'; + +@Pipe({ + name: 'toNumber', + standalone: true, +}) +export class ToNumberPipe implements PipeTransform { + transform(value: string | number): number { + const number = parseInt(`${value}`); + if (isNaN(number)) throw new Error('number is NaN'); + return number; + } +} diff --git a/src/login/components/group-label/group-label.component.ts b/src/login/components/group-label/group-label.component.ts index c9daa65c..7689c3b4 100644 --- a/src/login/components/group-label/group-label.component.ts +++ b/src/login/components/group-label/group-label.component.ts @@ -1,7 +1,7 @@ import { ChangeDetectionStrategy, Component, computed, forwardRef, inject, input } from '@angular/core'; import { USE_DEFAULT_CSS } from '@keycloakify/angular/lib/tokens/use-default-css.token'; import { ComponentReference } from '@keycloakify/angular/login/classes/component-reference.class'; -import { AttributesDirective } from '@keycloakify/angular/login/directives/attributes.directive'; +import { AttributesDirective } from '@keycloakify/angular/lib/directives/attributes.directive'; import { KcClassDirective } from '@keycloakify/angular/login/directives/kc-class.directive'; import { LOGIN_CLASSES } from '@keycloakify/angular/login/tokens/classes.token'; import { LOGIN_I18N } from '@keycloakify/angular/login/tokens/i18n.token'; diff --git a/src/login/components/input-field-by-type/input-field-by-type.component.ts b/src/login/components/input-field-by-type/input-field-by-type.component.ts index b89db71d..dc518af5 100644 --- a/src/login/components/input-field-by-type/input-field-by-type.component.ts +++ b/src/login/components/input-field-by-type/input-field-by-type.component.ts @@ -4,7 +4,7 @@ import { LOGIN_CLASSES } from '@keycloakify/angular/login/tokens/classes.token'; import { type Attribute } from 'keycloakify/login/KcContext'; import { type ClassKey } from 'keycloakify/login/lib/kcClsx'; import { ComponentReference } from '@keycloakify/angular/login/classes/component-reference.class'; -import { ToArrayPipe } from '@keycloakify/angular/login/pipes/to-array.pipe'; +import { ToArrayPipe } from '@keycloakify/angular/lib/pipes/to-array.pipe'; import { FormAction, FormFieldError } from '@keycloakify/angular/login/services/user-profile-form.service'; import { InputTagSelectsComponent } from '@keycloakify/angular/login/components/input-tag-selects/input-tag-selects.component'; import { InputTagComponent } from '@keycloakify/angular/login/components/input-tag/input-tag.component'; diff --git a/src/login/components/input-tag/input-tag.component.ts b/src/login/components/input-tag/input-tag.component.ts index 59db626c..9c4101bd 100644 --- a/src/login/components/input-tag/input-tag.component.ts +++ b/src/login/components/input-tag/input-tag.component.ts @@ -1,13 +1,13 @@ import { ChangeDetectionStrategy, Component, computed, forwardRef, inject, input, output } from '@angular/core'; +import { AttributesDirective } from '@keycloakify/angular/lib/directives/attributes.directive'; +import { InputTypePipe } from '@keycloakify/angular/lib/pipes/input-type.pipe'; +import { ToArrayPipe } from '@keycloakify/angular/lib/pipes/to-array.pipe'; +import { ToNumberPipe } from '@keycloakify/angular/lib/pipes/to-number.pipe'; import { USE_DEFAULT_CSS } from '@keycloakify/angular/lib/tokens/use-default-css.token'; import { ComponentReference } from '@keycloakify/angular/login/classes/component-reference.class'; import { AddRemoveButtonsMultiValuedAttributeComponent } from '@keycloakify/angular/login/components/add-remove-buttons-multi-valued-attribute/add-remove-buttons-multi-valued-attribute.component'; import { FieldErrorsComponent } from '@keycloakify/angular/login/components/field-errors/field-errors.component'; -import { AttributesDirective } from '@keycloakify/angular/login/directives/attributes.directive'; import { KcClassDirective } from '@keycloakify/angular/login/directives/kc-class.directive'; -import { InputTypePipe } from '@keycloakify/angular/login/pipes/input-type.pipe'; -import { ToArrayPipe } from '@keycloakify/angular/login/pipes/to-array.pipe'; -import { ToNumberPipe } from '@keycloakify/angular/login/pipes/to-number.pipe'; import { FormAction, FormFieldError } from '@keycloakify/angular/login/services/user-profile-form.service'; import { LOGIN_CLASSES } from '@keycloakify/angular/login/tokens/classes.token'; import { LOGIN_I18N } from '@keycloakify/angular/login/tokens/i18n.token'; diff --git a/src/login/components/select-tag/select-tag.component.ts b/src/login/components/select-tag/select-tag.component.ts index d4933fee..b5c32381 100644 --- a/src/login/components/select-tag/select-tag.component.ts +++ b/src/login/components/select-tag/select-tag.component.ts @@ -2,7 +2,7 @@ import { ChangeDetectionStrategy, Component, computed, forwardRef, inject, input import { USE_DEFAULT_CSS } from '@keycloakify/angular/lib/tokens/use-default-css.token'; import { ComponentReference } from '@keycloakify/angular/login/classes/component-reference.class'; import { KcClassDirective } from '@keycloakify/angular/login/directives/kc-class.directive'; -import { ToNumberPipe } from '@keycloakify/angular/login/pipes/to-number.pipe'; +import { ToNumberPipe } from '@keycloakify/angular/lib/pipes/to-number.pipe'; import { type FormAction, type FormFieldError } from '@keycloakify/angular/login/services/user-profile-form.service'; import { LOGIN_CLASSES } from '@keycloakify/angular/login/tokens/classes.token'; import { LOGIN_I18N } from '@keycloakify/angular/login/tokens/i18n.token'; diff --git a/src/login/components/textarea-tag/textarea-tag.component.ts b/src/login/components/textarea-tag/textarea-tag.component.ts index 66876ff0..5cba0790 100644 --- a/src/login/components/textarea-tag/textarea-tag.component.ts +++ b/src/login/components/textarea-tag/textarea-tag.component.ts @@ -2,7 +2,7 @@ import { ChangeDetectionStrategy, Component, forwardRef, inject, input, output } import { USE_DEFAULT_CSS } from '@keycloakify/angular/lib/tokens/use-default-css.token'; import { ComponentReference } from '@keycloakify/angular/login/classes/component-reference.class'; import { KcClassDirective } from '@keycloakify/angular/login/directives/kc-class.directive'; -import { ToNumberPipe } from '@keycloakify/angular/login/pipes/to-number.pipe'; +import { ToNumberPipe } from '@keycloakify/angular/lib/pipes/to-number.pipe'; import { type FormAction, type FormFieldError } from '@keycloakify/angular/login/services/user-profile-form.service'; import { LOGIN_CLASSES } from '@keycloakify/angular/login/tokens/classes.token'; import { type Attribute } from 'keycloakify/login/KcContext'; diff --git a/src/login/containers/template.component.ts b/src/login/containers/template.component.ts index 6f626a07..d8a056a3 100644 --- a/src/login/containers/template.component.ts +++ b/src/login/containers/template.component.ts @@ -5,7 +5,7 @@ import { USE_DEFAULT_CSS } from '@keycloakify/angular/lib/tokens/use-default-css import { ComponentReference } from '@keycloakify/angular/login/classes/component-reference.class'; import { KcClassDirective } from '@keycloakify/angular/login/directives/kc-class.directive'; import type { I18n } from '@keycloakify/angular/login/i18n'; -import { KcSanitizePipe } from '@keycloakify/angular/login/pipes/kc-sanitize.pipe'; +import { KcSanitizePipe } from '@keycloakify/angular/lib/pipes/kc-sanitize.pipe'; import { LoginResourceInjectorService } from '@keycloakify/angular/login/services/login-resource-injector.service'; import { LOGIN_CLASSES } from '@keycloakify/angular/login/tokens/classes.token'; import { LOGIN_I18N } from '@keycloakify/angular/login/tokens/i18n.token'; diff --git a/src/login/pages/error/error.component.ts b/src/login/pages/error/error.component.ts index 03661c3c..ec188eab 100644 --- a/src/login/pages/error/error.component.ts +++ b/src/login/pages/error/error.component.ts @@ -2,7 +2,7 @@ import { ChangeDetectionStrategy, Component, forwardRef, inject } from '@angular import { USE_DEFAULT_CSS } from '@keycloakify/angular/lib/tokens/use-default-css.token'; import { ComponentReference } from '@keycloakify/angular/login/classes/component-reference.class'; import { TemplateComponent } from '@keycloakify/angular/login/containers/template.component'; -import { KcSanitizePipe } from '@keycloakify/angular/login/pipes/kc-sanitize.pipe'; +import { KcSanitizePipe } from '@keycloakify/angular/lib/pipes/kc-sanitize.pipe'; import { LOGIN_I18N } from '@keycloakify/angular/login/tokens/i18n.token'; import { type I18n } from '../../i18n'; import { LOGIN_CLASSES } from '@keycloakify/angular/login/tokens/classes.token'; diff --git a/src/login/pages/frontchannel-logout/frontchannel-logout.component.ts b/src/login/pages/frontchannel-logout/frontchannel-logout.component.ts index e23defff..ce1c4164 100644 --- a/src/login/pages/frontchannel-logout/frontchannel-logout.component.ts +++ b/src/login/pages/frontchannel-logout/frontchannel-logout.component.ts @@ -2,7 +2,7 @@ import { ChangeDetectionStrategy, Component, forwardRef, inject, input, OnInit } import { USE_DEFAULT_CSS } from '@keycloakify/angular/lib/tokens/use-default-css.token'; import { ComponentReference } from '@keycloakify/angular/login/classes/component-reference.class'; import { TemplateComponent } from '@keycloakify/angular/login/containers/template.component'; -import { KcSanitizePipe } from '@keycloakify/angular/login/pipes/kc-sanitize.pipe'; +import { KcSanitizePipe } from '@keycloakify/angular/lib/pipes/kc-sanitize.pipe'; import { LOGIN_I18N } from '@keycloakify/angular/login/tokens/i18n.token'; import { type I18n } from '../../i18n'; import { LOGIN_CLASSES } from '@keycloakify/angular/login/tokens/classes.token'; diff --git a/src/login/pages/info/info.component.ts b/src/login/pages/info/info.component.ts index fdcd0d5a..c8cedd4b 100644 --- a/src/login/pages/info/info.component.ts +++ b/src/login/pages/info/info.component.ts @@ -2,7 +2,7 @@ import { ChangeDetectionStrategy, Component, forwardRef, inject, input } from '@ import { USE_DEFAULT_CSS } from '@keycloakify/angular/lib/tokens/use-default-css.token'; import { ComponentReference } from '@keycloakify/angular/login/classes/component-reference.class'; import { TemplateComponent } from '@keycloakify/angular/login/containers/template.component'; -import { KcSanitizePipe } from '@keycloakify/angular/login/pipes/kc-sanitize.pipe'; +import { KcSanitizePipe } from '@keycloakify/angular/lib/pipes/kc-sanitize.pipe'; import { LOGIN_CLASSES } from '@keycloakify/angular/login/tokens/classes.token'; import { LOGIN_I18N } from '@keycloakify/angular/login/tokens/i18n.token'; import { KC_LOGIN_CONTEXT } from '@keycloakify/angular/login/tokens/kc-context.token'; diff --git a/src/login/pages/login-config-totp/login-config-totp.component.ts b/src/login/pages/login-config-totp/login-config-totp.component.ts index 573c9912..81e98f55 100644 --- a/src/login/pages/login-config-totp/login-config-totp.component.ts +++ b/src/login/pages/login-config-totp/login-config-totp.component.ts @@ -4,7 +4,7 @@ import { ComponentReference } from '@keycloakify/angular/login/classes/component import { LogoutOtherSessionsComponent } from '@keycloakify/angular/login/components/logout-other-sessions/logout-other-sessions.component'; import { TemplateComponent } from '@keycloakify/angular/login/containers/template.component'; import { KcClassDirective } from '@keycloakify/angular/login/directives/kc-class.directive'; -import { KcSanitizePipe } from '@keycloakify/angular/login/pipes/kc-sanitize.pipe'; +import { KcSanitizePipe } from '@keycloakify/angular/lib/pipes/kc-sanitize.pipe'; import { LOGIN_CLASSES } from '@keycloakify/angular/login/tokens/classes.token'; import { LOGIN_I18N } from '@keycloakify/angular/login/tokens/i18n.token'; import { KC_LOGIN_CONTEXT } from '@keycloakify/angular/login/tokens/kc-context.token'; diff --git a/src/login/pages/login-otp/login-otp.component.ts b/src/login/pages/login-otp/login-otp.component.ts index 62e7c53d..e1d25121 100644 --- a/src/login/pages/login-otp/login-otp.component.ts +++ b/src/login/pages/login-otp/login-otp.component.ts @@ -3,7 +3,7 @@ import { USE_DEFAULT_CSS } from '@keycloakify/angular/lib/tokens/use-default-css import { ComponentReference } from '@keycloakify/angular/login/classes/component-reference.class'; import { TemplateComponent } from '@keycloakify/angular/login/containers/template.component'; import { KcClassDirective } from '@keycloakify/angular/login/directives/kc-class.directive'; -import { KcSanitizePipe } from '@keycloakify/angular/login/pipes/kc-sanitize.pipe'; +import { KcSanitizePipe } from '@keycloakify/angular/lib/pipes/kc-sanitize.pipe'; import { LOGIN_CLASSES } from '@keycloakify/angular/login/tokens/classes.token'; import { LOGIN_I18N } from '@keycloakify/angular/login/tokens/i18n.token'; import { KC_LOGIN_CONTEXT } from '@keycloakify/angular/login/tokens/kc-context.token'; diff --git a/src/login/pages/login-password/login-password.component.ts b/src/login/pages/login-password/login-password.component.ts index 37085956..53a79808 100644 --- a/src/login/pages/login-password/login-password.component.ts +++ b/src/login/pages/login-password/login-password.component.ts @@ -4,7 +4,7 @@ import { ComponentReference } from '@keycloakify/angular/login/classes/component import { PasswordWrapperComponent } from '@keycloakify/angular/login/components/password-wrapper/password-wrapper.component'; import { TemplateComponent } from '@keycloakify/angular/login/containers/template.component'; import { KcClassDirective } from '@keycloakify/angular/login/directives/kc-class.directive'; -import { KcSanitizePipe } from '@keycloakify/angular/login/pipes/kc-sanitize.pipe'; +import { KcSanitizePipe } from '@keycloakify/angular/lib/pipes/kc-sanitize.pipe'; import { LOGIN_CLASSES } from '@keycloakify/angular/login/tokens/classes.token'; import { LOGIN_I18N } from '@keycloakify/angular/login/tokens/i18n.token'; import { KC_LOGIN_CONTEXT } from '@keycloakify/angular/login/tokens/kc-context.token'; diff --git a/src/login/pages/login-recovery-authn-code-input/login-recovery-authn-code-input.component.ts b/src/login/pages/login-recovery-authn-code-input/login-recovery-authn-code-input.component.ts index 4016e21f..9ea46e17 100644 --- a/src/login/pages/login-recovery-authn-code-input/login-recovery-authn-code-input.component.ts +++ b/src/login/pages/login-recovery-authn-code-input/login-recovery-authn-code-input.component.ts @@ -3,7 +3,7 @@ import { USE_DEFAULT_CSS } from '@keycloakify/angular/lib/tokens/use-default-css import { ComponentReference } from '@keycloakify/angular/login/classes/component-reference.class'; import { TemplateComponent } from '@keycloakify/angular/login/containers/template.component'; import { KcClassDirective } from '@keycloakify/angular/login/directives/kc-class.directive'; -import { KcSanitizePipe } from '@keycloakify/angular/login/pipes/kc-sanitize.pipe'; +import { KcSanitizePipe } from '@keycloakify/angular/lib/pipes/kc-sanitize.pipe'; import { LOGIN_CLASSES } from '@keycloakify/angular/login/tokens/classes.token'; import { LOGIN_I18N } from '@keycloakify/angular/login/tokens/i18n.token'; import { KC_LOGIN_CONTEXT } from '@keycloakify/angular/login/tokens/kc-context.token'; diff --git a/src/login/pages/login-reset-password/login-reset-password.component.ts b/src/login/pages/login-reset-password/login-reset-password.component.ts index 890d0920..b18ddd84 100644 --- a/src/login/pages/login-reset-password/login-reset-password.component.ts +++ b/src/login/pages/login-reset-password/login-reset-password.component.ts @@ -3,7 +3,7 @@ import { USE_DEFAULT_CSS } from '@keycloakify/angular/lib/tokens/use-default-css import { ComponentReference } from '@keycloakify/angular/login/classes/component-reference.class'; import { TemplateComponent } from '@keycloakify/angular/login/containers/template.component'; import { KcClassDirective } from '@keycloakify/angular/login/directives/kc-class.directive'; -import { KcSanitizePipe } from '@keycloakify/angular/login/pipes/kc-sanitize.pipe'; +import { KcSanitizePipe } from '@keycloakify/angular/lib/pipes/kc-sanitize.pipe'; import { LOGIN_CLASSES } from '@keycloakify/angular/login/tokens/classes.token'; import { LOGIN_I18N } from '@keycloakify/angular/login/tokens/i18n.token'; import { KC_LOGIN_CONTEXT } from '@keycloakify/angular/login/tokens/kc-context.token'; diff --git a/src/login/pages/login-update-password/login-update-password.component.ts b/src/login/pages/login-update-password/login-update-password.component.ts index 5dfa959b..8be59138 100644 --- a/src/login/pages/login-update-password/login-update-password.component.ts +++ b/src/login/pages/login-update-password/login-update-password.component.ts @@ -5,7 +5,7 @@ import { LogoutOtherSessionsComponent } from '@keycloakify/angular/login/compone import { PasswordWrapperComponent } from '@keycloakify/angular/login/components/password-wrapper/password-wrapper.component'; import { TemplateComponent } from '@keycloakify/angular/login/containers/template.component'; import { KcClassDirective } from '@keycloakify/angular/login/directives/kc-class.directive'; -import { KcSanitizePipe } from '@keycloakify/angular/login/pipes/kc-sanitize.pipe'; +import { KcSanitizePipe } from '@keycloakify/angular/lib/pipes/kc-sanitize.pipe'; import { LOGIN_CLASSES } from '@keycloakify/angular/login/tokens/classes.token'; import { LOGIN_I18N } from '@keycloakify/angular/login/tokens/i18n.token'; import { KC_LOGIN_CONTEXT } from '@keycloakify/angular/login/tokens/kc-context.token'; diff --git a/src/login/pages/login-username/login-username.component.ts b/src/login/pages/login-username/login-username.component.ts index bce12ef4..0e7eee3a 100644 --- a/src/login/pages/login-username/login-username.component.ts +++ b/src/login/pages/login-username/login-username.component.ts @@ -4,7 +4,7 @@ import { USE_DEFAULT_CSS } from '@keycloakify/angular/lib/tokens/use-default-css import { ComponentReference } from '@keycloakify/angular/login/classes/component-reference.class'; import { TemplateComponent } from '@keycloakify/angular/login/containers/template.component'; import { KcClassDirective } from '@keycloakify/angular/login/directives/kc-class.directive'; -import { KcSanitizePipe } from '@keycloakify/angular/login/pipes/kc-sanitize.pipe'; +import { KcSanitizePipe } from '@keycloakify/angular/lib/pipes/kc-sanitize.pipe'; import { LOGIN_CLASSES } from '@keycloakify/angular/login/tokens/classes.token'; import { LOGIN_I18N } from '@keycloakify/angular/login/tokens/i18n.token'; import { KC_LOGIN_CONTEXT } from '@keycloakify/angular/login/tokens/kc-context.token'; diff --git a/src/login/pages/login/login.component.ts b/src/login/pages/login/login.component.ts index ea03c0f2..6eb5d7a4 100644 --- a/src/login/pages/login/login.component.ts +++ b/src/login/pages/login/login.component.ts @@ -5,7 +5,7 @@ import { ComponentReference } from '@keycloakify/angular/login/classes/component import { PasswordWrapperComponent } from '@keycloakify/angular/login/components/password-wrapper/password-wrapper.component'; import { TemplateComponent } from '@keycloakify/angular/login/containers/template.component'; import { KcClassDirective } from '@keycloakify/angular/login/directives/kc-class.directive'; -import { KcSanitizePipe } from '@keycloakify/angular/login/pipes/kc-sanitize.pipe'; +import { KcSanitizePipe } from '@keycloakify/angular/lib/pipes/kc-sanitize.pipe'; import { LOGIN_CLASSES } from '@keycloakify/angular/login/tokens/classes.token'; import { LOGIN_I18N } from '@keycloakify/angular/login/tokens/i18n.token'; import { KC_LOGIN_CONTEXT } from '@keycloakify/angular/login/tokens/kc-context.token'; diff --git a/src/login/pages/register/register.component.ts b/src/login/pages/register/register.component.ts index 5774fc99..9c3a21eb 100644 --- a/src/login/pages/register/register.component.ts +++ b/src/login/pages/register/register.component.ts @@ -6,7 +6,7 @@ import { ComponentReference } from '@keycloakify/angular/login/classes/component import { UserProfileFormFieldsComponent } from '@keycloakify/angular/login/components/user-profile-form-fields/user-profile-form-fields.component'; import { TemplateComponent } from '@keycloakify/angular/login/containers/template.component'; import { KcClassDirective } from '@keycloakify/angular/login/directives/kc-class.directive'; -import { KcSanitizePipe } from '@keycloakify/angular/login/pipes/kc-sanitize.pipe'; +import { KcSanitizePipe } from '@keycloakify/angular/lib/pipes/kc-sanitize.pipe'; import { LOGIN_CLASSES } from '@keycloakify/angular/login/tokens/classes.token'; import { LOGIN_I18N } from '@keycloakify/angular/login/tokens/i18n.token'; import { KC_LOGIN_CONTEXT } from '@keycloakify/angular/login/tokens/kc-context.token'; diff --git a/src/login/pipes/to-array.pipe.ts b/src/login/pipes/to-array.pipe.ts deleted file mode 100644 index 57900489..00000000 --- a/src/login/pipes/to-array.pipe.ts +++ /dev/null @@ -1,14 +0,0 @@ -import { Pipe, PipeTransform } from '@angular/core'; - -@Pipe({ - name: 'toArray', - standalone: true -}) -export class ToArrayPipe implements PipeTransform { - transform(value: string | string[], emptyWhenString = false): string[] { - if (value instanceof Array) { - return value; - } - return emptyWhenString ? [] : [value]; - } -} diff --git a/src/login/pipes/to-number.pipe.ts b/src/login/pipes/to-number.pipe.ts deleted file mode 100644 index 8d018e29..00000000 --- a/src/login/pipes/to-number.pipe.ts +++ /dev/null @@ -1,13 +0,0 @@ -import { Pipe, PipeTransform } from '@angular/core'; - -@Pipe({ - name: 'toNumber', - standalone: true -}) -export class ToNumberPipe implements PipeTransform { - transform(value: string | number): number { - const number = parseInt(`${value}`); - if (isNaN(number)) throw new Error('number is NaN'); - return number; - } -} diff --git a/src/login/tokens/kc-context.token.ts b/src/login/tokens/kc-context.token.ts index f9db97bf..0875a283 100644 --- a/src/login/tokens/kc-context.token.ts +++ b/src/login/tokens/kc-context.token.ts @@ -1,4 +1,4 @@ import { InjectionToken } from '@angular/core'; -import { KcContext } from '../KcContext'; +import { type KcContext } from '../KcContext'; export const KC_LOGIN_CONTEXT = new InjectionToken('keycloak login context'); From 667a965c0bca08add66690f20a1d0a79d2d9d8ab Mon Sep 17 00:00:00 2001 From: Luca Peruzzo Date: Tue, 1 Oct 2024 16:04:23 +0200 Subject: [PATCH 59/64] Release Candidate --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 81b34bfa..026531ca 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@keycloakify/angular", - "version": "0.0.1-rc.9", + "version": "0.0.1-rc.10", "description": "Angular components for Keycloakify", "repository": { "type": "git", From 8f8d29b81f0953b98e73347b252d0d2ca2374bd8 Mon Sep 17 00:00:00 2001 From: Luca Peruzzo Date: Tue, 1 Oct 2024 16:17:31 +0200 Subject: [PATCH 60/64] fix providers compatibility --- src/account/DefaultPage.ts | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/account/DefaultPage.ts b/src/account/DefaultPage.ts index a8eedd4c..5e4fdadd 100644 --- a/src/account/DefaultPage.ts +++ b/src/account/DefaultPage.ts @@ -8,6 +8,7 @@ const DefaultPage = async ( classes: { [key in ClassKey]?: string } = {}, ): Promise<{ ComponentBootstrap: Type; + doMakeUserConfirmPassword: boolean; doUseDefaultCss: boolean; classes: { [key in ClassKey]?: string }; }> => { @@ -41,6 +42,7 @@ const DefaultPage = async ( } return ComponentBootstrapPromise?.then((ComponentBootstrap) => ({ ComponentBootstrap, + doMakeUserConfirmPassword: false, doUseDefaultCss, classes, })); From ff3103a212f60677ac83ebbc94fdc02a86342b43 Mon Sep 17 00:00:00 2001 From: Luca Peruzzo Date: Tue, 1 Oct 2024 16:18:07 +0200 Subject: [PATCH 61/64] Release Candidate --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 026531ca..fa9c08ec 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@keycloakify/angular", - "version": "0.0.1-rc.10", + "version": "0.0.1-rc.11", "description": "Angular components for Keycloakify", "repository": { "type": "git", From 8a7740a3767af9739f45f90c84723ac0aeb5a95e Mon Sep 17 00:00:00 2001 From: Joseph Garrone Date: Tue, 1 Oct 2024 22:45:43 +0200 Subject: [PATCH 62/64] Fix build on windows --- scripts/build/main.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/scripts/build/main.ts b/scripts/build/main.ts index 39205de3..ec56d519 100644 --- a/scripts/build/main.ts +++ b/scripts/build/main.ts @@ -1,5 +1,5 @@ import * as fs from 'fs'; -import { join as pathJoin, basename as pathBasename } from 'path'; +import { join as pathJoin, basename as pathBasename, sep as pathSep } from 'path'; import { transformCodebase } from '../tools/transformCodebase'; import chalk from 'chalk'; import { run } from '../shared/run'; @@ -63,7 +63,7 @@ import { crawl } from '../tools/crawl'; typescriptFilesRelativeFilePaths .map( (relativeFilePath, i) => - `export * as e${i} from "./${relativeFilePath.replace(/\.ts$/, '')}";` + `export * as e${i} from "./${relativeFilePath.split(pathSep).join('/').replace(/\.ts$/, '')}";` ) .join('\n') ) From 4217b2f8b0305fb25bf62c4380a78a98f2a5c061 Mon Sep 17 00:00:00 2001 From: Joseph Garrone Date: Tue, 1 Oct 2024 23:31:06 +0200 Subject: [PATCH 63/64] Make the linking script more friendly --- package.json | 3 +- scripts/link-in-starter.ts | 121 ++++++++++++++++++++++++++----------- yarn.lock | 12 ++++ 3 files changed, 100 insertions(+), 36 deletions(-) diff --git a/package.json b/package.json index fa9c08ec..ce590369 100644 --- a/package.json +++ b/package.json @@ -65,7 +65,8 @@ "@angular/compiler": "^18.2.6", "ng-packagr": "^18.2.1", "run-exclusive": "^2.2.19", - "tslib": "^2.7.0" + "tslib": "^2.7.0", + "cli-select": "^1.1.2" }, "publishConfig": { "access": "public" diff --git a/scripts/link-in-starter.ts b/scripts/link-in-starter.ts index 757b80f6..0131f9be 100644 --- a/scripts/link-in-starter.ts +++ b/scripts/link-in-starter.ts @@ -1,49 +1,100 @@ import * as fs from 'fs'; -import { join } from 'path'; +import { join as pathJoin, sep as pathSep } from 'path'; import { startRebuildOnSrcChange } from './shared/startRebuildOnSrcChange'; import { crawl } from './tools/crawl'; import { run } from './shared/run'; +import cliSelect from 'cli-select'; +import { getThisCodebaseRootDirPath } from './tools/getThisCodebaseRootDirPath'; +import chalk from 'chalk'; -{ - const dirPath = 'node_modules'; - - try { - fs.rmSync(dirPath, { recursive: true, force: true }); - } catch { - // NOTE: This is a workaround for windows - // we can't remove locked executables. - - crawl({ - dirPath, - returnedPathsType: 'absolute' - }).forEach(filePath => { - try { - fs.rmSync(filePath, { force: true }); - } catch (error) { - if (filePath.endsWith('.exe')) { - return; - } - throw error; - } +(async () => { + const parentDirPath = pathJoin(getThisCodebaseRootDirPath(), '..'); + + const starterNames = fs + .readdirSync(parentDirPath) + .filter( + basename => + basename.includes('starter') && + basename.includes('angular') && + fs.statSync(pathJoin(parentDirPath, basename)).isDirectory() + ); + + if (starterNames.length === 0) { + console.log( + chalk.red( + `No starter found. Keycloakify Angular starter found in ${parentDirPath}` + ) + ); + process.exit(-1); + } + + const starterName = await (async () => { + if (starterNames.length === 1) { + return starterNames[0]; + } + + console.log(chalk.cyan(`\nSelect a starter to link in:`)); + + const { value } = await cliSelect({ + values: starterNames.map(starterName => `..${pathSep}${starterName}`) + }).catch(() => { + process.exit(-1); }); + + return value.split(pathSep)[1]; + })(); + + const startTime = Date.now(); + + console.log(chalk.cyan(`\n\nLinking in ..${pathSep}${starterName}...`)); + + { + const dirPath = 'node_modules'; + + try { + fs.rmSync(dirPath, { recursive: true, force: true }); + } catch { + // NOTE: This is a workaround for windows + // we can't remove locked executables. + + crawl({ + dirPath, + returnedPathsType: 'absolute' + }).forEach(filePath => { + try { + fs.rmSync(filePath, { force: true }); + } catch (error) { + if (filePath.endsWith('.exe')) { + return; + } + throw error; + } + }); + } } -} -fs.rmSync('dist', { recursive: true, force: true }); -fs.rmSync('.yarn_home', { recursive: true, force: true }); + fs.rmSync('dist', { recursive: true, force: true }); + fs.rmSync('.yarn_home', { recursive: true, force: true }); + + run('yarn install'); + run('yarn build'); -run('yarn install'); -run('yarn build'); + const starterDirPath = pathJoin(parentDirPath, starterName); -const starterName = 'keycloakify-angular-starter'; + fs.rmSync(pathJoin(starterDirPath, 'node_modules'), { + recursive: true, + force: true + }); -fs.rmSync(join('..', starterName, 'node_modules'), { - recursive: true, - force: true -}); + run('yarn install', { cwd: pathJoin('..', starterName) }); -run('yarn install', { cwd: join('..', starterName) }); + run(`npx tsx ${pathJoin('scripts', 'link-in-app.ts')} ${starterName}`); -run(`npx tsx ${join('scripts', 'link-in-app.ts')} ${starterName}`); + startRebuildOnSrcChange(); -startRebuildOnSrcChange(); + console.log( + chalk.green( + `\n\nLinked in ${starterName} in ${Math.round((Date.now() - startTime) / 1000)}s` + ) + ); +})(); diff --git a/yarn.lock b/yarn.lock index 008dd956..4275ea3a 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2773,6 +2773,11 @@ ansi-colors@4.1.3, ansi-colors@^4.1.1, ansi-colors@^4.1.3: resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-4.1.3.tgz#37611340eb2243e70cc604cad35d63270d48781b" integrity sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw== +ansi-escapes@^3.2.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-3.2.0.tgz#8780b98ff9dbf5638152d1f1fe5c1d7b4442976b" + integrity sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ== + ansi-escapes@^4.3.0, ansi-escapes@^4.3.2: version "4.3.2" resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-4.3.2.tgz#6b2291d1db7d98b6521d5f1efa42d0f3a9feb65e" @@ -3134,6 +3139,13 @@ cli-cursor@^5.0.0: dependencies: restore-cursor "^5.0.0" +cli-select@^1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/cli-select/-/cli-select-1.1.2.tgz#456dced464b3346ca661b16a0e37fc4b28db4818" + integrity sha512-PSvWb8G0PPmBNDcz/uM2LkZN3Nn5JmhUl465tTfynQAXjKzFpmHbxStM6X/+awKp5DJuAaHMzzMPefT0suGm1w== + dependencies: + ansi-escapes "^3.2.0" + cli-spinners@^2.5.0: version "2.9.2" resolved "https://registry.yarnpkg.com/cli-spinners/-/cli-spinners-2.9.2.tgz#1773a8f4b9c4d6ac31563df53b3fc1d79462fe41" From ac0780f2e5b027772d57afe4417279a5c7de8c26 Mon Sep 17 00:00:00 2001 From: Joseph Garrone Date: Tue, 1 Oct 2024 23:49:39 +0200 Subject: [PATCH 64/64] Fix deleting node_modules that can throw on windows --- scripts/link-in-starter.ts | 33 ++++++------------------------ scripts/tools/removeNodeModules.ts | 27 ++++++++++++++++++++++++ 2 files changed, 33 insertions(+), 27 deletions(-) create mode 100644 scripts/tools/removeNodeModules.ts diff --git a/scripts/link-in-starter.ts b/scripts/link-in-starter.ts index 0131f9be..07e842fa 100644 --- a/scripts/link-in-starter.ts +++ b/scripts/link-in-starter.ts @@ -6,6 +6,7 @@ import { run } from './shared/run'; import cliSelect from 'cli-select'; import { getThisCodebaseRootDirPath } from './tools/getThisCodebaseRootDirPath'; import chalk from 'chalk'; +import { removeNodeModules } from './tools/removeNodeModules'; (async () => { const parentDirPath = pathJoin(getThisCodebaseRootDirPath(), '..'); @@ -48,30 +49,9 @@ import chalk from 'chalk'; console.log(chalk.cyan(`\n\nLinking in ..${pathSep}${starterName}...`)); - { - const dirPath = 'node_modules'; - - try { - fs.rmSync(dirPath, { recursive: true, force: true }); - } catch { - // NOTE: This is a workaround for windows - // we can't remove locked executables. - - crawl({ - dirPath, - returnedPathsType: 'absolute' - }).forEach(filePath => { - try { - fs.rmSync(filePath, { force: true }); - } catch (error) { - if (filePath.endsWith('.exe')) { - return; - } - throw error; - } - }); - } - } + removeNodeModules({ + nodeModulesDirPath: pathJoin(getThisCodebaseRootDirPath(), 'node_modules') + }); fs.rmSync('dist', { recursive: true, force: true }); fs.rmSync('.yarn_home', { recursive: true, force: true }); @@ -81,9 +61,8 @@ import chalk from 'chalk'; const starterDirPath = pathJoin(parentDirPath, starterName); - fs.rmSync(pathJoin(starterDirPath, 'node_modules'), { - recursive: true, - force: true + removeNodeModules({ + nodeModulesDirPath: pathJoin(starterDirPath, 'node_modules') }); run('yarn install', { cwd: pathJoin('..', starterName) }); diff --git a/scripts/tools/removeNodeModules.ts b/scripts/tools/removeNodeModules.ts new file mode 100644 index 00000000..e44a85ba --- /dev/null +++ b/scripts/tools/removeNodeModules.ts @@ -0,0 +1,27 @@ +import * as fs from 'fs'; +import { crawl } from './crawl'; + +export function removeNodeModules(params: { nodeModulesDirPath: string }) { + const { nodeModulesDirPath } = params; + + try { + fs.rmSync(nodeModulesDirPath, { recursive: true, force: true }); + } catch { + // NOTE: This is a workaround for windows + // we can't remove locked executables. + + crawl({ + dirPath: nodeModulesDirPath, + returnedPathsType: 'absolute' + }).forEach(filePath => { + try { + fs.rmSync(filePath, { force: true }); + } catch (error) { + if (filePath.endsWith('.exe')) { + return; + } + throw error; + } + }); + } +}