keycloakify 10.0.0-rc.17 → 10.0.0-rc.18
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.map +1 -1
- package/account/Template.js +5 -5
- package/account/Template.js.map +1 -1
- package/account/i18n/i18n.js +37 -29
- package/account/i18n/i18n.js.map +1 -1
- package/account/kcContext/KcContext.js.map +1 -1
- package/account/kcContext/createGetKcContext.js +20 -15
- package/account/kcContext/createGetKcContext.js.map +1 -1
- package/account/kcContext/getKcContext.js.map +1 -1
- package/account/kcContext/getKcContextFromWindow.d.ts +3 -1
- package/account/kcContext/getKcContextFromWindow.js.map +1 -1
- package/account/kcContext/kcContextMocks.js +148 -144
- package/account/kcContext/kcContextMocks.js.map +1 -1
- package/account/lib/useGetClassName.js +14 -14
- package/account/lib/useGetClassName.js.map +1 -1
- package/account/pages/Account.js +1 -1
- package/account/pages/Account.js.map +1 -1
- package/account/pages/Password.js +7 -7
- package/account/pages/Password.js.map +1 -1
- package/account/pages/Totp.js +4 -4
- package/account/pages/Totp.js.map +1 -1
- package/bin/main.js +2066 -2165
- package/bin/shared/constants.d.ts +1 -0
- package/bin/shared/constants.js +4 -3
- package/bin/shared/constants.js.map +1 -1
- package/lib/isStorybook.js +2 -1
- package/lib/isStorybook.js.map +1 -1
- package/lib/useGetClassName.js.map +1 -1
- package/login/Template.js +13 -13
- package/login/Template.js.map +1 -1
- package/login/UserProfileFormFields.js +43 -41
- package/login/UserProfileFormFields.js.map +1 -1
- package/login/i18n/baseMessages/ca.d.ts +1 -1
- package/login/i18n/baseMessages/ca.js +1 -1
- package/login/i18n/baseMessages/el.d.ts +0 -1
- package/login/i18n/baseMessages/el.js +0 -1
- package/login/i18n/baseMessages/el.js.map +1 -1
- package/login/i18n/baseMessages/en.d.ts +1 -1
- package/login/i18n/baseMessages/en.js +1 -1
- package/login/i18n/baseMessages/es.d.ts +1 -1
- package/login/i18n/baseMessages/es.js +1 -1
- package/login/i18n/baseMessages/fa.d.ts +0 -1
- package/login/i18n/baseMessages/fa.js +0 -1
- package/login/i18n/baseMessages/fa.js.map +1 -1
- package/login/i18n/baseMessages/hu.d.ts +1 -1
- package/login/i18n/baseMessages/hu.js +1 -1
- package/login/i18n/baseMessages/index.d.ts +1 -2
- package/login/i18n/baseMessages/zh-CN.d.ts +1 -1
- package/login/i18n/baseMessages/zh-CN.js +1 -1
- package/login/i18n/i18n.js +39 -31
- package/login/i18n/i18n.js.map +1 -1
- package/login/kcContext/KcContext.js.map +1 -1
- package/login/kcContext/createGetKcContext.js +30 -22
- package/login/kcContext/createGetKcContext.js.map +1 -1
- package/login/kcContext/getKcContext.js.map +1 -1
- package/login/kcContext/getKcContextFromWindow.d.ts +3 -1
- package/login/kcContext/getKcContextFromWindow.js.map +1 -1
- package/login/kcContext/kcContextMocks.js +233 -231
- package/login/kcContext/kcContextMocks.js.map +1 -1
- package/login/lib/useDownloadTerms.js.map +1 -1
- package/login/lib/useGetClassName.js +112 -112
- package/login/lib/useGetClassName.js.map +1 -1
- package/login/lib/useUserProfileForm.js +181 -181
- package/login/lib/useUserProfileForm.js.map +1 -1
- package/login/pages/DeleteAccountConfirm.js +5 -1
- package/login/pages/DeleteAccountConfirm.js.map +1 -1
- package/login/pages/FrontchannelLogout.js +1 -1
- package/login/pages/FrontchannelLogout.js.map +1 -1
- package/login/pages/Login.js.map +1 -1
- package/login/pages/LoginRecoveryAuthnCodeConfig.js +3 -3
- package/login/pages/LoginRecoveryAuthnCodeConfig.js.map +1 -1
- package/login/pages/LoginResetPassword.js.map +1 -1
- package/login/pages/LoginUsername.js.map +1 -1
- package/login/pages/WebauthnAuthenticate.js +11 -8
- package/login/pages/WebauthnAuthenticate.js.map +1 -1
- package/login/pages/WebauthnRegister.js +7 -7
- package/login/pages/WebauthnRegister.js.map +1 -1
- package/package.json +230 -226
- package/src/PUBLIC_URL.ts +4 -1
- package/src/account/Template.tsx +5 -5
- package/src/account/TemplateProps.ts +4 -1
- package/src/account/i18n/i18n.tsx +40 -30
- package/src/account/kcContext/KcContext.ts +4 -1
- package/src/account/kcContext/createGetKcContext.ts +48 -22
- package/src/account/kcContext/getKcContext.ts +3 -1
- package/src/account/kcContext/getKcContextFromWindow.ts +6 -2
- package/src/account/kcContext/kcContextMocks.ts +164 -160
- package/src/account/lib/useGetClassName.ts +15 -14
- package/src/account/pages/Account.tsx +2 -2
- package/src/account/pages/Password.tsx +8 -8
- package/src/account/pages/Totp.tsx +4 -6
- package/src/bin/copy-keycloak-resources-to-public.ts +2 -2
- package/src/bin/download-keycloak-default-theme.ts +30 -8
- package/src/bin/eject-page.ts +48 -11
- package/src/bin/initialize-email-theme.ts +25 -17
- package/src/bin/keycloakify/buildJars/buildJar.ts +179 -104
- package/src/bin/keycloakify/buildJars/buildJars.ts +35 -16
- package/src/bin/keycloakify/buildJars/extensionVersions.ts +2 -1
- package/src/bin/keycloakify/buildJars/generatePom.ts +11 -3
- package/src/bin/keycloakify/buildJars/getKeycloakVersionRangeForJar.ts +33 -8
- package/src/bin/keycloakify/generateFtl/generateFtl.ts +49 -12
- package/src/bin/keycloakify/generateSrcMainResources/bringInAccountV1.ts +29 -18
- package/src/bin/keycloakify/generateSrcMainResources/generateMessageProperties.ts +35 -12
- package/src/bin/keycloakify/generateSrcMainResources/generateSrcMainResources.ts +3 -1
- package/src/bin/keycloakify/generateSrcMainResources/generateSrcMainResourcesForMainTheme.ts +86 -41
- package/src/bin/keycloakify/generateSrcMainResources/generateSrcMainResourcesForThemeVariant.ts +39 -15
- package/src/bin/keycloakify/generateSrcMainResources/readExtraPageNames.ts +21 -7
- package/src/bin/keycloakify/generateSrcMainResources/readFieldNameUsage.ts +34 -7
- package/src/bin/keycloakify/generateStartKeycloakTestingContainer.ts +19 -5
- package/src/bin/keycloakify/keycloakify.ts +28 -9
- package/src/bin/keycloakify/replacers/replaceImportsInCssCode.ts +24 -5
- package/src/bin/keycloakify/replacers/replaceImportsInInlineCssCode.ts +6 -2
- package/src/bin/keycloakify/replacers/replaceImportsInJsCode/replaceImportsInJsCode.ts +6 -3
- package/src/bin/keycloakify/replacers/replaceImportsInJsCode/vite.ts +24 -6
- package/src/bin/keycloakify/replacers/replaceImportsInJsCode/webpack.ts +49 -11
- package/src/bin/main.ts +78 -41
- package/src/bin/shared/KeycloakVersionRange.ts +3 -1
- package/src/bin/shared/buildOptions.ts +70 -43
- package/src/bin/shared/constants.ts +4 -2
- package/src/bin/shared/copyKeycloakResourcesToPublic.ts +27 -13
- package/src/bin/shared/downloadKeycloakDefaultTheme.ts +161 -218
- package/src/bin/shared/downloadKeycloakStaticResources.ts +25 -21
- package/src/bin/shared/getJarFileBasename.ts +3 -1
- package/src/bin/shared/getThemeSrcDirPath.ts +5 -2
- package/src/bin/shared/metaInfKeycloakThemes.ts +35 -8
- package/src/bin/shared/promptKeycloakVersion.ts +33 -14
- package/src/bin/start-keycloak/index.ts +1 -0
- package/src/bin/start-keycloak/myrealm-realm-23.json +2142 -0
- package/src/bin/start-keycloak/myrealm-realm-24.json +2318 -0
- package/src/bin/start-keycloak/start-keycloak.ts +467 -0
- package/src/bin/tools/SemVer.ts +32 -13
- package/src/bin/tools/String.prototype.replaceAll.ts +9 -2
- package/src/bin/tools/crawl.ts +4 -1
- package/src/bin/tools/crc32.ts +42 -24
- package/src/bin/tools/downloadAndExtractArchive/downloadAndExtractArchive.ts +262 -0
- package/src/bin/tools/downloadAndExtractArchive/fetchProxyOptions.ts +96 -0
- package/src/bin/tools/downloadAndExtractArchive/index.ts +1 -0
- package/src/bin/tools/extractArchive.ts +120 -0
- package/src/bin/tools/fetchProxyOptions.ts +31 -8
- package/src/bin/tools/getAbsoluteAndInOsFormatPath.ts +10 -2
- package/src/bin/tools/getNpmWorkspaceRootDirPath.ts +18 -5
- package/src/bin/tools/octokit-addons/getLatestsSemVersionedTag.ts +8 -2
- package/src/bin/tools/octokit-addons/listTags.ts +15 -4
- package/src/bin/tools/partitionPromiseSettledResults.ts +12 -3
- package/src/bin/tools/readThisNpmPackageVersion.ts +5 -1
- package/src/bin/tools/transformCodebase.ts +29 -10
- package/src/bin/tools/trimIndent.ts +4 -1
- package/src/lib/isStorybook.ts +3 -1
- package/src/lib/useGetClassName.ts +12 -3
- package/src/login/Template.tsx +14 -14
- package/src/login/TemplateProps.ts +4 -1
- package/src/login/UserProfileFormFields.tsx +44 -42
- package/src/login/i18n/baseMessages/ca.ts +1 -1
- package/src/login/i18n/baseMessages/el.ts +0 -1
- package/src/login/i18n/baseMessages/en.ts +1 -1
- package/src/login/i18n/baseMessages/es.ts +1 -1
- package/src/login/i18n/baseMessages/fa.ts +0 -1
- package/src/login/i18n/baseMessages/hu.ts +1 -1
- package/src/login/i18n/baseMessages/zh-CN.ts +1 -1
- package/src/login/i18n/i18n.tsx +42 -32
- package/src/login/kcContext/KcContext.ts +8 -2
- package/src/login/kcContext/createGetKcContext.ts +84 -37
- package/src/login/kcContext/getKcContext.ts +3 -1
- package/src/login/kcContext/getKcContextFromWindow.ts +6 -2
- package/src/login/kcContext/kcContextMocks.ts +339 -325
- package/src/login/lib/useDownloadTerms.ts +6 -4
- package/src/login/lib/useGetClassName.ts +119 -112
- package/src/login/lib/useUserProfileForm.tsx +219 -205
- package/src/login/pages/DeleteAccountConfirm.tsx +9 -3
- package/src/login/pages/FrontchannelLogout.tsx +1 -1
- package/src/login/pages/Login.tsx +2 -2
- package/src/login/pages/LoginRecoveryAuthnCodeConfig.tsx +3 -3
- package/src/login/pages/LoginResetPassword.tsx +2 -2
- package/src/login/pages/LoginUsername.tsx +2 -2
- package/src/login/pages/WebauthnAuthenticate.tsx +11 -8
- package/src/login/pages/WebauthnRegister.tsx +7 -7
- package/src/tools/AndByDiscriminatingKey.ts +12 -6
- package/src/tools/Array.prototype.every.ts +4 -1
- package/src/tools/LazyOrNot.ts +3 -1
- package/src/tools/clsx.ts +7 -1
- package/src/tools/deepAssign.ts +15 -8
- package/src/tools/deepClone.ts +3 -1
- package/src/tools/formatNumber.ts +4 -1
- package/src/tools/useConstCallback.ts +3 -1
- package/src/tools/useInsertLinkTags.ts +20 -7
- package/src/tools/useInsertScriptTags.ts +7 -2
- package/src/tools/useSetClassName.ts +4 -1
- package/src/vite-plugin/vite-plugin.ts +45 -21
- package/tools/Array.prototype.every.js +2 -1
- package/tools/Array.prototype.every.js.map +1 -1
- package/tools/clsx.js.map +1 -1
- package/tools/deepAssign.js +9 -7
- package/tools/deepAssign.js.map +1 -1
- package/tools/deepClone.js.map +1 -1
- package/tools/formatNumber.js.map +1 -1
- package/tools/useConstCallback.js.map +1 -1
- package/tools/useInsertLinkTags.js +5 -4
- package/tools/useInsertLinkTags.js.map +1 -1
- package/tools/useInsertScriptTags.js +5 -2
- package/tools/useInsertScriptTags.js.map +1 -1
- package/tools/useSetClassName.js.map +1 -1
- package/vite-plugin/index.js +975 -1651
- package/src/bin/shared/downloadAndUnzip.ts +0 -203
- package/src/bin/start-keycloak.ts +0 -309
- package/src/bin/tools/unzip.ts +0 -141
@@ -1,5 +1,8 @@
|
|
1
1
|
import { assert, type Equals } from "tsafe/assert";
|
2
|
-
import type {
|
2
|
+
import type {
|
3
|
+
KeycloakAccountV1Version,
|
4
|
+
KeycloakThemeAdditionalInfoExtensionVersion
|
5
|
+
} from "./extensionVersions";
|
3
6
|
import type { KeycloakVersionRange } from "../../shared/KeycloakVersionRange";
|
4
7
|
|
5
8
|
export function getKeycloakVersionRangeForJar(params: {
|
@@ -7,7 +10,11 @@ export function getKeycloakVersionRangeForJar(params: {
|
|
7
10
|
keycloakAccountV1Version: KeycloakAccountV1Version;
|
8
11
|
keycloakThemeAdditionalInfoExtensionVersion: KeycloakThemeAdditionalInfoExtensionVersion;
|
9
12
|
}): KeycloakVersionRange | undefined {
|
10
|
-
const {
|
13
|
+
const {
|
14
|
+
keycloakAccountV1Version,
|
15
|
+
keycloakThemeAdditionalInfoExtensionVersion,
|
16
|
+
doesImplementAccountTheme
|
17
|
+
} = params;
|
11
18
|
|
12
19
|
if (doesImplementAccountTheme) {
|
13
20
|
const keycloakVersionRange = (() => {
|
@@ -19,7 +26,9 @@ export function getKeycloakVersionRangeForJar(params: {
|
|
19
26
|
case "1.1.5":
|
20
27
|
return undefined;
|
21
28
|
}
|
22
|
-
assert<
|
29
|
+
assert<
|
30
|
+
Equals<typeof keycloakThemeAdditionalInfoExtensionVersion, never>
|
31
|
+
>(false);
|
23
32
|
case "0.3":
|
24
33
|
switch (keycloakThemeAdditionalInfoExtensionVersion) {
|
25
34
|
case null:
|
@@ -27,7 +36,9 @@ export function getKeycloakVersionRangeForJar(params: {
|
|
27
36
|
case "1.1.5":
|
28
37
|
return "23" as const;
|
29
38
|
}
|
30
|
-
assert<
|
39
|
+
assert<
|
40
|
+
Equals<typeof keycloakThemeAdditionalInfoExtensionVersion, never>
|
41
|
+
>(false);
|
31
42
|
case "0.4":
|
32
43
|
switch (keycloakThemeAdditionalInfoExtensionVersion) {
|
33
44
|
case null:
|
@@ -35,11 +46,18 @@ export function getKeycloakVersionRangeForJar(params: {
|
|
35
46
|
case "1.1.5":
|
36
47
|
return "24-and-above" as const;
|
37
48
|
}
|
38
|
-
assert<
|
49
|
+
assert<
|
50
|
+
Equals<typeof keycloakThemeAdditionalInfoExtensionVersion, never>
|
51
|
+
>(false);
|
39
52
|
}
|
40
53
|
})();
|
41
54
|
|
42
|
-
assert<
|
55
|
+
assert<
|
56
|
+
Equals<
|
57
|
+
typeof keycloakVersionRange,
|
58
|
+
KeycloakVersionRange.WithAccountTheme | undefined
|
59
|
+
>
|
60
|
+
>();
|
43
61
|
|
44
62
|
return keycloakVersionRange;
|
45
63
|
} else {
|
@@ -54,10 +72,17 @@ export function getKeycloakVersionRangeForJar(params: {
|
|
54
72
|
case "1.1.5":
|
55
73
|
return "22-and-above";
|
56
74
|
}
|
57
|
-
assert<Equals<typeof keycloakThemeAdditionalInfoExtensionVersion, never>>(
|
75
|
+
assert<Equals<typeof keycloakThemeAdditionalInfoExtensionVersion, never>>(
|
76
|
+
false
|
77
|
+
);
|
58
78
|
})();
|
59
79
|
|
60
|
-
assert<
|
80
|
+
assert<
|
81
|
+
Equals<
|
82
|
+
typeof keycloakVersionRange,
|
83
|
+
KeycloakVersionRange.WithoutAccountTheme | undefined
|
84
|
+
>
|
85
|
+
>();
|
61
86
|
|
62
87
|
return keycloakVersionRange;
|
63
88
|
}
|
@@ -6,7 +6,12 @@ import * as fs from "fs";
|
|
6
6
|
import { join as pathJoin } from "path";
|
7
7
|
import type { BuildOptions } from "../../shared/buildOptions";
|
8
8
|
import { assert } from "tsafe/assert";
|
9
|
-
import {
|
9
|
+
import {
|
10
|
+
type ThemeType,
|
11
|
+
nameOfTheGlobal,
|
12
|
+
basenameOfTheKeycloakifyResourcesDir,
|
13
|
+
resources_common
|
14
|
+
} from "../../shared/constants";
|
10
15
|
import { getThisCodebaseRootDirPath } from "../../tools/getThisCodebaseRootDirPath";
|
11
16
|
|
12
17
|
export type BuildOptionsLike = {
|
@@ -28,7 +33,15 @@ export function generateFtlFilesCodeFactory(params: {
|
|
28
33
|
themeType: ThemeType;
|
29
34
|
fieldNames: string[];
|
30
35
|
}) {
|
31
|
-
const {
|
36
|
+
const {
|
37
|
+
themeName,
|
38
|
+
cssGlobalsToDefine,
|
39
|
+
indexHtmlCode,
|
40
|
+
buildOptions,
|
41
|
+
keycloakifyVersion,
|
42
|
+
themeType,
|
43
|
+
fieldNames
|
44
|
+
} = params;
|
32
45
|
|
33
46
|
const $ = cheerio.load(indexHtmlCode);
|
34
47
|
|
@@ -38,7 +51,10 @@ export function generateFtlFilesCodeFactory(params: {
|
|
38
51
|
|
39
52
|
assert(jsCode !== null);
|
40
53
|
|
41
|
-
const { fixedJsCode } = replaceImportsInJsCode({
|
54
|
+
const { fixedJsCode } = replaceImportsInJsCode({
|
55
|
+
jsCode,
|
56
|
+
buildOptions
|
57
|
+
});
|
42
58
|
|
43
59
|
$(element).text(fixedJsCode);
|
44
60
|
});
|
@@ -72,7 +88,9 @@ export function generateFtlFilesCodeFactory(params: {
|
|
72
88
|
$(element).attr(
|
73
89
|
attrName,
|
74
90
|
href.replace(
|
75
|
-
new RegExp(
|
91
|
+
new RegExp(
|
92
|
+
`^${(buildOptions.urlPathname ?? "/").replace(/\//g, "\\/")}`
|
93
|
+
),
|
76
94
|
`\${url.resourcesPath}/${basenameOfTheKeycloakifyResourcesDir}/`
|
77
95
|
)
|
78
96
|
);
|
@@ -98,20 +116,33 @@ export function generateFtlFilesCodeFactory(params: {
|
|
98
116
|
//FTL is no valid html, we can't insert with cheerio, we put placeholder for injecting later.
|
99
117
|
const ftlObjectToJsCodeDeclaringAnObject = fs
|
100
118
|
.readFileSync(
|
101
|
-
pathJoin(
|
119
|
+
pathJoin(
|
120
|
+
getThisCodebaseRootDirPath(),
|
121
|
+
"src",
|
122
|
+
"bin",
|
123
|
+
"keycloakify",
|
124
|
+
"generateFtl",
|
125
|
+
"ftl_object_to_js_code_declaring_an_object.ftl"
|
126
|
+
)
|
102
127
|
)
|
103
128
|
.toString("utf8")
|
104
129
|
.match(/^<script>const _=((?:.|\n)+)<\/script>[\n]?$/)![1]
|
105
|
-
.replace(
|
130
|
+
.replace(
|
131
|
+
"FIELD_NAMES_eKsIY4ZsZ4xeM",
|
132
|
+
fieldNames.map(name => `"${name}"`).join(", ")
|
133
|
+
)
|
106
134
|
.replace("KEYCLOAKIFY_VERSION_xEdKd3xEdr", keycloakifyVersion)
|
107
135
|
.replace("KEYCLOAKIFY_THEME_VERSION_sIgKd3xEdr3dx", buildOptions.themeVersion)
|
108
136
|
.replace("KEYCLOAKIFY_THEME_TYPE_dExKd3xEdr", themeType)
|
109
137
|
.replace("KEYCLOAKIFY_THEME_NAME_cXxKd3xEer", themeName)
|
110
138
|
.replace("RESOURCES_COMMON_cLsLsMrtDkpVv", resources_common);
|
111
139
|
|
112
|
-
const ftlObjectToJsCodeDeclaringAnObjectPlaceholder =
|
140
|
+
const ftlObjectToJsCodeDeclaringAnObjectPlaceholder =
|
141
|
+
'{ "x": "vIdLqMeOed9sdLdIdOxdK0d" }';
|
113
142
|
|
114
|
-
$("head").prepend(
|
143
|
+
$("head").prepend(
|
144
|
+
`<script>\nwindow.${nameOfTheGlobal}=${ftlObjectToJsCodeDeclaringAnObjectPlaceholder}</script>`
|
145
|
+
);
|
115
146
|
|
116
147
|
// Remove part of the document marked as ignored.
|
117
148
|
{
|
@@ -119,7 +150,9 @@ export function generateFtlFilesCodeFactory(params: {
|
|
119
150
|
|
120
151
|
startTags.each((...[, startTag]) => {
|
121
152
|
const $startTag = $(startTag);
|
122
|
-
const $endTag = $startTag
|
153
|
+
const $endTag = $startTag
|
154
|
+
.nextAll('meta[name="keycloakify-ignore-end"]')
|
155
|
+
.first();
|
123
156
|
|
124
157
|
if ($endTag.length) {
|
125
158
|
let currentNode = $startTag.next();
|
@@ -146,9 +179,13 @@ export function generateFtlFilesCodeFactory(params: {
|
|
146
179
|
let ftlCode = $.html();
|
147
180
|
|
148
181
|
Object.entries({
|
149
|
-
[ftlObjectToJsCodeDeclaringAnObjectPlaceholder]:
|
150
|
-
|
151
|
-
|
182
|
+
[ftlObjectToJsCodeDeclaringAnObjectPlaceholder]:
|
183
|
+
ftlObjectToJsCodeDeclaringAnObject,
|
184
|
+
PAGE_ID_xIgLsPgGId9D8e: pageId
|
185
|
+
}).map(
|
186
|
+
([searchValue, replaceValue]) =>
|
187
|
+
(ftlCode = ftlCode.replace(searchValue, replaceValue))
|
188
|
+
);
|
152
189
|
|
153
190
|
return { ftlCode };
|
154
191
|
}
|
@@ -2,10 +2,13 @@ import * as fs from "fs";
|
|
2
2
|
import { join as pathJoin } from "path";
|
3
3
|
import { assert } from "tsafe/assert";
|
4
4
|
import type { BuildOptions } from "../../shared/buildOptions";
|
5
|
-
import {
|
5
|
+
import {
|
6
|
+
resources_common,
|
7
|
+
lastKeycloakVersionWithAccountV1,
|
8
|
+
accountV1ThemeName
|
9
|
+
} from "../../shared/constants";
|
6
10
|
import { downloadKeycloakDefaultTheme } from "../../shared/downloadKeycloakDefaultTheme";
|
7
11
|
import { transformCodebase } from "../../tools/transformCodebase";
|
8
|
-
import { rmSync } from "../../tools/fs.rmSync";
|
9
12
|
|
10
13
|
type BuildOptionsLike = {
|
11
14
|
cacheDirPath: string;
|
@@ -18,33 +21,36 @@ assert<BuildOptions extends BuildOptionsLike ? true : false>();
|
|
18
21
|
export async function bringInAccountV1(params: { buildOptions: BuildOptionsLike }) {
|
19
22
|
const { buildOptions } = params;
|
20
23
|
|
21
|
-
const
|
22
|
-
|
23
|
-
await downloadKeycloakDefaultTheme({
|
24
|
-
"destDirPath": builtinKeycloakThemeTmpDirPath,
|
25
|
-
"keycloakVersion": lastKeycloakVersionWithAccountV1,
|
24
|
+
const { defaultThemeDirPath } = await downloadKeycloakDefaultTheme({
|
25
|
+
keycloakVersion: lastKeycloakVersionWithAccountV1,
|
26
26
|
buildOptions
|
27
27
|
});
|
28
28
|
|
29
|
-
const accountV1DirPath = pathJoin(
|
29
|
+
const accountV1DirPath = pathJoin(
|
30
|
+
buildOptions.keycloakifyBuildDirPath,
|
31
|
+
"src",
|
32
|
+
"main",
|
33
|
+
"resources",
|
34
|
+
"theme",
|
35
|
+
accountV1ThemeName,
|
36
|
+
"account"
|
37
|
+
);
|
30
38
|
|
31
39
|
transformCodebase({
|
32
|
-
|
33
|
-
|
40
|
+
srcDirPath: pathJoin(defaultThemeDirPath, "base", "account"),
|
41
|
+
destDirPath: accountV1DirPath
|
34
42
|
});
|
35
43
|
|
36
44
|
transformCodebase({
|
37
|
-
|
38
|
-
|
45
|
+
srcDirPath: pathJoin(defaultThemeDirPath, "keycloak", "account", "resources"),
|
46
|
+
destDirPath: pathJoin(accountV1DirPath, "resources")
|
39
47
|
});
|
40
48
|
|
41
49
|
transformCodebase({
|
42
|
-
|
43
|
-
|
50
|
+
srcDirPath: pathJoin(defaultThemeDirPath, "keycloak", "common", "resources"),
|
51
|
+
destDirPath: pathJoin(accountV1DirPath, "resources", resources_common)
|
44
52
|
});
|
45
53
|
|
46
|
-
rmSync(builtinKeycloakThemeTmpDirPath, { "recursive": true });
|
47
|
-
|
48
54
|
fs.writeFileSync(
|
49
55
|
pathJoin(accountV1DirPath, "theme.properties"),
|
50
56
|
Buffer.from(
|
@@ -58,8 +64,13 @@ export async function bringInAccountV1(params: { buildOptions: BuildOptionsLike
|
|
58
64
|
"css/account.css",
|
59
65
|
"img/icon-sidebar-active.png",
|
60
66
|
"img/logo.png",
|
61
|
-
...[
|
62
|
-
|
67
|
+
...[
|
68
|
+
"patternfly.min.css",
|
69
|
+
"patternfly-additions.min.css",
|
70
|
+
"patternfly-additions.min.css"
|
71
|
+
].map(
|
72
|
+
fileBasename =>
|
73
|
+
`${resources_common}/node_modules/patternfly/dist/css/${fileBasename}`
|
63
74
|
)
|
64
75
|
].join(" "),
|
65
76
|
"",
|
@@ -16,8 +16,8 @@ export function generateMessageProperties(params: {
|
|
16
16
|
const { themeSrcDirPath, themeType } = params;
|
17
17
|
|
18
18
|
let files = crawl({
|
19
|
-
|
20
|
-
|
19
|
+
dirPath: pathJoin(themeSrcDirPath, themeType),
|
20
|
+
returnedPathsType: "absolute"
|
21
21
|
});
|
22
22
|
|
23
23
|
files = files.filter(file => {
|
@@ -34,7 +34,9 @@ export function generateMessageProperties(params: {
|
|
34
34
|
|
35
35
|
files = files.sort((a, b) => a.length - b.length);
|
36
36
|
|
37
|
-
files = files.filter(file =>
|
37
|
+
files = files.filter(file =>
|
38
|
+
readFileSync(file).toString("utf8").includes("createUseI18n")
|
39
|
+
);
|
38
40
|
|
39
41
|
if (files.length === 0) {
|
40
42
|
return [];
|
@@ -43,18 +45,25 @@ export function generateMessageProperties(params: {
|
|
43
45
|
const extraMessages = files
|
44
46
|
.map(file => {
|
45
47
|
const root = recast.parse(readFileSync(file).toString("utf8"), {
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
48
|
+
parser: {
|
49
|
+
parse: (code: string) =>
|
50
|
+
babelParser.parse(code, {
|
51
|
+
sourceType: "module",
|
52
|
+
plugins: ["typescript"]
|
53
|
+
}),
|
54
|
+
generator: babelGenerate,
|
55
|
+
types: babelTypes
|
50
56
|
}
|
51
57
|
});
|
52
58
|
|
53
59
|
const codes: string[] = [];
|
54
60
|
|
55
61
|
recast.visit(root, {
|
56
|
-
|
57
|
-
if (
|
62
|
+
visitCallExpression: function (path) {
|
63
|
+
if (
|
64
|
+
path.node.callee.type === "Identifier" &&
|
65
|
+
path.node.callee.name === "createUseI18n"
|
66
|
+
) {
|
58
67
|
codes.push(babelGenerate(path.node.arguments[0] as any).code);
|
59
68
|
}
|
60
69
|
this.traverse(path);
|
@@ -65,7 +74,9 @@ export function generateMessageProperties(params: {
|
|
65
74
|
})
|
66
75
|
.flat()
|
67
76
|
.map(code => {
|
68
|
-
let extraMessages: {
|
77
|
+
let extraMessages: {
|
78
|
+
[languageTag: string]: Record<string, string>;
|
79
|
+
} = {};
|
69
80
|
|
70
81
|
try {
|
71
82
|
eval(`${symToStr({ extraMessages })} = ${code}`);
|
@@ -140,7 +151,14 @@ export function generateMessageProperties(params: {
|
|
140
151
|
|
141
152
|
out.push({
|
142
153
|
languageTag,
|
143
|
-
|
154
|
+
propertiesFileSource: [
|
155
|
+
"# This file was generated by keycloakify",
|
156
|
+
"",
|
157
|
+
"parent=base",
|
158
|
+
"",
|
159
|
+
propertiesFileSource,
|
160
|
+
""
|
161
|
+
].join("\n")
|
144
162
|
});
|
145
163
|
}
|
146
164
|
|
@@ -157,7 +175,12 @@ function toUTF16(codePoint: number): string {
|
|
157
175
|
codePoint -= 0x10000;
|
158
176
|
let highSurrogate = (codePoint >> 10) + 0xd800;
|
159
177
|
let lowSurrogate = (codePoint % 0x400) + 0xdc00;
|
160
|
-
return
|
178
|
+
return (
|
179
|
+
"\\u" +
|
180
|
+
highSurrogate.toString(16).padStart(4, "0") +
|
181
|
+
"\\u" +
|
182
|
+
lowSurrogate.toString(16).padStart(4, "0")
|
183
|
+
);
|
161
184
|
}
|
162
185
|
}
|
163
186
|
|
@@ -12,7 +12,9 @@ export type BuildOptionsLike = BuildOptionsLike_generateSrcMainResourcesForMainT
|
|
12
12
|
|
13
13
|
assert<BuildOptions extends BuildOptionsLike ? true : false>();
|
14
14
|
|
15
|
-
export async function generateSrcMainResources(params: {
|
15
|
+
export async function generateSrcMainResources(params: {
|
16
|
+
buildOptions: BuildOptionsLike;
|
17
|
+
}): Promise<void> {
|
16
18
|
const { buildOptions } = params;
|
17
19
|
|
18
20
|
const [themeName, ...themeVariantNames] = buildOptions.themeNames;
|
package/src/bin/keycloakify/generateSrcMainResources/generateSrcMainResourcesForMainTheme.ts
CHANGED
@@ -24,7 +24,10 @@ import { bringInAccountV1 } from "./bringInAccountV1";
|
|
24
24
|
import { getThemeSrcDirPath } from "../../shared/getThemeSrcDirPath";
|
25
25
|
import { rmSync } from "../../tools/fs.rmSync";
|
26
26
|
import { readThisNpmPackageVersion } from "../../tools/readThisNpmPackageVersion";
|
27
|
-
import {
|
27
|
+
import {
|
28
|
+
writeMetaInfKeycloakThemes,
|
29
|
+
type MetaInfKeycloakTheme
|
30
|
+
} from "../../shared/metaInfKeycloakThemes";
|
28
31
|
import { objectEntries } from "tsafe/objectEntries";
|
29
32
|
|
30
33
|
export type BuildOptionsLike = {
|
@@ -43,22 +46,35 @@ export type BuildOptionsLike = {
|
|
43
46
|
|
44
47
|
assert<BuildOptions extends BuildOptionsLike ? true : false>();
|
45
48
|
|
46
|
-
export async function generateSrcMainResourcesForMainTheme(params: {
|
49
|
+
export async function generateSrcMainResourcesForMainTheme(params: {
|
50
|
+
themeName: string;
|
51
|
+
buildOptions: BuildOptionsLike;
|
52
|
+
}): Promise<void> {
|
47
53
|
const { themeName, buildOptions } = params;
|
48
54
|
|
49
|
-
const { themeSrcDirPath } = getThemeSrcDirPath({
|
55
|
+
const { themeSrcDirPath } = getThemeSrcDirPath({
|
56
|
+
reactAppRootDirPath: buildOptions.reactAppRootDirPath
|
57
|
+
});
|
50
58
|
|
51
59
|
const getThemeTypeDirPath = (params: { themeType: ThemeType | "email" }) => {
|
52
60
|
const { themeType } = params;
|
53
|
-
return pathJoin(
|
61
|
+
return pathJoin(
|
62
|
+
buildOptions.keycloakifyBuildDirPath,
|
63
|
+
"src",
|
64
|
+
"main",
|
65
|
+
"resources",
|
66
|
+
"theme",
|
67
|
+
themeName,
|
68
|
+
themeType
|
69
|
+
);
|
54
70
|
};
|
55
71
|
|
56
72
|
const cssGlobalsToDefine: Record<string, string> = {};
|
57
73
|
|
58
74
|
const implementedThemeTypes: Record<ThemeType | "email", boolean> = {
|
59
|
-
|
60
|
-
|
61
|
-
|
75
|
+
login: false,
|
76
|
+
account: false,
|
77
|
+
email: false
|
62
78
|
};
|
63
79
|
|
64
80
|
for (const themeType of ["login", "account"] as const) {
|
@@ -71,18 +87,22 @@ export async function generateSrcMainResourcesForMainTheme(params: { themeName:
|
|
71
87
|
const themeTypeDirPath = getThemeTypeDirPath({ themeType });
|
72
88
|
|
73
89
|
apply_replacers_and_move_to_theme_resources: {
|
74
|
-
const destDirPath = pathJoin(
|
90
|
+
const destDirPath = pathJoin(
|
91
|
+
themeTypeDirPath,
|
92
|
+
"resources",
|
93
|
+
basenameOfTheKeycloakifyResourcesDir
|
94
|
+
);
|
75
95
|
|
76
96
|
// NOTE: Prevent accumulation of files in the assets dir, as names are hashed they pile up.
|
77
|
-
rmSync(destDirPath, {
|
97
|
+
rmSync(destDirPath, { recursive: true, force: true });
|
78
98
|
|
79
99
|
if (themeType === "account" && implementedThemeTypes.login) {
|
80
100
|
// NOTE: We prevent doing it twice, it has been done for the login theme.
|
81
101
|
|
82
102
|
transformCodebase({
|
83
|
-
|
103
|
+
srcDirPath: pathJoin(
|
84
104
|
getThemeTypeDirPath({
|
85
|
-
|
105
|
+
themeType: "login"
|
86
106
|
}),
|
87
107
|
"resources",
|
88
108
|
basenameOfTheKeycloakifyResourcesDir
|
@@ -94,14 +114,17 @@ export async function generateSrcMainResourcesForMainTheme(params: { themeName:
|
|
94
114
|
}
|
95
115
|
|
96
116
|
transformCodebase({
|
97
|
-
|
117
|
+
srcDirPath: buildOptions.reactAppBuildDirPath,
|
98
118
|
destDirPath,
|
99
|
-
|
119
|
+
transformSourceCode: ({ filePath, sourceCode }) => {
|
100
120
|
//NOTE: Prevent cycles, excludes the folder we generated for debug in public/
|
101
121
|
// This should not happen if users follow the new instruction setup but we keep it for retrocompatibility.
|
102
122
|
if (
|
103
123
|
isInside({
|
104
|
-
|
124
|
+
dirPath: pathJoin(
|
125
|
+
buildOptions.reactAppBuildDirPath,
|
126
|
+
keycloak_resources
|
127
|
+
),
|
105
128
|
filePath
|
106
129
|
})
|
107
130
|
) {
|
@@ -109,39 +132,50 @@ export async function generateSrcMainResourcesForMainTheme(params: { themeName:
|
|
109
132
|
}
|
110
133
|
|
111
134
|
if (/\.css?$/i.test(filePath)) {
|
112
|
-
const {
|
113
|
-
|
135
|
+
const {
|
136
|
+
cssGlobalsToDefine: cssGlobalsToDefineForThisFile,
|
137
|
+
fixedCssCode
|
138
|
+
} = replaceImportsInCssCode({
|
139
|
+
cssCode: sourceCode.toString("utf8")
|
114
140
|
});
|
115
141
|
|
116
|
-
Object.entries(cssGlobalsToDefineForThisFile).forEach(
|
117
|
-
|
118
|
-
|
142
|
+
Object.entries(cssGlobalsToDefineForThisFile).forEach(
|
143
|
+
([key, value]) => {
|
144
|
+
cssGlobalsToDefine[key] = value;
|
145
|
+
}
|
146
|
+
);
|
119
147
|
|
120
|
-
return {
|
148
|
+
return {
|
149
|
+
modifiedSourceCode: Buffer.from(fixedCssCode, "utf8")
|
150
|
+
};
|
121
151
|
}
|
122
152
|
|
123
153
|
if (/\.js?$/i.test(filePath)) {
|
124
154
|
const { fixedJsCode } = replaceImportsInJsCode({
|
125
|
-
|
155
|
+
jsCode: sourceCode.toString("utf8"),
|
126
156
|
buildOptions
|
127
157
|
});
|
128
158
|
|
129
|
-
return {
|
159
|
+
return {
|
160
|
+
modifiedSourceCode: Buffer.from(fixedJsCode, "utf8")
|
161
|
+
};
|
130
162
|
}
|
131
163
|
|
132
|
-
return {
|
164
|
+
return { modifiedSourceCode: sourceCode };
|
133
165
|
}
|
134
166
|
});
|
135
167
|
}
|
136
168
|
|
137
169
|
const { generateFtlFilesCode } = generateFtlFilesCodeFactory({
|
138
170
|
themeName,
|
139
|
-
|
171
|
+
indexHtmlCode: fs
|
172
|
+
.readFileSync(pathJoin(buildOptions.reactAppBuildDirPath, "index.html"))
|
173
|
+
.toString("utf8"),
|
140
174
|
cssGlobalsToDefine,
|
141
175
|
buildOptions,
|
142
|
-
|
176
|
+
keycloakifyVersion: readThisNpmPackageVersion(),
|
143
177
|
themeType,
|
144
|
-
|
178
|
+
fieldNames: readFieldNameUsage({
|
145
179
|
themeSrcDirPath,
|
146
180
|
themeType
|
147
181
|
})
|
@@ -163,9 +197,12 @@ export async function generateSrcMainResourcesForMainTheme(params: { themeName:
|
|
163
197
|
].forEach(pageId => {
|
164
198
|
const { ftlCode } = generateFtlFilesCode({ pageId });
|
165
199
|
|
166
|
-
fs.mkdirSync(themeTypeDirPath, {
|
200
|
+
fs.mkdirSync(themeTypeDirPath, { recursive: true });
|
167
201
|
|
168
|
-
fs.writeFileSync(
|
202
|
+
fs.writeFileSync(
|
203
|
+
pathJoin(themeTypeDirPath, pageId),
|
204
|
+
Buffer.from(ftlCode, "utf8")
|
205
|
+
);
|
169
206
|
});
|
170
207
|
|
171
208
|
generateMessageProperties({
|
@@ -174,15 +211,23 @@ export async function generateSrcMainResourcesForMainTheme(params: { themeName:
|
|
174
211
|
}).forEach(({ languageTag, propertiesFileSource }) => {
|
175
212
|
const messagesDirPath = pathJoin(themeTypeDirPath, "messages");
|
176
213
|
|
177
|
-
fs.mkdirSync(pathJoin(themeTypeDirPath, "messages"), {
|
214
|
+
fs.mkdirSync(pathJoin(themeTypeDirPath, "messages"), {
|
215
|
+
recursive: true
|
216
|
+
});
|
178
217
|
|
179
|
-
const propertiesFilePath = pathJoin(
|
218
|
+
const propertiesFilePath = pathJoin(
|
219
|
+
messagesDirPath,
|
220
|
+
`messages_${languageTag}.properties`
|
221
|
+
);
|
180
222
|
|
181
|
-
fs.writeFileSync(
|
223
|
+
fs.writeFileSync(
|
224
|
+
propertiesFilePath,
|
225
|
+
Buffer.from(propertiesFileSource, "utf8")
|
226
|
+
);
|
182
227
|
});
|
183
228
|
|
184
229
|
await downloadKeycloakStaticResources({
|
185
|
-
|
230
|
+
keycloakVersion: (() => {
|
186
231
|
switch (themeType) {
|
187
232
|
case "account":
|
188
233
|
return lastKeycloakVersionWithAccountV1;
|
@@ -190,7 +235,7 @@ export async function generateSrcMainResourcesForMainTheme(params: { themeName:
|
|
190
235
|
return buildOptions.loginThemeResourcesFromKeycloakVersion;
|
191
236
|
}
|
192
237
|
})(),
|
193
|
-
|
238
|
+
themeDirPath: pathResolve(pathJoin(themeTypeDirPath, "..")),
|
194
239
|
themeType,
|
195
240
|
buildOptions
|
196
241
|
});
|
@@ -225,8 +270,8 @@ export async function generateSrcMainResourcesForMainTheme(params: { themeName:
|
|
225
270
|
implementedThemeTypes.email = true;
|
226
271
|
|
227
272
|
transformCodebase({
|
228
|
-
|
229
|
-
|
273
|
+
srcDirPath: emailThemeSrcDirPath,
|
274
|
+
destDirPath: getThemeTypeDirPath({ themeType: "email" })
|
230
275
|
});
|
231
276
|
}
|
232
277
|
|
@@ -237,24 +282,24 @@ export async function generateSrcMainResourcesForMainTheme(params: { themeName:
|
|
237
282
|
}
|
238
283
|
|
239
284
|
{
|
240
|
-
const metaInfKeycloakThemes: MetaInfKeycloakTheme = {
|
285
|
+
const metaInfKeycloakThemes: MetaInfKeycloakTheme = { themes: [] };
|
241
286
|
|
242
287
|
metaInfKeycloakThemes.themes.push({
|
243
|
-
|
244
|
-
|
288
|
+
name: themeName,
|
289
|
+
types: objectEntries(implementedThemeTypes)
|
245
290
|
.filter(([, isImplemented]) => isImplemented)
|
246
291
|
.map(([themeType]) => themeType)
|
247
292
|
});
|
248
293
|
|
249
294
|
if (implementedThemeTypes.account) {
|
250
295
|
metaInfKeycloakThemes.themes.push({
|
251
|
-
|
252
|
-
|
296
|
+
name: accountV1ThemeName,
|
297
|
+
types: ["account"]
|
253
298
|
});
|
254
299
|
}
|
255
300
|
|
256
301
|
writeMetaInfKeycloakThemes({
|
257
|
-
|
302
|
+
keycloakifyBuildDirPath: buildOptions.keycloakifyBuildDirPath,
|
258
303
|
metaInfKeycloakThemes
|
259
304
|
});
|
260
305
|
}
|