2021-06-14 21:21:36 +02:00
import { generateKeycloakThemeResources } from "./generateKeycloakThemeResources" ;
import { generateJavaStackFiles } from "./generateJavaStackFiles" ;
import { join as pathJoin , relative as pathRelative , basename as pathBasename } from "path" ;
import * as child_process from "child_process" ;
import { generateDebugFiles , containerLaunchScriptBasename } from "./generateDebugFiles" ;
import { URL } from "url" ;
2021-08-04 16:12:54 +02:00
type ParsedPackageJson = {
name : string ;
version : string ;
homepage? : string ;
} ;
2021-06-14 21:21:36 +02:00
const reactProjectDirPath = process . cwd ( ) ;
const doUseExternalAssets = process . argv [ 2 ] ? . toLowerCase ( ) === "--external-assets" ;
const parsedPackageJson : ParsedPackageJson = require ( pathJoin ( reactProjectDirPath , "package.json" ) ) ;
export const keycloakThemeBuildingDirPath = pathJoin ( reactProjectDirPath , "build_keycloak" ) ;
2021-08-04 16:12:54 +02:00
function sanitizeThemeName ( name : string ) {
return name . replace ( /^@(.*)/ , '$1' ) . split ( '/' ) . join ( '-' ) ;
}
2021-06-14 21:21:36 +02:00
2021-08-04 16:12:54 +02:00
export function main() {
2021-06-14 21:21:36 +02:00
console . log ( "🔏 Building the keycloak theme...⌚" ) ;
2021-06-23 18:03:49 +02:00
const extraPagesId : string [ ] = ( parsedPackageJson as any ) [ "keycloakify" ] ? . [ "extraPages" ] ? ? [ ] ;
2021-07-06 15:52:14 +03:00
const extraThemeProperties : string [ ] = ( parsedPackageJson as any ) [ "keycloakify" ] ? . [ "extraThemeProperties" ] ? ? [ ] ;
2021-08-04 16:12:54 +02:00
const themeName = sanitizeThemeName ( parsedPackageJson . name ) ;
2021-06-23 18:03:49 +02:00
2021-06-14 21:21:36 +02:00
generateKeycloakThemeResources ( {
keycloakThemeBuildingDirPath ,
"reactAppBuildDirPath" : pathJoin ( reactProjectDirPath , "build" ) ,
2021-08-04 16:12:54 +02:00
themeName ,
2021-06-14 21:21:36 +02:00
. . . ( ( ) = > {
const url = ( ( ) = > {
const { homepage } = parsedPackageJson ;
return homepage === undefined ?
undefined :
new URL ( homepage ) ;
} ) ( ) ;
return {
"urlPathname" :
url === undefined ?
"/" :
url . pathname . replace ( /([^/])$/ , "$1/" ) ,
"urlOrigin" : ! doUseExternalAssets ? undefined : ( ( ) = > {
if ( url === undefined ) {
console . error ( "ERROR: You must specify 'homepage' in your package.json" ) ;
process . exit ( - 1 ) ;
}
return url . origin ;
} ) ( )
} ;
2021-06-23 18:03:49 +02:00
} ) ( ) ,
2021-07-06 15:52:14 +03:00
extraPagesId ,
extraThemeProperties
2021-06-14 21:21:36 +02:00
} ) ;
const { jarFilePath } = generateJavaStackFiles ( {
2021-08-04 16:12:54 +02:00
version : parsedPackageJson.version ,
themeName ,
homepage : parsedPackageJson.homepage ,
2021-06-14 21:21:36 +02:00
keycloakThemeBuildingDirPath
} ) ;
child_process . execSync (
"mvn package" ,
{ "cwd" : keycloakThemeBuildingDirPath }
) ;
generateDebugFiles ( {
keycloakThemeBuildingDirPath ,
2021-08-04 16:12:54 +02:00
themeName
2021-06-14 21:21:36 +02:00
} ) ;
console . log ( [
'' ,
` ✅ Your keycloak theme has been generated and bundled into ./ ${ pathRelative ( reactProjectDirPath , jarFilePath ) } 🚀 ` ,
` It is to be placed in "/opt/jboss/keycloak/standalone/deployments" in the container running a jboss/keycloak Docker image. (Tested with 11.0.3) ` ,
'' ,
'Using Helm (https://github.com/codecentric/helm-charts), edit to reflect:' ,
'' ,
'value.yaml: ' ,
' extraInitContainers: |' ,
' - name: realm-ext-provider' ,
' image: curlimages/curl' ,
' imagePullPolicy: IfNotPresent' ,
' command:' ,
' - sh' ,
' args:' ,
' - -c' ,
` - curl -L -f -S -o /extensions/ ${ pathBasename ( jarFilePath ) } https://AN.URL.FOR/ ${ pathBasename ( jarFilePath ) } ` ,
' volumeMounts:' ,
' - name: extensions' ,
' mountPath: /extensions' ,
' ' ,
' extraVolumeMounts: |' ,
' - name: extensions' ,
' mountPath: /opt/jboss/keycloak/standalone/deployments' ,
'' ,
'' ,
'To test your theme locally, with hot reloading, you can spin up a Keycloak container image with the theme loaded by running:' ,
'' ,
` 👉 $ ./ ${ pathRelative ( reactProjectDirPath , pathJoin ( keycloakThemeBuildingDirPath , containerLaunchScriptBasename ) ) } 👈 ` ,
'' ,
'To enable the theme within keycloak log into the admin console ( 👉 http://localhost:8080 username: admin, password: admin 👈), create a realm (called "myrealm" for example),' ,
2021-08-04 16:12:54 +02:00
` go to your realm settings, click on the theme tab then select ${ themeName } . ` ,
2021-06-14 21:21:36 +02:00
` More details: https://www.keycloak.org/getting-started/getting-started-docker ` ,
'' ,
'Once your container is up and configured 👉 http://localhost:8080/auth/realms/myrealm/account 👈' ,
'' ,
] . join ( "\n" ) ) ;
}