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.
Files changed (205) hide show
  1. package/PUBLIC_URL.js.map +1 -1
  2. package/account/Template.js +5 -5
  3. package/account/Template.js.map +1 -1
  4. package/account/i18n/i18n.js +37 -29
  5. package/account/i18n/i18n.js.map +1 -1
  6. package/account/kcContext/KcContext.js.map +1 -1
  7. package/account/kcContext/createGetKcContext.js +20 -15
  8. package/account/kcContext/createGetKcContext.js.map +1 -1
  9. package/account/kcContext/getKcContext.js.map +1 -1
  10. package/account/kcContext/getKcContextFromWindow.d.ts +3 -1
  11. package/account/kcContext/getKcContextFromWindow.js.map +1 -1
  12. package/account/kcContext/kcContextMocks.js +148 -144
  13. package/account/kcContext/kcContextMocks.js.map +1 -1
  14. package/account/lib/useGetClassName.js +14 -14
  15. package/account/lib/useGetClassName.js.map +1 -1
  16. package/account/pages/Account.js +1 -1
  17. package/account/pages/Account.js.map +1 -1
  18. package/account/pages/Password.js +7 -7
  19. package/account/pages/Password.js.map +1 -1
  20. package/account/pages/Totp.js +4 -4
  21. package/account/pages/Totp.js.map +1 -1
  22. package/bin/main.js +2066 -2165
  23. package/bin/shared/constants.d.ts +1 -0
  24. package/bin/shared/constants.js +4 -3
  25. package/bin/shared/constants.js.map +1 -1
  26. package/lib/isStorybook.js +2 -1
  27. package/lib/isStorybook.js.map +1 -1
  28. package/lib/useGetClassName.js.map +1 -1
  29. package/login/Template.js +13 -13
  30. package/login/Template.js.map +1 -1
  31. package/login/UserProfileFormFields.js +43 -41
  32. package/login/UserProfileFormFields.js.map +1 -1
  33. package/login/i18n/baseMessages/ca.d.ts +1 -1
  34. package/login/i18n/baseMessages/ca.js +1 -1
  35. package/login/i18n/baseMessages/el.d.ts +0 -1
  36. package/login/i18n/baseMessages/el.js +0 -1
  37. package/login/i18n/baseMessages/el.js.map +1 -1
  38. package/login/i18n/baseMessages/en.d.ts +1 -1
  39. package/login/i18n/baseMessages/en.js +1 -1
  40. package/login/i18n/baseMessages/es.d.ts +1 -1
  41. package/login/i18n/baseMessages/es.js +1 -1
  42. package/login/i18n/baseMessages/fa.d.ts +0 -1
  43. package/login/i18n/baseMessages/fa.js +0 -1
  44. package/login/i18n/baseMessages/fa.js.map +1 -1
  45. package/login/i18n/baseMessages/hu.d.ts +1 -1
  46. package/login/i18n/baseMessages/hu.js +1 -1
  47. package/login/i18n/baseMessages/index.d.ts +1 -2
  48. package/login/i18n/baseMessages/zh-CN.d.ts +1 -1
  49. package/login/i18n/baseMessages/zh-CN.js +1 -1
  50. package/login/i18n/i18n.js +39 -31
  51. package/login/i18n/i18n.js.map +1 -1
  52. package/login/kcContext/KcContext.js.map +1 -1
  53. package/login/kcContext/createGetKcContext.js +30 -22
  54. package/login/kcContext/createGetKcContext.js.map +1 -1
  55. package/login/kcContext/getKcContext.js.map +1 -1
  56. package/login/kcContext/getKcContextFromWindow.d.ts +3 -1
  57. package/login/kcContext/getKcContextFromWindow.js.map +1 -1
  58. package/login/kcContext/kcContextMocks.js +233 -231
  59. package/login/kcContext/kcContextMocks.js.map +1 -1
  60. package/login/lib/useDownloadTerms.js.map +1 -1
  61. package/login/lib/useGetClassName.js +112 -112
  62. package/login/lib/useGetClassName.js.map +1 -1
  63. package/login/lib/useUserProfileForm.js +181 -181
  64. package/login/lib/useUserProfileForm.js.map +1 -1
  65. package/login/pages/DeleteAccountConfirm.js +5 -1
  66. package/login/pages/DeleteAccountConfirm.js.map +1 -1
  67. package/login/pages/FrontchannelLogout.js +1 -1
  68. package/login/pages/FrontchannelLogout.js.map +1 -1
  69. package/login/pages/Login.js.map +1 -1
  70. package/login/pages/LoginRecoveryAuthnCodeConfig.js +3 -3
  71. package/login/pages/LoginRecoveryAuthnCodeConfig.js.map +1 -1
  72. package/login/pages/LoginResetPassword.js.map +1 -1
  73. package/login/pages/LoginUsername.js.map +1 -1
  74. package/login/pages/WebauthnAuthenticate.js +11 -8
  75. package/login/pages/WebauthnAuthenticate.js.map +1 -1
  76. package/login/pages/WebauthnRegister.js +7 -7
  77. package/login/pages/WebauthnRegister.js.map +1 -1
  78. package/package.json +230 -226
  79. package/src/PUBLIC_URL.ts +4 -1
  80. package/src/account/Template.tsx +5 -5
  81. package/src/account/TemplateProps.ts +4 -1
  82. package/src/account/i18n/i18n.tsx +40 -30
  83. package/src/account/kcContext/KcContext.ts +4 -1
  84. package/src/account/kcContext/createGetKcContext.ts +48 -22
  85. package/src/account/kcContext/getKcContext.ts +3 -1
  86. package/src/account/kcContext/getKcContextFromWindow.ts +6 -2
  87. package/src/account/kcContext/kcContextMocks.ts +164 -160
  88. package/src/account/lib/useGetClassName.ts +15 -14
  89. package/src/account/pages/Account.tsx +2 -2
  90. package/src/account/pages/Password.tsx +8 -8
  91. package/src/account/pages/Totp.tsx +4 -6
  92. package/src/bin/copy-keycloak-resources-to-public.ts +2 -2
  93. package/src/bin/download-keycloak-default-theme.ts +30 -8
  94. package/src/bin/eject-page.ts +48 -11
  95. package/src/bin/initialize-email-theme.ts +25 -17
  96. package/src/bin/keycloakify/buildJars/buildJar.ts +179 -104
  97. package/src/bin/keycloakify/buildJars/buildJars.ts +35 -16
  98. package/src/bin/keycloakify/buildJars/extensionVersions.ts +2 -1
  99. package/src/bin/keycloakify/buildJars/generatePom.ts +11 -3
  100. package/src/bin/keycloakify/buildJars/getKeycloakVersionRangeForJar.ts +33 -8
  101. package/src/bin/keycloakify/generateFtl/generateFtl.ts +49 -12
  102. package/src/bin/keycloakify/generateSrcMainResources/bringInAccountV1.ts +29 -18
  103. package/src/bin/keycloakify/generateSrcMainResources/generateMessageProperties.ts +35 -12
  104. package/src/bin/keycloakify/generateSrcMainResources/generateSrcMainResources.ts +3 -1
  105. package/src/bin/keycloakify/generateSrcMainResources/generateSrcMainResourcesForMainTheme.ts +86 -41
  106. package/src/bin/keycloakify/generateSrcMainResources/generateSrcMainResourcesForThemeVariant.ts +39 -15
  107. package/src/bin/keycloakify/generateSrcMainResources/readExtraPageNames.ts +21 -7
  108. package/src/bin/keycloakify/generateSrcMainResources/readFieldNameUsage.ts +34 -7
  109. package/src/bin/keycloakify/generateStartKeycloakTestingContainer.ts +19 -5
  110. package/src/bin/keycloakify/keycloakify.ts +28 -9
  111. package/src/bin/keycloakify/replacers/replaceImportsInCssCode.ts +24 -5
  112. package/src/bin/keycloakify/replacers/replaceImportsInInlineCssCode.ts +6 -2
  113. package/src/bin/keycloakify/replacers/replaceImportsInJsCode/replaceImportsInJsCode.ts +6 -3
  114. package/src/bin/keycloakify/replacers/replaceImportsInJsCode/vite.ts +24 -6
  115. package/src/bin/keycloakify/replacers/replaceImportsInJsCode/webpack.ts +49 -11
  116. package/src/bin/main.ts +78 -41
  117. package/src/bin/shared/KeycloakVersionRange.ts +3 -1
  118. package/src/bin/shared/buildOptions.ts +70 -43
  119. package/src/bin/shared/constants.ts +4 -2
  120. package/src/bin/shared/copyKeycloakResourcesToPublic.ts +27 -13
  121. package/src/bin/shared/downloadKeycloakDefaultTheme.ts +161 -218
  122. package/src/bin/shared/downloadKeycloakStaticResources.ts +25 -21
  123. package/src/bin/shared/getJarFileBasename.ts +3 -1
  124. package/src/bin/shared/getThemeSrcDirPath.ts +5 -2
  125. package/src/bin/shared/metaInfKeycloakThemes.ts +35 -8
  126. package/src/bin/shared/promptKeycloakVersion.ts +33 -14
  127. package/src/bin/start-keycloak/index.ts +1 -0
  128. package/src/bin/start-keycloak/myrealm-realm-23.json +2142 -0
  129. package/src/bin/start-keycloak/myrealm-realm-24.json +2318 -0
  130. package/src/bin/start-keycloak/start-keycloak.ts +467 -0
  131. package/src/bin/tools/SemVer.ts +32 -13
  132. package/src/bin/tools/String.prototype.replaceAll.ts +9 -2
  133. package/src/bin/tools/crawl.ts +4 -1
  134. package/src/bin/tools/crc32.ts +42 -24
  135. package/src/bin/tools/downloadAndExtractArchive/downloadAndExtractArchive.ts +262 -0
  136. package/src/bin/tools/downloadAndExtractArchive/fetchProxyOptions.ts +96 -0
  137. package/src/bin/tools/downloadAndExtractArchive/index.ts +1 -0
  138. package/src/bin/tools/extractArchive.ts +120 -0
  139. package/src/bin/tools/fetchProxyOptions.ts +31 -8
  140. package/src/bin/tools/getAbsoluteAndInOsFormatPath.ts +10 -2
  141. package/src/bin/tools/getNpmWorkspaceRootDirPath.ts +18 -5
  142. package/src/bin/tools/octokit-addons/getLatestsSemVersionedTag.ts +8 -2
  143. package/src/bin/tools/octokit-addons/listTags.ts +15 -4
  144. package/src/bin/tools/partitionPromiseSettledResults.ts +12 -3
  145. package/src/bin/tools/readThisNpmPackageVersion.ts +5 -1
  146. package/src/bin/tools/transformCodebase.ts +29 -10
  147. package/src/bin/tools/trimIndent.ts +4 -1
  148. package/src/lib/isStorybook.ts +3 -1
  149. package/src/lib/useGetClassName.ts +12 -3
  150. package/src/login/Template.tsx +14 -14
  151. package/src/login/TemplateProps.ts +4 -1
  152. package/src/login/UserProfileFormFields.tsx +44 -42
  153. package/src/login/i18n/baseMessages/ca.ts +1 -1
  154. package/src/login/i18n/baseMessages/el.ts +0 -1
  155. package/src/login/i18n/baseMessages/en.ts +1 -1
  156. package/src/login/i18n/baseMessages/es.ts +1 -1
  157. package/src/login/i18n/baseMessages/fa.ts +0 -1
  158. package/src/login/i18n/baseMessages/hu.ts +1 -1
  159. package/src/login/i18n/baseMessages/zh-CN.ts +1 -1
  160. package/src/login/i18n/i18n.tsx +42 -32
  161. package/src/login/kcContext/KcContext.ts +8 -2
  162. package/src/login/kcContext/createGetKcContext.ts +84 -37
  163. package/src/login/kcContext/getKcContext.ts +3 -1
  164. package/src/login/kcContext/getKcContextFromWindow.ts +6 -2
  165. package/src/login/kcContext/kcContextMocks.ts +339 -325
  166. package/src/login/lib/useDownloadTerms.ts +6 -4
  167. package/src/login/lib/useGetClassName.ts +119 -112
  168. package/src/login/lib/useUserProfileForm.tsx +219 -205
  169. package/src/login/pages/DeleteAccountConfirm.tsx +9 -3
  170. package/src/login/pages/FrontchannelLogout.tsx +1 -1
  171. package/src/login/pages/Login.tsx +2 -2
  172. package/src/login/pages/LoginRecoveryAuthnCodeConfig.tsx +3 -3
  173. package/src/login/pages/LoginResetPassword.tsx +2 -2
  174. package/src/login/pages/LoginUsername.tsx +2 -2
  175. package/src/login/pages/WebauthnAuthenticate.tsx +11 -8
  176. package/src/login/pages/WebauthnRegister.tsx +7 -7
  177. package/src/tools/AndByDiscriminatingKey.ts +12 -6
  178. package/src/tools/Array.prototype.every.ts +4 -1
  179. package/src/tools/LazyOrNot.ts +3 -1
  180. package/src/tools/clsx.ts +7 -1
  181. package/src/tools/deepAssign.ts +15 -8
  182. package/src/tools/deepClone.ts +3 -1
  183. package/src/tools/formatNumber.ts +4 -1
  184. package/src/tools/useConstCallback.ts +3 -1
  185. package/src/tools/useInsertLinkTags.ts +20 -7
  186. package/src/tools/useInsertScriptTags.ts +7 -2
  187. package/src/tools/useSetClassName.ts +4 -1
  188. package/src/vite-plugin/vite-plugin.ts +45 -21
  189. package/tools/Array.prototype.every.js +2 -1
  190. package/tools/Array.prototype.every.js.map +1 -1
  191. package/tools/clsx.js.map +1 -1
  192. package/tools/deepAssign.js +9 -7
  193. package/tools/deepAssign.js.map +1 -1
  194. package/tools/deepClone.js.map +1 -1
  195. package/tools/formatNumber.js.map +1 -1
  196. package/tools/useConstCallback.js.map +1 -1
  197. package/tools/useInsertLinkTags.js +5 -4
  198. package/tools/useInsertLinkTags.js.map +1 -1
  199. package/tools/useInsertScriptTags.js +5 -2
  200. package/tools/useInsertScriptTags.js.map +1 -1
  201. package/tools/useSetClassName.js.map +1 -1
  202. package/vite-plugin/index.js +975 -1651
  203. package/src/bin/shared/downloadAndUnzip.ts +0 -203
  204. package/src/bin/start-keycloak.ts +0 -309
  205. package/src/bin/tools/unzip.ts +0 -141
