keycloakify 10.1.3 → 11.0.0

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 (198) hide show
  1. package/account/KcContext/kcContextMocks.js +18 -6
  2. package/account/KcContext/kcContextMocks.js.map +1 -1
  3. package/account/Template.js +8 -26
  4. package/account/Template.js.map +1 -1
  5. package/account/Template.useInitialize.d.ts +12 -0
  6. package/account/Template.useInitialize.js +20 -0
  7. package/account/Template.useInitialize.js.map +1 -0
  8. package/account/i18n/index.d.ts +5 -5
  9. package/account/i18n/index.js +1 -1
  10. package/account/i18n/index.js.map +1 -1
  11. package/account/i18n/messages_defaultSet/types.d.ts +3 -0
  12. package/account/i18n/messages_defaultSet/types.js +26 -0
  13. package/account/i18n/messages_defaultSet/types.js.map +1 -0
  14. package/account/i18n/noJsx/GenericI18n_noJsx.d.ts +63 -0
  15. package/account/i18n/noJsx/GenericI18n_noJsx.js +2 -0
  16. package/account/i18n/noJsx/GenericI18n_noJsx.js.map +1 -0
  17. package/account/i18n/noJsx/getI18n.d.ts +41 -0
  18. package/account/i18n/noJsx/getI18n.js +207 -0
  19. package/account/i18n/noJsx/getI18n.js.map +1 -0
  20. package/account/i18n/noJsx/i18nBuilder.d.ts +18 -0
  21. package/account/i18n/noJsx/i18nBuilder.js +27 -0
  22. package/account/i18n/noJsx/i18nBuilder.js.map +1 -0
  23. package/account/i18n/noJsx/index.d.ts +3 -0
  24. package/account/i18n/noJsx/index.js +2 -0
  25. package/account/i18n/noJsx/index.js.map +1 -0
  26. package/account/i18n/withJsx/GenericI18n.d.ts +72 -0
  27. package/account/i18n/withJsx/GenericI18n.js +5 -0
  28. package/account/i18n/withJsx/GenericI18n.js.map +1 -0
  29. package/account/i18n/withJsx/i18nBuilder.d.ts +18 -0
  30. package/account/i18n/withJsx/i18nBuilder.js +27 -0
  31. package/account/i18n/withJsx/i18nBuilder.js.map +1 -0
  32. package/account/i18n/withJsx/index.d.ts +3 -0
  33. package/account/i18n/withJsx/index.js +2 -0
  34. package/account/i18n/withJsx/index.js.map +1 -0
  35. package/account/i18n/withJsx/useI18n.d.ts +27 -0
  36. package/account/i18n/{useI18n.js → withJsx/useI18n.js} +6 -4
  37. package/account/i18n/withJsx/useI18n.js.map +1 -0
  38. package/account/index.d.ts +1 -1
  39. package/account/index.js +1 -1
  40. package/account/index.js.map +1 -1
  41. package/account/pages/Totp.js +3 -2
  42. package/account/pages/Totp.js.map +1 -1
  43. package/bin/246.index.js +191 -191
  44. package/bin/499.index.js +252 -68
  45. package/bin/main.js +1 -1
  46. package/lib/kcSanitize/HtmlPolicyBuilder.d.ts +28 -0
  47. package/lib/kcSanitize/HtmlPolicyBuilder.js +209 -0
  48. package/lib/kcSanitize/HtmlPolicyBuilder.js.map +1 -0
  49. package/lib/kcSanitize/KcSanitizer.d.ts +12 -0
  50. package/lib/kcSanitize/KcSanitizer.js +46 -0
  51. package/lib/kcSanitize/KcSanitizer.js.map +1 -0
  52. package/lib/kcSanitize/KcSanitizerPolicy.d.ts +24 -0
  53. package/lib/kcSanitize/KcSanitizerPolicy.js +149 -0
  54. package/lib/kcSanitize/KcSanitizerPolicy.js.map +1 -0
  55. package/lib/kcSanitize/index.d.ts +1 -0
  56. package/lib/kcSanitize/index.js +5 -0
  57. package/lib/kcSanitize/index.js.map +1 -0
  58. package/login/KcContext/kcContextMocks.js +24 -6
  59. package/login/KcContext/kcContextMocks.js.map +1 -1
  60. package/login/Template.js +7 -7
  61. package/login/Template.js.map +1 -1
  62. package/login/{Template.useStylesAndScripts.d.ts → Template.useInitialize.d.ts} +1 -4
  63. package/login/{Template.useStylesAndScripts.js → Template.useInitialize.js} +5 -23
  64. package/login/Template.useInitialize.js.map +1 -0
  65. package/login/i18n/index.d.ts +5 -5
  66. package/login/i18n/index.js +1 -1
  67. package/login/i18n/index.js.map +1 -1
  68. package/login/i18n/messages_defaultSet/types.d.ts +3 -0
  69. package/login/i18n/messages_defaultSet/types.js +33 -0
  70. package/login/i18n/messages_defaultSet/types.js.map +1 -0
  71. package/login/i18n/noJsx/GenericI18n_noJsx.d.ts +63 -0
  72. package/login/i18n/noJsx/GenericI18n_noJsx.js +2 -0
  73. package/login/i18n/noJsx/GenericI18n_noJsx.js.map +1 -0
  74. package/login/i18n/noJsx/getI18n.d.ts +41 -0
  75. package/login/i18n/noJsx/getI18n.js +207 -0
  76. package/login/i18n/noJsx/getI18n.js.map +1 -0
  77. package/login/i18n/noJsx/i18nBuilder.d.ts +18 -0
  78. package/login/i18n/noJsx/i18nBuilder.js +27 -0
  79. package/login/i18n/noJsx/i18nBuilder.js.map +1 -0
  80. package/login/i18n/noJsx/index.d.ts +3 -0
  81. package/login/i18n/noJsx/index.js +2 -0
  82. package/login/i18n/noJsx/index.js.map +1 -0
  83. package/login/i18n/withJsx/GenericI18n.d.ts +72 -0
  84. package/login/i18n/withJsx/GenericI18n.js +5 -0
  85. package/login/i18n/withJsx/GenericI18n.js.map +1 -0
  86. package/login/i18n/withJsx/i18nBuilder.d.ts +18 -0
  87. package/login/i18n/withJsx/i18nBuilder.js +27 -0
  88. package/login/i18n/withJsx/i18nBuilder.js.map +1 -0
  89. package/login/i18n/withJsx/index.d.ts +3 -0
  90. package/login/i18n/withJsx/index.js +2 -0
  91. package/login/i18n/withJsx/index.js.map +1 -0
  92. package/login/i18n/withJsx/useI18n.d.ts +27 -0
  93. package/login/i18n/{useI18n.js → withJsx/useI18n.js} +6 -4
  94. package/login/i18n/withJsx/useI18n.js.map +1 -0
  95. package/login/index.d.ts +1 -1
  96. package/login/index.js +1 -1
  97. package/login/index.js.map +1 -1
  98. package/login/lib/useUserProfileForm.d.ts +1 -1
  99. package/login/lib/useUserProfileForm.js +2 -1
  100. package/login/lib/useUserProfileForm.js.map +1 -1
  101. package/login/pages/Error.js +2 -1
  102. package/login/pages/Error.js.map +1 -1
  103. package/login/pages/Info.js +4 -3
  104. package/login/pages/Info.js.map +1 -1
  105. package/login/pages/Login.js +4 -3
  106. package/login/pages/Login.js.map +1 -1
  107. package/login/pages/LoginConfigTotp.js +3 -2
  108. package/login/pages/LoginConfigTotp.js.map +1 -1
  109. package/login/pages/LoginOtp.js +2 -1
  110. package/login/pages/LoginOtp.js.map +1 -1
  111. package/login/pages/LoginPassword.js +2 -1
  112. package/login/pages/LoginPassword.js.map +1 -1
  113. package/login/pages/LoginRecoveryAuthnCodeInput.js +2 -1
  114. package/login/pages/LoginRecoveryAuthnCodeInput.js.map +1 -1
  115. package/login/pages/LoginResetPassword.js +2 -1
  116. package/login/pages/LoginResetPassword.js.map +1 -1
  117. package/login/pages/LoginUpdatePassword.js +3 -2
  118. package/login/pages/LoginUpdatePassword.js.map +1 -1
  119. package/login/pages/Register.js +2 -1
  120. package/login/pages/Register.js.map +1 -1
  121. package/package.json +110 -31
  122. package/src/account/KcContext/kcContextMocks.ts +49 -29
  123. package/src/account/Template.tsx +11 -32
  124. package/src/account/Template.useInitialize.ts +35 -0
  125. package/src/account/i18n/index.ts +5 -5
  126. package/src/account/i18n/messages_defaultSet/types.ts +30 -0
  127. package/src/account/i18n/noJsx/GenericI18n_noJsx.ts +64 -0
  128. package/src/account/i18n/noJsx/getI18n.tsx +341 -0
  129. package/src/account/i18n/noJsx/i18nBuilder.ts +117 -0
  130. package/src/account/i18n/noJsx/index.ts +3 -0
  131. package/src/account/i18n/withJsx/GenericI18n.tsx +81 -0
  132. package/src/account/i18n/withJsx/i18nBuilder.ts +117 -0
  133. package/src/account/i18n/withJsx/index.ts +3 -0
  134. package/src/{login/i18n → account/i18n/withJsx}/useI18n.tsx +43 -11
  135. package/src/account/index.ts +1 -1
  136. package/src/account/pages/Totp.tsx +3 -2
  137. package/src/bin/initialize-account-theme/src/multi-page/i18n.ts +10 -3
  138. package/src/bin/keycloakify/generateFtl/kcContextDeclarationTemplate.ftl +15 -0
  139. package/src/bin/keycloakify/generateResources/generateMessageProperties.ts +371 -121
  140. package/src/bin/keycloakify/generateResources/generateResources.ts +8 -6
  141. package/src/bin/keycloakify/generateResources/generateResourcesForMainTheme.ts +61 -29
  142. package/src/bin/keycloakify/generateResources/generateResourcesForThemeVariant.ts +15 -9
  143. package/src/lib/kcSanitize/HtmlPolicyBuilder.ts +252 -0
  144. package/src/lib/kcSanitize/KcSanitizer.ts +60 -0
  145. package/src/lib/kcSanitize/KcSanitizerPolicy.ts +294 -0
  146. package/src/lib/kcSanitize/index.ts +5 -0
  147. package/src/login/KcContext/kcContextMocks.ts +54 -29
  148. package/src/login/Template.tsx +11 -17
  149. package/src/login/{Template.useStylesAndScripts.ts → Template.useInitialize.ts} +5 -29
  150. package/src/login/i18n/index.ts +5 -5
  151. package/src/login/i18n/messages_defaultSet/types.ts +37 -0
  152. package/src/login/i18n/noJsx/GenericI18n_noJsx.ts +64 -0
  153. package/src/login/i18n/noJsx/getI18n.tsx +341 -0
  154. package/src/login/i18n/noJsx/i18nBuilder.ts +117 -0
  155. package/src/login/i18n/noJsx/index.ts +3 -0
  156. package/src/login/i18n/withJsx/GenericI18n.tsx +81 -0
  157. package/src/login/i18n/withJsx/i18nBuilder.ts +117 -0
  158. package/src/login/i18n/withJsx/index.ts +3 -0
  159. package/src/{account/i18n → login/i18n/withJsx}/useI18n.tsx +43 -11
  160. package/src/login/index.ts +1 -1
  161. package/src/login/lib/useUserProfileForm.tsx +3 -2
  162. package/src/login/pages/Error.tsx +2 -1
  163. package/src/login/pages/Info.tsx +13 -10
  164. package/src/login/pages/Login.tsx +4 -3
  165. package/src/login/pages/LoginConfigTotp.tsx +3 -2
  166. package/src/login/pages/LoginOtp.tsx +2 -1
  167. package/src/login/pages/LoginPassword.tsx +2 -1
  168. package/src/login/pages/LoginRecoveryAuthnCodeInput.tsx +2 -1
  169. package/src/login/pages/LoginResetPassword.tsx +2 -1
  170. package/src/login/pages/LoginUpdatePassword.tsx +3 -2
  171. package/src/login/pages/Register.tsx +2 -1
  172. package/src/tools/useInsertScriptTags.ts +1 -1
  173. package/src/tools/vendor/dompurify.ts +3 -0
  174. package/stories/intro/intro.stories.tsx +0 -1
  175. package/tools/useInsertScriptTags.d.ts +1 -1
  176. package/tools/vendor/dompurify.d.ts +2 -0
  177. package/tools/vendor/dompurify.js +2 -0
  178. package/account/i18n/GenericI18n.d.ts +0 -6
  179. package/account/i18n/GenericI18n.js +0 -2
  180. package/account/i18n/GenericI18n.js.map +0 -1
  181. package/account/i18n/i18n.d.ts +0 -87
  182. package/account/i18n/i18n.js +0 -111
  183. package/account/i18n/i18n.js.map +0 -1
  184. package/account/i18n/useI18n.d.ts +0 -14
  185. package/account/i18n/useI18n.js.map +0 -1
  186. package/login/Template.useStylesAndScripts.js.map +0 -1
  187. package/login/i18n/GenericI18n.d.ts +0 -6
  188. package/login/i18n/GenericI18n.js +0 -2
  189. package/login/i18n/GenericI18n.js.map +0 -1
  190. package/login/i18n/i18n.d.ts +0 -87
  191. package/login/i18n/i18n.js +0 -113
  192. package/login/i18n/i18n.js.map +0 -1
  193. package/login/i18n/useI18n.d.ts +0 -14
  194. package/login/i18n/useI18n.js.map +0 -1
  195. package/src/account/i18n/GenericI18n.tsx +0 -6
  196. package/src/account/i18n/i18n.tsx +0 -250
  197. package/src/login/i18n/GenericI18n.tsx +0 -6
  198. package/src/login/i18n/i18n.tsx +0 -252
