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.
- package/PUBLIC_URL.js +2 -2
- package/PUBLIC_URL.js.map +1 -1
- package/README.md +28 -242
- package/account/KcContext/KcContext.d.ts +4 -1
- package/account/KcContext/KcContext.js.map +1 -1
- package/account/KcContext/kcContextMocks.js +7 -4
- package/account/KcContext/kcContextMocks.js.map +1 -1
- package/account/Template.js +3 -1
- package/account/Template.js.map +1 -1
- package/account/i18n/GenericI18n.d.ts +6 -0
- package/account/i18n/GenericI18n.js +2 -0
- package/account/i18n/GenericI18n.js.map +1 -0
- package/account/i18n/i18n.d.ts +24 -30
- package/account/i18n/i18n.js +50 -70
- package/account/i18n/i18n.js.map +1 -1
- package/account/i18n/index.d.ts +4 -3
- package/account/i18n/index.js.map +1 -1
- package/account/i18n/messages_defaultSet/ar.js.map +1 -0
- package/account/i18n/messages_defaultSet/ca.js.map +1 -0
- package/account/i18n/messages_defaultSet/cs.js.map +1 -0
- package/account/i18n/messages_defaultSet/da.js.map +1 -0
- package/account/i18n/messages_defaultSet/de.js.map +1 -0
- package/account/i18n/messages_defaultSet/el.js.map +1 -0
- package/account/i18n/messages_defaultSet/en.js.map +1 -0
- package/account/i18n/messages_defaultSet/es.js.map +1 -0
- package/account/i18n/messages_defaultSet/fa.js.map +1 -0
- package/account/i18n/messages_defaultSet/fi.js.map +1 -0
- package/account/i18n/messages_defaultSet/fr.js.map +1 -0
- package/account/i18n/messages_defaultSet/hu.js.map +1 -0
- package/account/i18n/{baseMessages → messages_defaultSet}/index.d.ts +1 -1
- package/account/i18n/{baseMessages → messages_defaultSet}/index.js +3 -3
- package/account/i18n/messages_defaultSet/index.js.map +1 -0
- package/account/i18n/messages_defaultSet/it.js.map +1 -0
- package/account/i18n/messages_defaultSet/ja.js.map +1 -0
- package/account/i18n/messages_defaultSet/lt.js.map +1 -0
- package/account/i18n/messages_defaultSet/lv.js.map +1 -0
- package/account/i18n/messages_defaultSet/nl.js.map +1 -0
- package/account/i18n/messages_defaultSet/no.js.map +1 -0
- package/account/i18n/messages_defaultSet/pl.js.map +1 -0
- package/account/i18n/messages_defaultSet/pt-BR.js.map +1 -0
- package/account/i18n/messages_defaultSet/ru.js.map +1 -0
- package/account/i18n/messages_defaultSet/sk.js.map +1 -0
- package/account/i18n/messages_defaultSet/sv.js.map +1 -0
- package/account/i18n/messages_defaultSet/th.js.map +1 -0
- package/account/i18n/messages_defaultSet/tr.js.map +1 -0
- package/account/i18n/messages_defaultSet/uk.js.map +1 -0
- package/account/i18n/messages_defaultSet/zh-CN.js.map +1 -0
- package/account/i18n/useI18n.d.ts +6 -5
- package/account/i18n/useI18n.js +37 -4
- package/account/i18n/useI18n.js.map +1 -1
- package/account/pages/Applications.js +1 -1
- package/account/pages/Applications.js.map +1 -1
- package/account/pages/FederatedIdentity.js +1 -1
- package/account/pages/FederatedIdentity.js.map +1 -1
- package/account/pages/Totp.js +5 -1
- package/account/pages/Totp.js.map +1 -1
- package/bin/193.index.js +5 -5
- package/bin/{490.index.js → 246.index.js} +22 -4
- package/bin/31.index.js +264 -203
- package/bin/440.index.js +178 -106
- package/bin/453.index.js +59 -7
- package/bin/526.index.js +525 -137
- package/bin/599.index.js +567 -0
- package/bin/{893.index.js → 622.index.js} +239 -231
- package/bin/{36.index.js → 678.index.js} +577 -71
- package/bin/{180.index.js → 697.index.js} +611 -526
- package/bin/743.index.js +70 -0
- package/bin/780.index.js +895 -0
- package/bin/786.index.js +185 -0
- package/bin/932.index.js +740 -52
- package/bin/{456.index.js → 941.index.js} +3 -1988
- package/bin/97.index.js +29 -7
- package/bin/main.js +1994 -8
- package/bin/shared/KeycloakVersionRange.d.ts +3 -3
- package/bin/shared/buildContext.d.ts +52 -16
- package/bin/shared/buildContext.js.map +1 -1
- package/bin/shared/constants.d.ts +18 -17
- package/bin/shared/constants.js +15 -14
- package/bin/shared/constants.js.map +1 -1
- package/bin/shared/copyKeycloakResourcesToPublic.js.map +1 -1
- package/bin/shared/downloadKeycloakDefaultTheme.js.map +1 -1
- package/bin/shared/generateKcGenTs.d.ts +3 -0
- package/bin/shared/generateKcGenTs.js.map +1 -1
- package/bin/shared/getLatestsSemVersionedTag.d.ts +15 -0
- package/bin/shared/getLatestsSemVersionedTag.js.map +1 -0
- package/bin/shared/promptKeycloakVersion.d.ts +3 -1
- package/bin/shared/promptKeycloakVersion.js.map +1 -1
- package/lib/getKcClsx.js +2 -1
- package/lib/getKcClsx.js.map +1 -1
- package/login/KcContext/KcContext.d.ts +10 -11
- package/login/KcContext/KcContext.js.map +1 -1
- package/login/KcContext/kcContextMocks.js +4 -5
- package/login/KcContext/kcContextMocks.js.map +1 -1
- package/login/Template.js +13 -7
- package/login/Template.js.map +1 -1
- package/login/TemplateProps.d.ts +0 -1
- package/login/UserProfileFormFields.js +6 -5
- package/login/UserProfileFormFields.js.map +1 -1
- package/login/i18n/GenericI18n.d.ts +6 -0
- package/login/i18n/GenericI18n.js +2 -0
- package/login/i18n/GenericI18n.js.map +1 -0
- package/login/i18n/i18n.d.ts +22 -32
- package/login/i18n/i18n.js +51 -92
- package/login/i18n/i18n.js.map +1 -1
- package/login/i18n/index.d.ts +4 -3
- package/login/i18n/index.js.map +1 -1
- package/login/i18n/messages_defaultSet/ar.js.map +1 -0
- package/login/i18n/messages_defaultSet/ca.js.map +1 -0
- package/login/i18n/messages_defaultSet/cs.js.map +1 -0
- package/login/i18n/messages_defaultSet/da.js.map +1 -0
- package/login/i18n/messages_defaultSet/de.js.map +1 -0
- package/login/i18n/messages_defaultSet/el.js.map +1 -0
- package/login/i18n/messages_defaultSet/en.js.map +1 -0
- package/login/i18n/messages_defaultSet/es.js.map +1 -0
- package/login/i18n/messages_defaultSet/fa.js.map +1 -0
- package/login/i18n/messages_defaultSet/fi.js.map +1 -0
- package/login/i18n/messages_defaultSet/fr.js.map +1 -0
- package/login/i18n/messages_defaultSet/hu.js.map +1 -0
- package/login/i18n/{baseMessages → messages_defaultSet}/index.d.ts +1 -1
- package/login/i18n/{baseMessages → messages_defaultSet}/index.js +3 -3
- package/login/i18n/messages_defaultSet/index.js.map +1 -0
- package/login/i18n/messages_defaultSet/it.js.map +1 -0
- package/login/i18n/messages_defaultSet/ja.js.map +1 -0
- package/login/i18n/messages_defaultSet/lt.js.map +1 -0
- package/login/i18n/messages_defaultSet/lv.js.map +1 -0
- package/login/i18n/messages_defaultSet/nl.js.map +1 -0
- package/login/i18n/messages_defaultSet/no.js.map +1 -0
- package/login/i18n/messages_defaultSet/pl.js.map +1 -0
- package/login/i18n/messages_defaultSet/pt-BR.js.map +1 -0
- package/login/i18n/messages_defaultSet/ru.js.map +1 -0
- package/login/i18n/messages_defaultSet/sk.js.map +1 -0
- package/login/i18n/messages_defaultSet/sv.js.map +1 -0
- package/login/i18n/messages_defaultSet/th.js.map +1 -0
- package/login/i18n/messages_defaultSet/tr.js.map +1 -0
- package/login/i18n/messages_defaultSet/uk.js.map +1 -0
- package/login/i18n/messages_defaultSet/zh-CN.js.map +1 -0
- package/login/i18n/useI18n.d.ts +6 -5
- package/login/i18n/useI18n.js +37 -4
- package/login/i18n/useI18n.js.map +1 -1
- package/login/lib/useUserProfileForm.d.ts +2 -0
- package/login/lib/useUserProfileForm.js +44 -10
- package/login/lib/useUserProfileForm.js.map +1 -1
- package/login/pages/Error.js +1 -1
- package/login/pages/Error.js.map +1 -1
- package/login/pages/Info.js +15 -3
- package/login/pages/Info.js.map +1 -1
- package/login/pages/Login.js +6 -2
- package/login/pages/Login.js.map +1 -1
- package/login/pages/LoginConfigTotp.js +5 -1
- package/login/pages/LoginConfigTotp.js.map +1 -1
- package/login/pages/LoginOtp.js +3 -1
- package/login/pages/LoginOtp.js.map +1 -1
- package/login/pages/LoginPassword.js +3 -1
- package/login/pages/LoginPassword.js.map +1 -1
- package/login/pages/LoginRecoveryAuthnCodeInput.js +3 -1
- package/login/pages/LoginRecoveryAuthnCodeInput.js.map +1 -1
- package/login/pages/LoginResetPassword.js +3 -1
- package/login/pages/LoginResetPassword.js.map +1 -1
- package/login/pages/LoginUpdatePassword.js +5 -1
- package/login/pages/LoginUpdatePassword.js.map +1 -1
- package/login/pages/Register.js +3 -1
- package/login/pages/Register.js.map +1 -1
- package/login/pages/SamlPostForm.js +1 -1
- package/login/pages/SamlPostForm.js.map +1 -1
- package/login/pages/SelectAuthenticator.js +2 -2
- package/login/pages/SelectAuthenticator.js.map +1 -1
- package/login/pages/WebauthnAuthenticate.js +3 -3
- package/login/pages/WebauthnAuthenticate.js.map +1 -1
- package/login/pages/WebauthnRegister.js +2 -2
- package/package.json +267 -245
- package/src/PUBLIC_URL.ts +2 -2
- package/src/account/KcContext/KcContext.ts +4 -1
- package/src/account/KcContext/kcContextMocks.ts +7 -4
- package/src/account/Template.tsx +6 -1
- package/src/account/i18n/GenericI18n.tsx +6 -0
- package/src/account/i18n/i18n.tsx +91 -129
- package/src/account/i18n/index.ts +4 -3
- package/src/account/i18n/{baseMessages → messages_defaultSet}/index.ts +3 -3
- package/src/account/i18n/useI18n.tsx +95 -0
- package/src/account/pages/Applications.tsx +0 -1
- package/src/account/pages/FederatedIdentity.tsx +1 -1
- package/src/account/pages/Totp.tsx +16 -6
- package/src/bin/add-story.ts +42 -10
- package/src/bin/eject-page.ts +119 -11
- package/src/bin/initialize-account-theme/copyBoilerplate.ts +32 -0
- package/src/bin/initialize-account-theme/index.ts +1 -0
- package/src/bin/initialize-account-theme/initialize-account-theme.ts +112 -0
- package/src/bin/initialize-account-theme/initializeAccountTheme_multiPage.ts +21 -0
- package/src/bin/initialize-account-theme/initializeAccountTheme_singlePage.ts +152 -0
- package/src/bin/initialize-account-theme/src/multi-page/KcContext.ts +12 -0
- package/src/bin/initialize-account-theme/src/multi-page/KcPage.tsx +25 -0
- package/src/bin/initialize-account-theme/src/multi-page/KcPageStory.tsx +38 -0
- package/src/bin/initialize-account-theme/src/multi-page/i18n.ts +5 -0
- package/src/bin/initialize-account-theme/src/single-page/KcContext.ts +7 -0
- package/src/bin/initialize-account-theme/src/single-page/KcPage.tsx +11 -0
- package/src/bin/initialize-account-theme/updateAccountThemeImplementationInConfig.ts +92 -0
- package/src/bin/initialize-email-theme.ts +1 -1
- package/src/bin/keycloakify/buildJars/buildJar.ts +38 -24
- package/src/bin/keycloakify/buildJars/buildJars.ts +6 -3
- package/src/bin/keycloakify/buildJars/getKeycloakVersionRangeForJar.ts +5 -5
- package/src/bin/keycloakify/generateFtl/generateFtl.ts +16 -16
- package/src/bin/keycloakify/generateFtl/kcContextDeclarationTemplate.ftl +471 -364
- package/src/bin/keycloakify/generateResources/bringInAccountV1.ts +7 -7
- package/src/bin/keycloakify/generateResources/generateMessageProperties.ts +3 -3
- package/src/bin/keycloakify/generateResources/generateResourcesForMainTheme.ts +125 -59
- package/src/bin/keycloakify/generateResources/generateResourcesForThemeVariant.ts +2 -2
- package/src/bin/keycloakify/generateResources/readExtraPageNames.ts +5 -8
- package/src/bin/keycloakify/keycloakify.ts +8 -6
- package/src/bin/keycloakify/replacers/replaceImportsInCssCode.ts +41 -27
- package/src/bin/keycloakify/replacers/replaceImportsInJsCode/replaceImportsInJsCode.ts +2 -2
- package/src/bin/keycloakify/replacers/replaceImportsInJsCode/vite.ts +6 -6
- package/src/bin/keycloakify/replacers/replaceImportsInJsCode/webpack.ts +4 -4
- package/src/bin/main.ts +19 -2
- package/src/bin/shared/KeycloakVersionRange.ts +4 -4
- package/src/bin/shared/buildContext.ts +360 -251
- package/src/bin/shared/constants.ts +19 -17
- package/src/bin/shared/copyKeycloakResourcesToPublic.ts +6 -6
- package/src/bin/shared/downloadKeycloakDefaultTheme.ts +48 -27
- package/src/bin/shared/downloadKeycloakStaticResources.ts +2 -2
- package/src/bin/shared/generateKcGenTs.ts +110 -3
- package/src/bin/shared/getLatestsSemVersionedTag.ts +201 -0
- package/src/bin/shared/promptKeycloakVersion.ts +20 -80
- package/src/bin/start-keycloak/appBuild.ts +15 -11
- package/src/bin/start-keycloak/keycloakifyBuild.ts +3 -3
- package/src/bin/start-keycloak/myrealm-realm-18.json +4 -4
- package/src/bin/start-keycloak/myrealm-realm-19.json +4 -4
- package/src/bin/start-keycloak/myrealm-realm-20.json +4 -4
- package/src/bin/start-keycloak/myrealm-realm-21.json +4 -4
- package/src/bin/start-keycloak/myrealm-realm-23.json +3 -3
- package/src/bin/start-keycloak/myrealm-realm-24.json +4 -4
- package/src/bin/start-keycloak/myrealm-realm-25.json +4 -4
- package/src/bin/start-keycloak/start-keycloak.ts +256 -102
- package/src/bin/tools/assertNoPnpmDlx.ts +17 -0
- package/src/bin/tools/downloadAndExtractArchive.ts +10 -9
- package/src/bin/tools/fetchProxyOptions.ts +32 -11
- package/src/bin/tools/npmInstall.ts +63 -0
- package/src/bin/tools/octokit-addons/getLatestsSemVersionedTag.ts +3 -2
- package/src/bin/tsconfig.json +3 -1
- package/src/lib/getKcClsx.ts +2 -2
- package/src/login/KcContext/KcContext.ts +10 -28
- package/src/login/KcContext/kcContextMocks.ts +5 -6
- package/src/login/Template.tsx +32 -54
- package/src/login/TemplateProps.ts +0 -1
- package/src/login/UserProfileFormFields.tsx +15 -11
- package/src/login/i18n/GenericI18n.tsx +6 -0
- package/src/login/i18n/i18n.tsx +91 -166
- package/src/login/i18n/index.ts +4 -3
- package/src/login/i18n/{baseMessages → messages_defaultSet}/index.ts +3 -3
- package/src/login/i18n/useI18n.tsx +95 -0
- package/src/login/lib/useUserProfileForm.tsx +68 -20
- package/src/login/pages/Error.tsx +1 -1
- package/src/login/pages/Info.tsx +26 -6
- package/src/login/pages/Login.tsx +20 -9
- package/src/login/pages/LoginConfigTotp.tsx +16 -6
- package/src/login/pages/LoginOtp.tsx +8 -3
- package/src/login/pages/LoginPassword.tsx +8 -3
- package/src/login/pages/LoginRecoveryAuthnCodeInput.tsx +8 -3
- package/src/login/pages/LoginResetPassword.tsx +8 -3
- package/src/login/pages/LoginUpdatePassword.tsx +55 -47
- package/src/login/pages/Register.tsx +8 -3
- package/src/login/pages/SamlPostForm.tsx +1 -1
- package/src/login/pages/SelectAuthenticator.tsx +4 -4
- package/src/login/pages/WebauthnAuthenticate.tsx +5 -5
- package/src/login/pages/WebauthnRegister.tsx +2 -2
- package/src/tools/useInsertLinkTags.ts +9 -1
- package/src/tools/useInsertScriptTags.ts +9 -1
- package/src/vite-plugin/vite-plugin.ts +15 -13
- package/stories/account/pages/Applications.stories.tsx +80 -0
- package/stories/account/pages/Log.stories.tsx +1 -0
- package/stories/account-spa/index.stories.tsx +94 -0
- package/stories/intro/intro.stories.tsx +90 -0
- package/stories/login/pages/Info.stories.tsx +7 -2
- package/stories/login/pages/Login.stories.tsx +25 -13
- package/stories/login/pages/Register.stories.tsx +11 -9
- package/stories/login/pages/SelectAuthenticator.stories.tsx +41 -0
- package/stories/login/pages/Terms.stories.tsx +6 -2
- package/tools/useInsertLinkTags.js +7 -1
- package/tools/useInsertLinkTags.js.map +1 -1
- package/tools/useInsertScriptTags.js +7 -1
- package/tools/useInsertScriptTags.js.map +1 -1
- package/vite-plugin/index.js +25820 -25686
- package/vite-plugin/vite-plugin.d.ts +6 -4
- package/account/i18n/baseMessages/ar.js.map +0 -1
- package/account/i18n/baseMessages/ca.js.map +0 -1
- package/account/i18n/baseMessages/cs.js.map +0 -1
- package/account/i18n/baseMessages/da.js.map +0 -1
- package/account/i18n/baseMessages/de.js.map +0 -1
- package/account/i18n/baseMessages/el.js.map +0 -1
- package/account/i18n/baseMessages/en.js.map +0 -1
- package/account/i18n/baseMessages/es.js.map +0 -1
- package/account/i18n/baseMessages/fa.js.map +0 -1
- package/account/i18n/baseMessages/fi.js.map +0 -1
- package/account/i18n/baseMessages/fr.js.map +0 -1
- package/account/i18n/baseMessages/hu.js.map +0 -1
- package/account/i18n/baseMessages/index.js.map +0 -1
- package/account/i18n/baseMessages/it.js.map +0 -1
- package/account/i18n/baseMessages/ja.js.map +0 -1
- package/account/i18n/baseMessages/lt.js.map +0 -1
- package/account/i18n/baseMessages/lv.js.map +0 -1
- package/account/i18n/baseMessages/nl.js.map +0 -1
- package/account/i18n/baseMessages/no.js.map +0 -1
- package/account/i18n/baseMessages/pl.js.map +0 -1
- package/account/i18n/baseMessages/pt-BR.js.map +0 -1
- package/account/i18n/baseMessages/ru.js.map +0 -1
- package/account/i18n/baseMessages/sk.js.map +0 -1
- package/account/i18n/baseMessages/sv.js.map +0 -1
- package/account/i18n/baseMessages/th.js.map +0 -1
- package/account/i18n/baseMessages/tr.js.map +0 -1
- package/account/i18n/baseMessages/uk.js.map +0 -1
- package/account/i18n/baseMessages/zh-CN.js.map +0 -1
- package/bin/538.index.js +0 -108
- package/login/i18n/baseMessages/ar.js.map +0 -1
- package/login/i18n/baseMessages/ca.js.map +0 -1
- package/login/i18n/baseMessages/cs.js.map +0 -1
- package/login/i18n/baseMessages/da.js.map +0 -1
- package/login/i18n/baseMessages/de.js.map +0 -1
- package/login/i18n/baseMessages/el.js.map +0 -1
- package/login/i18n/baseMessages/en.js.map +0 -1
- package/login/i18n/baseMessages/es.js.map +0 -1
- package/login/i18n/baseMessages/fa.js.map +0 -1
- package/login/i18n/baseMessages/fi.js.map +0 -1
- package/login/i18n/baseMessages/fr.js.map +0 -1
- package/login/i18n/baseMessages/hu.js.map +0 -1
- package/login/i18n/baseMessages/index.js.map +0 -1
- package/login/i18n/baseMessages/it.js.map +0 -1
- package/login/i18n/baseMessages/ja.js.map +0 -1
- package/login/i18n/baseMessages/lt.js.map +0 -1
- package/login/i18n/baseMessages/lv.js.map +0 -1
- package/login/i18n/baseMessages/nl.js.map +0 -1
- package/login/i18n/baseMessages/no.js.map +0 -1
- package/login/i18n/baseMessages/pl.js.map +0 -1
- package/login/i18n/baseMessages/pt-BR.js.map +0 -1
- package/login/i18n/baseMessages/ru.js.map +0 -1
- package/login/i18n/baseMessages/sk.js.map +0 -1
- package/login/i18n/baseMessages/sv.js.map +0 -1
- package/login/i18n/baseMessages/th.js.map +0 -1
- package/login/i18n/baseMessages/tr.js.map +0 -1
- package/login/i18n/baseMessages/uk.js.map +0 -1
- package/login/i18n/baseMessages/zh-CN.js.map +0 -1
- package/src/account/i18n/useI18n.ts +0 -44
- package/src/login/i18n/useI18n.ts +0 -44
- package/src/tools/ExtractAfterStartingWith.ts +0 -4
- package/tools/ExtractAfterStartingWith.d.ts +0 -1
- package/tools/ExtractAfterStartingWith.js +0 -2
- package/tools/ExtractAfterStartingWith.js.map +0 -1
- /package/account/i18n/{baseMessages → messages_defaultSet}/ar.d.ts +0 -0
- /package/account/i18n/{baseMessages → messages_defaultSet}/ar.js +0 -0
- /package/account/i18n/{baseMessages → messages_defaultSet}/ca.d.ts +0 -0
- /package/account/i18n/{baseMessages → messages_defaultSet}/ca.js +0 -0
- /package/account/i18n/{baseMessages → messages_defaultSet}/cs.d.ts +0 -0
- /package/account/i18n/{baseMessages → messages_defaultSet}/cs.js +0 -0
- /package/account/i18n/{baseMessages → messages_defaultSet}/da.d.ts +0 -0
- /package/account/i18n/{baseMessages → messages_defaultSet}/da.js +0 -0
- /package/account/i18n/{baseMessages → messages_defaultSet}/de.d.ts +0 -0
- /package/account/i18n/{baseMessages → messages_defaultSet}/de.js +0 -0
- /package/account/i18n/{baseMessages → messages_defaultSet}/el.d.ts +0 -0
- /package/account/i18n/{baseMessages → messages_defaultSet}/el.js +0 -0
- /package/account/i18n/{baseMessages → messages_defaultSet}/en.d.ts +0 -0
- /package/account/i18n/{baseMessages → messages_defaultSet}/en.js +0 -0
- /package/account/i18n/{baseMessages → messages_defaultSet}/es.d.ts +0 -0
- /package/account/i18n/{baseMessages → messages_defaultSet}/es.js +0 -0
- /package/account/i18n/{baseMessages → messages_defaultSet}/fa.d.ts +0 -0
- /package/account/i18n/{baseMessages → messages_defaultSet}/fa.js +0 -0
- /package/account/i18n/{baseMessages → messages_defaultSet}/fi.d.ts +0 -0
- /package/account/i18n/{baseMessages → messages_defaultSet}/fi.js +0 -0
- /package/account/i18n/{baseMessages → messages_defaultSet}/fr.d.ts +0 -0
- /package/account/i18n/{baseMessages → messages_defaultSet}/fr.js +0 -0
- /package/account/i18n/{baseMessages → messages_defaultSet}/hu.d.ts +0 -0
- /package/account/i18n/{baseMessages → messages_defaultSet}/hu.js +0 -0
- /package/account/i18n/{baseMessages → messages_defaultSet}/it.d.ts +0 -0
- /package/account/i18n/{baseMessages → messages_defaultSet}/it.js +0 -0
- /package/account/i18n/{baseMessages → messages_defaultSet}/ja.d.ts +0 -0
- /package/account/i18n/{baseMessages → messages_defaultSet}/ja.js +0 -0
- /package/account/i18n/{baseMessages → messages_defaultSet}/lt.d.ts +0 -0
- /package/account/i18n/{baseMessages → messages_defaultSet}/lt.js +0 -0
- /package/account/i18n/{baseMessages → messages_defaultSet}/lv.d.ts +0 -0
- /package/account/i18n/{baseMessages → messages_defaultSet}/lv.js +0 -0
- /package/account/i18n/{baseMessages → messages_defaultSet}/nl.d.ts +0 -0
- /package/account/i18n/{baseMessages → messages_defaultSet}/nl.js +0 -0
- /package/account/i18n/{baseMessages → messages_defaultSet}/no.d.ts +0 -0
- /package/account/i18n/{baseMessages → messages_defaultSet}/no.js +0 -0
- /package/account/i18n/{baseMessages → messages_defaultSet}/pl.d.ts +0 -0
- /package/account/i18n/{baseMessages → messages_defaultSet}/pl.js +0 -0
- /package/account/i18n/{baseMessages → messages_defaultSet}/pt-BR.d.ts +0 -0
- /package/account/i18n/{baseMessages → messages_defaultSet}/pt-BR.js +0 -0
- /package/account/i18n/{baseMessages → messages_defaultSet}/ru.d.ts +0 -0
- /package/account/i18n/{baseMessages → messages_defaultSet}/ru.js +0 -0
- /package/account/i18n/{baseMessages → messages_defaultSet}/sk.d.ts +0 -0
- /package/account/i18n/{baseMessages → messages_defaultSet}/sk.js +0 -0
- /package/account/i18n/{baseMessages → messages_defaultSet}/sv.d.ts +0 -0
- /package/account/i18n/{baseMessages → messages_defaultSet}/sv.js +0 -0
- /package/account/i18n/{baseMessages → messages_defaultSet}/th.d.ts +0 -0
- /package/account/i18n/{baseMessages → messages_defaultSet}/th.js +0 -0
- /package/account/i18n/{baseMessages → messages_defaultSet}/tr.d.ts +0 -0
- /package/account/i18n/{baseMessages → messages_defaultSet}/tr.js +0 -0
- /package/account/i18n/{baseMessages → messages_defaultSet}/uk.d.ts +0 -0
- /package/account/i18n/{baseMessages → messages_defaultSet}/uk.js +0 -0
- /package/account/i18n/{baseMessages → messages_defaultSet}/zh-CN.d.ts +0 -0
- /package/account/i18n/{baseMessages → messages_defaultSet}/zh-CN.js +0 -0
- /package/login/i18n/{baseMessages → messages_defaultSet}/ar.d.ts +0 -0
- /package/login/i18n/{baseMessages → messages_defaultSet}/ar.js +0 -0
- /package/login/i18n/{baseMessages → messages_defaultSet}/ca.d.ts +0 -0
- /package/login/i18n/{baseMessages → messages_defaultSet}/ca.js +0 -0
- /package/login/i18n/{baseMessages → messages_defaultSet}/cs.d.ts +0 -0
- /package/login/i18n/{baseMessages → messages_defaultSet}/cs.js +0 -0
- /package/login/i18n/{baseMessages → messages_defaultSet}/da.d.ts +0 -0
- /package/login/i18n/{baseMessages → messages_defaultSet}/da.js +0 -0
- /package/login/i18n/{baseMessages → messages_defaultSet}/de.d.ts +0 -0
- /package/login/i18n/{baseMessages → messages_defaultSet}/de.js +0 -0
- /package/login/i18n/{baseMessages → messages_defaultSet}/el.d.ts +0 -0
- /package/login/i18n/{baseMessages → messages_defaultSet}/el.js +0 -0
- /package/login/i18n/{baseMessages → messages_defaultSet}/en.d.ts +0 -0
- /package/login/i18n/{baseMessages → messages_defaultSet}/en.js +0 -0
- /package/login/i18n/{baseMessages → messages_defaultSet}/es.d.ts +0 -0
- /package/login/i18n/{baseMessages → messages_defaultSet}/es.js +0 -0
- /package/login/i18n/{baseMessages → messages_defaultSet}/fa.d.ts +0 -0
- /package/login/i18n/{baseMessages → messages_defaultSet}/fa.js +0 -0
- /package/login/i18n/{baseMessages → messages_defaultSet}/fi.d.ts +0 -0
- /package/login/i18n/{baseMessages → messages_defaultSet}/fi.js +0 -0
- /package/login/i18n/{baseMessages → messages_defaultSet}/fr.d.ts +0 -0
- /package/login/i18n/{baseMessages → messages_defaultSet}/fr.js +0 -0
- /package/login/i18n/{baseMessages → messages_defaultSet}/hu.d.ts +0 -0
- /package/login/i18n/{baseMessages → messages_defaultSet}/hu.js +0 -0
- /package/login/i18n/{baseMessages → messages_defaultSet}/it.d.ts +0 -0
- /package/login/i18n/{baseMessages → messages_defaultSet}/it.js +0 -0
- /package/login/i18n/{baseMessages → messages_defaultSet}/ja.d.ts +0 -0
- /package/login/i18n/{baseMessages → messages_defaultSet}/ja.js +0 -0
- /package/login/i18n/{baseMessages → messages_defaultSet}/lt.d.ts +0 -0
- /package/login/i18n/{baseMessages → messages_defaultSet}/lt.js +0 -0
- /package/login/i18n/{baseMessages → messages_defaultSet}/lv.d.ts +0 -0
- /package/login/i18n/{baseMessages → messages_defaultSet}/lv.js +0 -0
- /package/login/i18n/{baseMessages → messages_defaultSet}/nl.d.ts +0 -0
- /package/login/i18n/{baseMessages → messages_defaultSet}/nl.js +0 -0
- /package/login/i18n/{baseMessages → messages_defaultSet}/no.d.ts +0 -0
- /package/login/i18n/{baseMessages → messages_defaultSet}/no.js +0 -0
- /package/login/i18n/{baseMessages → messages_defaultSet}/pl.d.ts +0 -0
- /package/login/i18n/{baseMessages → messages_defaultSet}/pl.js +0 -0
- /package/login/i18n/{baseMessages → messages_defaultSet}/pt-BR.d.ts +0 -0
- /package/login/i18n/{baseMessages → messages_defaultSet}/pt-BR.js +0 -0
- /package/login/i18n/{baseMessages → messages_defaultSet}/ru.d.ts +0 -0
- /package/login/i18n/{baseMessages → messages_defaultSet}/ru.js +0 -0
- /package/login/i18n/{baseMessages → messages_defaultSet}/sk.d.ts +0 -0
- /package/login/i18n/{baseMessages → messages_defaultSet}/sk.js +0 -0
- /package/login/i18n/{baseMessages → messages_defaultSet}/sv.d.ts +0 -0
- /package/login/i18n/{baseMessages → messages_defaultSet}/sv.js +0 -0
- /package/login/i18n/{baseMessages → messages_defaultSet}/th.d.ts +0 -0
- /package/login/i18n/{baseMessages → messages_defaultSet}/th.js +0 -0
- /package/login/i18n/{baseMessages → messages_defaultSet}/tr.d.ts +0 -0
- /package/login/i18n/{baseMessages → messages_defaultSet}/tr.js +0 -0
- /package/login/i18n/{baseMessages → messages_defaultSet}/uk.d.ts +0 -0
- /package/login/i18n/{baseMessages → messages_defaultSet}/uk.js +0 -0
- /package/login/i18n/{baseMessages → messages_defaultSet}/zh-CN.d.ts +0 -0
- /package/login/i18n/{baseMessages → messages_defaultSet}/zh-CN.js +0 -0
- /package/src/account/i18n/{baseMessages → messages_defaultSet}/ar.ts +0 -0
- /package/src/account/i18n/{baseMessages → messages_defaultSet}/ca.ts +0 -0
- /package/src/account/i18n/{baseMessages → messages_defaultSet}/cs.ts +0 -0
- /package/src/account/i18n/{baseMessages → messages_defaultSet}/da.ts +0 -0
- /package/src/account/i18n/{baseMessages → messages_defaultSet}/de.ts +0 -0
- /package/src/account/i18n/{baseMessages → messages_defaultSet}/el.ts +0 -0
- /package/src/account/i18n/{baseMessages → messages_defaultSet}/en.ts +0 -0
- /package/src/account/i18n/{baseMessages → messages_defaultSet}/es.ts +0 -0
- /package/src/account/i18n/{baseMessages → messages_defaultSet}/fa.ts +0 -0
- /package/src/account/i18n/{baseMessages → messages_defaultSet}/fi.ts +0 -0
- /package/src/account/i18n/{baseMessages → messages_defaultSet}/fr.ts +0 -0
- /package/src/account/i18n/{baseMessages → messages_defaultSet}/hu.ts +0 -0
- /package/src/account/i18n/{baseMessages → messages_defaultSet}/it.ts +0 -0
- /package/src/account/i18n/{baseMessages → messages_defaultSet}/ja.ts +0 -0
- /package/src/account/i18n/{baseMessages → messages_defaultSet}/lt.ts +0 -0
- /package/src/account/i18n/{baseMessages → messages_defaultSet}/lv.ts +0 -0
- /package/src/account/i18n/{baseMessages → messages_defaultSet}/nl.ts +0 -0
- /package/src/account/i18n/{baseMessages → messages_defaultSet}/no.ts +0 -0
- /package/src/account/i18n/{baseMessages → messages_defaultSet}/pl.ts +0 -0
- /package/src/account/i18n/{baseMessages → messages_defaultSet}/pt-BR.ts +0 -0
- /package/src/account/i18n/{baseMessages → messages_defaultSet}/ru.ts +0 -0
- /package/src/account/i18n/{baseMessages → messages_defaultSet}/sk.ts +0 -0
- /package/src/account/i18n/{baseMessages → messages_defaultSet}/sv.ts +0 -0
- /package/src/account/i18n/{baseMessages → messages_defaultSet}/th.ts +0 -0
- /package/src/account/i18n/{baseMessages → messages_defaultSet}/tr.ts +0 -0
- /package/src/account/i18n/{baseMessages → messages_defaultSet}/uk.ts +0 -0
- /package/src/account/i18n/{baseMessages → messages_defaultSet}/zh-CN.ts +0 -0
- /package/src/login/i18n/{baseMessages → messages_defaultSet}/ar.ts +0 -0
- /package/src/login/i18n/{baseMessages → messages_defaultSet}/ca.ts +0 -0
- /package/src/login/i18n/{baseMessages → messages_defaultSet}/cs.ts +0 -0
- /package/src/login/i18n/{baseMessages → messages_defaultSet}/da.ts +0 -0
- /package/src/login/i18n/{baseMessages → messages_defaultSet}/de.ts +0 -0
- /package/src/login/i18n/{baseMessages → messages_defaultSet}/el.ts +0 -0
- /package/src/login/i18n/{baseMessages → messages_defaultSet}/en.ts +0 -0
- /package/src/login/i18n/{baseMessages → messages_defaultSet}/es.ts +0 -0
- /package/src/login/i18n/{baseMessages → messages_defaultSet}/fa.ts +0 -0
- /package/src/login/i18n/{baseMessages → messages_defaultSet}/fi.ts +0 -0
- /package/src/login/i18n/{baseMessages → messages_defaultSet}/fr.ts +0 -0
- /package/src/login/i18n/{baseMessages → messages_defaultSet}/hu.ts +0 -0
- /package/src/login/i18n/{baseMessages → messages_defaultSet}/it.ts +0 -0
- /package/src/login/i18n/{baseMessages → messages_defaultSet}/ja.ts +0 -0
- /package/src/login/i18n/{baseMessages → messages_defaultSet}/lt.ts +0 -0
- /package/src/login/i18n/{baseMessages → messages_defaultSet}/lv.ts +0 -0
- /package/src/login/i18n/{baseMessages → messages_defaultSet}/nl.ts +0 -0
- /package/src/login/i18n/{baseMessages → messages_defaultSet}/no.ts +0 -0
- /package/src/login/i18n/{baseMessages → messages_defaultSet}/pl.ts +0 -0
- /package/src/login/i18n/{baseMessages → messages_defaultSet}/pt-BR.ts +0 -0
- /package/src/login/i18n/{baseMessages → messages_defaultSet}/ru.ts +0 -0
- /package/src/login/i18n/{baseMessages → messages_defaultSet}/sk.ts +0 -0
- /package/src/login/i18n/{baseMessages → messages_defaultSet}/sv.ts +0 -0
- /package/src/login/i18n/{baseMessages → messages_defaultSet}/th.ts +0 -0
- /package/src/login/i18n/{baseMessages → messages_defaultSet}/tr.ts +0 -0
- /package/src/login/i18n/{baseMessages → messages_defaultSet}/uk.ts +0 -0
- /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 {
|
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 {
|
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
|
-
|
95
|
-
keycloakMajorNumber: SemVer.parse(cliCommandOptions.keycloakVersion).major
|
100
|
+
dockerImageTag: buildContext.startKeycloakOptions.dockerImage.tag
|
96
101
|
};
|
97
102
|
}
|
98
103
|
|
99
104
|
console.log(
|
100
|
-
|
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
|
-
|
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 =
|
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
|
-
|
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
|
-
|
174
|
-
|
175
|
-
|
176
|
-
|
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
|
-
|
182
|
-
|
183
|
-
|
245
|
+
const internalFilePath = await (async () => {
|
246
|
+
const defaultFilePath = getRealmJsonFilePath_defaultForKeycloakMajor(
|
247
|
+
keycloakMajorVersionNumber
|
184
248
|
);
|
185
249
|
|
186
|
-
if (fs.existsSync(
|
187
|
-
return
|
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 ${
|
372
|
+
child_process.execSync(`docker rm --force ${CONTAINER_NAME}`, {
|
273
373
|
stdio: "ignore"
|
274
374
|
});
|
275
375
|
} catch {}
|
276
376
|
|
277
|
-
const
|
278
|
-
|
279
|
-
|
280
|
-
|
281
|
-
|
282
|
-
|
283
|
-
|
284
|
-
|
285
|
-
|
286
|
-
|
287
|
-
|
288
|
-
|
289
|
-
|
290
|
-
|
291
|
-
|
292
|
-
|
293
|
-
|
294
|
-
|
295
|
-
|
296
|
-
|
297
|
-
|
298
|
-
|
299
|
-
|
300
|
-
|
301
|
-
|
302
|
-
|
303
|
-
|
304
|
-
|
305
|
-
|
306
|
-
|
307
|
-
|
308
|
-
|
309
|
-
|
310
|
-
|
311
|
-
|
312
|
-
|
313
|
-
|
314
|
-
|
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
|
-
|
329
|
-
|
330
|
-
|
331
|
-
|
332
|
-
|
333
|
-
|
334
|
-
|
335
|
-
|
336
|
-
|
337
|
-
|
338
|
-
:
|
339
|
-
|
340
|
-
|
341
|
-
|
342
|
-
|
343
|
-
|
344
|
-
|
345
|
-
|
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(
|
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:${
|
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
|
-
|
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
|
-
|
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,
|
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.
|
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), {
|
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 =>
|
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
|
-
|
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 (
|
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 :
|
106
|
+
return Array.isArray(arg0) ? arg0 : arg0 === undefined ? [] : [arg0];
|
86
107
|
}
|
87
108
|
|
88
109
|
function ensureSingleOrNone<T>(arg0: T | T[]) {
|