keycloakify 10.0.0-rc.97 → 10.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (507) hide show
  1. package/PUBLIC_URL.js +2 -2
  2. package/PUBLIC_URL.js.map +1 -1
  3. package/README.md +28 -242
  4. package/account/KcContext/KcContext.d.ts +4 -1
  5. package/account/KcContext/KcContext.js.map +1 -1
  6. package/account/KcContext/kcContextMocks.js +7 -4
  7. package/account/KcContext/kcContextMocks.js.map +1 -1
  8. package/account/Template.js +3 -1
  9. package/account/Template.js.map +1 -1
  10. package/account/i18n/GenericI18n.d.ts +6 -0
  11. package/account/i18n/GenericI18n.js +2 -0
  12. package/account/i18n/GenericI18n.js.map +1 -0
  13. package/account/i18n/i18n.d.ts +24 -30
  14. package/account/i18n/i18n.js +50 -70
  15. package/account/i18n/i18n.js.map +1 -1
  16. package/account/i18n/index.d.ts +4 -3
  17. package/account/i18n/index.js.map +1 -1
  18. package/account/i18n/messages_defaultSet/ar.js.map +1 -0
  19. package/account/i18n/messages_defaultSet/ca.js.map +1 -0
  20. package/account/i18n/messages_defaultSet/cs.js.map +1 -0
  21. package/account/i18n/messages_defaultSet/da.js.map +1 -0
  22. package/account/i18n/messages_defaultSet/de.js.map +1 -0
  23. package/account/i18n/messages_defaultSet/el.js.map +1 -0
  24. package/account/i18n/messages_defaultSet/en.js.map +1 -0
  25. package/account/i18n/messages_defaultSet/es.js.map +1 -0
  26. package/account/i18n/messages_defaultSet/fa.js.map +1 -0
  27. package/account/i18n/messages_defaultSet/fi.js.map +1 -0
  28. package/account/i18n/messages_defaultSet/fr.js.map +1 -0
  29. package/account/i18n/messages_defaultSet/hu.js.map +1 -0
  30. package/account/i18n/{baseMessages → messages_defaultSet}/index.d.ts +1 -1
  31. package/account/i18n/{baseMessages → messages_defaultSet}/index.js +3 -3
  32. package/account/i18n/messages_defaultSet/index.js.map +1 -0
  33. package/account/i18n/messages_defaultSet/it.js.map +1 -0
  34. package/account/i18n/messages_defaultSet/ja.js.map +1 -0
  35. package/account/i18n/messages_defaultSet/lt.js.map +1 -0
  36. package/account/i18n/messages_defaultSet/lv.js.map +1 -0
  37. package/account/i18n/messages_defaultSet/nl.js.map +1 -0
  38. package/account/i18n/messages_defaultSet/no.js.map +1 -0
  39. package/account/i18n/messages_defaultSet/pl.js.map +1 -0
  40. package/account/i18n/messages_defaultSet/pt-BR.js.map +1 -0
  41. package/account/i18n/messages_defaultSet/ru.js.map +1 -0
  42. package/account/i18n/messages_defaultSet/sk.js.map +1 -0
  43. package/account/i18n/messages_defaultSet/sv.js.map +1 -0
  44. package/account/i18n/messages_defaultSet/th.js.map +1 -0
  45. package/account/i18n/messages_defaultSet/tr.js.map +1 -0
  46. package/account/i18n/messages_defaultSet/uk.js.map +1 -0
  47. package/account/i18n/messages_defaultSet/zh-CN.js.map +1 -0
  48. package/account/i18n/useI18n.d.ts +6 -5
  49. package/account/i18n/useI18n.js +37 -4
  50. package/account/i18n/useI18n.js.map +1 -1
  51. package/account/pages/Applications.js +1 -1
  52. package/account/pages/Applications.js.map +1 -1
  53. package/account/pages/FederatedIdentity.js +1 -1
  54. package/account/pages/FederatedIdentity.js.map +1 -1
  55. package/account/pages/Totp.js +5 -1
  56. package/account/pages/Totp.js.map +1 -1
  57. package/bin/193.index.js +5 -5
  58. package/bin/{490.index.js → 246.index.js} +22 -4
  59. package/bin/31.index.js +264 -203
  60. package/bin/440.index.js +178 -106
  61. package/bin/453.index.js +59 -7
  62. package/bin/526.index.js +525 -137
  63. package/bin/599.index.js +567 -0
  64. package/bin/{893.index.js → 622.index.js} +239 -231
  65. package/bin/{36.index.js → 678.index.js} +577 -71
  66. package/bin/{180.index.js → 697.index.js} +611 -526
  67. package/bin/743.index.js +70 -0
  68. package/bin/780.index.js +895 -0
  69. package/bin/786.index.js +185 -0
  70. package/bin/932.index.js +740 -52
  71. package/bin/{456.index.js → 941.index.js} +3 -1988
  72. package/bin/97.index.js +29 -7
  73. package/bin/main.js +1994 -8
  74. package/bin/shared/KeycloakVersionRange.d.ts +3 -3
  75. package/bin/shared/buildContext.d.ts +52 -16
  76. package/bin/shared/buildContext.js.map +1 -1
  77. package/bin/shared/constants.d.ts +18 -17
  78. package/bin/shared/constants.js +15 -14
  79. package/bin/shared/constants.js.map +1 -1
  80. package/bin/shared/copyKeycloakResourcesToPublic.js.map +1 -1
  81. package/bin/shared/downloadKeycloakDefaultTheme.js.map +1 -1
  82. package/bin/shared/generateKcGenTs.d.ts +3 -0
  83. package/bin/shared/generateKcGenTs.js.map +1 -1
  84. package/bin/shared/getLatestsSemVersionedTag.d.ts +15 -0
  85. package/bin/shared/getLatestsSemVersionedTag.js.map +1 -0
  86. package/bin/shared/promptKeycloakVersion.d.ts +3 -1
  87. package/bin/shared/promptKeycloakVersion.js.map +1 -1
  88. package/lib/getKcClsx.js +2 -1
  89. package/lib/getKcClsx.js.map +1 -1
  90. package/login/KcContext/KcContext.d.ts +10 -11
  91. package/login/KcContext/KcContext.js.map +1 -1
  92. package/login/KcContext/kcContextMocks.js +4 -5
  93. package/login/KcContext/kcContextMocks.js.map +1 -1
  94. package/login/Template.js +13 -7
  95. package/login/Template.js.map +1 -1
  96. package/login/TemplateProps.d.ts +0 -1
  97. package/login/UserProfileFormFields.js +6 -5
  98. package/login/UserProfileFormFields.js.map +1 -1
  99. package/login/i18n/GenericI18n.d.ts +6 -0
  100. package/login/i18n/GenericI18n.js +2 -0
  101. package/login/i18n/GenericI18n.js.map +1 -0
  102. package/login/i18n/i18n.d.ts +22 -32
  103. package/login/i18n/i18n.js +51 -92
  104. package/login/i18n/i18n.js.map +1 -1
  105. package/login/i18n/index.d.ts +4 -3
  106. package/login/i18n/index.js.map +1 -1
  107. package/login/i18n/messages_defaultSet/ar.js.map +1 -0
  108. package/login/i18n/messages_defaultSet/ca.js.map +1 -0
  109. package/login/i18n/messages_defaultSet/cs.js.map +1 -0
  110. package/login/i18n/messages_defaultSet/da.js.map +1 -0
  111. package/login/i18n/messages_defaultSet/de.js.map +1 -0
  112. package/login/i18n/messages_defaultSet/el.js.map +1 -0
  113. package/login/i18n/messages_defaultSet/en.js.map +1 -0
  114. package/login/i18n/messages_defaultSet/es.js.map +1 -0
  115. package/login/i18n/messages_defaultSet/fa.js.map +1 -0
  116. package/login/i18n/messages_defaultSet/fi.js.map +1 -0
  117. package/login/i18n/messages_defaultSet/fr.js.map +1 -0
  118. package/login/i18n/messages_defaultSet/hu.js.map +1 -0
  119. package/login/i18n/{baseMessages → messages_defaultSet}/index.d.ts +1 -1
  120. package/login/i18n/{baseMessages → messages_defaultSet}/index.js +3 -3
  121. package/login/i18n/messages_defaultSet/index.js.map +1 -0
  122. package/login/i18n/messages_defaultSet/it.js.map +1 -0
  123. package/login/i18n/messages_defaultSet/ja.js.map +1 -0
  124. package/login/i18n/messages_defaultSet/lt.js.map +1 -0
  125. package/login/i18n/messages_defaultSet/lv.js.map +1 -0
  126. package/login/i18n/messages_defaultSet/nl.js.map +1 -0
  127. package/login/i18n/messages_defaultSet/no.js.map +1 -0
  128. package/login/i18n/messages_defaultSet/pl.js.map +1 -0
  129. package/login/i18n/messages_defaultSet/pt-BR.js.map +1 -0
  130. package/login/i18n/messages_defaultSet/ru.js.map +1 -0
  131. package/login/i18n/messages_defaultSet/sk.js.map +1 -0
  132. package/login/i18n/messages_defaultSet/sv.js.map +1 -0
  133. package/login/i18n/messages_defaultSet/th.js.map +1 -0
  134. package/login/i18n/messages_defaultSet/tr.js.map +1 -0
  135. package/login/i18n/messages_defaultSet/uk.js.map +1 -0
  136. package/login/i18n/messages_defaultSet/zh-CN.js.map +1 -0
  137. package/login/i18n/useI18n.d.ts +6 -5
  138. package/login/i18n/useI18n.js +37 -4
  139. package/login/i18n/useI18n.js.map +1 -1
  140. package/login/lib/useUserProfileForm.d.ts +2 -0
  141. package/login/lib/useUserProfileForm.js +44 -10
  142. package/login/lib/useUserProfileForm.js.map +1 -1
  143. package/login/pages/Error.js +1 -1
  144. package/login/pages/Error.js.map +1 -1
  145. package/login/pages/Info.js +15 -3
  146. package/login/pages/Info.js.map +1 -1
  147. package/login/pages/Login.js +6 -2
  148. package/login/pages/Login.js.map +1 -1
  149. package/login/pages/LoginConfigTotp.js +5 -1
  150. package/login/pages/LoginConfigTotp.js.map +1 -1
  151. package/login/pages/LoginOtp.js +3 -1
  152. package/login/pages/LoginOtp.js.map +1 -1
  153. package/login/pages/LoginPassword.js +3 -1
  154. package/login/pages/LoginPassword.js.map +1 -1
  155. package/login/pages/LoginRecoveryAuthnCodeInput.js +3 -1
  156. package/login/pages/LoginRecoveryAuthnCodeInput.js.map +1 -1
  157. package/login/pages/LoginResetPassword.js +3 -1
  158. package/login/pages/LoginResetPassword.js.map +1 -1
  159. package/login/pages/LoginUpdatePassword.js +5 -1
  160. package/login/pages/LoginUpdatePassword.js.map +1 -1
  161. package/login/pages/Register.js +3 -1
  162. package/login/pages/Register.js.map +1 -1
  163. package/login/pages/SamlPostForm.js +1 -1
  164. package/login/pages/SamlPostForm.js.map +1 -1
  165. package/login/pages/SelectAuthenticator.js +2 -2
  166. package/login/pages/SelectAuthenticator.js.map +1 -1
  167. package/login/pages/WebauthnAuthenticate.js +3 -3
  168. package/login/pages/WebauthnAuthenticate.js.map +1 -1
  169. package/login/pages/WebauthnRegister.js +2 -2
  170. package/package.json +267 -245
  171. package/src/PUBLIC_URL.ts +2 -2
  172. package/src/account/KcContext/KcContext.ts +4 -1
  173. package/src/account/KcContext/kcContextMocks.ts +7 -4
  174. package/src/account/Template.tsx +6 -1
  175. package/src/account/i18n/GenericI18n.tsx +6 -0
  176. package/src/account/i18n/i18n.tsx +91 -129
  177. package/src/account/i18n/index.ts +4 -3
  178. package/src/account/i18n/{baseMessages → messages_defaultSet}/index.ts +3 -3
  179. package/src/account/i18n/useI18n.tsx +95 -0
  180. package/src/account/pages/Applications.tsx +0 -1
  181. package/src/account/pages/FederatedIdentity.tsx +1 -1
  182. package/src/account/pages/Totp.tsx +16 -6
  183. package/src/bin/add-story.ts +42 -10
  184. package/src/bin/eject-page.ts +119 -11
  185. package/src/bin/initialize-account-theme/copyBoilerplate.ts +32 -0
  186. package/src/bin/initialize-account-theme/index.ts +1 -0
  187. package/src/bin/initialize-account-theme/initialize-account-theme.ts +112 -0
  188. package/src/bin/initialize-account-theme/initializeAccountTheme_multiPage.ts +21 -0
  189. package/src/bin/initialize-account-theme/initializeAccountTheme_singlePage.ts +152 -0
  190. package/src/bin/initialize-account-theme/src/multi-page/KcContext.ts +12 -0
  191. package/src/bin/initialize-account-theme/src/multi-page/KcPage.tsx +25 -0
  192. package/src/bin/initialize-account-theme/src/multi-page/KcPageStory.tsx +38 -0
  193. package/src/bin/initialize-account-theme/src/multi-page/i18n.ts +5 -0
  194. package/src/bin/initialize-account-theme/src/single-page/KcContext.ts +7 -0
  195. package/src/bin/initialize-account-theme/src/single-page/KcPage.tsx +11 -0
  196. package/src/bin/initialize-account-theme/updateAccountThemeImplementationInConfig.ts +92 -0
  197. package/src/bin/initialize-email-theme.ts +1 -1
  198. package/src/bin/keycloakify/buildJars/buildJar.ts +38 -24
  199. package/src/bin/keycloakify/buildJars/buildJars.ts +6 -3
  200. package/src/bin/keycloakify/buildJars/getKeycloakVersionRangeForJar.ts +5 -5
  201. package/src/bin/keycloakify/generateFtl/generateFtl.ts +16 -16
  202. package/src/bin/keycloakify/generateFtl/kcContextDeclarationTemplate.ftl +471 -364
  203. package/src/bin/keycloakify/generateResources/bringInAccountV1.ts +7 -7
  204. package/src/bin/keycloakify/generateResources/generateMessageProperties.ts +3 -3
  205. package/src/bin/keycloakify/generateResources/generateResourcesForMainTheme.ts +125 -59
  206. package/src/bin/keycloakify/generateResources/generateResourcesForThemeVariant.ts +2 -2
  207. package/src/bin/keycloakify/generateResources/readExtraPageNames.ts +5 -8
  208. package/src/bin/keycloakify/keycloakify.ts +8 -6
  209. package/src/bin/keycloakify/replacers/replaceImportsInCssCode.ts +41 -27
  210. package/src/bin/keycloakify/replacers/replaceImportsInJsCode/replaceImportsInJsCode.ts +2 -2
  211. package/src/bin/keycloakify/replacers/replaceImportsInJsCode/vite.ts +6 -6
  212. package/src/bin/keycloakify/replacers/replaceImportsInJsCode/webpack.ts +4 -4
  213. package/src/bin/main.ts +19 -2
  214. package/src/bin/shared/KeycloakVersionRange.ts +4 -4
  215. package/src/bin/shared/buildContext.ts +360 -251
  216. package/src/bin/shared/constants.ts +19 -17
  217. package/src/bin/shared/copyKeycloakResourcesToPublic.ts +6 -6
  218. package/src/bin/shared/downloadKeycloakDefaultTheme.ts +48 -27
  219. package/src/bin/shared/downloadKeycloakStaticResources.ts +2 -2
  220. package/src/bin/shared/generateKcGenTs.ts +110 -3
  221. package/src/bin/shared/getLatestsSemVersionedTag.ts +201 -0
  222. package/src/bin/shared/promptKeycloakVersion.ts +20 -80
  223. package/src/bin/start-keycloak/appBuild.ts +15 -11
  224. package/src/bin/start-keycloak/keycloakifyBuild.ts +3 -3
  225. package/src/bin/start-keycloak/myrealm-realm-18.json +4 -4
  226. package/src/bin/start-keycloak/myrealm-realm-19.json +4 -4
  227. package/src/bin/start-keycloak/myrealm-realm-20.json +4 -4
  228. package/src/bin/start-keycloak/myrealm-realm-21.json +4 -4
  229. package/src/bin/start-keycloak/myrealm-realm-23.json +3 -3
  230. package/src/bin/start-keycloak/myrealm-realm-24.json +4 -4
  231. package/src/bin/start-keycloak/myrealm-realm-25.json +4 -4
  232. package/src/bin/start-keycloak/start-keycloak.ts +256 -102
  233. package/src/bin/tools/assertNoPnpmDlx.ts +17 -0
  234. package/src/bin/tools/downloadAndExtractArchive.ts +10 -9
  235. package/src/bin/tools/fetchProxyOptions.ts +32 -11
  236. package/src/bin/tools/npmInstall.ts +63 -0
  237. package/src/bin/tools/octokit-addons/getLatestsSemVersionedTag.ts +3 -2
  238. package/src/bin/tsconfig.json +3 -1
  239. package/src/lib/getKcClsx.ts +2 -2
  240. package/src/login/KcContext/KcContext.ts +10 -28
  241. package/src/login/KcContext/kcContextMocks.ts +5 -6
  242. package/src/login/Template.tsx +32 -54
  243. package/src/login/TemplateProps.ts +0 -1
  244. package/src/login/UserProfileFormFields.tsx +15 -11
  245. package/src/login/i18n/GenericI18n.tsx +6 -0
  246. package/src/login/i18n/i18n.tsx +91 -166
  247. package/src/login/i18n/index.ts +4 -3
  248. package/src/login/i18n/{baseMessages → messages_defaultSet}/index.ts +3 -3
  249. package/src/login/i18n/useI18n.tsx +95 -0
  250. package/src/login/lib/useUserProfileForm.tsx +68 -20
  251. package/src/login/pages/Error.tsx +1 -1
  252. package/src/login/pages/Info.tsx +26 -6
  253. package/src/login/pages/Login.tsx +20 -9
  254. package/src/login/pages/LoginConfigTotp.tsx +16 -6
  255. package/src/login/pages/LoginOtp.tsx +8 -3
  256. package/src/login/pages/LoginPassword.tsx +8 -3
  257. package/src/login/pages/LoginRecoveryAuthnCodeInput.tsx +8 -3
  258. package/src/login/pages/LoginResetPassword.tsx +8 -3
  259. package/src/login/pages/LoginUpdatePassword.tsx +55 -47
  260. package/src/login/pages/Register.tsx +8 -3
  261. package/src/login/pages/SamlPostForm.tsx +1 -1
  262. package/src/login/pages/SelectAuthenticator.tsx +4 -4
  263. package/src/login/pages/WebauthnAuthenticate.tsx +5 -5
  264. package/src/login/pages/WebauthnRegister.tsx +2 -2
  265. package/src/tools/useInsertLinkTags.ts +9 -1
  266. package/src/tools/useInsertScriptTags.ts +9 -1
  267. package/src/vite-plugin/vite-plugin.ts +15 -13
  268. package/stories/account/pages/Applications.stories.tsx +80 -0
  269. package/stories/account/pages/Log.stories.tsx +1 -0
  270. package/stories/account-spa/index.stories.tsx +94 -0
  271. package/stories/intro/intro.stories.tsx +90 -0
  272. package/stories/login/pages/Info.stories.tsx +7 -2
  273. package/stories/login/pages/Login.stories.tsx +25 -13
  274. package/stories/login/pages/Register.stories.tsx +11 -9
  275. package/stories/login/pages/SelectAuthenticator.stories.tsx +41 -0
  276. package/stories/login/pages/Terms.stories.tsx +6 -2
  277. package/tools/useInsertLinkTags.js +7 -1
  278. package/tools/useInsertLinkTags.js.map +1 -1
  279. package/tools/useInsertScriptTags.js +7 -1
  280. package/tools/useInsertScriptTags.js.map +1 -1
  281. package/vite-plugin/index.js +25820 -25686
  282. package/vite-plugin/vite-plugin.d.ts +6 -4
  283. package/account/i18n/baseMessages/ar.js.map +0 -1
  284. package/account/i18n/baseMessages/ca.js.map +0 -1
  285. package/account/i18n/baseMessages/cs.js.map +0 -1
  286. package/account/i18n/baseMessages/da.js.map +0 -1
  287. package/account/i18n/baseMessages/de.js.map +0 -1
  288. package/account/i18n/baseMessages/el.js.map +0 -1
  289. package/account/i18n/baseMessages/en.js.map +0 -1
  290. package/account/i18n/baseMessages/es.js.map +0 -1
  291. package/account/i18n/baseMessages/fa.js.map +0 -1
  292. package/account/i18n/baseMessages/fi.js.map +0 -1
  293. package/account/i18n/baseMessages/fr.js.map +0 -1
  294. package/account/i18n/baseMessages/hu.js.map +0 -1
  295. package/account/i18n/baseMessages/index.js.map +0 -1
  296. package/account/i18n/baseMessages/it.js.map +0 -1
  297. package/account/i18n/baseMessages/ja.js.map +0 -1
  298. package/account/i18n/baseMessages/lt.js.map +0 -1
  299. package/account/i18n/baseMessages/lv.js.map +0 -1
  300. package/account/i18n/baseMessages/nl.js.map +0 -1
  301. package/account/i18n/baseMessages/no.js.map +0 -1
  302. package/account/i18n/baseMessages/pl.js.map +0 -1
  303. package/account/i18n/baseMessages/pt-BR.js.map +0 -1
  304. package/account/i18n/baseMessages/ru.js.map +0 -1
  305. package/account/i18n/baseMessages/sk.js.map +0 -1
  306. package/account/i18n/baseMessages/sv.js.map +0 -1
  307. package/account/i18n/baseMessages/th.js.map +0 -1
  308. package/account/i18n/baseMessages/tr.js.map +0 -1
  309. package/account/i18n/baseMessages/uk.js.map +0 -1
  310. package/account/i18n/baseMessages/zh-CN.js.map +0 -1
  311. package/bin/538.index.js +0 -108
  312. package/login/i18n/baseMessages/ar.js.map +0 -1
  313. package/login/i18n/baseMessages/ca.js.map +0 -1
  314. package/login/i18n/baseMessages/cs.js.map +0 -1
  315. package/login/i18n/baseMessages/da.js.map +0 -1
  316. package/login/i18n/baseMessages/de.js.map +0 -1
  317. package/login/i18n/baseMessages/el.js.map +0 -1
  318. package/login/i18n/baseMessages/en.js.map +0 -1
  319. package/login/i18n/baseMessages/es.js.map +0 -1
  320. package/login/i18n/baseMessages/fa.js.map +0 -1
  321. package/login/i18n/baseMessages/fi.js.map +0 -1
  322. package/login/i18n/baseMessages/fr.js.map +0 -1
  323. package/login/i18n/baseMessages/hu.js.map +0 -1
  324. package/login/i18n/baseMessages/index.js.map +0 -1
  325. package/login/i18n/baseMessages/it.js.map +0 -1
  326. package/login/i18n/baseMessages/ja.js.map +0 -1
  327. package/login/i18n/baseMessages/lt.js.map +0 -1
  328. package/login/i18n/baseMessages/lv.js.map +0 -1
  329. package/login/i18n/baseMessages/nl.js.map +0 -1
  330. package/login/i18n/baseMessages/no.js.map +0 -1
  331. package/login/i18n/baseMessages/pl.js.map +0 -1
  332. package/login/i18n/baseMessages/pt-BR.js.map +0 -1
  333. package/login/i18n/baseMessages/ru.js.map +0 -1
  334. package/login/i18n/baseMessages/sk.js.map +0 -1
  335. package/login/i18n/baseMessages/sv.js.map +0 -1
  336. package/login/i18n/baseMessages/th.js.map +0 -1
  337. package/login/i18n/baseMessages/tr.js.map +0 -1
  338. package/login/i18n/baseMessages/uk.js.map +0 -1
  339. package/login/i18n/baseMessages/zh-CN.js.map +0 -1
  340. package/src/account/i18n/useI18n.ts +0 -44
  341. package/src/login/i18n/useI18n.ts +0 -44
  342. package/src/tools/ExtractAfterStartingWith.ts +0 -4
  343. package/tools/ExtractAfterStartingWith.d.ts +0 -1
  344. package/tools/ExtractAfterStartingWith.js +0 -2
  345. package/tools/ExtractAfterStartingWith.js.map +0 -1
  346. /package/account/i18n/{baseMessages → messages_defaultSet}/ar.d.ts +0 -0
  347. /package/account/i18n/{baseMessages → messages_defaultSet}/ar.js +0 -0
  348. /package/account/i18n/{baseMessages → messages_defaultSet}/ca.d.ts +0 -0
  349. /package/account/i18n/{baseMessages → messages_defaultSet}/ca.js +0 -0
  350. /package/account/i18n/{baseMessages → messages_defaultSet}/cs.d.ts +0 -0
  351. /package/account/i18n/{baseMessages → messages_defaultSet}/cs.js +0 -0
  352. /package/account/i18n/{baseMessages → messages_defaultSet}/da.d.ts +0 -0
  353. /package/account/i18n/{baseMessages → messages_defaultSet}/da.js +0 -0
  354. /package/account/i18n/{baseMessages → messages_defaultSet}/de.d.ts +0 -0
  355. /package/account/i18n/{baseMessages → messages_defaultSet}/de.js +0 -0
  356. /package/account/i18n/{baseMessages → messages_defaultSet}/el.d.ts +0 -0
  357. /package/account/i18n/{baseMessages → messages_defaultSet}/el.js +0 -0
  358. /package/account/i18n/{baseMessages → messages_defaultSet}/en.d.ts +0 -0
  359. /package/account/i18n/{baseMessages → messages_defaultSet}/en.js +0 -0
  360. /package/account/i18n/{baseMessages → messages_defaultSet}/es.d.ts +0 -0
  361. /package/account/i18n/{baseMessages → messages_defaultSet}/es.js +0 -0
  362. /package/account/i18n/{baseMessages → messages_defaultSet}/fa.d.ts +0 -0
  363. /package/account/i18n/{baseMessages → messages_defaultSet}/fa.js +0 -0
  364. /package/account/i18n/{baseMessages → messages_defaultSet}/fi.d.ts +0 -0
  365. /package/account/i18n/{baseMessages → messages_defaultSet}/fi.js +0 -0
  366. /package/account/i18n/{baseMessages → messages_defaultSet}/fr.d.ts +0 -0
  367. /package/account/i18n/{baseMessages → messages_defaultSet}/fr.js +0 -0
  368. /package/account/i18n/{baseMessages → messages_defaultSet}/hu.d.ts +0 -0
  369. /package/account/i18n/{baseMessages → messages_defaultSet}/hu.js +0 -0
  370. /package/account/i18n/{baseMessages → messages_defaultSet}/it.d.ts +0 -0
  371. /package/account/i18n/{baseMessages → messages_defaultSet}/it.js +0 -0
  372. /package/account/i18n/{baseMessages → messages_defaultSet}/ja.d.ts +0 -0
  373. /package/account/i18n/{baseMessages → messages_defaultSet}/ja.js +0 -0
  374. /package/account/i18n/{baseMessages → messages_defaultSet}/lt.d.ts +0 -0
  375. /package/account/i18n/{baseMessages → messages_defaultSet}/lt.js +0 -0
  376. /package/account/i18n/{baseMessages → messages_defaultSet}/lv.d.ts +0 -0
  377. /package/account/i18n/{baseMessages → messages_defaultSet}/lv.js +0 -0
  378. /package/account/i18n/{baseMessages → messages_defaultSet}/nl.d.ts +0 -0
  379. /package/account/i18n/{baseMessages → messages_defaultSet}/nl.js +0 -0
  380. /package/account/i18n/{baseMessages → messages_defaultSet}/no.d.ts +0 -0
  381. /package/account/i18n/{baseMessages → messages_defaultSet}/no.js +0 -0
  382. /package/account/i18n/{baseMessages → messages_defaultSet}/pl.d.ts +0 -0
  383. /package/account/i18n/{baseMessages → messages_defaultSet}/pl.js +0 -0
  384. /package/account/i18n/{baseMessages → messages_defaultSet}/pt-BR.d.ts +0 -0
  385. /package/account/i18n/{baseMessages → messages_defaultSet}/pt-BR.js +0 -0
  386. /package/account/i18n/{baseMessages → messages_defaultSet}/ru.d.ts +0 -0
  387. /package/account/i18n/{baseMessages → messages_defaultSet}/ru.js +0 -0
  388. /package/account/i18n/{baseMessages → messages_defaultSet}/sk.d.ts +0 -0
  389. /package/account/i18n/{baseMessages → messages_defaultSet}/sk.js +0 -0
  390. /package/account/i18n/{baseMessages → messages_defaultSet}/sv.d.ts +0 -0
  391. /package/account/i18n/{baseMessages → messages_defaultSet}/sv.js +0 -0
  392. /package/account/i18n/{baseMessages → messages_defaultSet}/th.d.ts +0 -0
  393. /package/account/i18n/{baseMessages → messages_defaultSet}/th.js +0 -0
  394. /package/account/i18n/{baseMessages → messages_defaultSet}/tr.d.ts +0 -0
  395. /package/account/i18n/{baseMessages → messages_defaultSet}/tr.js +0 -0
  396. /package/account/i18n/{baseMessages → messages_defaultSet}/uk.d.ts +0 -0
  397. /package/account/i18n/{baseMessages → messages_defaultSet}/uk.js +0 -0
  398. /package/account/i18n/{baseMessages → messages_defaultSet}/zh-CN.d.ts +0 -0
  399. /package/account/i18n/{baseMessages → messages_defaultSet}/zh-CN.js +0 -0
  400. /package/login/i18n/{baseMessages → messages_defaultSet}/ar.d.ts +0 -0
  401. /package/login/i18n/{baseMessages → messages_defaultSet}/ar.js +0 -0
  402. /package/login/i18n/{baseMessages → messages_defaultSet}/ca.d.ts +0 -0
  403. /package/login/i18n/{baseMessages → messages_defaultSet}/ca.js +0 -0
  404. /package/login/i18n/{baseMessages → messages_defaultSet}/cs.d.ts +0 -0
  405. /package/login/i18n/{baseMessages → messages_defaultSet}/cs.js +0 -0
  406. /package/login/i18n/{baseMessages → messages_defaultSet}/da.d.ts +0 -0
  407. /package/login/i18n/{baseMessages → messages_defaultSet}/da.js +0 -0
  408. /package/login/i18n/{baseMessages → messages_defaultSet}/de.d.ts +0 -0
  409. /package/login/i18n/{baseMessages → messages_defaultSet}/de.js +0 -0
  410. /package/login/i18n/{baseMessages → messages_defaultSet}/el.d.ts +0 -0
  411. /package/login/i18n/{baseMessages → messages_defaultSet}/el.js +0 -0
  412. /package/login/i18n/{baseMessages → messages_defaultSet}/en.d.ts +0 -0
  413. /package/login/i18n/{baseMessages → messages_defaultSet}/en.js +0 -0
  414. /package/login/i18n/{baseMessages → messages_defaultSet}/es.d.ts +0 -0
  415. /package/login/i18n/{baseMessages → messages_defaultSet}/es.js +0 -0
  416. /package/login/i18n/{baseMessages → messages_defaultSet}/fa.d.ts +0 -0
  417. /package/login/i18n/{baseMessages → messages_defaultSet}/fa.js +0 -0
  418. /package/login/i18n/{baseMessages → messages_defaultSet}/fi.d.ts +0 -0
  419. /package/login/i18n/{baseMessages → messages_defaultSet}/fi.js +0 -0
  420. /package/login/i18n/{baseMessages → messages_defaultSet}/fr.d.ts +0 -0
  421. /package/login/i18n/{baseMessages → messages_defaultSet}/fr.js +0 -0
  422. /package/login/i18n/{baseMessages → messages_defaultSet}/hu.d.ts +0 -0
  423. /package/login/i18n/{baseMessages → messages_defaultSet}/hu.js +0 -0
  424. /package/login/i18n/{baseMessages → messages_defaultSet}/it.d.ts +0 -0
  425. /package/login/i18n/{baseMessages → messages_defaultSet}/it.js +0 -0
  426. /package/login/i18n/{baseMessages → messages_defaultSet}/ja.d.ts +0 -0
  427. /package/login/i18n/{baseMessages → messages_defaultSet}/ja.js +0 -0
  428. /package/login/i18n/{baseMessages → messages_defaultSet}/lt.d.ts +0 -0
  429. /package/login/i18n/{baseMessages → messages_defaultSet}/lt.js +0 -0
  430. /package/login/i18n/{baseMessages → messages_defaultSet}/lv.d.ts +0 -0
  431. /package/login/i18n/{baseMessages → messages_defaultSet}/lv.js +0 -0
  432. /package/login/i18n/{baseMessages → messages_defaultSet}/nl.d.ts +0 -0
  433. /package/login/i18n/{baseMessages → messages_defaultSet}/nl.js +0 -0
  434. /package/login/i18n/{baseMessages → messages_defaultSet}/no.d.ts +0 -0
  435. /package/login/i18n/{baseMessages → messages_defaultSet}/no.js +0 -0
  436. /package/login/i18n/{baseMessages → messages_defaultSet}/pl.d.ts +0 -0
  437. /package/login/i18n/{baseMessages → messages_defaultSet}/pl.js +0 -0
  438. /package/login/i18n/{baseMessages → messages_defaultSet}/pt-BR.d.ts +0 -0
  439. /package/login/i18n/{baseMessages → messages_defaultSet}/pt-BR.js +0 -0
  440. /package/login/i18n/{baseMessages → messages_defaultSet}/ru.d.ts +0 -0
  441. /package/login/i18n/{baseMessages → messages_defaultSet}/ru.js +0 -0
  442. /package/login/i18n/{baseMessages → messages_defaultSet}/sk.d.ts +0 -0
  443. /package/login/i18n/{baseMessages → messages_defaultSet}/sk.js +0 -0
  444. /package/login/i18n/{baseMessages → messages_defaultSet}/sv.d.ts +0 -0
  445. /package/login/i18n/{baseMessages → messages_defaultSet}/sv.js +0 -0
  446. /package/login/i18n/{baseMessages → messages_defaultSet}/th.d.ts +0 -0
  447. /package/login/i18n/{baseMessages → messages_defaultSet}/th.js +0 -0
  448. /package/login/i18n/{baseMessages → messages_defaultSet}/tr.d.ts +0 -0
  449. /package/login/i18n/{baseMessages → messages_defaultSet}/tr.js +0 -0
  450. /package/login/i18n/{baseMessages → messages_defaultSet}/uk.d.ts +0 -0
  451. /package/login/i18n/{baseMessages → messages_defaultSet}/uk.js +0 -0
  452. /package/login/i18n/{baseMessages → messages_defaultSet}/zh-CN.d.ts +0 -0
  453. /package/login/i18n/{baseMessages → messages_defaultSet}/zh-CN.js +0 -0
  454. /package/src/account/i18n/{baseMessages → messages_defaultSet}/ar.ts +0 -0
  455. /package/src/account/i18n/{baseMessages → messages_defaultSet}/ca.ts +0 -0
  456. /package/src/account/i18n/{baseMessages → messages_defaultSet}/cs.ts +0 -0
  457. /package/src/account/i18n/{baseMessages → messages_defaultSet}/da.ts +0 -0
  458. /package/src/account/i18n/{baseMessages → messages_defaultSet}/de.ts +0 -0
  459. /package/src/account/i18n/{baseMessages → messages_defaultSet}/el.ts +0 -0
  460. /package/src/account/i18n/{baseMessages → messages_defaultSet}/en.ts +0 -0
  461. /package/src/account/i18n/{baseMessages → messages_defaultSet}/es.ts +0 -0
  462. /package/src/account/i18n/{baseMessages → messages_defaultSet}/fa.ts +0 -0
  463. /package/src/account/i18n/{baseMessages → messages_defaultSet}/fi.ts +0 -0
  464. /package/src/account/i18n/{baseMessages → messages_defaultSet}/fr.ts +0 -0
  465. /package/src/account/i18n/{baseMessages → messages_defaultSet}/hu.ts +0 -0
  466. /package/src/account/i18n/{baseMessages → messages_defaultSet}/it.ts +0 -0
  467. /package/src/account/i18n/{baseMessages → messages_defaultSet}/ja.ts +0 -0
  468. /package/src/account/i18n/{baseMessages → messages_defaultSet}/lt.ts +0 -0
  469. /package/src/account/i18n/{baseMessages → messages_defaultSet}/lv.ts +0 -0
  470. /package/src/account/i18n/{baseMessages → messages_defaultSet}/nl.ts +0 -0
  471. /package/src/account/i18n/{baseMessages → messages_defaultSet}/no.ts +0 -0
  472. /package/src/account/i18n/{baseMessages → messages_defaultSet}/pl.ts +0 -0
  473. /package/src/account/i18n/{baseMessages → messages_defaultSet}/pt-BR.ts +0 -0
  474. /package/src/account/i18n/{baseMessages → messages_defaultSet}/ru.ts +0 -0
  475. /package/src/account/i18n/{baseMessages → messages_defaultSet}/sk.ts +0 -0
  476. /package/src/account/i18n/{baseMessages → messages_defaultSet}/sv.ts +0 -0
  477. /package/src/account/i18n/{baseMessages → messages_defaultSet}/th.ts +0 -0
  478. /package/src/account/i18n/{baseMessages → messages_defaultSet}/tr.ts +0 -0
  479. /package/src/account/i18n/{baseMessages → messages_defaultSet}/uk.ts +0 -0
  480. /package/src/account/i18n/{baseMessages → messages_defaultSet}/zh-CN.ts +0 -0
  481. /package/src/login/i18n/{baseMessages → messages_defaultSet}/ar.ts +0 -0
  482. /package/src/login/i18n/{baseMessages → messages_defaultSet}/ca.ts +0 -0
  483. /package/src/login/i18n/{baseMessages → messages_defaultSet}/cs.ts +0 -0
  484. /package/src/login/i18n/{baseMessages → messages_defaultSet}/da.ts +0 -0
  485. /package/src/login/i18n/{baseMessages → messages_defaultSet}/de.ts +0 -0
  486. /package/src/login/i18n/{baseMessages → messages_defaultSet}/el.ts +0 -0
  487. /package/src/login/i18n/{baseMessages → messages_defaultSet}/en.ts +0 -0
  488. /package/src/login/i18n/{baseMessages → messages_defaultSet}/es.ts +0 -0
  489. /package/src/login/i18n/{baseMessages → messages_defaultSet}/fa.ts +0 -0
  490. /package/src/login/i18n/{baseMessages → messages_defaultSet}/fi.ts +0 -0
  491. /package/src/login/i18n/{baseMessages → messages_defaultSet}/fr.ts +0 -0
  492. /package/src/login/i18n/{baseMessages → messages_defaultSet}/hu.ts +0 -0
  493. /package/src/login/i18n/{baseMessages → messages_defaultSet}/it.ts +0 -0
  494. /package/src/login/i18n/{baseMessages → messages_defaultSet}/ja.ts +0 -0
  495. /package/src/login/i18n/{baseMessages → messages_defaultSet}/lt.ts +0 -0
  496. /package/src/login/i18n/{baseMessages → messages_defaultSet}/lv.ts +0 -0
  497. /package/src/login/i18n/{baseMessages → messages_defaultSet}/nl.ts +0 -0
  498. /package/src/login/i18n/{baseMessages → messages_defaultSet}/no.ts +0 -0
  499. /package/src/login/i18n/{baseMessages → messages_defaultSet}/pl.ts +0 -0
  500. /package/src/login/i18n/{baseMessages → messages_defaultSet}/pt-BR.ts +0 -0
  501. /package/src/login/i18n/{baseMessages → messages_defaultSet}/ru.ts +0 -0
  502. /package/src/login/i18n/{baseMessages → messages_defaultSet}/sk.ts +0 -0
  503. /package/src/login/i18n/{baseMessages → messages_defaultSet}/sv.ts +0 -0
  504. /package/src/login/i18n/{baseMessages → messages_defaultSet}/th.ts +0 -0
  505. /package/src/login/i18n/{baseMessages → messages_defaultSet}/tr.ts +0 -0
  506. /package/src/login/i18n/{baseMessages → messages_defaultSet}/uk.ts +0 -0
  507. /package/src/login/i18n/{baseMessages → messages_defaultSet}/zh-CN.ts +0 -0
