keycloakify 2.3.0 → 2.5.2
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/CHANGELOG.md +21 -0
- package/README.md +156 -127
- package/bin/KeycloakVersion.js.map +1 -1
- package/bin/build-keycloak-theme/build-keycloak-theme.js +57 -54
- package/bin/build-keycloak-theme/build-keycloak-theme.js.map +1 -1
- package/bin/build-keycloak-theme/ftlValuesGlobalName.js.map +1 -1
- package/bin/build-keycloak-theme/generateDebugFiles/generateDebugFiles.js +4 -11
- package/bin/build-keycloak-theme/generateDebugFiles/generateDebugFiles.js.map +1 -1
- package/bin/build-keycloak-theme/generateFtl/common.ftl +72 -57
- package/bin/build-keycloak-theme/generateFtl/generateFtl.d.ts +1 -1
- package/bin/build-keycloak-theme/generateFtl/generateFtl.js +47 -44
- package/bin/build-keycloak-theme/generateFtl/generateFtl.js.map +1 -1
- package/bin/build-keycloak-theme/generateJavaStackFiles.js +12 -8
- package/bin/build-keycloak-theme/generateJavaStackFiles.js.map +1 -1
- package/bin/build-keycloak-theme/generateKeycloakThemeResources.js +20 -21
- package/bin/build-keycloak-theme/generateKeycloakThemeResources.js.map +1 -1
- package/bin/build-keycloak-theme/index.js.map +1 -1
- package/bin/build-keycloak-theme/replaceImportFromStatic.js +18 -30
- package/bin/build-keycloak-theme/replaceImportFromStatic.js.map +1 -1
- package/bin/download-builtin-keycloak-theme.js +2 -2
- package/bin/download-builtin-keycloak-theme.js.map +1 -1
- package/bin/generate-i18n-messages.js +9 -11
- package/bin/generate-i18n-messages.js.map +1 -1
- package/bin/link_in_test_app.js +6 -22
- package/bin/link_in_test_app.js.map +1 -1
- package/bin/tools/crawl.js.map +1 -1
- package/bin/tools/downloadAndUnzip.js +4 -5
- package/bin/tools/downloadAndUnzip.js.map +1 -1
- package/bin/tools/grant-exec-perms.js +4 -3
- package/bin/tools/grant-exec-perms.js.map +1 -1
- package/bin/tools/isInside.js.map +1 -1
- package/bin/tools/rm.js +1 -1
- package/bin/tools/rm.js.map +1 -1
- package/bin/tools/transformCodebase.js +7 -3
- package/bin/tools/transformCodebase.js.map +1 -1
- package/lib/components/Error.js +1 -2
- package/lib/components/Error.js.map +1 -1
- package/lib/components/Info.js +1 -15
- package/lib/components/Info.js.map +1 -1
- package/lib/components/KcApp.js +23 -10
- package/lib/components/KcApp.js.map +1 -1
- package/lib/components/KcProps.d.ts +4 -2
- package/lib/components/KcProps.js +10 -8
- package/lib/components/KcProps.js.map +1 -1
- package/lib/components/Login.js +20 -18
- package/lib/components/Login.js.map +1 -1
- package/lib/components/LoginIdpLinkConfirm.js.map +1 -1
- package/lib/components/LoginOtp.js +14 -15
- package/lib/components/LoginOtp.js.map +1 -1
- package/lib/components/LoginResetPassword.js +5 -7
- package/lib/components/LoginResetPassword.js.map +1 -1
- package/lib/components/LoginUpdateProfile.js +1 -5
- package/lib/components/LoginUpdateProfile.js.map +1 -1
- package/lib/components/LoginVerifyEmail.js.map +1 -1
- package/lib/components/Register.js +1 -4
- package/lib/components/Register.js.map +1 -1
- package/lib/components/RegisterUserProfile.d.ts +6 -0
- package/lib/components/RegisterUserProfile.js +78 -0
- package/lib/components/RegisterUserProfile.js.map +1 -0
- package/lib/components/Template.js +28 -43
- package/lib/components/Template.js.map +1 -1
- package/lib/components/Terms.js.map +1 -1
- package/lib/getKcContext/KcContextBase.d.ts +78 -18
- package/lib/getKcContext/KcContextBase.js +2 -3
- package/lib/getKcContext/KcContextBase.js.map +1 -1
- package/lib/getKcContext/getKcContext.d.ts +1 -3
- package/lib/getKcContext/getKcContext.js +5 -9
- package/lib/getKcContext/getKcContext.js.map +1 -1
- package/lib/getKcContext/kcContextMocks/kcContextMocks.d.ts +1 -0
- package/lib/getKcContext/kcContextMocks/kcContextMocks.js +187 -55
- package/lib/getKcContext/kcContextMocks/kcContextMocks.js.map +1 -1
- package/lib/getKcContext/kcContextMocks/urlResourcesPath.js.map +1 -1
- package/lib/i18n/KcLanguageTag.d.ts +25 -2
- package/lib/i18n/KcLanguageTag.js +27 -27
- package/lib/i18n/KcLanguageTag.js.map +1 -1
- package/lib/i18n/generated_kcMessages/11.0.3/account.js +27 -27
- package/lib/i18n/generated_kcMessages/11.0.3/account.js.map +1 -1
- package/lib/i18n/generated_kcMessages/11.0.3/admin.js +23 -23
- package/lib/i18n/generated_kcMessages/11.0.3/admin.js.map +1 -1
- package/lib/i18n/generated_kcMessages/11.0.3/email.js +97 -97
- package/lib/i18n/generated_kcMessages/11.0.3/email.js.map +1 -1
- package/lib/i18n/generated_kcMessages/11.0.3/login.js +30 -30
- package/lib/i18n/generated_kcMessages/11.0.3/login.js.map +1 -1
- package/lib/i18n/generated_kcMessages/15.0.2/account.js +29 -29
- package/lib/i18n/generated_kcMessages/15.0.2/account.js.map +1 -1
- package/lib/i18n/generated_kcMessages/15.0.2/admin.js +23 -23
- package/lib/i18n/generated_kcMessages/15.0.2/admin.js.map +1 -1
- package/lib/i18n/generated_kcMessages/15.0.2/email.js +111 -111
- package/lib/i18n/generated_kcMessages/15.0.2/email.js.map +1 -1
- package/lib/i18n/generated_kcMessages/15.0.2/login.js +32 -32
- package/lib/i18n/generated_kcMessages/15.0.2/login.js.map +1 -1
- package/lib/i18n/kcMessages/login.js +1 -1
- package/lib/i18n/kcMessages/login.js.map +1 -1
- package/lib/i18n/useKcLanguageTag.js +1 -3
- package/lib/i18n/useKcLanguageTag.js.map +1 -1
- package/lib/i18n/useKcMessage.d.ts +2 -1
- package/lib/i18n/useKcMessage.js +8 -6
- package/lib/i18n/useKcMessage.js.map +1 -1
- package/lib/keycloakJsAdapter.d.ts +6 -6
- package/lib/keycloakJsAdapter.js +10 -12
- package/lib/keycloakJsAdapter.js.map +1 -1
- package/lib/tools/ReactComponent.d.ts +2 -0
- package/lib/tools/ReactComponent.js +3 -0
- package/lib/tools/ReactComponent.js.map +1 -0
- package/lib/tools/allPropertiesValuesToUndefined.js +1 -2
- package/lib/tools/allPropertiesValuesToUndefined.js.map +1 -1
- package/lib/tools/appendHead.js +16 -12
- package/lib/tools/appendHead.js.map +1 -1
- package/lib/tools/assert.js.map +1 -1
- package/lib/tools/deepAssign.js +3 -4
- package/lib/tools/deepAssign.js.map +1 -1
- package/lib/tools/deepClone.js.map +1 -1
- package/package.json +26 -6
- package/src/bin/KeycloakVersion.ts +0 -2
- package/src/bin/build-keycloak-theme/build-keycloak-theme.ts +70 -77
- package/src/bin/build-keycloak-theme/ftlValuesGlobalName.ts +1 -2
- package/src/bin/build-keycloak-theme/generateDebugFiles/generateDebugFiles.ts +26 -37
- package/src/bin/build-keycloak-theme/generateDebugFiles/index.ts +1 -1
- package/src/bin/build-keycloak-theme/generateFtl/common.ftl +72 -57
- package/src/bin/build-keycloak-theme/generateFtl/generateFtl.ts +75 -95
- package/src/bin/build-keycloak-theme/generateFtl/index.ts +1 -1
- package/src/bin/build-keycloak-theme/generateJavaStackFiles.ts +38 -56
- package/src/bin/build-keycloak-theme/generateKeycloakThemeResources.ts +47 -85
- package/src/bin/build-keycloak-theme/index.ts +2 -4
- package/src/bin/build-keycloak-theme/replaceImportFromStatic.ts +34 -78
- package/src/bin/download-builtin-keycloak-theme.ts +5 -19
- package/src/bin/generate-i18n-messages.ts +13 -25
- package/src/bin/link_in_test_app.ts +9 -38
- package/src/bin/tools/crawl.ts +2 -12
- package/src/bin/tools/downloadAndUnzip.ts +6 -22
- package/src/bin/tools/getProjectRoot.ts +1 -1
- package/src/bin/tools/grant-exec-perms.ts +8 -7
- package/src/bin/tools/isInside.ts +2 -9
- package/src/bin/tools/rm.ts +21 -32
- package/src/bin/tools/transformCodebase.ts +20 -43
- package/src/lib/components/Error.tsx +3 -7
- package/src/lib/components/Info.tsx +23 -47
- package/src/lib/components/KcApp.tsx +25 -13
- package/src/lib/components/KcProps.ts +94 -92
- package/src/lib/components/Login.tsx +126 -116
- package/src/lib/components/LoginIdpLinkConfirm.tsx +38 -53
- package/src/lib/components/LoginOtp.tsx +39 -76
- package/src/lib/components/LoginResetPassword.tsx +9 -26
- package/src/lib/components/LoginUpdateProfile.tsx +104 -117
- package/src/lib/components/LoginVerifyEmail.tsx +3 -12
- package/src/lib/components/Register.tsx +76 -46
- package/src/lib/components/RegisterUserProfile.tsx +201 -0
- package/src/lib/components/Template.tsx +109 -161
- package/src/lib/components/Terms.tsx +4 -13
- package/src/lib/getKcContext/KcContextBase.ts +104 -53
- package/src/lib/getKcContext/getKcContext.ts +47 -78
- package/src/lib/getKcContext/index.ts +2 -2
- package/src/lib/getKcContext/kcContextMocks/index.ts +1 -1
- package/src/lib/getKcContext/kcContextMocks/kcContextMocks.ts +362 -241
- package/src/lib/getKcContext/kcContextMocks/urlResourcesPath.ts +1 -2
- package/src/lib/i18n/KcLanguageTag.ts +34 -45
- package/src/lib/i18n/generated_kcMessages/11.0.3/account.ts +3086 -3059
- package/src/lib/i18n/generated_kcMessages/11.0.3/admin.ts +248 -239
- package/src/lib/i18n/generated_kcMessages/11.0.3/email.ts +848 -633
- package/src/lib/i18n/generated_kcMessages/11.0.3/login.ts +4466 -4359
- package/src/lib/i18n/generated_kcMessages/15.0.2/account.ts +4247 -4202
- package/src/lib/i18n/generated_kcMessages/15.0.2/admin.ts +273 -264
- package/src/lib/i18n/generated_kcMessages/15.0.2/email.ts +997 -749
- package/src/lib/i18n/generated_kcMessages/15.0.2/login.ts +5352 -5212
- package/src/lib/i18n/kcMessages/login.ts +4 -9
- package/src/lib/i18n/useKcLanguageTag.ts +2 -16
- package/src/lib/i18n/useKcMessage.tsx +17 -20
- package/src/lib/index.ts +0 -1
- package/src/lib/keycloakJsAdapter.ts +23 -53
- package/src/lib/tools/AndByDiscriminatingKey.ts +16 -30
- package/src/lib/tools/DeepPartial.ts +1 -2
- package/src/lib/tools/ReactComponent.ts +4 -0
- package/src/lib/tools/allPropertiesValuesToUndefined.ts +1 -6
- package/src/lib/tools/appendHead.ts +28 -25
- package/src/lib/tools/assert.ts +1 -2
- package/src/lib/tools/deepAssign.ts +28 -46
- package/src/lib/tools/deepClone.ts +2 -3
@@ -1,74 +1,66 @@
|
|
1
|
-
|
2
|
-
|
3
1
|
import cheerio from "cheerio";
|
4
|
-
import {
|
5
|
-
replaceImportsFromStaticInJsCode,
|
6
|
-
replaceImportsInInlineCssCode,
|
7
|
-
generateCssCodeToDefineGlobals
|
8
|
-
} from "../replaceImportFromStatic";
|
2
|
+
import { replaceImportsFromStaticInJsCode, replaceImportsInInlineCssCode, generateCssCodeToDefineGlobals } from "../replaceImportFromStatic";
|
9
3
|
import fs from "fs";
|
10
4
|
import { join as pathJoin } from "path";
|
11
5
|
import { objectKeys } from "tsafe/objectKeys";
|
12
6
|
import { ftlValuesGlobalName } from "../ftlValuesGlobalName";
|
13
7
|
|
14
8
|
export const pageIds = [
|
15
|
-
"login.ftl",
|
16
|
-
"
|
17
|
-
"
|
18
|
-
"
|
19
|
-
"
|
9
|
+
"login.ftl",
|
10
|
+
"register.ftl",
|
11
|
+
"register-user-profile.ftl",
|
12
|
+
"info.ftl",
|
13
|
+
"error.ftl",
|
14
|
+
"login-reset-password.ftl",
|
15
|
+
"login-verify-email.ftl",
|
16
|
+
"terms.ftl",
|
17
|
+
"login-otp.ftl",
|
18
|
+
"login-update-profile.ftl",
|
19
|
+
"login-idp-link-confirm.ftl",
|
20
20
|
] as const;
|
21
21
|
|
22
22
|
export type PageId = typeof pageIds[number];
|
23
23
|
|
24
24
|
function loadAdjacentFile(fileBasename: string) {
|
25
|
-
return fs.readFileSync(pathJoin(__dirname, fileBasename))
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
urlPathname: string;
|
35
|
-
urlOrigin: undefined | string;
|
36
|
-
}
|
37
|
-
) {
|
38
|
-
|
25
|
+
return fs.readFileSync(pathJoin(__dirname, fileBasename)).toString("utf8");
|
26
|
+
}
|
27
|
+
|
28
|
+
export function generateFtlFilesCodeFactory(params: {
|
29
|
+
cssGlobalsToDefine: Record<string, string>;
|
30
|
+
indexHtmlCode: string;
|
31
|
+
urlPathname: string;
|
32
|
+
urlOrigin: undefined | string;
|
33
|
+
}) {
|
39
34
|
const { cssGlobalsToDefine, indexHtmlCode, urlPathname, urlOrigin } = params;
|
40
35
|
|
41
36
|
const $ = cheerio.load(indexHtmlCode);
|
42
37
|
|
43
38
|
$("script:not([src])").each((...[, element]) => {
|
44
|
-
|
45
39
|
const { fixedJsCode } = replaceImportsFromStaticInJsCode({
|
46
40
|
"jsCode": $(element).html()!,
|
47
|
-
urlOrigin
|
41
|
+
urlOrigin,
|
48
42
|
});
|
49
43
|
|
50
44
|
$(element).text(fixedJsCode);
|
51
|
-
|
52
45
|
});
|
53
46
|
|
54
47
|
$("style").each((...[, element]) => {
|
55
|
-
|
56
48
|
const { fixedCssCode } = replaceImportsInInlineCssCode({
|
57
49
|
"cssCode": $(element).html()!,
|
58
50
|
"urlPathname": params.urlPathname,
|
59
|
-
urlOrigin
|
51
|
+
urlOrigin,
|
60
52
|
});
|
61
53
|
|
62
54
|
$(element).text(fixedCssCode);
|
63
|
-
|
64
55
|
});
|
65
56
|
|
66
|
-
(
|
67
|
-
[
|
68
|
-
|
69
|
-
|
57
|
+
(
|
58
|
+
[
|
59
|
+
["link", "href"],
|
60
|
+
["script", "src"],
|
61
|
+
] as const
|
62
|
+
).forEach(([selector, attrName]) =>
|
70
63
|
$(selector).each((...[, element]) => {
|
71
|
-
|
72
64
|
const href = $(element).attr(attrName);
|
73
65
|
|
74
66
|
if (href === undefined) {
|
@@ -77,94 +69,82 @@ export function generateFtlFilesCodeFactory(
|
|
77
69
|
|
78
70
|
$(element).attr(
|
79
71
|
attrName,
|
80
|
-
urlOrigin !== undefined
|
81
|
-
href.replace(/^\//, `${urlOrigin}/`)
|
82
|
-
href.replace(
|
83
|
-
new RegExp(`^${urlPathname.replace(/\//g, "\\/")}`),
|
84
|
-
"${url.resourcesPath}/build/"
|
85
|
-
)
|
72
|
+
urlOrigin !== undefined
|
73
|
+
? href.replace(/^\//, `${urlOrigin}/`)
|
74
|
+
: href.replace(new RegExp(`^${urlPathname.replace(/\//g, "\\/")}`), "${url.resourcesPath}/build/"),
|
86
75
|
);
|
87
|
-
|
88
|
-
})
|
76
|
+
}),
|
89
77
|
);
|
90
78
|
|
91
79
|
//FTL is no valid html, we can't insert with cheerio, we put placeholder for injecting later.
|
92
80
|
const ftlPlaceholders = {
|
93
|
-
'{ "x": "vIdLqMeOed9sdLdIdOxdK0d" }': loadAdjacentFile("common.ftl")
|
94
|
-
|
95
|
-
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
|
100
|
-
|
101
|
-
'</#if>'
|
102
|
-
].join("\n")
|
81
|
+
'{ "x": "vIdLqMeOed9sdLdIdOxdK0d" }': loadAdjacentFile("common.ftl").match(/^<script>const _=((?:.|\n)+)<\/script>[\n]?$/)![1],
|
82
|
+
"<!-- xIdLqMeOedErIdLsPdNdI9dSlxI -->": [
|
83
|
+
"<#if scripts??>",
|
84
|
+
" <#list scripts as script>",
|
85
|
+
' <script src="${script}" type="text/javascript"></script>',
|
86
|
+
" </#list>",
|
87
|
+
"</#if>",
|
88
|
+
].join("\n"),
|
103
89
|
};
|
104
90
|
|
105
91
|
const pageSpecificCodePlaceholder = "<!-- dIddLqMeOedErIdLsPdNdI9dSl42sw -->";
|
106
92
|
|
107
93
|
$("head").prepend(
|
108
94
|
[
|
109
|
-
...(Object.keys(cssGlobalsToDefine).length === 0
|
110
|
-
|
111
|
-
|
112
|
-
|
113
|
-
|
114
|
-
|
115
|
-
|
116
|
-
|
117
|
-
|
118
|
-
|
95
|
+
...(Object.keys(cssGlobalsToDefine).length === 0
|
96
|
+
? []
|
97
|
+
: [
|
98
|
+
"",
|
99
|
+
"<style>",
|
100
|
+
generateCssCodeToDefineGlobals({
|
101
|
+
cssGlobalsToDefine,
|
102
|
+
urlPathname,
|
103
|
+
}).cssCodeToPrependInHead,
|
104
|
+
"</style>",
|
105
|
+
"",
|
106
|
+
]),
|
119
107
|
"<script>",
|
120
108
|
loadAdjacentFile("Object.deepAssign.js"),
|
121
109
|
"</script>",
|
122
|
-
|
110
|
+
"<script>",
|
123
111
|
` window.${ftlValuesGlobalName}= Object.assign(`,
|
124
112
|
` {},`,
|
125
113
|
` ${objectKeys(ftlPlaceholders)[0]}`,
|
126
|
-
|
127
|
-
|
128
|
-
|
114
|
+
" );",
|
115
|
+
"</script>",
|
116
|
+
"",
|
129
117
|
pageSpecificCodePlaceholder,
|
130
|
-
|
131
|
-
objectKeys(ftlPlaceholders)[1]
|
118
|
+
"",
|
119
|
+
objectKeys(ftlPlaceholders)[1],
|
132
120
|
].join("\n"),
|
133
121
|
);
|
134
122
|
|
135
123
|
const partiallyFixedIndexHtmlCode = $.html();
|
136
124
|
|
137
|
-
function generateFtlFilesCode(
|
138
|
-
|
139
|
-
|
140
|
-
}
|
141
|
-
): { ftlCode: string; } {
|
142
|
-
|
125
|
+
function generateFtlFilesCode(params: { pageId: string }): {
|
126
|
+
ftlCode: string;
|
127
|
+
} {
|
143
128
|
const { pageId } = params;
|
144
129
|
|
145
130
|
const $ = cheerio.load(partiallyFixedIndexHtmlCode);
|
146
131
|
|
147
|
-
let ftlCode = $.html()
|
148
|
-
|
149
|
-
|
150
|
-
|
151
|
-
|
152
|
-
|
153
|
-
|
154
|
-
|
155
|
-
|
156
|
-
|
157
|
-
|
158
|
-
);
|
132
|
+
let ftlCode = $.html().replace(
|
133
|
+
pageSpecificCodePlaceholder,
|
134
|
+
[
|
135
|
+
"<script>",
|
136
|
+
` Object.deepAssign(`,
|
137
|
+
` window.${ftlValuesGlobalName},`,
|
138
|
+
` { "pageId": "${pageId}" }`,
|
139
|
+
" );",
|
140
|
+
"</script>",
|
141
|
+
].join("\n"),
|
142
|
+
);
|
159
143
|
|
160
|
-
objectKeys(ftlPlaceholders)
|
161
|
-
.forEach(id => ftlCode = ftlCode.replace(id, ftlPlaceholders[id]));
|
144
|
+
objectKeys(ftlPlaceholders).forEach(id => (ftlCode = ftlCode.replace(id, ftlPlaceholders[id])));
|
162
145
|
|
163
146
|
return { ftlCode };
|
164
|
-
|
165
147
|
}
|
166
148
|
|
167
149
|
return { generateFtlFilesCode };
|
168
|
-
|
169
|
-
|
170
|
-
}
|
150
|
+
}
|
@@ -1 +1 @@
|
|
1
|
-
export * from "./generateFtl";
|
1
|
+
export * from "./generateFtl";
|
@@ -1,39 +1,29 @@
|
|
1
|
-
|
2
1
|
import * as url from "url";
|
3
2
|
import * as fs from "fs";
|
4
3
|
import { join as pathJoin, dirname as pathDirname } from "path";
|
5
4
|
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
themeName: string;
|
11
|
-
homepage?: string;
|
12
|
-
keycloakThemeBuildingDirPath: string;
|
13
|
-
}
|
14
|
-
): { jarFilePath: string; } {
|
15
|
-
|
16
|
-
const {
|
17
|
-
themeName,
|
18
|
-
version,
|
19
|
-
homepage,
|
20
|
-
keycloakThemeBuildingDirPath
|
21
|
-
} = params;
|
5
|
+
export function generateJavaStackFiles(params: { version: string; themeName: string; homepage?: string; keycloakThemeBuildingDirPath: string }): {
|
6
|
+
jarFilePath: string;
|
7
|
+
} {
|
8
|
+
const { themeName, version, homepage, keycloakThemeBuildingDirPath } = params;
|
22
9
|
|
23
10
|
{
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
11
|
+
const { pomFileCode } = (function generatePomFileCode(): {
|
12
|
+
pomFileCode: string;
|
13
|
+
} {
|
28
14
|
const groupId = (() => {
|
29
|
-
|
30
15
|
const fallbackGroupId = `there.was.no.homepage.field.in.the.package.json.${themeName}`;
|
31
16
|
|
32
|
-
return (
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
17
|
+
return (
|
18
|
+
(!homepage
|
19
|
+
? fallbackGroupId
|
20
|
+
: url
|
21
|
+
.parse(homepage)
|
22
|
+
.host?.replace(/:[0-9]+$/, "")
|
23
|
+
?.split(".")
|
24
|
+
.reverse()
|
25
|
+
.join(".") ?? fallbackGroupId) + ".keycloak"
|
26
|
+
);
|
37
27
|
})();
|
38
28
|
|
39
29
|
const artefactId = `${themeName}-keycloak-theme`;
|
@@ -49,51 +39,43 @@ export function generateJavaStackFiles(
|
|
49
39
|
` <version>${version}</version>`,
|
50
40
|
` <name>${artefactId}</name>`,
|
51
41
|
` <description />`,
|
52
|
-
`</project
|
42
|
+
`</project>`,
|
53
43
|
].join("\n");
|
54
44
|
|
55
45
|
return { pomFileCode };
|
56
|
-
|
57
46
|
})();
|
58
47
|
|
59
|
-
fs.writeFileSync(
|
60
|
-
pathJoin(keycloakThemeBuildingDirPath, "pom.xml"),
|
61
|
-
Buffer.from(pomFileCode, "utf8")
|
62
|
-
);
|
63
|
-
|
48
|
+
fs.writeFileSync(pathJoin(keycloakThemeBuildingDirPath, "pom.xml"), Buffer.from(pomFileCode, "utf8"));
|
64
49
|
}
|
65
50
|
|
66
51
|
{
|
67
|
-
|
68
|
-
const themeManifestFilePath = pathJoin(
|
69
|
-
keycloakThemeBuildingDirPath, "src", "main",
|
70
|
-
"resources", "META-INF", "keycloak-themes.json"
|
71
|
-
);
|
52
|
+
const themeManifestFilePath = pathJoin(keycloakThemeBuildingDirPath, "src", "main", "resources", "META-INF", "keycloak-themes.json");
|
72
53
|
|
73
54
|
try {
|
74
|
-
|
75
55
|
fs.mkdirSync(pathDirname(themeManifestFilePath));
|
76
|
-
|
77
|
-
} catch { }
|
56
|
+
} catch {}
|
78
57
|
|
79
58
|
fs.writeFileSync(
|
80
59
|
themeManifestFilePath,
|
81
60
|
Buffer.from(
|
82
|
-
JSON.stringify(
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
61
|
+
JSON.stringify(
|
62
|
+
{
|
63
|
+
"themes": [
|
64
|
+
{
|
65
|
+
"name": themeName,
|
66
|
+
"types": ["login"],
|
67
|
+
},
|
68
|
+
],
|
69
|
+
},
|
70
|
+
null,
|
71
|
+
2,
|
72
|
+
),
|
73
|
+
"utf8",
|
74
|
+
),
|
92
75
|
);
|
93
|
-
|
94
76
|
}
|
95
77
|
|
96
|
-
return {
|
97
|
-
|
78
|
+
return {
|
79
|
+
"jarFilePath": pathJoin(keycloakThemeBuildingDirPath, "target", `${themeName}-${version}.jar`),
|
80
|
+
};
|
98
81
|
}
|
99
|
-
|
@@ -1,36 +1,33 @@
|
|
1
|
-
|
2
1
|
import { transformCodebase } from "../tools/transformCodebase";
|
3
2
|
import * as fs from "fs";
|
4
3
|
import { join as pathJoin } from "path";
|
5
|
-
import {
|
6
|
-
replaceImportsInCssCode,
|
7
|
-
replaceImportsFromStaticInJsCode
|
8
|
-
} from "./replaceImportFromStatic";
|
4
|
+
import { replaceImportsInCssCode, replaceImportsFromStaticInJsCode } from "./replaceImportFromStatic";
|
9
5
|
import { generateFtlFilesCodeFactory, pageIds } from "./generateFtl";
|
10
6
|
import { downloadBuiltinKeycloakTheme } from "../download-builtin-keycloak-theme";
|
11
7
|
import * as child_process from "child_process";
|
12
8
|
import { resourcesCommonPath, resourcesPath, subDirOfPublicDirBasename } from "../../lib/getKcContext/kcContextMocks/urlResourcesPath";
|
13
9
|
import { isInside } from "../tools/isInside";
|
14
10
|
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
11
|
+
export function generateKeycloakThemeResources(params: {
|
12
|
+
themeName: string;
|
13
|
+
reactAppBuildDirPath: string;
|
14
|
+
keycloakThemeBuildingDirPath: string;
|
15
|
+
urlPathname: string;
|
16
|
+
//If urlOrigin is not undefined then it means --externals-assets
|
17
|
+
urlOrigin: undefined | string;
|
18
|
+
extraPagesId: string[];
|
19
|
+
extraThemeProperties: string[];
|
20
|
+
keycloakVersion: "11.0.3" | "15.0.2";
|
21
|
+
}) {
|
22
|
+
const {
|
23
|
+
themeName,
|
24
|
+
reactAppBuildDirPath,
|
25
|
+
keycloakThemeBuildingDirPath,
|
26
|
+
urlPathname,
|
27
|
+
urlOrigin,
|
28
|
+
extraPagesId,
|
29
|
+
extraThemeProperties,
|
30
|
+
keycloakVersion,
|
34
31
|
} = params;
|
35
32
|
|
36
33
|
const themeDirPath = pathJoin(keycloakThemeBuildingDirPath, "src", "main", "resources", "theme", themeName, "login");
|
@@ -38,141 +35,106 @@ export function generateKeycloakThemeResources(
|
|
38
35
|
let allCssGlobalsToDefine: Record<string, string> = {};
|
39
36
|
|
40
37
|
transformCodebase({
|
41
|
-
"destDirPath":
|
42
|
-
urlOrigin === undefined ?
|
43
|
-
pathJoin(themeDirPath, "resources", "build") :
|
44
|
-
reactAppBuildDirPath,
|
38
|
+
"destDirPath": urlOrigin === undefined ? pathJoin(themeDirPath, "resources", "build") : reactAppBuildDirPath,
|
45
39
|
"srcDirPath": reactAppBuildDirPath,
|
46
40
|
"transformSourceCode": ({ filePath, sourceCode }) => {
|
47
|
-
|
48
41
|
//NOTE: Prevent cycles, excludes the folder we generated for debug in public/
|
49
42
|
if (
|
50
43
|
urlOrigin === undefined &&
|
51
44
|
isInside({
|
52
45
|
"dirPath": pathJoin(reactAppBuildDirPath, subDirOfPublicDirBasename),
|
53
|
-
filePath
|
46
|
+
filePath,
|
54
47
|
})
|
55
48
|
) {
|
56
49
|
return undefined;
|
57
50
|
}
|
58
51
|
|
59
52
|
if (urlOrigin === undefined && /\.css?$/i.test(filePath)) {
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
);
|
53
|
+
const { cssGlobalsToDefine, fixedCssCode } = replaceImportsInCssCode({
|
54
|
+
"cssCode": sourceCode.toString("utf8"),
|
55
|
+
});
|
64
56
|
|
65
57
|
allCssGlobalsToDefine = {
|
66
58
|
...allCssGlobalsToDefine,
|
67
|
-
...cssGlobalsToDefine
|
59
|
+
...cssGlobalsToDefine,
|
68
60
|
};
|
69
61
|
|
70
|
-
return {
|
71
|
-
|
62
|
+
return {
|
63
|
+
"modifiedSourceCode": Buffer.from(fixedCssCode, "utf8"),
|
64
|
+
};
|
72
65
|
}
|
73
66
|
|
74
67
|
if (/\.js?$/i.test(filePath)) {
|
75
|
-
|
76
68
|
const { fixedJsCode } = replaceImportsFromStaticInJsCode({
|
77
69
|
"jsCode": sourceCode.toString("utf8"),
|
78
|
-
urlOrigin
|
70
|
+
urlOrigin,
|
79
71
|
});
|
80
72
|
|
81
|
-
return {
|
82
|
-
|
73
|
+
return {
|
74
|
+
"modifiedSourceCode": Buffer.from(fixedJsCode, "utf8"),
|
75
|
+
};
|
83
76
|
}
|
84
77
|
|
85
|
-
return urlOrigin === undefined ?
|
86
|
-
|
87
|
-
undefined;
|
88
|
-
|
89
|
-
}
|
78
|
+
return urlOrigin === undefined ? { "modifiedSourceCode": sourceCode } : undefined;
|
79
|
+
},
|
90
80
|
});
|
91
81
|
|
92
82
|
const { generateFtlFilesCode } = generateFtlFilesCodeFactory({
|
93
83
|
"cssGlobalsToDefine": allCssGlobalsToDefine,
|
94
|
-
"indexHtmlCode": fs.readFileSync(
|
95
|
-
pathJoin(reactAppBuildDirPath, "index.html")
|
96
|
-
).toString("utf8"),
|
84
|
+
"indexHtmlCode": fs.readFileSync(pathJoin(reactAppBuildDirPath, "index.html")).toString("utf8"),
|
97
85
|
urlPathname,
|
98
|
-
urlOrigin
|
86
|
+
urlOrigin,
|
99
87
|
});
|
100
88
|
|
101
89
|
[...pageIds, ...extraPagesId].forEach(pageId => {
|
102
|
-
|
103
90
|
const { ftlCode } = generateFtlFilesCode({ pageId });
|
104
91
|
|
105
92
|
fs.mkdirSync(themeDirPath, { "recursive": true });
|
106
93
|
|
107
|
-
fs.writeFileSync(
|
108
|
-
pathJoin(themeDirPath, pageId),
|
109
|
-
Buffer.from(ftlCode, "utf8")
|
110
|
-
);
|
111
|
-
|
94
|
+
fs.writeFileSync(pathJoin(themeDirPath, pageId), Buffer.from(ftlCode, "utf8"));
|
112
95
|
});
|
113
96
|
|
114
97
|
{
|
115
|
-
|
116
98
|
const tmpDirPath = pathJoin(themeDirPath, "..", "tmp_xxKdLpdIdLd");
|
117
99
|
|
118
100
|
downloadBuiltinKeycloakTheme({
|
119
101
|
keycloakVersion,
|
120
|
-
"destDirPath": tmpDirPath
|
102
|
+
"destDirPath": tmpDirPath,
|
121
103
|
});
|
122
104
|
|
123
105
|
const themeResourcesDirPath = pathJoin(themeDirPath, "resources");
|
124
106
|
|
125
107
|
transformCodebase({
|
126
108
|
"srcDirPath": pathJoin(tmpDirPath, "keycloak", "login", "resources"),
|
127
|
-
"destDirPath": themeResourcesDirPath
|
109
|
+
"destDirPath": themeResourcesDirPath,
|
128
110
|
});
|
129
111
|
|
130
112
|
const reactAppPublicDirPath = pathJoin(reactAppBuildDirPath, "..", "public");
|
131
113
|
|
132
114
|
transformCodebase({
|
133
115
|
"srcDirPath": themeResourcesDirPath,
|
134
|
-
"destDirPath": pathJoin(
|
135
|
-
reactAppPublicDirPath,
|
136
|
-
resourcesPath
|
137
|
-
)
|
116
|
+
"destDirPath": pathJoin(reactAppPublicDirPath, resourcesPath),
|
138
117
|
});
|
139
118
|
|
140
119
|
transformCodebase({
|
141
120
|
"srcDirPath": pathJoin(tmpDirPath, "keycloak", "common", "resources"),
|
142
|
-
"destDirPath": pathJoin(
|
143
|
-
reactAppPublicDirPath,
|
144
|
-
resourcesCommonPath
|
145
|
-
)
|
121
|
+
"destDirPath": pathJoin(reactAppPublicDirPath, resourcesCommonPath),
|
146
122
|
});
|
147
123
|
|
148
|
-
const keycloakResourcesWithinPublicDirPath =
|
149
|
-
pathJoin(reactAppPublicDirPath, subDirOfPublicDirBasename);
|
150
|
-
|
124
|
+
const keycloakResourcesWithinPublicDirPath = pathJoin(reactAppPublicDirPath, subDirOfPublicDirBasename);
|
151
125
|
|
152
126
|
fs.writeFileSync(
|
153
127
|
pathJoin(keycloakResourcesWithinPublicDirPath, "README.txt"),
|
154
|
-
Buffer.from([
|
155
|
-
"This is just a test folder that helps develop",
|
156
|
-
"the login and register page without having to yarn build"
|
157
|
-
].join(" "))
|
128
|
+
Buffer.from(["This is just a test folder that helps develop", "the login and register page without having to yarn build"].join(" ")),
|
158
129
|
);
|
159
130
|
|
160
|
-
fs.writeFileSync(
|
161
|
-
pathJoin(keycloakResourcesWithinPublicDirPath, ".gitignore"),
|
162
|
-
Buffer.from("*", "utf8")
|
163
|
-
);
|
131
|
+
fs.writeFileSync(pathJoin(keycloakResourcesWithinPublicDirPath, ".gitignore"), Buffer.from("*", "utf8"));
|
164
132
|
|
165
133
|
child_process.execSync(`rm -r ${tmpDirPath}`);
|
166
|
-
|
167
134
|
}
|
168
135
|
|
169
136
|
fs.writeFileSync(
|
170
137
|
pathJoin(themeDirPath, "theme.properties"),
|
171
|
-
Buffer.from(
|
172
|
-
"parent=keycloak".concat("\n\n", extraThemeProperties.join("\n\n")),
|
173
|
-
"utf8"
|
174
|
-
)
|
138
|
+
Buffer.from("parent=keycloak".concat("\n\n", extraThemeProperties.join("\n\n")), "utf8"),
|
175
139
|
);
|
176
|
-
|
177
140
|
}
|
178
|
-
|