@@ -1,5 +1,8 @@
1
1
  import { assert, type Equals } from "tsafe/assert";
2
- import type { KeycloakAccountV1Version, KeycloakThemeAdditionalInfoExtensionVersion } from "./extensionVersions";
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 { keycloakAccountV1Version, keycloakThemeAdditionalInfoExtensionVersion, doesImplementAccountTheme } = params;
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<Equals<typeof keycloakThemeAdditionalInfoExtensionVersion, never>>(false);
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<Equals<typeof keycloakThemeAdditionalInfoExtensionVersion, never>>(false);
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<Equals<typeof keycloakThemeAdditionalInfoExtensionVersion, never>>(false);
49
+ assert<
50
+ Equals<typeof keycloakThemeAdditionalInfoExtensionVersion, never>
51
+ >(false);
39
52
  }
40
53
  })();
41
54
 
42
- assert<Equals<typeof keycloakVersionRange, KeycloakVersionRange.WithAccountTheme | undefined>>();
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>>(false);
75
+ assert<Equals<typeof keycloakThemeAdditionalInfoExtensionVersion, never>>(
76
+ false
77
+ );
58
78
  })();
59
79
 
60
- assert<Equals<typeof keycloakVersionRange, KeycloakVersionRange.WithoutAccountTheme | undefined>>();
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 { type ThemeType, nameOfTheGlobal, basenameOfTheKeycloakifyResourcesDir, resources_common } from "../../shared/constants";
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 { themeName, cssGlobalsToDefine, indexHtmlCode, buildOptions, keycloakifyVersion, themeType, fieldNames } = params;
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({ jsCode, buildOptions });
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(`^${(buildOptions.urlPathname ?? "/").replace(/\//g, "\\/")}`),
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(getThisCodebaseRootDirPath(), "src", "bin", "keycloakify", "generateFtl", "ftl_object_to_js_code_declaring_an_object.ftl")
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("FIELD_NAMES_eKsIY4ZsZ4xeM", fieldNames.map(name => `"${name}"`).join(", "))
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 = '{ "x": "vIdLqMeOed9sdLdIdOxdK0d" }';
140
+ const ftlObjectToJsCodeDeclaringAnObjectPlaceholder =
141
+ '{ "x": "vIdLqMeOed9sdLdIdOxdK0d" }';
113
142
 