@@ -1,11 +1,11 @@
1
1
  import { getThisCodebaseRootDirPath } from "./tools/getThisCodebaseRootDirPath";
2
2
  import cliSelect from "cli-select";
3
3
  import {
4
- loginThemePageIds,
5
- accountThemePageIds,
4
+ LOGIN_THEME_PAGE_IDS,
5
+ ACCOUNT_THEME_PAGE_IDS,
6
6
  type LoginThemePageId,
7
7
  type AccountThemePageId,
8
- themeTypes,
8
+ THEME_TYPES,
9
9
  type ThemeType
10
10
  } from "./shared/constants";
11
11
  import { capitalize } from "tsafe/capitalize";
@@ -26,11 +26,43 @@ export async function command(params: { cliCommandOptions: CliCommandOptions })
26
26
 
27
27
  console.log(chalk.cyan("Theme type:"));
28
28
 
29
- const { value: themeType } = await cliSelect<ThemeType>({
30
- values: [...themeTypes]
31
- }).catch(() => {
32
- process.exit(-1);
33
- });
29
+ const themeType = await (async () => {
30
+ const values = THEME_TYPES.filter(themeType => {
31
+ switch (themeType) {
32
+ case "account":
33
+ return buildContext.implementedThemeTypes.account.isImplemented;
34
+ case "login":
35
+ return buildContext.implementedThemeTypes.login.isImplemented;
36
+ }
37
+ assert<Equals<typeof themeType, never>>(false);
38
+ });
39
+
40
+ assert(values.length > 0, "No theme is implemented in this project");
41
+
42
+ if (values.length === 1) {
43
+ return values[0];
44
+ }
45
+
46
+ const { value } = await cliSelect<ThemeType>({
47
+ values
48
+ }).catch(() => {
49
+ process.exit(-1);
50
+ });
51
+
52
+ return value;
53
+ })();
54
+
55
+ if (
56
+ themeType === "account" &&
57
+ (assert(buildContext.implementedThemeTypes.account.isImplemented),
58
+ buildContext.implementedThemeTypes.account.type === "Single-Page")
59
+ ) {
60
+ console.log(
61
+ `${chalk.red("✗")} Sorry, there is no Storybook support for Single-Page Account themes.`
62
+ );
63
+
64
+ process.exit(0);
65
+ }
34
66
 
