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
@@ -2,15 +2,16 @@ import { getBuildContext } from "../shared/buildContext";
2
2
  import { exclude } from "tsafe/exclude";
3
3
  import type { CliCommandOptions as CliCommandOptions_common } from "../main";
4
4
  import { promptKeycloakVersion } from "../shared/promptKeycloakVersion";
5
- import { accountV1ThemeName, containerName } from "../shared/constants";
5
+ import { ACCOUNT_V1_THEME_NAME, CONTAINER_NAME } from "../shared/constants";
6
6
  import { SemVer } from "../tools/SemVer";
7
- import { assert } from "tsafe/assert";
7
+ import { assert, type Equals } from "tsafe/assert";
8
8
  import * as fs from "fs";
9
9
  import {
10
10
  join as pathJoin,
11
11
  relative as pathRelative,
12
12
  sep as pathSep,
13
- basename as pathBasename
13
+ basename as pathBasename,
14
+ dirname as pathDirname
14
15
  } from "path";
15
16
  import * as child_process from "child_process";
16
17
  import chalk from "chalk";
@@ -26,9 +27,10 @@ import { keycloakifyBuild } from "./keycloakifyBuild";
26
27
  import { isInside } from "../tools/isInside";
27
28
  import { existsAsync } from "../tools/fs.existsAsync";
28
29
  import { rm } from "../tools/fs.rm";
30
+ import { downloadAndExtractArchive } from "../tools/downloadAndExtractArchive";
29
31
 
30
32
  export type CliCommandOptions = CliCommandOptions_common & {
31
- port: number;
33
+ port: number | undefined;
32
34
  keycloakVersion: string | undefined;
33
35
  realmJsonFilePath: string | undefined;
34
36
  };
@@ -88,30 +90,65 @@ export async function command(params: { cliCommandOptions: CliCommandOptions })
88
90
 
89
91
  const buildContext = getBuildContext({ cliCommandOptions });
90
92
 