114
- $("head").prepend(`<script>\nwindow.${nameOfTheGlobal}=${ftlObjectToJsCodeDeclaringAnObjectPlaceholder}</script>`);
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.nextAll('meta[name="keycloakify-ignore-end"]').first();
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]: ftlObjectToJsCodeDeclaringAnObject,
150
- "PAGE_ID_xIgLsPgGId9D8e": pageId
151
- }).map(([searchValue, replaceValue]) => (ftlCode = ftlCode.replace(searchValue, replaceValue)));
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 { resources_common, lastKeycloakVersionWithAccountV1, accountV1ThemeName } from "../../shared/constants";
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 builtinKeycloakThemeTmpDirPath = pathJoin(buildOptions.cacheDirPath, "bringInAccountV1_tmp");
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(buildOptions.keycloakifyBuildDirPath, "src", "main", "resources", "theme", accountV1ThemeName, "account");
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
- "srcDirPath": pathJoin(builtinKeycloakThemeTmpDirPath, "base", "account"),
33
- "destDirPath": accountV1DirPath
40
+ srcDirPath: pathJoin(defaultThemeDirPath, "base", "account"),
41
+ destDirPath: accountV1DirPath
34
42
  });
35
43
 
36
44
  transformCodebase({
37
- "srcDirPath": pathJoin(builtinKeycloakThemeTmpDirPath, "keycloak", "account", "resources"),
38
- "destDirPath": pathJoin(accountV1DirPath, "resources")
45
+ srcDirPath: pathJoin(defaultThemeDirPath, "keycloak", "account", "resources"),
46
+ destDirPath: pathJoin(accountV1DirPath, "resources")
39
47
  });