35
67
  console.log(`→ ${themeType}`);
36
68
 
@@ -40,9 +72,9 @@ export async function command(params: { cliCommandOptions: CliCommandOptions })
40
72
  values: (() => {
41
73
  switch (themeType) {
42
74
  case "login":
43
- return [...loginThemePageIds];
75
+ return [...LOGIN_THEME_PAGE_IDS];
44
76
  case "account":
45
- return [...accountThemePageIds];
77
+ return [...ACCOUNT_THEME_PAGE_IDS];
46
78
  }
47
79
  assert<Equals<typeof themeType, never>>(false);
48
80
  })()
@@ -3,16 +3,21 @@
3
3
  import { getThisCodebaseRootDirPath } from "./tools/getThisCodebaseRootDirPath";
4
4
  import cliSelect from "cli-select";
5
5
  import {
6
- loginThemePageIds,
7
- accountThemePageIds,
6
+ LOGIN_THEME_PAGE_IDS,
7
+ ACCOUNT_THEME_PAGE_IDS,
8
8
  type LoginThemePageId,
9
9
  type AccountThemePageId,
10
- themeTypes,
10
+ THEME_TYPES,
11
11
  type ThemeType
12
12
  } from "./shared/constants";
13
13
  import { capitalize } from "tsafe/capitalize";