91
- const { keycloakVersion } = await (async () => {
93
+ const { dockerImageTag } = await (async () => {
92
94
  if (cliCommandOptions.keycloakVersion !== undefined) {
95
+ return { dockerImageTag: cliCommandOptions.keycloakVersion };
96
+ }
97
+
98
+ if (buildContext.startKeycloakOptions.dockerImage !== undefined) {
93
99
  return {
94
- keycloakVersion: cliCommandOptions.keycloakVersion,
95
- keycloakMajorNumber: SemVer.parse(cliCommandOptions.keycloakVersion).major
100
+ dockerImageTag: buildContext.startKeycloakOptions.dockerImage.tag
96
101
  };
97
102
  }
98
103
 
99
104
  console.log(
100
- chalk.cyan("On which version of Keycloak do you want to test your theme?")
105
+ [
106
+ chalk.cyan(
107
+ "On which version of Keycloak do you want to test your theme?"
108
+ ),
109
+ chalk.gray(
110
+ "You can also explicitly provide the version with `npx keycloakify start-keycloak --keycloak-version 25.0.2` (or any other version)"
111
+ )
112
+ ].join("\n")
101
113
  );
102
114
 
103
115
  const { keycloakVersion } = await promptKeycloakVersion({
104
116
  startingFromMajor: 18,
105
117
  excludeMajorVersions: [22],
106
- cacheDirPath: buildContext.cacheDirPath
118
+ buildContext
107
119
  });
108
120
 
109
121
  console.log(`→ ${keycloakVersion}`);
110
122
 
111
- return { keycloakVersion };
123
+ return { dockerImageTag: keycloakVersion };
112
124
  })();
113
125
 
114
- const keycloakMajorVersionNumber = SemVer.parse(keycloakVersion).major;
126
+ const keycloakMajorVersionNumber = (() => {
127
+ if (buildContext.startKeycloakOptions.dockerImage === undefined) {
128
+ return SemVer.parse(dockerImageTag).major;
129
+ }
130
+
131
+ const { tag } = buildContext.startKeycloakOptions.dockerImage;
132
+
133
+ const [wrap] = [18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28]
134
+ .map(majorVersionNumber => ({
135
+ majorVersionNumber,
136
+ index: tag.indexOf(`${majorVersionNumber}`)
137
+ }))
138
+ .filter(({ index }) => index !== -1)
139
+ .sort((a, b) => a.index - b.index);
140
+
141
+ if (wrap === undefined) {
142
+ console.warn(
143
+ chalk.yellow(
144
+ `Could not determine the major Keycloak version number from the docker image tag ${tag}. Assuming 25`
145
+ )
146
+ );
147
+ return 25;
148
+ }
149
+
150
+ return wrap.majorVersionNumber;
151
+ })();
115
152
 
116
153
  {
117
154
  const { isAppBuildSuccess } = await appBuild({
@@ -150,41 +187,68 @@ export async function command(params: { cliCommandOptions: CliCommandOptions })
150
187
 
151
188
  assert(jarFilePath !== undefined);
152
189
 
153
- console.log(`Using ${chalk.bold(pathBasename(jarFilePath))}`);
190
+ const extensionJarFilePaths = await Promise.all(
191
+ buildContext.startKeycloakOptions.extensionJars.map(async extensionJar => {
192
+ switch (extensionJar.type) {
193
+ case "path": {
194
+ assert(
195
+ await existsAsync(extensionJar.path),
196
+ `${extensionJar.path} does not exist`
197
+ );
198
+ return extensionJar.path;
199
+ }
200
+ case "url": {
201
+ const { archiveFilePath } = await downloadAndExtractArchive({
202
+ cacheDirPath: buildContext.cacheDirPath,
203
+ fetchOptions: buildContext.fetchOptions,
204
+ url: extensionJar.url,
205
+ uniqueIdOfOnArchiveFile: "no extraction",
206
+ onArchiveFile: async () => {}
207
+ });
208
+ return archiveFilePath;
209
+ }
210
+ }
211
+ assert<Equals<typeof extensionJar, never>>(false);
212
+ })
213
+ );
214
+
215
+ const getRealmJsonFilePath_defaultForKeycloakMajor = (
216
+ keycloakMajorVersionNumber: number
217
+ ) =>
218
+ pathJoin(
219
+ getThisCodebaseRootDirPath(),
220
+ "src",
221
+ "bin",
222
+ "start-keycloak",
223
+ `myrealm-realm-${keycloakMajorVersionNumber}.json`
224
+ );
154
225
 
155
226
  const realmJsonFilePath = await (async () => {
156
227
  if (cliCommandOptions.realmJsonFilePath !== undefined) {
157
228
  if (cliCommandOptions.realmJsonFilePath === "none") {
158
229
  return undefined;
159
230
  }
160
-
161
- console.log(
162
- chalk.green(
163
- `Using realm json file: ${cliCommandOptions.realmJsonFilePath}`
164
- )
165
- );
166
-
167
231
  return getAbsoluteAndInOsFormatPath({
168
232
  pathIsh: cliCommandOptions.realmJsonFilePath,
169
233
  cwd: process.cwd()
170
234
  });
171
235
  }
172
236
 
173
- const internalFilePath = await (async () => {
174
- const dirPath = pathJoin(
175
- getThisCodebaseRootDirPath(),
176
- "src",
177
- "bin",
178
- "start-keycloak"
237
+ if (buildContext.startKeycloakOptions.realmJsonFilePath !== undefined) {
238
+ assert(
239
+ await existsAsync(buildContext.startKeycloakOptions.realmJsonFilePath),
240
+ `${pathRelative(process.cwd(), buildContext.startKeycloakOptions.realmJsonFilePath)} does not exist`
179
241
  );
242
+ return buildContext.startKeycloakOptions.realmJsonFilePath;
243
+ }
180
244
 
181
- const filePath = pathJoin(
182
- dirPath,
183
- `myrealm-realm-${keycloakMajorVersionNumber}.json`
245
+ const internalFilePath = await (async () => {
246
+ const defaultFilePath = getRealmJsonFilePath_defaultForKeycloakMajor(
247
+ keycloakMajorVersionNumber
184
248
  );
185
249
 
186
- if (fs.existsSync(filePath)) {
187
- return filePath;
250
+ if (fs.existsSync(defaultFilePath)) {
251
+ return defaultFilePath;
188
252
  }
189
253
 
190
254
  console.log(
@@ -195,6 +259,8 @@ export async function command(params: { cliCommandOptions: CliCommandOptions })
195
259
 
196
260
  console.log(chalk.cyan("Select what configuration to use:"));
197
261
 
262
+ const dirPath = pathDirname(defaultFilePath);
263
+
198
264
  const { value } = await cliSelect<string>({
199
265
  values: [
200
266
  ...fs
@@ -236,6 +302,40 @@ export async function command(params: { cliCommandOptions: CliCommandOptions })
236
302
  return filePath;
237
303
  })();
238
304
 
305
+ add_test_user_if_missing: {
306
+ if (realmJsonFilePath === undefined) {
307
+ break add_test_user_if_missing;
308
+ }
309
+
310
+ const realm: Record<string, unknown> = JSON.parse(
311
+ fs.readFileSync(realmJsonFilePath).toString("utf8")
312
+ );
313
+
314
+ if (realm.users !== undefined) {
315
+ break add_test_user_if_missing;
316
+ }
317
+
318
+ const realmJsonFilePath_internal = (() => {
319
+ const filePath = getRealmJsonFilePath_defaultForKeycloakMajor(
320
+ keycloakMajorVersionNumber
321
+ );
322
+
323
+ if (!fs.existsSync(filePath)) {
324
+ return getRealmJsonFilePath_defaultForKeycloakMajor(25);
325
+ }
326
+
327
+ return filePath;
328
+ })();
329
+
330
+ const users = JSON.parse(
331
+ fs.readFileSync(realmJsonFilePath_internal).toString("utf8")
332
+ ).users;
333
+
334
+ realm.users = users;
335
+
336
+ fs.writeFileSync(realmJsonFilePath, JSON.stringify(realm, null, 2), "utf8");
337
+ }
338
+
239
339
  async function extractThemeResourcesFromJar() {
240
340
  await extractArchive({
241
341
  archiveFilePath: jarFilePath,
@@ -269,82 +369,110 @@ export async function command(params: { cliCommandOptions: CliCommandOptions })
269
369
  fs.copyFileSync(jarFilePath, jarFilePath_cacheDir);
270
370
 
271
371
  try {
272
- child_process.execSync(`docker rm --force ${containerName}`, {
372
+ child_process.execSync(`docker rm --force ${CONTAINER_NAME}`, {
273
373
  stdio: "ignore"
274
374
  });
275
375
  } catch {}
276
376
 
277
- const spawnArgs = [
278
- "docker",
279
- [
280
- "run",
281
- ...["-p", `${cliCommandOptions.port}:8080`],
282
- ...["--name", containerName],
283
- ...["-e", "KEYCLOAK_ADMIN=admin"],
284
- ...["-e", "KEYCLOAK_ADMIN_PASSWORD=admin"],
285
- ...(realmJsonFilePath === undefined
286
- ? []
287
- : [
288
- "-v",
289
- `${realmJsonFilePath}:/opt/keycloak/data/import/myrealm-realm.json`
290
- ]),
291
- ...[
292
- "-v",
293
- `${jarFilePath_cacheDir}:/opt/keycloak/providers/keycloak-theme.jar`
294
- ],
295
- ...(keycloakMajorVersionNumber <= 20
296
- ? ["-e", "JAVA_OPTS=-Dkeycloak.profile=preview"]
297
- : []),
298
- ...[
299
- ...buildContext.themeNames,
300
- ...(fs.existsSync(
301
- pathJoin(
302
- buildContext.keycloakifyBuildDirPath,
303
- "theme",
304
- accountV1ThemeName
305
- )
306
- )
307
- ? [accountV1ThemeName]
308
- : [])
309
- ]
310
- .map(themeName => ({
311
- localDirPath: pathJoin(
312
- buildContext.keycloakifyBuildDirPath,
313
- "theme",
314
- themeName
315
- ),
316
- containerDirPath: `/opt/keycloak/themes/${themeName}`
317
- }))
318
- .map(({ localDirPath, containerDirPath }) => [
319
- "-v",
320
- `${localDirPath}:${containerDirPath}:rw`
321
- ])
322
- .flat(),
323
- ...buildContext.environmentVariables
324
- .map(({ name }) => ({ name, envValue: process.env[name] }))
325
- .map(({ name, envValue }) =>
326
- envValue === undefined ? undefined : { name, envValue }
377
+ const DEFAULT_PORT = 8080;
378
+ const port =
379
+ cliCommandOptions.port ?? buildContext.startKeycloakOptions.port ?? DEFAULT_PORT;
380
+
381
+ const SPACE_PLACEHOLDER = "SPACE_PLACEHOLDER_xKLmdPd";
382
+
383
+ const dockerRunArgs: string[] = [
384
+ `-p${SPACE_PLACEHOLDER}${port}:8080`,
385
+ `--name${SPACE_PLACEHOLDER}${CONTAINER_NAME}`,
386
+ `-e${SPACE_PLACEHOLDER}KEYCLOAK_ADMIN=admin`,
387
+ `-e${SPACE_PLACEHOLDER}KEYCLOAK_ADMIN_PASSWORD=admin`,
388
+ ...(buildContext.startKeycloakOptions.dockerExtraArgs.length === 0
389
+ ? []
390
+ : [
391
+ buildContext.startKeycloakOptions.dockerExtraArgs.join(
392
+ SPACE_PLACEHOLDER
393
+ )
394
+ ]),
395
+ ...(realmJsonFilePath === undefined
396
+ ? []
397
+ : [
398
+ `-v${SPACE_PLACEHOLDER}".${pathSep}${pathRelative(process.cwd(), realmJsonFilePath)}":/opt/keycloak/data/import/myrealm-realm.json`
399
+ ]),
400
+ `-v${SPACE_PLACEHOLDER}".${pathSep}${pathRelative(process.cwd(), jarFilePath_cacheDir)}":/opt/keycloak/providers/keycloak-theme.jar`,
401
+ ...extensionJarFilePaths.map(
402
+ jarFilePath =>
403
+ `-v${SPACE_PLACEHOLDER}".${pathSep}${pathRelative(process.cwd(), jarFilePath)}":/opt/keycloak/providers/${pathBasename(jarFilePath)}`
404
+ ),
405
+ ...(keycloakMajorVersionNumber <= 20
406
+ ? [`-e${SPACE_PLACEHOLDER}JAVA_OPTS=-Dkeycloak.profile=preview`]
407
+ : []),
408
+ ...[
409
+ ...buildContext.themeNames,
410
+ ...(fs.existsSync(
411
+ pathJoin(
412
+ buildContext.keycloakifyBuildDirPath,
413
+ "theme",
414
+ ACCOUNT_V1_THEME_NAME
327
415
  )
328
- .filter(exclude(undefined))
329
- .map(({ name, envValue }) => [
330
- "--env",
331
- `${name}='${envValue.replace(/'/g, "'\\''")}'`
332
- ])
333
- .flat(),
334
- `quay.io/keycloak/keycloak:${keycloakVersion}`,
335
- "start-dev",
336
- ...(21 <= keycloakMajorVersionNumber && keycloakMajorVersionNumber < 24
337
- ? ["--features=declarative-user-profile"]
338
- : []),
339
- ...(realmJsonFilePath === undefined ? [] : ["--import-realm"])
340
- ],
341
- {
342
- cwd: buildContext.keycloakifyBuildDirPath,
343
- shell: true
344
- }
345
- ] as const;
416
+ )
417
+ ? [ACCOUNT_V1_THEME_NAME]
418
+ : [])
419
+ ]
420
+ .map(themeName => ({
421
+ localDirPath: pathJoin(
422
+ buildContext.keycloakifyBuildDirPath,
423
+ "theme",
424
+ themeName
425
+ ),
426
+ containerDirPath: `/opt/keycloak/themes/${themeName}`
427
+ }))
428
+ .map(
429
+ ({ localDirPath, containerDirPath }) =>
430
+ `-v${SPACE_PLACEHOLDER}".${pathSep}${pathRelative(process.cwd(), localDirPath)}":${containerDirPath}:rw`
431
+ ),
432
+ ...buildContext.environmentVariables
433
+ .map(({ name }) => ({ name, envValue: process.env[name] }))
434
+ .map(({ name, envValue }) =>
435
+ envValue === undefined ? undefined : { name, envValue }
436
+ )
437
+ .filter(exclude(undefined))
438
+ .map(
439
+ ({ name, envValue }) =>
440
+ `--env${SPACE_PLACEHOLDER}${name}='${envValue.replace(/'/g, "'\\''")}'`
441
+ ),
442
+ `${buildContext.startKeycloakOptions.dockerImage?.reference ?? "quay.io/keycloak/keycloak"}:${dockerImageTag}`,
443
+ "start-dev",
444
+ ...(21 <= keycloakMajorVersionNumber && keycloakMajorVersionNumber < 24
445
+ ? ["--features=declarative-user-profile"]
446
+ : []),
447
+ ...(realmJsonFilePath === undefined ? [] : ["--import-realm"]),
448
+ ...(buildContext.startKeycloakOptions.keycloakExtraArgs.length === 0
449
+ ? []
450
+ : [
451
+ buildContext.startKeycloakOptions.keycloakExtraArgs.join(
452
+ SPACE_PLACEHOLDER
453
+ )
454
+ ])
455
+ ];
456
+
457
+ console.log(
458
+ chalk.blue(
459
+ [
460
+ `$ docker run \\`,
461
+ ...dockerRunArgs
462
+ .map(arg => arg.replace(new RegExp(SPACE_PLACEHOLDER, "g"), " "))
463
+ .map(
464
+ (line, i, arr) =>
465
+ ` ${line}${arr.length - 1 === i ? "" : " \\"}`
466
+ )
467
+ ].join("\n")
468
+ )
469
+ );
346
470
 
347
- const child = child_process.spawn(...spawnArgs);
471
+ const child = child_process.spawn(
472
+ "docker",
473
+ ["run", ...dockerRunArgs.map(line => line.split(SPACE_PLACEHOLDER)).flat()],
474
+ { shell: true }
475
+ );
348
476
 
349
477
  child.stdout.on("data", data => process.stdout.write(data));
350
478
 
@@ -355,6 +483,18 @@ export async function command(params: { cliCommandOptions: CliCommandOptions })
355
483
  const srcDirPath = pathJoin(buildContext.projectDirPath, "src");
356
484
 
357
485
  {
486
+ const kcHttpRelativePath = (() => {
487
+ const match = buildContext.startKeycloakOptions.dockerExtraArgs
488
+ .join(" ")
489
+ .match(/KC_HTTP_RELATIVE_PATH=([^ ]+)/);
490
+
491
+ if (match === null) {
492
+ return undefined;
493
+ }
494
+
495
+ return match[1];
496
+ })();
497
+
358
498
  const handler = async (data: Buffer) => {
359
499
  if (!data.toString("utf8").includes("Listening on: http://0.0.0.0:8080")) {
360
500
  return;
@@ -372,7 +512,7 @@ export async function command(params: { cliCommandOptions: CliCommandOptions })
372
512
  )} are mounted in the Keycloak container.`,
373
513
  "",
374
514
  `Keycloak Admin console: ${chalk.cyan.bold(
375
- `http://localhost:${cliCommandOptions.port}`
515
+ `http://localhost:${port}${kcHttpRelativePath ?? ""}`
376
516
  )}`,
377
517
  `- user: ${chalk.cyan.bold("admin")}`,
378
518
  `- password: ${chalk.cyan.bold("admin")}`,
@@ -380,7 +520,21 @@ export async function command(params: { cliCommandOptions: CliCommandOptions })
380
520
  "",
381
521
  `${chalk.green("Your theme is accessible at:")}`,
382
522
  `${chalk.green("➜")} ${chalk.cyan.bold(
383
- `https://my-theme.keycloakify.dev${cliCommandOptions.port === 8080 ? "" : `?port=${cliCommandOptions.port}`}`
523
+ (() => {
524
+ const url = new URL("https://my-theme.keycloakify.dev");
525
+
526
+ if (port !== DEFAULT_PORT) {
527
+ url.searchParams.set("port", `${port}`);
528
+ }
529
+ if (kcHttpRelativePath !== undefined) {
530
+ url.searchParams.set(
531
+ "kcHttpRelativePath",
532
+ kcHttpRelativePath
533
+ );
534
+ }
535
+
536
+ return url.href;
537
+ })()
384
538
  )}`,
385
539
  "",
386
540
  "You can login with the following credentials:",
@@ -0,0 +1,17 @@
1
+ import { sep as pathSep } from "path";
2
+ import chalk from "chalk";
3
+
4
+ export function assertNoPnpmDlx() {
5
+ if (__dirname.includes(`${pathSep}pnpm${pathSep}dlx${pathSep}`)) {
6
+ console.log(
7
+ [
8
+ chalk.red(
9
+ "Please don't use `pnpm dlx keycloakify` (download and execute)"
10
+ ),
11
+ "\nUse `npx keycloakify` or `pnpm exec keycloakify` instead since you want to use the keycloakify",
12
+ "version that is installed in your project and not download and run the latest NPM version of keycloakify."
13
+ ].join(" ")
14
+ );
15
+ process.exit(1);
16
+ }
17
+ }
@@ -4,13 +4,12 @@ import { dirname as pathDirname, join as pathJoin } from "path";
4
4
  import { assert } from "tsafe/assert";
5
5
  import { extractArchive } from "./extractArchive";
6
6
  import { existsAsync } from "./fs.existsAsync";
7
-
8
7
  import * as crypto from "crypto";
9
8
  import { rm } from "./fs.rm";
10
9
 
11
10
  export async function downloadAndExtractArchive(params: {
12
11
  url: string;
13
- uniqueIdOfOnOnArchiveFile: string;
12
+ uniqueIdOfOnArchiveFile: string;
14
13
  onArchiveFile: (params: {
15
14
  fileRelativePath: string;
16
15
  readFile: () => Promise<Buffer>;
@@ -21,8 +20,8 @@ export async function downloadAndExtractArchive(params: {
21
20
  }) => Promise<void>;
22
21
  cacheDirPath: string;
23
22
  fetchOptions: FetchOptions | undefined;
24
- }): Promise<{ extractedDirPath: string }> {
25
- const { url, uniqueIdOfOnOnArchiveFile, onArchiveFile, cacheDirPath, fetchOptions } =
23
+ }): Promise<{ extractedDirPath: string; archiveFilePath: string }> {
24
+ const { url, uniqueIdOfOnArchiveFile, onArchiveFile, cacheDirPath, fetchOptions } =
26
25
  params;
27
26
 
28
27
  const archiveFileBasename = url.split("?")[0].split("/").reverse()[0];
@@ -30,6 +29,8 @@ export async function downloadAndExtractArchive(params: {
30
29
  const archiveFilePath = pathJoin(cacheDirPath, archiveFileBasename);
31
30
 
32
31
  download: {
32
+ await mkdir(pathDirname(archiveFilePath), { recursive: true });
33
+
33
34
  if (await existsAsync(archiveFilePath)) {
34
35
  const isDownloaded = await SuccessTracker.getIsDownloaded({
35
36
  cacheDirPath,
@@ -48,8 +49,6 @@ export async function downloadAndExtractArchive(params: {
48
49
  });
49
50
  }
50
51
 
51
- await mkdir(pathDirname(archiveFilePath), { recursive: true });
52
-
53
52
  const response = await fetch(url, fetchOptions);
54
53
 
55
54
  response.body?.setMaxListeners(Number.MAX_VALUE);
@@ -63,7 +62,7 @@ export async function downloadAndExtractArchive(params: {
63
62
  });
64
63
  }
65
64
 
66
- const extractDirBasename = `${archiveFileBasename.split(".")[0]}_${uniqueIdOfOnOnArchiveFile}_${crypto
65
+ const extractDirBasename = `${archiveFileBasename.replace(/\.([^.]+)$/, (...[, ext]) => `_${ext}`)}_${uniqueIdOfOnArchiveFile}_${crypto
67
66
  .createHash("sha256")
68
67
  .update(onArchiveFile.toString())
69
68
  .digest("hex")
@@ -85,7 +84,9 @@ export async function downloadAndExtractArchive(params: {
85
84
  })()
86
85
  )
87
86
  .map(async extractDirBasename => {
88
- await rm(pathJoin(cacheDirPath, extractDirBasename), { recursive: true });
87
+ await rm(pathJoin(cacheDirPath, extractDirBasename), {
88
+ recursive: true
89
+ });
89
90
  await SuccessTracker.removeFromExtracted({
90
91
  cacheDirPath,
91
92
  extractDirBasename
@@ -134,7 +135,7 @@ export async function downloadAndExtractArchive(params: {
134
135
  });
135
136
  }
136
137
 
137
- return { extractedDirPath };
138
+ return { extractedDirPath, archiveFilePath };
138
139
  }
139
140
 
140
141
  type SuccessTracker = {
@@ -1,6 +1,7 @@
1
1
  import { type FetchOptions } from "make-fetch-happen";
2
2
  import * as child_process from "child_process";
3
3
  import * as fs from "fs";
4
+ import { exclude } from "tsafe/exclude";
4
5
 
5
6
  export type ProxyFetchOptions = Pick<
6
7
  FetchOptions,
@@ -23,12 +24,32 @@ export function getProxyFetchOptions(params: {
23
24
  .split("\n")
24
25
  .filter(line => !line.startsWith(";"))
25
26
  .map(line => line.trim())
26
- .map(line => line.split("=", 2) as [string, string])
27
+ .map(line => {
28
+ const [key, value] = line.split("=");
29
+ if (key === undefined) {
30
+ return undefined;
31
+ }
32
+ if (value === undefined) {
33
+ return undefined;
34
+ }
35
+ return [key.trim(), value.trim()] as const;
36
+ })
37
+ .filter(exclude(undefined))
38
+ .filter(([key]) => key !== "")
39
+ .map(([key, value]) => {
40
+ if (value.startsWith('"') && value.endsWith('"')) {
41
+ return [key, value.slice(1, -1)] as const;
42
+ }
43
+
44
+ if (value === "true" || value === "false") {
45
+ return [key, value] as const;
46
+ }
47
+
48
+ return undefined;
49
+ })
50
+ .filter(exclude(undefined))
27
51
  .reduce(
28
- (
29
- cfg: Record<string, string | string[]>,
30
- [key, value]: [string, string]
31
- ) =>
52
+ (cfg: Record<string, string | string[]>, [key, value]) =>
32
53
  key in cfg
33
54
  ? { ...cfg, [key]: [...ensureArray(cfg[key]), value] }
34
55
  : { ...cfg, [key]: value },
@@ -37,18 +58,18 @@ export function getProxyFetchOptions(params: {
37
58
  })();
38
59
 
39
60
  const proxy = ensureSingleOrNone(cfg["https-proxy"] ?? cfg["proxy"]);
61
+
40
62
  const noProxy = cfg["noproxy"] ?? cfg["no-proxy"];
41
63
 
42
- function maybeBoolean(arg0: string | undefined) {
43
- return typeof arg0 === "undefined" ? undefined : Boolean(arg0);
44
- }
64
+ const strictSSL = ensureSingleOrNone(cfg["strict-ssl"]) === "true";
45
65
 
46
- const strictSSL = maybeBoolean(ensureSingleOrNone(cfg["strict-ssl"]));
47
66
  const cert = cfg["cert"];
67
+
48
68
  const ca = ensureArray(cfg["ca"] ?? cfg["ca[]"]);
69
+
49
70
  const cafile = ensureSingleOrNone(cfg["cafile"]);
50
71
 
51
- if (typeof cafile !== "undefined" && cafile !== "null") {
72
+ if (cafile !== undefined) {
52
73
  ca.push(
53
74
  ...(() => {
54
75
  const cafileContent = fs.readFileSync(cafile).toString("utf8");
@@ -82,7 +103,7 @@ export function getProxyFetchOptions(params: {
82
103
  }
83
104
 
84
105
  function ensureArray<T>(arg0: T | T[]) {
85
- return Array.isArray(arg0) ? arg0 : typeof arg0 === "undefined" ? [] : [arg0];
106
+ return Array.isArray(arg0) ? arg0 : arg0 === undefined ? [] : [arg0];
86
107
  }
87
108
 
88
109
  function ensureSingleOrNone<T>(arg0: T | T[]) {