40
48
 
41
49
  transformCodebase({
42
- "srcDirPath": pathJoin(builtinKeycloakThemeTmpDirPath, "keycloak", "common", "resources"),
43
- "destDirPath": pathJoin(accountV1DirPath, "resources", resources_common)
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
- ...["patternfly.min.css", "patternfly-additions.min.css", "patternfly-additions.min.css"].map(
62
- fileBasename => `${resources_common}/node_modules/patternfly/dist/css/${fileBasename}`
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
- "dirPath": pathJoin(themeSrcDirPath, themeType),
20
- "returnedPathsType": "absolute"
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 => readFileSync(file).toString("utf8").includes("createUseI18n"));
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
- "parser": {
47
- "parse": (code: string) => babelParser.parse(code, { "sourceType": "module", "plugins": ["typescript"] }),
48
- "generator": babelGenerate,
49
- "types": babelTypes
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
- "visitCallExpression": function (path) {
57
- if (path.node.callee.type === "Identifier" && path.node.callee.name === "createUseI18n") {
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: { [languageTag: string]: Record<string, string> } = {};
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
- "propertiesFileSource": ["# This file was generated by keycloakify", "", "parent=base", "", propertiesFileSource, ""].join("\n")
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 "\\u" + highSurrogate.toString(16).padStart(4, "0") + "\\u" + lowSurrogate.toString(16).padStart(4, "0");
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: { buildOptions: BuildOptionsLike }): Promise<void> {
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;
@@ -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 { writeMetaInfKeycloakThemes, type MetaInfKeycloakTheme } from "../../shared/metaInfKeycloakThemes";
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: { themeName: string; buildOptions: BuildOptionsLike }): Promise<void> {
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({ "reactAppRootDirPath": buildOptions.reactAppRootDirPath });
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(buildOptions.keycloakifyBuildDirPath, "src", "main", "resources", "theme", themeName, themeType);
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
- "login": false,
60
- "account": false,
61
- "email": false
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(themeTypeDirPath, "resources", basenameOfTheKeycloakifyResourcesDir);
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, { "recursive": true, "force": true });
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
- "srcDirPath": pathJoin(
103
+ srcDirPath: pathJoin(
84
104
  getThemeTypeDirPath({
85
- "themeType": "login"
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
- "srcDirPath": buildOptions.reactAppBuildDirPath,
117
+ srcDirPath: buildOptions.reactAppBuildDirPath,
98
118
  destDirPath,
99
- "transformSourceCode": ({ filePath, sourceCode }) => {
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
- "dirPath": pathJoin(buildOptions.reactAppBuildDirPath, keycloak_resources),
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 { cssGlobalsToDefine: cssGlobalsToDefineForThisFile, fixedCssCode } = replaceImportsInCssCode({
113
- "cssCode": sourceCode.toString("utf8")
135
+ const {
136
+ cssGlobalsToDefine: cssGlobalsToDefineForThisFile,
137
+ fixedCssCode
138
+ } = replaceImportsInCssCode({
139
+ cssCode: sourceCode.toString("utf8")
114
140
  });
115
141
 
116
- Object.entries(cssGlobalsToDefineForThisFile).forEach(([key, value]) => {
117
- cssGlobalsToDefine[key] = value;
118
- });
142
+ Object.entries(cssGlobalsToDefineForThisFile).forEach(
143
+ ([key, value]) => {
144
+ cssGlobalsToDefine[key] = value;
145
+ }
146
+ );
119
147
 
120
- return { "modifiedSourceCode": Buffer.from(fixedCssCode, "utf8") };
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
- "jsCode": sourceCode.toString("utf8"),
155
+ jsCode: sourceCode.toString("utf8"),
126
156
  buildOptions
127
157
  });
128
158
 
129
- return { "modifiedSourceCode": Buffer.from(fixedJsCode, "utf8") };
159
+ return {
160
+ modifiedSourceCode: Buffer.from(fixedJsCode, "utf8")
161
+ };
130
162
  }
131
163
 
132
- return { "modifiedSourceCode": sourceCode };
164
+ return { modifiedSourceCode: sourceCode };
133
165
  }
134
166
  });
135
167
  }
136
168
 
137
169
  const { generateFtlFilesCode } = generateFtlFilesCodeFactory({
138
170
  themeName,
139
- "indexHtmlCode": fs.readFileSync(pathJoin(buildOptions.reactAppBuildDirPath, "index.html")).toString("utf8"),
171
+ indexHtmlCode: fs
172
+ .readFileSync(pathJoin(buildOptions.reactAppBuildDirPath, "index.html"))
173
+ .toString("utf8"),
140
174
  cssGlobalsToDefine,
141
175
  buildOptions,
142
- "keycloakifyVersion": readThisNpmPackageVersion(),
176
+ keycloakifyVersion: readThisNpmPackageVersion(),
143
177
  themeType,
144
- "fieldNames": readFieldNameUsage({
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, { "recursive": true });
200
+ fs.mkdirSync(themeTypeDirPath, { recursive: true });
167
201
 
168
- fs.writeFileSync(pathJoin(themeTypeDirPath, pageId), Buffer.from(ftlCode, "utf8"));
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"), { "recursive": true });
214
+ fs.mkdirSync(pathJoin(themeTypeDirPath, "messages"), {
215
+ recursive: true
216
+ });
178
217
 
179
- const propertiesFilePath = pathJoin(messagesDirPath, `messages_${languageTag}.properties`);
218
+ const propertiesFilePath = pathJoin(
219
+ messagesDirPath,
220
+ `messages_${languageTag}.properties`
221
+ );
180
222
 
181
- fs.writeFileSync(propertiesFilePath, Buffer.from(propertiesFileSource, "utf8"));
223
+ fs.writeFileSync(
224
+ propertiesFilePath,
225
+ Buffer.from(propertiesFileSource, "utf8")
226
+ );
182
227
  });
183
228
 
184
229
  await downloadKeycloakStaticResources({
185
- "keycloakVersion": (() => {
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
- "themeDirPath": pathResolve(pathJoin(themeTypeDirPath, "..")),
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
- "srcDirPath": emailThemeSrcDirPath,
229
- "destDirPath": getThemeTypeDirPath({ "themeType": "email" })
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 = { "themes": [] };
285
+ const metaInfKeycloakThemes: MetaInfKeycloakTheme = { themes: [] };
241
286
 
242
287
  metaInfKeycloakThemes.themes.push({
243
- "name": themeName,
244
- "types": objectEntries(implementedThemeTypes)
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
- "name": accountV1ThemeName,
252
- "types": ["account"]
296
+ name: accountV1ThemeName,
297
+ types: ["account"]
253
298
  });
254
299
  }
255
300
 
256
301
  writeMetaInfKeycloakThemes({
257
- "keycloakifyBuildDirPath": buildOptions.keycloakifyBuildDirPath,
302
+ keycloakifyBuildDirPath: buildOptions.keycloakifyBuildDirPath,
258
303
  metaInfKeycloakThemes
259
304
  });
260
305
  }