package/bin/499.index.js CHANGED
@@ -19,12 +19,13 @@ exports.modules = {
19
19
  /* harmony import */ var _babel_generator__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(92332);
20
20
  /* harmony import */ var _babel_types__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(7912);
21
21
  /* harmony import */ var _babel_types__WEBPACK_IMPORTED_MODULE_7___default = /*#__PURE__*/__webpack_require__.n(_babel_types__WEBPACK_IMPORTED_MODULE_7__);
22
- /* harmony import */ var _tools_escapeStringForPropertiesFile__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(27190);
22
+ /* harmony import */ var _tools_escapeStringForPropertiesFile__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(27190);
23
23
  /* harmony import */ var _tools_getThisCodebaseRootDirPath__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(58822);
24
24
  /* harmony import */ var fs__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(57147);
25
25
  /* harmony import */ var fs__WEBPACK_IMPORTED_MODULE_9___default = /*#__PURE__*/__webpack_require__.n(fs__WEBPACK_IMPORTED_MODULE_9__);
26
26
  /* harmony import */ var tsafe_assert__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(88078);
27
27
  /* harmony import */ var tsafe_assert__WEBPACK_IMPORTED_MODULE_10___default = /*#__PURE__*/__webpack_require__.n(tsafe_assert__WEBPACK_IMPORTED_MODULE_10__);
28
+ /* harmony import */ var _tools_getAbsoluteAndInOsFormatPath__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(84794);
28
29
 
29
30
 
30
31
 
@@ -37,19 +38,19 @@ exports.modules = {
37
38
 
38
39
 
39
40
 
41
+
42
+ (0,tsafe_assert__WEBPACK_IMPORTED_MODULE_10__.assert)();
40
43
  function generateMessageProperties(params) {
41
- const { themeSrcDirPath, themeType } = params;
44
+ const { buildContext, themeType } = params;
42
45
  const baseMessagesDirPath = (0,path__WEBPACK_IMPORTED_MODULE_2__.join)((0,_tools_getThisCodebaseRootDirPath__WEBPACK_IMPORTED_MODULE_8__/* .getThisCodebaseRootDirPath */ .e)(), "src", themeType, "i18n", "messages_defaultSet");
43
- const baseMessageBundle = Object.fromEntries(fs__WEBPACK_IMPORTED_MODULE_9__.readdirSync(baseMessagesDirPath)
44
- .filter(baseName => baseName !== "index.ts")
46
+ const messages_defaultSet_by_languageTag_defaultSet = Object.fromEntries(fs__WEBPACK_IMPORTED_MODULE_9__.readdirSync(baseMessagesDirPath)
47
+ .filter(basename => basename !== "index.ts" && basename !== "types.ts")
45
48
  .map(basename => ({
46
49
  languageTag: basename.replace(/\.ts$/, ""),
47
50
  filePath: (0,path__WEBPACK_IMPORTED_MODULE_2__.join)(baseMessagesDirPath, basename)
48
51
  }))
49
52
  .map(({ languageTag, filePath }) => {
50
- const lines = fs__WEBPACK_IMPORTED_MODULE_9__.readFileSync(filePath)
51
- .toString("utf8")
52
- .split(/\r?\n/);
53
+ const lines = fs__WEBPACK_IMPORTED_MODULE_9__.readFileSync(filePath).toString("utf8").split(/\r?\n/);
53
54
  let messagesJson = "{";
54
55
  let isInDeclaration = false;
55
56
  for (const line of lines) {
@@ -70,7 +71,7 @@ function generateMessageProperties(params) {
70
71
  }));
71
72
  const { i18nTsFilePath } = (() => {
72
73
  let files = (0,_tools_crawl__WEBPACK_IMPORTED_MODULE_1__/* .crawl */ .J)({
73
- dirPath: (0,path__WEBPACK_IMPORTED_MODULE_2__.join)(themeSrcDirPath, themeType),
74
+ dirPath: (0,path__WEBPACK_IMPORTED_MODULE_2__.join)(buildContext.themeSrcDirPath, themeType),
74
75
  returnedPathsType: "absolute"
75
76
  });
76
77
  files = files.filter(file => {
@@ -84,72 +85,231 @@ function generateMessageProperties(params) {
84
85
  return aIsI18nFile === bIsI18nFile ? 0 : aIsI18nFile ? -1 : 1;
85
86
  });
86
87
  files = files.sort((a, b) => a.length - b.length);
87
- files = files.filter(file => fs__WEBPACK_IMPORTED_MODULE_9__.readFileSync(file).toString("utf8").includes("createUseI18n("));
88
+ files = files.filter(file => fs__WEBPACK_IMPORTED_MODULE_9__.readFileSync(file).toString("utf8").includes("i18nBuilder"));
88
89
  const i18nTsFilePath = files[0];
89
90
  return { i18nTsFilePath };
90
91
  })();
91
- const messageBundle = (() => {
92
+ const i18nTsRoot = (() => {
92
93
  if (i18nTsFilePath === undefined) {
93
94
  return undefined;
94
95
  }
95
- const root = recast__WEBPACK_IMPORTED_MODULE_4__/* .parse */ .Qc(fs__WEBPACK_IMPORTED_MODULE_9__.readFileSync(i18nTsFilePath).toString("utf8"), {
96
- parser: {
97
- parse: (code) => _babel_parser__WEBPACK_IMPORTED_MODULE_5__/* .parse */ .Qc(code, {
98
- sourceType: "module",
99
- plugins: ["typescript"]
100
- }),
101
- generator: _babel_generator__WEBPACK_IMPORTED_MODULE_6__/* ["default"] */ .ZP,
102
- types: _babel_types__WEBPACK_IMPORTED_MODULE_7__
96
+ const root = recastParseTs(i18nTsFilePath);
97
+ return root;
98
+ })();
99
+ const messages_defaultSet_by_languageTag_notInDefaultSet = (() => {
100
+ if (i18nTsRoot === undefined) {
101
+ return undefined;
102
+ }
103
+ let extraLanguageEntryByLanguageTag = {};
104
+ recast__WEBPACK_IMPORTED_MODULE_4__/* .visit */ .Vn(i18nTsRoot, {
105
+ visitCallExpression: function (path) {
106
+ const node = path.node;
107
+ // Check if the callee is a MemberExpression with property 'withExtraLanguages'
108
+ if (node.callee.type === "MemberExpression" &&
109
+ node.callee.property.type === "Identifier" &&
110
+ node.callee.property.name === "withExtraLanguages") {
111
+ const arg = node.arguments[0];
112
+ if (arg && arg.type === "ObjectExpression") {
113
+ // Iterate over the properties of the object
114
+ arg.properties.forEach(prop => {
115
+ if (prop.type === "ObjectProperty" &&
116
+ prop.key.type === "Identifier") {
117
+ const lang = prop.key.name;
118
+ const value = prop.value;
119
+ if (value.type === "ObjectExpression") {
120
+ let label = undefined;
121
+ let pathStr = undefined;
122
+ // Iterate over the properties of the language object
123
+ value.properties.forEach(p => {
124
+ if (p.type === "ObjectProperty" &&
125
+ p.key.type === "Identifier") {
126
+ if (p.key.name === "label" &&
127
+ p.value.type === "StringLiteral") {
128
+ label = p.value.value;
129
+ }
130
+ if (p.key.name === "getMessages" &&
131
+ (p.value.type ===
132
+ "ArrowFunctionExpression" ||
133
+ p.value.type === "FunctionExpression")) {
134
+ // Extract the import path from the function body
135
+ const body = p.value.body;
136
+ if (body.type === "CallExpression" &&
137
+ body.callee.type === "Import") {
138
+ const importArg = body.arguments[0];
139
+ if (importArg.type === "StringLiteral") {
140
+ pathStr = importArg.value;
141
+ }
142
+ }
143
+ else if (body.type === "BlockStatement") {
144
+ // If the function body is a block (e.g., function with braces {})
145
+ // Look for return statement
146
+ body.body.forEach(statement => {
147
+ if (statement.type ===
148
+ "ReturnStatement" &&
149
+ statement.argument &&
150
+ statement.argument.type ===
151
+ "CallExpression" &&
152
+ statement.argument.callee
153
+ .type === "Import") {
154
+ const importArg = statement.argument
155
+ .arguments[0];
156
+ if (importArg.type ===
157
+ "StringLiteral") {
158
+ pathStr = importArg.value;
159
+ }
160
+ }
161
+ });
162
+ }
163
+ }
164
+ }
165
+ });
166
+ if (label && pathStr) {
167
+ extraLanguageEntryByLanguageTag[lang] = {
168
+ label,
169
+ path: pathStr
170
+ };
171
+ }
172
+ }
173
+ }
174
+ });
175
+ }
176
+ return false; // Stop traversing this path
177
+ }
178
+ this.traverse(path); // Continue traversing other paths
103
179
  }
104
180
  });
105
- let messageBundleDeclarationTsCode = undefined;
106
- recast__WEBPACK_IMPORTED_MODULE_4__/* .visit */ .Vn(root, {
181
+ const messages_defaultSet_by_languageTag_notInDefaultSet = Object.fromEntries(Object.entries(extraLanguageEntryByLanguageTag).map(([languageTag, { path: relativePathWithoutExt }]) => [
182
+ languageTag,
183
+ (() => {
184
+ const filePath = (0,_tools_getAbsoluteAndInOsFormatPath__WEBPACK_IMPORTED_MODULE_11__/* .getAbsoluteAndInOsFormatPath */ .c)({
185
+ pathIsh: relativePathWithoutExt.endsWith(".ts")
186
+ ? relativePathWithoutExt
187
+ : `${relativePathWithoutExt}.ts`,
188
+ cwd: (0,path__WEBPACK_IMPORTED_MODULE_2__.dirname)(i18nTsFilePath)
189
+ });
190
+ const root = recastParseTs(filePath);
191
+ let declarationCode = "";
192
+ recast__WEBPACK_IMPORTED_MODULE_4__/* .visit */ .Vn(root, {
193
+ visitVariableDeclarator: function (path) {
194
+ const node = path.node;
195
+ // Check if the variable name is 'messages'
196
+ if (node.id.type === "Identifier" &&
197
+ node.id.name === "messages") {
198
+ // Ensure there is an initializer
199
+ if (node.init) {
200
+ // Generate code from the initializer, preserving comments
201
+ declarationCode = recast__WEBPACK_IMPORTED_MODULE_4__/* .print */ .S0(node.init)
202
+ .code.replace(/}.*$/, "}");
203
+ }
204
+ return false; // Stop traversing this path
205
+ }
206
+ this.traverse(path); // Continue traversing other paths
207
+ }
208
+ });
209
+ (0,tsafe_assert__WEBPACK_IMPORTED_MODULE_10__.assert)(declarationCode !== undefined, `${filePath} does not contain a 'messages' variable declaration`);
210
+ let messages = {};
211
+ try {
212
+ eval(`${(0,tsafe_symToStr__WEBPACK_IMPORTED_MODULE_3__/* .symToStr */ .r)({ messages })} = ${declarationCode};`);
213
+ }
214
+ catch (_a) {
215
+ throw new Error(`The declaration of 'message' in ${filePath} cannot be statically evaluated: ${declarationCode}`);
216
+ }
217
+ return messages;
218
+ })()
219
+ ]));
220
+ return messages_defaultSet_by_languageTag_notInDefaultSet;
221
+ })();
222
+ const messages_defaultSet_by_languageTag = Object.assign(Object.assign({}, messages_defaultSet_by_languageTag_defaultSet), messages_defaultSet_by_languageTag_notInDefaultSet);
223
+ const messages_themeDefined_by_languageTag = (() => {
224
+ if (i18nTsRoot === undefined) {
225
+ return undefined;
226
+ }
227
+ let firstArgumentCode = undefined;
228
+ recast__WEBPACK_IMPORTED_MODULE_4__/* .visit */ .Vn(i18nTsRoot, {
107
229
  visitCallExpression: function (path) {
108
- if (path.node.callee.type === "Identifier" &&
109
- path.node.callee.name === "createUseI18n") {
110
- messageBundleDeclarationTsCode = (0,_babel_generator__WEBPACK_IMPORTED_MODULE_6__/* ["default"] */ .ZP)(path.node.arguments[0]).code;
230
+ const node = path.node;
231
+ if (node.callee.type === "MemberExpression" &&
232
+ node.callee.property.type === "Identifier" &&
233
+ node.callee.property.name === "withCustomTranslations") {
234
+ firstArgumentCode = (0,_babel_generator__WEBPACK_IMPORTED_MODULE_6__/* ["default"] */ .ZP)(node.arguments[0]).code;
111
235
  return false;
112
236
  }
113
237
  this.traverse(path);
114
238
  }
115
239
  });
116
- (0,tsafe_assert__WEBPACK_IMPORTED_MODULE_10__.assert)(messageBundleDeclarationTsCode !== undefined);
117
- let messageBundle = {};
240
+ if (firstArgumentCode === undefined) {
241
+ return undefined;
242
+ }
243
+ let messages_themeDefined_by_languageTag = {};
118
244
  try {
119
- eval(`${(0,tsafe_symToStr__WEBPACK_IMPORTED_MODULE_3__/* .symToStr */ .r)({ messageBundle })} = ${messageBundleDeclarationTsCode}`);
245
+ eval(`${(0,tsafe_symToStr__WEBPACK_IMPORTED_MODULE_3__/* .symToStr */ .r)({ messages_themeDefined_by_languageTag })} = ${firstArgumentCode}`);
120
246
  }
121
247
  catch (_a) {
122
248
  console.warn([
123
- "WARNING: Make sure the messageBundle your provided as argument of createUseI18n can be statically evaluated.",
124
- "This is important because we need to put your i18n messages in messages_*.properties files",
125
- "or they won't be available server side.",
126
- "\n",
127
- "The following code could not be evaluated:",
128
- "\n",
129
- messageBundleDeclarationTsCode
249
+ "WARNING: The argument of withCustomTranslations can't be statically evaluated!",
250
+ "This needs to be fixed refer to the documentation: https://docs.keycloakify.dev/i18n",
251
+ firstArgumentCode
130
252
  ].join(" "));
253
+ return undefined;
131
254
  }
132
- return messageBundle;
255
+ return messages_themeDefined_by_languageTag;
133
256
  })();
134
- const mergedMessageBundle = Object.fromEntries(Object.entries(baseMessageBundle).map(([languageTag, messages]) => {
135
- var _a, _b, _c;
136
- return [
137
- languageTag,
138
- Object.assign(Object.assign({}, messages), (messageBundle === undefined
139
- ? {}
140
- : (_c = (_b = (_a = messageBundle[languageTag]) !== null && _a !== void 0 ? _a : messageBundle[_shared_constants__WEBPACK_IMPORTED_MODULE_0__/* .FALLBACK_LANGUAGE_TAG */ ._L]) !== null && _b !== void 0 ? _b : messageBundle[Object.keys(messageBundle)[0]]) !== null && _c !== void 0 ? _c : {}))
141
- ];
142
- }));
143
- const messageProperties = Object.entries(mergedMessageBundle).map(([languageTag, messages]) => ({
144
- languageTag,
145
- propertiesFileSource: [
146
- "",
147
- ...(themeType !== "account" ? ["parent=base"] : []),
148
- ...Object.entries(messages).map(([key, value]) => `${key}=${(0,_tools_escapeStringForPropertiesFile__WEBPACK_IMPORTED_MODULE_11__/* .escapeStringForPropertiesFile */ .y)(value)}`),
149
- ""
150
- ].join("\n")
151
- }));
152
- return messageProperties;
257
+ const languageTags = Object.keys(messages_defaultSet_by_languageTag);
258
+ return {
259
+ languageTags,
260
+ writeMessagePropertiesFiles: ({ messageDirPath, themeName }) => {
261
+ for (const languageTag of languageTags) {
262
+ const messages = Object.assign({}, messages_defaultSet_by_languageTag[languageTag]);
263
+ add_theme_defined_messages: {
264
+ if (messages_themeDefined_by_languageTag === undefined) {
265
+ break add_theme_defined_messages;
266
+ }
267
+ let messages_themeDefined = messages_themeDefined_by_languageTag[languageTag];
268
+ if (messages_themeDefined === undefined) {
269
+ messages_themeDefined =
270
+ messages_themeDefined_by_languageTag[_shared_constants__WEBPACK_IMPORTED_MODULE_0__/* .FALLBACK_LANGUAGE_TAG */ ._L];
271
+ }
272
+ if (messages_themeDefined === undefined) {
273
+ messages_themeDefined =
274
+ messages_themeDefined_by_languageTag[Object.keys(messages_themeDefined_by_languageTag)[0]];
275
+ }
276
+ if (messages_themeDefined === undefined) {
277
+ break add_theme_defined_messages;
278
+ }
279
+ for (const [key, messageOrMessageByThemeName] of Object.entries(messages_themeDefined)) {
280
+ const message = (() => {
281
+ if (typeof messageOrMessageByThemeName === "string") {
282
+ return messageOrMessageByThemeName;
283
+ }
284
+ const message = messageOrMessageByThemeName[themeName];
285
+ (0,tsafe_assert__WEBPACK_IMPORTED_MODULE_10__.assert)(message !== undefined);
286
+ return message;
287
+ })();
288
+ messages[key] = message;
289
+ }
290
+ }
291
+ const propertiesFileSource = [
292
+ "",
293
+ ...Object.entries(messages).map(([key, value]) => `${key}=${(0,_tools_escapeStringForPropertiesFile__WEBPACK_IMPORTED_MODULE_12__/* .escapeStringForPropertiesFile */ .y)(value)}`),
294
+ ""
295
+ ].join("\n");
296
+ fs__WEBPACK_IMPORTED_MODULE_9__.mkdirSync(messageDirPath, { recursive: true });
297
+ fs__WEBPACK_IMPORTED_MODULE_9__.writeFileSync((0,path__WEBPACK_IMPORTED_MODULE_2__.join)(messageDirPath, `messages_${languageTag}.properties`), Buffer.from(propertiesFileSource, "utf8"));
298
+ }
299
+ }
300
+ };
301
+ }
302
+ function recastParseTs(filePath) {
303
+ return recast__WEBPACK_IMPORTED_MODULE_4__/* .parse */ .Qc(fs__WEBPACK_IMPORTED_MODULE_9__.readFileSync(filePath).toString("utf8"), {
304
+ parser: {
305
+ parse: (code) => _babel_parser__WEBPACK_IMPORTED_MODULE_5__/* .parse */ .Qc(code, {
306
+ sourceType: "module",
307
+ plugins: ["typescript"]
308
+ }),
309
+ generator: _babel_generator__WEBPACK_IMPORTED_MODULE_6__/* ["default"] */ .ZP,
310
+ types: _babel_types__WEBPACK_IMPORTED_MODULE_7__
311
+ }
312
+ });
153
313
  }
154
314
  //# sourceMappingURL=generateMessageProperties.js.map
155
315
 
@@ -652,6 +812,7 @@ async function generateResourcesForMainTheme(params) {
652
812
  const { themeType } = params;
653
813
  return (0,external_path_.join)(resourcesDirPath, "theme", themeName, themeType);
654
814
  };
815
+ const writeMessagePropertiesFilesByThemeType = {};
655
816
  for (const themeType of ["login", "account"]) {
656
817
  if (!buildContext.implementedThemeTypes[themeType].isImplemented) {
657
818
  continue;
@@ -746,20 +907,22 @@ async function generateResourcesForMainTheme(params) {
746
907
  const { ftlCode } = generateFtlFilesCode({ pageId });
747
908
  external_fs_.writeFileSync((0,external_path_.join)(themeTypeDirPath, pageId), Buffer.from(ftlCode, "utf8"));
748
909
  });
910
+ let languageTags = undefined;
749
911
  i18n_messages_generation: {
750
912
  if (isForAccountSpa) {
751
913
  break i18n_messages_generation;
752
914
  }
753
- (0,generateMessageProperties/* generateMessageProperties */.k)({
754
- themeSrcDirPath: buildContext.themeSrcDirPath,
915
+ const wrap = (0,generateMessageProperties/* generateMessageProperties */.k)({
916
+ buildContext,
755
917
  themeType
756
- }).forEach(({ languageTag, propertiesFileSource }) => {
757
- const messagesDirPath = (0,external_path_.join)(themeTypeDirPath, "messages");
758
- external_fs_.mkdirSync((0,external_path_.join)(themeTypeDirPath, "messages"), {
759
- recursive: true
760
- });
761
- const propertiesFilePath = (0,external_path_.join)(messagesDirPath, `messages_${languageTag}.properties`);
762
- external_fs_.writeFileSync(propertiesFilePath, Buffer.from(propertiesFileSource, "utf8"));
918
+ });
919
+ languageTags = wrap.languageTags;
920
+ const { writeMessagePropertiesFiles } = wrap;
921
+ writeMessagePropertiesFilesByThemeType[themeType] =
922
+ writeMessagePropertiesFiles;
923
+ writeMessagePropertiesFiles({
924
+ messageDirPath: (0,external_path_.join)(themeTypeDirPath, "messages"),
925
+ themeName
763
926
  });
764
927
  }
765
928
  bring_in_account_v3_i18n_messages: {
@@ -804,7 +967,10 @@ async function generateResourcesForMainTheme(params) {
804
967
  })()}`,
805
968
  ...(isForAccountSpa ? ["deprecatedMode=false"] : []),
806
969
  ...((_a = buildContext.extraThemeProperties) !== null && _a !== void 0 ? _a : []),
807
- ...buildContext.environmentVariables.map(({ name, default: defaultValue }) => `${name}=\${env.${name}:${(0,escapeStringForPropertiesFile/* escapeStringForPropertiesFile */.y)(defaultValue)}}`)
970
+ ...buildContext.environmentVariables.map(({ name, default: defaultValue }) => `${name}=\${env.${name}:${(0,escapeStringForPropertiesFile/* escapeStringForPropertiesFile */.y)(defaultValue)}}`),
971
+ ...(languageTags === undefined
972
+ ? []
973
+ : [`locales=${languageTags.join(",")}`])
808
974
  ].join("\n\n"), "utf8"));
809
975
  }
810
976
  email: {
@@ -848,6 +1014,19 @@ async function generateResourcesForMainTheme(params) {
848
1014
  getNewMetaInfKeycloakTheme: () => metaInfKeycloakThemes
849
1015
  });
850
1016
  }
1017
+ return {
1018
+ writeMessagePropertiesFilesForThemeVariant: ({ getMessageDirPath, themeName }) => {
1019
+ (0,objectEntries.objectEntries)(writeMessagePropertiesFilesByThemeType).forEach(([themeType, writeMessagePropertiesFiles]) => {
1020
+ if (writeMessagePropertiesFiles === undefined) {
1021
+ return;
1022
+ }
1023
+ writeMessagePropertiesFiles({
1024
+ messageDirPath: getMessageDirPath({ themeType }),
1025
+ themeName
1026
+ });
1027
+ });
1028
+ }
1029
+ };
851
1030
  }
852
1031
  //# sourceMappingURL=generateResourcesForMainTheme.js.map
853
1032
  ;// CONCATENATED MODULE: ./dist/bin/keycloakify/generateResources/generateResourcesForThemeVariant.js
@@ -855,13 +1034,13 @@ async function generateResourcesForMainTheme(params) {
855
1034
 
856
1035
 
857
1036
 
858
- (0,assert.assert)();
859
1037
  function generateResourcesForThemeVariant(params) {
860
- const { resourcesDirPath, themeName, themeVariantName } = params;
1038
+ const { resourcesDirPath, themeName, themeVariantName, writeMessagePropertiesFiles } = params;
861
1039
  const mainThemeDirPath = (0,external_path_.join)(resourcesDirPath, "theme", themeName);
1040
+ const themeVariantDirPath = (0,external_path_.join)(mainThemeDirPath, "..", themeVariantName);
862
1041
  (0,transformCodebase/* transformCodebase */.N)({
863
1042
  srcDirPath: mainThemeDirPath,
864
- destDirPath: (0,external_path_.join)(mainThemeDirPath, "..", themeVariantName),
1043
+ destDirPath: themeVariantDirPath,
865
1044
  transformSourceCode: ({ fileRelativePath, sourceCode }) => {
866
1045
  if ((0,external_path_.extname)(fileRelativePath) === ".ftl" &&
867
1046
  fileRelativePath.split(external_path_.sep).length === 2) {
@@ -890,6 +1069,10 @@ function generateResourcesForThemeVariant(params) {
890
1069
  return newMetaInfKeycloakTheme;
891
1070
  }
892
1071
  });
1072
+ writeMessagePropertiesFiles({
1073
+ getMessageDirPath: ({ themeType }) => (0,external_path_.join)(themeVariantDirPath, themeType, "messages"),
1074
+ themeName: themeVariantName
1075
+ });
893
1076
  }
894
1077
  //# sourceMappingURL=generateResourcesForThemeVariant.js.map
895
1078
  ;// CONCATENATED MODULE: ./dist/bin/keycloakify/generateResources/generateResources.js
@@ -905,7 +1088,7 @@ async function generateResources(params) {
905
1088
  if (external_fs_default().existsSync(resourcesDirPath)) {
906
1089
  (0,fs_rmSync/* rmSync */.a)(resourcesDirPath, { recursive: true });
907
1090
  }
908
- await generateResourcesForMainTheme({
1091
+ const { writeMessagePropertiesFilesForThemeVariant } = await generateResourcesForMainTheme({
909
1092
  resourcesDirPath,
910
1093
  themeName,
911
1094
  buildContext
@@ -914,7 +1097,8 @@ async function generateResources(params) {
914
1097
  generateResourcesForThemeVariant({
915
1098
  resourcesDirPath,
916
1099
  themeName,
917
- themeVariantName
1100
+ themeVariantName,
1101
+ writeMessagePropertiesFiles: writeMessagePropertiesFilesForThemeVariant
918
1102
  });
919
1103
  }
920
1104
  }
package/bin/main.js CHANGED
@@ -8785,7 +8785,7 @@ var eventemitter3 = __nccwpck_require__(11848);
8785
8785
  // EXTERNAL MODULE: external "tty"
8786
8786
  var external_tty_ = __nccwpck_require__(76224);
8787
8787
  var external_tty_namespaceObject = /*#__PURE__*/__nccwpck_require__.t(external_tty_, 2);
8788
- ;// CONCATENATED MODULE: ./node_modules/listr2/node_modules/colorette/index.js
8788
+ ;// CONCATENATED MODULE: ./node_modules/colorette/index.js
8789
8789
 
8790
8790
 
8791
8791
  const {
@@ -0,0 +1,28 @@
1
+ /// <reference types="dompurify" />
2
+ import { DOMPurify } from "../../tools/vendor/dompurify";
3
+ export declare class HtmlPolicyBuilder {
4
+ private globalAttributesAllowed;
5
+ private tagsAllowed;
6
+ private tagsAllowedWithNoAttribute;
7
+ private currentAttribute;
8
+ private isStylingAllowed;
9
+ private allowedProtocols;
10
+ private enforceRelNofollow;
11
+ private DOMPurify;
12
+ constructor(dependencyInjections: Partial<{
13
+ DOMPurify: typeof DOMPurify;
14
+ }>);
15
+ allowWithoutAttributes(tag: string): this;
16
+ allowAttributes(...args: string[]): this;
17
+ matching(matchingPattern: RegExp | ((value: string) => boolean)): this;
18
+ globally(): this;
19
+ allowStyling(): this;
20
+ onElements(...tags: string[]): this;
21
+ allowElements(...tags: string[]): this;
22
+ requireRelNofollowOnLinks(): this;
23
+ allowStandardUrlProtocols(): this;
24
+ apply(html: string): string;
25
+ private setupHooks;
26
+ private getAllowedAttributes;
27
+ private getAllowedUriRegexp;
28
+ }