14
14
  import * as fs from "fs";
15
- import { join as pathJoin, relative as pathRelative, dirname as pathDirname } from "path";
15
+ import {
16
+ join as pathJoin,
17
+ relative as pathRelative,
18
+ dirname as pathDirname,
19
+ basename as pathBasename
20
+ } from "path";
16
21
  import { kebabCaseToCamelCase } from "./tools/kebabCaseToSnakeCase";
17
22
  import { assert, Equals } from "tsafe/assert";
18
23
  import type { CliCommandOptions } from "./main";
@@ -28,11 +33,114 @@ export async function command(params: { cliCommandOptions: CliCommandOptions })
28
33
 
29
34
  console.log(chalk.cyan("Theme type:"));
30
35
 
31
- const { value: themeType } = await cliSelect<ThemeType>({
32
- values: [...themeTypes]
33
- }).catch(() => {
34
- process.exit(-1);
35
- });
36
+ const themeType = await (async () => {
37
+ const values = THEME_TYPES.filter(themeType => {
38
+ switch (themeType) {
39
+ case "account":
40
+ return buildContext.implementedThemeTypes.account.isImplemented;
41
+ case "login":
42
+ return buildContext.implementedThemeTypes.login.isImplemented;
43
+ }
44
+ assert<Equals<typeof themeType, never>>(false);
45
+ });
46
+
47
+ assert(values.length > 0, "No theme is implemented in this project");
48
+
49
+ if (values.length === 1) {
50
+ return values[0];
51
+ }
52
+
53
+ const { value } = await cliSelect<ThemeType>({
54
+ values
55
+ }).catch(() => {
56
+ process.exit(-1);
57
+ });
58
+
59
+ return value;
60
+ })();
61
+
62
+ if (
63
+ themeType === "account" &&
64
+ (assert(buildContext.implementedThemeTypes.account.isImplemented),
65
+ buildContext.implementedThemeTypes.account.type === "Single-Page")
66
+ ) {
67
+ const srcDirPath = pathJoin(
68
+ pathDirname(buildContext.packageJsonFilePath),
69
+ "node_modules",
70
+ "@keycloakify",
71
+ "keycloak-account-ui",
72
+ "src"
73
+ );
74
+
75
+ console.log(
76
+ [
77
+ `There isn't an interactive CLI to eject components of the Single-Page Account theme.`,
78
+ `You can however copy paste into your codebase the any file or directory from the following source directory:`,
79
+ ``,
80
+ `${chalk.bold(pathJoin(pathRelative(process.cwd(), srcDirPath)))}`,
81
+ ``
82
+ ].join("\n")
83
+ );
84
+
85
+ eject_entrypoint: {
86
+ const kcAccountUiTsxFileRelativePath = "KcAccountUi.tsx";
87
+
88
+ const accountThemeSrcDirPath = pathJoin(
89
+ buildContext.themeSrcDirPath,
90
+ "account"
91
+ );
92
+
93
+ const targetFilePath = pathJoin(
94
+ accountThemeSrcDirPath,
95
+ kcAccountUiTsxFileRelativePath
96
+ );
97
+
98
+ if (fs.existsSync(targetFilePath)) {
99
+ break eject_entrypoint;
100
+ }
101
+
102
+ fs.cpSync(
103
+ pathJoin(srcDirPath, kcAccountUiTsxFileRelativePath),
104
+ targetFilePath
105
+ );
106
+
107
+ {
108
+ const kcPageTsxFilePath = pathJoin(accountThemeSrcDirPath, "KcPage.tsx");
109
+
110
+ const kcPageTsxCode = fs.readFileSync(kcPageTsxFilePath).toString("utf8");
111
+
112
+ const componentName = pathBasename(
113
+ kcAccountUiTsxFileRelativePath
114
+ ).replace(/.tsx$/, "");
115
+
116
+ const modifiedKcPageTsxCode = kcPageTsxCode.replace(
117
+ `@keycloakify/keycloak-account-ui/${componentName}`,
118
+ `./${componentName}`
119
+ );
120
+
121
+ fs.writeFileSync(
122
+ kcPageTsxFilePath,
123
+ Buffer.from(modifiedKcPageTsxCode, "utf8")
124
+ );
125
+ }
126
+
127
+ const routesTsxFilePath = pathRelative(
128
+ process.cwd(),
129
+ pathJoin(srcDirPath, "routes.tsx")
130
+ );
131
+
132
+ console.log(
133
+ [
134
+ `To help you get started ${chalk.bold(pathRelative(process.cwd(), targetFilePath))} has been copied into your project.`,
135
+ `The next step is usually to eject ${chalk.bold(routesTsxFilePath)}`,
136
+ `with \`cp ${routesTsxFilePath} ${pathRelative(process.cwd(), accountThemeSrcDirPath)}\``,
137
+ `then update the import of routes in ${kcAccountUiTsxFileRelativePath}.`
138
+ ].join("\n")
139
+ );
140
+ }
141
+
142
+ process.exit(0);
143
+ }
36
144
 
