@keycloakify/angular 0.0.1-rc.21 → 0.0.1-rc.22

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