2023-04-18 03:10:29 +02:00
import { generateTheme } from "./generateTheme" ;
2021-06-14 21:21:36 +02:00
import { generateJavaStackFiles } from "./generateJavaStackFiles" ;
2023-03-21 15:16:23 +01:00
import { join as pathJoin , relative as pathRelative , basename as pathBasename , sep as pathSep } from "path" ;
2021-06-14 21:21:36 +02:00
import * as child_process from "child_process" ;
2022-04-09 20:17:20 +02:00
import { generateStartKeycloakTestingContainer } from "./generateStartKeycloakTestingContainer" ;
2022-01-18 18:52:52 +01:00
import * as fs from "fs" ;
2022-08-16 14:41:06 +07:00
import { readBuildOptions } from "./BuildOptions" ;
2022-09-08 12:06:26 +03:00
import { getLogger } from "../tools/logger" ;
2023-02-04 18:02:39 +01:00
import { assert } from "tsafe/assert" ;
2023-06-19 00:09:21 +02:00
import { getThemeSrcDirPath } from "../getSrcDirPath" ;
2023-04-04 01:40:55 +02:00
import { getProjectRoot } from "../tools/getProjectRoot" ;
2023-06-19 00:09:21 +02:00
import { objectKeys } from "tsafe/objectKeys" ;
2021-06-14 21:21:36 +02:00
2023-01-16 14:42:20 +01:00
export async function main() {
2023-09-03 23:26:34 +02:00
const reactAppRootDirPath = process . cwd ( ) ;
2022-08-20 14:04:47 +07:00
2023-04-02 03:10:16 +02:00
const buildOptions = readBuildOptions ( {
2023-09-03 23:26:34 +02:00
reactAppRootDirPath ,
2023-04-19 05:04:11 +02:00
"processArgv" : process . argv . slice ( 2 )
2022-08-16 14:41:06 +07:00
} ) ;
2021-06-23 18:03:49 +02:00
2023-04-19 05:04:11 +02:00
const logger = getLogger ( { "isSilent" : buildOptions . isSilent } ) ;
logger . log ( "🔏 Building the keycloak theme...⌚" ) ;
2023-06-19 00:09:21 +02:00
const keycloakifyDirPath = getProjectRoot ( ) ;
2023-03-24 06:25:25 +01:00
2023-09-03 23:26:34 +02:00
const { themeSrcDirPath } = getThemeSrcDirPath ( { reactAppRootDirPath } ) ;
2023-04-04 01:40:55 +02:00
2023-09-04 00:53:57 +02:00
for ( const themeName of [ buildOptions . themeName , . . . buildOptions . themeVariantNames ] ) {
2023-06-19 00:09:21 +02:00
await generateTheme ( {
themeSrcDirPath ,
"keycloakifySrcDirPath" : pathJoin ( keycloakifyDirPath , "src" ) ,
2023-06-08 23:09:14 +02:00
"buildOptions" : {
. . . buildOptions ,
"themeName" : themeName
} ,
"keycloakifyVersion" : ( ( ) = > {
2023-06-19 00:09:21 +02:00
const version = JSON . parse ( fs . readFileSync ( pathJoin ( keycloakifyDirPath , "package.json" ) ) . toString ( "utf8" ) ) [ "version" ] ;
2023-04-04 01:40:55 +02:00
2023-06-08 23:09:14 +02:00
assert ( typeof version === "string" ) ;
return version ;
} ) ( )
} ) ;
}
2023-09-03 07:14:57 +02:00
const { jarFilePath } = await generateJavaStackFiles ( {
2023-06-19 00:09:21 +02:00
"implementedThemeTypes" : ( ( ) = > {
const implementedThemeTypes = {
"login" : false ,
"account" : false ,
"email" : false
} ;
for ( const themeType of objectKeys ( implementedThemeTypes ) ) {
if ( ! fs . existsSync ( pathJoin ( themeSrcDirPath , themeType ) ) ) {
continue ;
}
implementedThemeTypes [ themeType ] = true ;
}
return implementedThemeTypes ;
} ) ( ) ,
2022-08-20 11:44:48 +07:00
buildOptions
2021-06-14 21:21:36 +02:00
} ) ;
2023-09-04 00:25:36 +02:00
if ( buildOptions . doCreateJar ) {
2023-09-03 21:10:20 +02:00
child_process . execSync ( "mvn package" , { "cwd" : buildOptions . keycloakifyBuildDirPath } ) ;
2023-02-03 14:28:06 +01:00
}
2021-06-14 21:21:36 +02:00
2023-02-03 14:28:06 +01:00
// We want, however, to test in a container running the latest Keycloak version
2023-08-02 08:56:47 +02:00
const containerKeycloakVersion = "21.1.2" ;
2022-04-20 22:13:42 +02:00
2022-04-09 20:17:20 +02:00
generateStartKeycloakTestingContainer ( {
2022-04-20 22:13:42 +02:00
"keycloakVersion" : containerKeycloakVersion ,
2022-08-20 11:44:48 +07:00
buildOptions
2021-06-14 21:21:36 +02:00
} ) ;
2022-09-08 12:06:26 +03:00
logger . log (
2021-10-11 21:35:40 +02:00
[
"" ,
2023-09-03 23:26:34 +02:00
` ✅ Your keycloak theme has been generated and bundled into . ${ pathSep } ${ pathRelative ( reactAppRootDirPath , jarFilePath ) } 🚀 ` ,
2022-04-25 13:05:13 +02:00
` It is to be placed in "/opt/keycloak/providers" in the container running a quay.io/keycloak/keycloak Docker image. ` ,
2021-10-11 21:35:40 +02:00
"" ,
2022-04-29 18:35:07 +02:00
//TODO: Restore when we find a good Helm chart for Keycloak.
//"Using Helm (https://github.com/codecentric/helm-charts), edit to reflect:",
2021-10-11 21:35:40 +02:00
"" ,
"value.yaml: " ,
" extraInitContainers: |" ,
" - name: realm-ext-provider" ,
" image: curlimages/curl" ,
" imagePullPolicy: IfNotPresent" ,
" command:" ,
" - sh" ,
" args:" ,
" - -c" ,
2021-10-12 00:26:29 +02:00
` - curl -L -f -S -o /extensions/ ${ pathBasename ( jarFilePath ) } https://AN.URL.FOR/ ${ pathBasename ( jarFilePath ) } ` ,
2021-10-11 21:35:40 +02:00
" volumeMounts:" ,
" - name: extensions" ,
" mountPath: /extensions" ,
" " ,
" extraVolumeMounts: |" ,
" - name: extensions" ,
2022-04-25 13:05:13 +02:00
" mountPath: /opt/keycloak/providers" ,
2021-10-11 21:35:40 +02:00
" extraEnv: |" ,
" - name: KEYCLOAK_USER" ,
" value: admin" ,
" - name: KEYCLOAK_PASSWORD" ,
" value: xxxxxxxxx" ,
" - name: JAVA_OPTS" ,
" value: -Dkeycloak.profile=preview" ,
"" ,
"" ,
2022-04-20 22:13:42 +02:00
` To test your theme locally you can spin up a Keycloak ${ containerKeycloakVersion } container image with the theme pre loaded by running: ` ,
2021-10-11 21:35:40 +02:00
"" ,
2023-03-21 15:16:23 +01:00
` 👉 $ . ${ pathSep } ${ pathRelative (
2023-09-03 23:26:34 +02:00
reactAppRootDirPath ,
2023-04-02 03:10:16 +02:00
pathJoin ( buildOptions . keycloakifyBuildDirPath , generateStartKeycloakTestingContainer . basename )
2023-03-21 15:16:23 +01:00
) } 👈 ` ,
2021-10-11 21:35:40 +02:00
"" ,
2023-03-21 15:16:23 +01:00
` Test with different Keycloak versions by editing the .sh file. see available versions here: https://quay.io/repository/keycloak/keycloak?tab=tags ` ,
` ` ,
` Once your container is up and running: ` ,
2022-04-09 20:17:20 +02:00
"- Log into the admin console 👉 http://localhost:8080/admin username: admin, password: admin 👈" ,
2023-04-20 18:15:03 +02:00
` - Create a realm: Master -> AddRealm -> Name: myrealm ` ,
` - Enable registration: Realm settings -> Login tab -> User registration: on ` ,
` - Enable the Account theme (optional): Realm settings -> Themes tab -> Account theme: ${ buildOptions . themeName } ` ,
` Clients -> account -> Login theme: ${ buildOptions . themeName } ` ,
` - Enable the email theme (optional): Realm settings -> Themes tab -> Email theme: ${ buildOptions . themeName } (option will appear only if you have ran npx initialize-email-theme) ` ,
` - Create a client Clients -> Create -> Client ID: myclient ` ,
` Root URL: https://www.keycloak.org/app/ ` ,
` Valid redirect URIs: https://www.keycloak.org/app* http://localhost* (localhost is optional) ` ,
` Valid post logout redirect URIs: https://www.keycloak.org/app* http://localhost* ` ,
` Web origins: * ` ,
` Login Theme: ${ buildOptions . themeName } ` ,
` Save (button at the bottom of the page) ` ,
2023-03-21 23:21:30 +01:00
` ` ,
` - Go to 👉 https://www.keycloak.org/app/ 👈 Click "Save" then "Sign in". You should see your login page ` ,
2023-03-21 19:44:01 +01:00
` - Got to 👉 http://localhost:8080/realms/myrealm/account 👈 to see your account theme ` ,
2023-03-22 01:46:05 +01:00
` ` ,
` Video tutorial: https://youtu.be/WMyGZNHQkjU ` ,
2023-03-21 15:16:23 +01:00
` `
2022-08-20 11:44:48 +07:00
] . join ( "\n" )
2021-10-11 21:35:40 +02:00
) ;
2021-06-14 21:21:36 +02:00
}