141 lines
5.4 KiB
TypeScript
141 lines
5.4 KiB
TypeScript
import * as fs from "fs";
|
|
import { join as pathJoin, dirname as pathDirname } from "path";
|
|
import { assert } from "tsafe/assert";
|
|
import { Reflect } from "tsafe/Reflect";
|
|
import type { BuildOptions } from "../BuildOptions";
|
|
import { type ThemeType, retrocompatPostfix, accountV1 } from "../../constants";
|
|
import { bringInAccountV1 } from "./bringInAccountV1";
|
|
|
|
export type BuildOptionsLike = {
|
|
groupId: string;
|
|
artifactId: string;
|
|
themeVersion: string;
|
|
cacheDirPath: string;
|
|
keycloakifyBuildDirPath: string;
|
|
themeNames: string[];
|
|
};
|
|
|
|
{
|
|
const buildOptions = Reflect<BuildOptions>();
|
|
|
|
assert<typeof buildOptions extends BuildOptionsLike ? true : false>();
|
|
}
|
|
|
|
export async function generateJavaStackFiles(params: {
|
|
implementedThemeTypes: Record<ThemeType | "email", boolean>;
|
|
buildOptions: BuildOptionsLike;
|
|
}): Promise<{
|
|
jarFilePath: string;
|
|
}> {
|
|
const { implementedThemeTypes, buildOptions } = params;
|
|
|
|
{
|
|
const { pomFileCode } = (function generatePomFileCode(): {
|
|
pomFileCode: string;
|
|
} {
|
|
const pomFileCode = [
|
|
`<?xml version="1.0"?>`,
|
|
`<project xmlns="http://maven.apache.org/POM/4.0.0"`,
|
|
` xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"`,
|
|
` xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">`,
|
|
` <modelVersion>4.0.0</modelVersion>`,
|
|
` <groupId>${buildOptions.groupId}</groupId>`,
|
|
` <artifactId>${buildOptions.artifactId}</artifactId>`,
|
|
` <version>${buildOptions.themeVersion}</version>`,
|
|
` <name>${buildOptions.artifactId}</name>`,
|
|
` <description />`,
|
|
` <packaging>jar</packaging>`,
|
|
` <properties>`,
|
|
` <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>`,
|
|
` </properties>`,
|
|
` <build>`,
|
|
` <plugins>`,
|
|
` <plugin>`,
|
|
` <groupId>org.apache.maven.plugins</groupId>`,
|
|
` <artifactId>maven-shade-plugin</artifactId>`,
|
|
` <version>3.5.1</version>`,
|
|
` <executions>`,
|
|
` <execution>`,
|
|
` <phase>package</phase>`,
|
|
` <goals>`,
|
|
` <goal>shade</goal>`,
|
|
` </goals>`,
|
|
` </execution>`,
|
|
` </executions>`,
|
|
` </plugin>`,
|
|
` </plugins>`,
|
|
` </build>`,
|
|
` <dependencies>`,
|
|
` <dependency>`,
|
|
` <groupId>io.phasetwo.keycloak</groupId>`,
|
|
` <artifactId>keycloak-account-v1</artifactId>`,
|
|
` <version>0.1</version>`,
|
|
` </dependency>`,
|
|
` </dependencies>`,
|
|
`</project>`
|
|
].join("\n");
|
|
|
|
return { pomFileCode };
|
|
})();
|
|
|
|
fs.writeFileSync(pathJoin(buildOptions.keycloakifyBuildDirPath, "pom.xml"), Buffer.from(pomFileCode, "utf8"));
|
|
}
|
|
|
|
if (implementedThemeTypes.account) {
|
|
await bringInAccountV1({ buildOptions });
|
|
}
|
|
|
|
{
|
|
const themeManifestFilePath = pathJoin(buildOptions.keycloakifyBuildDirPath, "src", "main", "resources", "META-INF", "keycloak-themes.json");
|
|
|
|
try {
|
|
fs.mkdirSync(pathDirname(themeManifestFilePath));
|
|
} catch {}
|
|
|
|
fs.writeFileSync(
|
|
themeManifestFilePath,
|
|
Buffer.from(
|
|
JSON.stringify(
|
|
{
|
|
"themes": [
|
|
...(!implementedThemeTypes.account
|
|
? []
|
|
: [
|
|
{
|
|
"name": accountV1,
|
|
"types": ["account"]
|
|
}
|
|
]),
|
|
...buildOptions.themeNames
|
|
.map(themeName => [
|
|
{
|
|
"name": themeName,
|
|
"types": Object.entries(implementedThemeTypes)
|
|
.filter(([, isImplemented]) => isImplemented)
|
|
.map(([themeType]) => themeType)
|
|
},
|
|
...(!implementedThemeTypes.account
|
|
? []
|
|
: [
|
|
{
|
|
"name": `${themeName}${retrocompatPostfix}`,
|
|
"types": ["account"]
|
|
}
|
|
])
|
|
])
|
|
.flat()
|
|
]
|
|
},
|
|
null,
|
|
2
|
|
),
|
|
"utf8"
|
|
)
|
|
);
|
|
}
|
|
|
|
return {
|
|
"jarFilePath": pathJoin(buildOptions.keycloakifyBuildDirPath, "target", `${buildOptions.artifactId}-${buildOptions.themeVersion}.jar`)
|
|
};
|
|
}
|