37
145
  console.log(`→ ${themeType}`);
38
146
 
@@ -54,10 +162,10 @@ export async function command(params: { cliCommandOptions: CliCommandOptions })
54
162
  return [
55
163
  templateValue,
56
164
  userProfileFormFieldsValue,
57
- ...loginThemePageIds
165
+ ...LOGIN_THEME_PAGE_IDS
58
166
  ];
59
167
  case "account":
60
- return [templateValue, ...accountThemePageIds];
168
+ return [templateValue, ...ACCOUNT_THEME_PAGE_IDS];
61
169
  }
62
170
  assert<Equals<typeof themeType, never>>(false);
63
171
  })()
@@ -0,0 +1,32 @@
1
+ import * as fs from "fs";
2
+ import { join as pathJoin } from "path";
3
+ import { getThisCodebaseRootDirPath } from "../tools/getThisCodebaseRootDirPath";
4
+ import { assert, type Equals } from "tsafe/assert";
5
+
6
+ export function copyBoilerplate(params: {
7
+ accountThemeType: "Single-Page" | "Multi-Page";
8
+ accountThemeSrcDirPath: string;
9
+ }) {
10
+ const { accountThemeType, accountThemeSrcDirPath } = params;
11
+
12
+ fs.cpSync(
13
+ pathJoin(
14
+ getThisCodebaseRootDirPath(),
15
+ "src",
16
+ "bin",
17
+ "initialize-account-theme",
18
+ "src",
19
+ (() => {
20
+ switch (accountThemeType) {
21
+ case "Single-Page":
22
+ return "single-page";
23
+ case "Multi-Page":
24
+ return "multi-page";
25
+ }
26
+ assert<Equals<typeof accountThemeType, never>>(false);
27
+ })()
28
+ ),
29
+ accountThemeSrcDirPath,
30
+ { recursive: true }
31
+ );
32
+ }
@@ -0,0 +1 @@
1
+ export * from "./initialize-account-theme";
@@ -0,0 +1,112 @@
1
+ import { getBuildContext } from "../shared/buildContext";
2
+ import type { CliCommandOptions } from "../main";
3
+ import cliSelect from "cli-select";
4
+ import child_process from "child_process";
5
+ import chalk from "chalk";
6
+ import { join as pathJoin, relative as pathRelative } from "path";
7
+ import * as fs from "fs";
8
+ import { updateAccountThemeImplementationInConfig } from "./updateAccountThemeImplementationInConfig";
9
+ import { generateKcGenTs } from "../shared/generateKcGenTs";
10
+
11
+ export async function command(params: { cliCommandOptions: CliCommandOptions }) {
12
+ const { cliCommandOptions } = params;
13
+
14
+ const buildContext = getBuildContext({ cliCommandOptions });
15
+
16
+ const accountThemeSrcDirPath = pathJoin(buildContext.themeSrcDirPath, "account");
17
+
18
+ if (
19
+ fs.existsSync(accountThemeSrcDirPath) &&
20
+ fs.readdirSync(accountThemeSrcDirPath).length > 0
21
+ ) {
22
+ console.warn(
23
+ chalk.red(
24
+ `There is already a ${pathRelative(
25
+ process.cwd(),
26
+ accountThemeSrcDirPath
27
+ )} directory in your project. Aborting.`
28
+ )
29
+ );
30
+
31
+ process.exit(-1);
32
+ }
33
+
34
+ exit_if_uncommitted_changes: {
35
+ let hasUncommittedChanges: boolean | undefined = undefined;
36
+
37
+ try {
38
+ hasUncommittedChanges =
39
+ child_process
40
+ .execSync(`git status --porcelain`, {
41
+ cwd: buildContext.projectDirPath
42
+ })
43
+ .toString()
44
+ .trim() !== "";
45
+ } catch {
46
+ // Probably not a git repository
47
+ break exit_if_uncommitted_changes;
48
+ }
49
+
50
+ if (!hasUncommittedChanges) {
51
+ break exit_if_uncommitted_changes;
52
+ }
53
+ console.warn(
54
+ [
55
+ chalk.red(
56
+ "Please commit or stash your changes before running this command.\n"
57
+ ),
58
+ "This command will modify your project's files so it's better to have a clean working directory",
59
+ "so that you can easily see what has been changed and revert if needed."
60
+ ].join(" ")
61
+ );
62
+
63
+ process.exit(-1);
64
+ }
65
+
66
+ const { value: accountThemeType } = await cliSelect({
67
+ values: ["Single-Page" as const, "Multi-Page" as const]
68
+ }).catch(() => {
69
+ process.exit(-1);
70
+ });
71
+
72
+ switch (accountThemeType) {
73
+ case "Multi-Page":
74
+ {
75
+ const { initializeAccountTheme_multiPage } = await import(
76
+ "./initializeAccountTheme_multiPage"
77
+ );
78
+
79
+ await initializeAccountTheme_multiPage({
80
+ accountThemeSrcDirPath
81
+ });
82
+ }
83
+ break;
84
+ case "Single-Page":
85
+ {
86
+ const { initializeAccountTheme_singlePage } = await import(
87
+ "./initializeAccountTheme_singlePage"
88
+ );
89
+
90
+ await initializeAccountTheme_singlePage({
91
+ accountThemeSrcDirPath,
92
+ buildContext
93
+ });
94
+ }
95
+ break;
96
+ }
97
+
98
+ updateAccountThemeImplementationInConfig({ buildContext, accountThemeType });
99
+
100
+ await generateKcGenTs({
101
+ buildContext: {
102
+ ...buildContext,
103
+ implementedThemeTypes: {
104
+ ...buildContext.implementedThemeTypes,
105
+ account: {
106
+ isImplemented: true,
107
+ type: accountThemeType
108
+ }
109
+ }
110
+ }
111
+ });
112
+ }
@@ -0,0 +1,21 @@
1
+ import { relative as pathRelative } from "path";
2
+ import chalk from "chalk";
3
+ import { copyBoilerplate } from "./copyBoilerplate";
4
+
5
+ export async function initializeAccountTheme_multiPage(params: {
6
+ accountThemeSrcDirPath: string;
7
+ }) {
8
+ const { accountThemeSrcDirPath } = params;
9
+
10
+ copyBoilerplate({
11
+ accountThemeType: "Multi-Page",
12
+ accountThemeSrcDirPath
13
+ });
14
+
15
+ console.log(
16
+ [
17
+ chalk.green("The Multi-Page account theme has been initialized."),
18
+ `Directory created: ${chalk.bold(pathRelative(process.cwd(), accountThemeSrcDirPath))}`
19
+ ].join("\n")
20
+ );
21
+ }
@@ -0,0 +1,152 @@
1
+ import { join as pathJoin, relative as pathRelative, dirname as pathDirname } from "path";
2
+ import type { BuildContext } from "../shared/buildContext";
3
+ import * as fs from "fs";
4
+ import chalk from "chalk";
5
+ import {
6
+ getLatestsSemVersionedTag,
7
+ type BuildContextLike as BuildContextLike_getLatestsSemVersionedTag
8
+ } from "../shared/getLatestsSemVersionedTag";
9
+ import fetch from "make-fetch-happen";
10
+ import { z } from "zod";
11
+ import { assert, type Equals } from "tsafe/assert";
12
+ import { is } from "tsafe/is";
13
+ import { id } from "tsafe/id";
14
+ import { npmInstall } from "../tools/npmInstall";
15
+ import { copyBoilerplate } from "./copyBoilerplate";
16
+ import { getThisCodebaseRootDirPath } from "../tools/getThisCodebaseRootDirPath";
17
+
18
+ type BuildContextLike = BuildContextLike_getLatestsSemVersionedTag & {
19
+ fetchOptions: BuildContext["fetchOptions"];
20
+ packageJsonFilePath: string;
21
+ };
22
+
23
+ assert<BuildContext extends BuildContextLike ? true : false>();
24
+
25
+ export async function initializeAccountTheme_singlePage(params: {
26
+ accountThemeSrcDirPath: string;
27
+ buildContext: BuildContextLike;
28
+ }) {
29
+ const { accountThemeSrcDirPath, buildContext } = params;
30
+
31
+ const OWNER = "keycloakify";
32
+ const REPO = "keycloak-account-ui";
33
+
34
+ const [semVersionedTag] = await getLatestsSemVersionedTag({
35
+ owner: OWNER,
36
+ repo: REPO,
37
+ count: 1,
38
+ doIgnoreReleaseCandidates: false,
39
+ buildContext
40
+ });
41
+
42
+ const dependencies = await fetch(
43
+ `https://raw.githubusercontent.com/${OWNER}/${REPO}/${semVersionedTag.tag}/dependencies.gen.json`,
44
+ buildContext.fetchOptions
45
+ )
46
+ .then(r => r.json())
47
+ .then(
48
+ (() => {
49
+ type Dependencies = {
50
+ dependencies: Record<string, string>;
51
+ devDependencies?: Record<string, string>;
52
+ };
53
+
54
+ const zDependencies = (() => {
55
+ type TargetType = Dependencies;
56
+
57
+ const zTargetType = z.object({
58
+ dependencies: z.record(z.string()),
59
+ devDependencies: z.record(z.string()).optional()
60
+ });
61
+
62
+ assert<Equals<z.infer<typeof zTargetType>, TargetType>>();
63
+
64
+ return id<z.ZodType<TargetType>>(zTargetType);
65
+ })();
66
+
67
+ return o => zDependencies.parse(o);
68
+ })()
69
+ );
70
+
71
+ dependencies.dependencies["@keycloakify/keycloak-account-ui"] = semVersionedTag.tag;
72
+
73
+ const parsedPackageJson = (() => {
74
+ type ParsedPackageJson = {
75
+ dependencies?: Record<string, string>;
76
+ devDependencies?: Record<string, string>;
77
+ };
78
+
79
+ const zParsedPackageJson = (() => {
80
+ type TargetType = ParsedPackageJson;
81
+
82
+ const zTargetType = z.object({
83
+ dependencies: z.record(z.string()).optional(),
84
+ devDependencies: z.record(z.string()).optional()
85
+ });
86
+
87
+ assert<Equals<z.infer<typeof zTargetType>, TargetType>>();
88
+
89
+ return id<z.ZodType<TargetType>>(zTargetType);
90
+ })();
91
+ const parsedPackageJson = JSON.parse(
92
+ fs.readFileSync(buildContext.packageJsonFilePath).toString("utf8")
93
+ );
94
+
95
+ zParsedPackageJson.parse(parsedPackageJson);
96
+
97
+ assert(is<ParsedPackageJson>(parsedPackageJson));
98
+
99
+ return parsedPackageJson;
100
+ })();
101
+
102
+ parsedPackageJson.dependencies = {
103
+ ...parsedPackageJson.dependencies,
104
+ ...dependencies.dependencies
105
+ };
106
+
107
+ parsedPackageJson.devDependencies = {
108
+ ...parsedPackageJson.devDependencies,
109
+ ...dependencies.devDependencies
110
+ };
111
+
112
+ if (Object.keys(parsedPackageJson.devDependencies).length === 0) {
113
+ delete parsedPackageJson.devDependencies;
114
+ }
115
+
116
+ fs.writeFileSync(
117
+ buildContext.packageJsonFilePath,
118
+ JSON.stringify(parsedPackageJson, undefined, 4)
119
+ );
120
+
121
+ run_npm_install: {
122
+ if (
123
+ JSON.parse(
124
+ fs
125
+ .readFileSync(pathJoin(getThisCodebaseRootDirPath(), "package.json"))
126
+ .toString("utf8")
127
+ )["version"] === "0.0.0"
128
+ ) {
129
+ //NOTE: Linked version
130
+ break run_npm_install;
131
+ }
132
+
133
+ npmInstall({ packageJsonDirPath: pathDirname(buildContext.packageJsonFilePath) });
134
+ }
135
+
136
+ copyBoilerplate({
137
+ accountThemeType: "Single-Page",
138
+ accountThemeSrcDirPath
139
+ });
140
+
141
+ console.log(
142
+ [
143
+ chalk.green(
144
+ "The Single-Page account theme has been successfully initialized."
145
+ ),
146
+ `Using Account UI of Keycloak version: ${chalk.bold(semVersionedTag.tag.split("-")[0])}`,
147
+ `Directory created: ${chalk.bold(pathRelative(process.cwd(), accountThemeSrcDirPath))}`,
148
+ `Dependencies added to your project's package.json: `,
149
+ chalk.bold(JSON.stringify(dependencies, null, 2))
150
+ ].join("\n")
151
+ );
152
+ }
@@ -0,0 +1,12 @@
1
+ /* eslint-disable @typescript-eslint/ban-types */
2
+ import type { ExtendKcContext } from "keycloakify/account";
3
+ import type { KcEnvName, ThemeName } from "../kc.gen";
4
+
5
+ export type KcContextExtension = {
6
+ themeName: ThemeName;
7
+ properties: Record<KcEnvName, string> & {};
8
+ };
9
+
10
+ export type KcContextExtensionPerPage = {};
11
+
12
+ export type KcContext = ExtendKcContext<KcContextExtension, KcContextExtensionPerPage>;
@@ -0,0 +1,25 @@
1
+ import { Suspense } from "react";
2
+ import type { ClassKey } from "keycloakify/account";
3
+ import type { KcContext } from "./KcContext";
4
+ import { useI18n } from "./i18n";
5
+ import DefaultPage from "keycloakify/account/DefaultPage";
6
+ import Template from "keycloakify/account/Template";
7
+
8
+ export default function KcPage(props: { kcContext: KcContext }) {
9
+ const { kcContext } = props;
10
+
11
+ const { i18n } = useI18n({ kcContext });
12
+
13
+ return (
14
+ <Suspense>
15
+ {(() => {
16
+ switch (kcContext.pageId) {
17
+ default:
18
+ return <DefaultPage kcContext={kcContext} i18n={i18n} classes={classes} Template={Template} doUseDefaultCss={true} />;
19
+ }
20
+ })()}
21
+ </Suspense>
22
+ );
23
+ }
24
+
25
+ const classes = {} satisfies { [key in ClassKey]?: string };
@@ -0,0 +1,38 @@
1
+ import type { DeepPartial } from "keycloakify/tools/DeepPartial";
2
+ import type { KcContext } from "./KcContext";
3
+ import { createGetKcContextMock } from "keycloakify/account/KcContext";
4
+ import type { KcContextExtension, KcContextExtensionPerPage } from "./KcContext";
5
+ import KcPage from "./KcPage";
6
+ import { themeNames, kcEnvDefaults } from "../kc.gen";
7
+
8
+ const kcContextExtension: KcContextExtension = {
9
+ themeName: themeNames[0],
10
+ properties: {
11
+ ...kcEnvDefaults
12
+ }
13
+ };
14
+ const kcContextExtensionPerPage: KcContextExtensionPerPage = {};
15
+
16
+ export const { getKcContextMock } = createGetKcContextMock({
17
+ kcContextExtension,
18
+ kcContextExtensionPerPage,
19
+ overrides: {},
20
+ overridesPerPage: {}
21
+ });
22
+
23
+ export function createKcPageStory<PageId extends KcContext["pageId"]>(params: { pageId: PageId }) {
24
+ const { pageId } = params;
25
+
26
+ function KcPageStory(props: { kcContext?: DeepPartial<Extract<KcContext, { pageId: PageId }>> }) {
27
+ const { kcContext: overrides } = props;
28
+
29
+ const kcContextMock = getKcContextMock({
30
+ pageId,
31
+ overrides
32
+ });
33
+
34
+ return <KcPage kcContext={kcContextMock} />;
35
+ }
36
+
37
+ return { KcPageStory };
38
+ }
@@ -0,0 +1,5 @@
1
+ import { createUseI18n } from "keycloakify/account";
2
+
3
+ export const { useI18n, ofTypeI18n } = createUseI18n({});
4
+
5
+ export type I18n = typeof ofTypeI18n;
@@ -0,0 +1,7 @@
1
+ import type { KcContextLike } from "@keycloakify/keycloak-account-ui";
2
+ import type { KcEnvName } from "../kc.gen";
3
+
4
+ export type KcContext = KcContextLike & {
5
+ themeType: "account";
6
+ properties: Record<KcEnvName, string>;
7
+ };
@@ -0,0 +1,11 @@
1
+ import { lazy } from "react";
2
+ import { KcAccountUiLoader } from "@keycloakify/keycloak-account-ui";
3
+ import type { KcContext } from "./KcContext";
4
+
5
+ const KcAccountUi = lazy(() => import("@keycloakify/keycloak-account-ui/KcAccountUi"));
6
+
7
+ export default function KcPage(props: { kcContext: KcContext }) {
8
+ const { kcContext } = props;
9
+
10
+ return <KcAccountUiLoader kcContext={kcContext} KcAccountUi={KcAccountUi} />;
11
+ }