keycloakify 4.10.0 → 5.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 (80) hide show
  1. package/CHANGELOG.md +4 -0
  2. package/lib/components/Error.js +2 -2
  3. package/lib/components/Error.js.map +1 -1
  4. package/lib/components/Info.js +2 -2
  5. package/lib/components/Info.js.map +1 -1
  6. package/lib/components/Login.js +2 -2
  7. package/lib/components/Login.js.map +1 -1
  8. package/lib/components/LoginIdpLinkConfirm.js +2 -2
  9. package/lib/components/LoginIdpLinkConfirm.js.map +1 -1
  10. package/lib/components/LoginIdpLinkEmail.js +2 -2
  11. package/lib/components/LoginIdpLinkEmail.js.map +1 -1
  12. package/lib/components/LoginOtp.js +2 -2
  13. package/lib/components/LoginOtp.js.map +1 -1
  14. package/lib/components/LoginPageExpired.js +2 -2
  15. package/lib/components/LoginPageExpired.js.map +1 -1
  16. package/lib/components/LoginResetPassword.js +2 -2
  17. package/lib/components/LoginResetPassword.js.map +1 -1
  18. package/lib/components/LoginUpdatePassword.js +2 -2
  19. package/lib/components/LoginUpdatePassword.js.map +1 -1
  20. package/lib/components/LoginUpdateProfile.js +2 -2
  21. package/lib/components/LoginUpdateProfile.js.map +1 -1
  22. package/lib/components/LoginVerifyEmail.js +2 -2
  23. package/lib/components/LoginVerifyEmail.js.map +1 -1
  24. package/lib/components/Register.js +2 -2
  25. package/lib/components/Register.js.map +1 -1
  26. package/lib/components/RegisterUserProfile.js +3 -3
  27. package/lib/components/RegisterUserProfile.js.map +1 -1
  28. package/lib/components/Template.js +10 -28
  29. package/lib/components/Template.js.map +1 -1
  30. package/lib/components/Terms.d.ts +8 -0
  31. package/lib/components/Terms.js +33 -3
  32. package/lib/components/Terms.js.map +1 -1
  33. package/lib/getKcContext/KcContextBase.d.ts +4 -4
  34. package/lib/getKcContext/KcContextBase.js.map +1 -1
  35. package/lib/getKcContext/kcContextMocks/kcContextMocks.js +21 -8
  36. package/lib/getKcContext/kcContextMocks/kcContextMocks.js.map +1 -1
  37. package/lib/i18n/{kcMessages/login.d.ts → index.d.ts} +62 -4
  38. package/lib/i18n/{useKcMessage.js → index.js} +47 -33
  39. package/lib/i18n/index.js.map +1 -0
  40. package/lib/index.d.ts +2 -11
  41. package/lib/index.js +4 -11
  42. package/lib/index.js.map +1 -1
  43. package/lib/useFormValidationSlice.d.ts +4 -12
  44. package/lib/useFormValidationSlice.js +4 -3
  45. package/lib/useFormValidationSlice.js.map +1 -1
  46. package/package.json +7 -17
  47. package/src/lib/components/Error.tsx +2 -2
  48. package/src/lib/components/Info.tsx +2 -2
  49. package/src/lib/components/Login.tsx +2 -2
  50. package/src/lib/components/LoginIdpLinkConfirm.tsx +2 -2
  51. package/src/lib/components/LoginIdpLinkEmail.tsx +2 -2
  52. package/src/lib/components/LoginOtp.tsx +2 -2
  53. package/src/lib/components/LoginPageExpired.tsx +2 -2
  54. package/src/lib/components/LoginResetPassword.tsx +2 -2
  55. package/src/lib/components/LoginUpdatePassword.tsx +2 -2
  56. package/src/lib/components/LoginUpdateProfile.tsx +2 -2
  57. package/src/lib/components/LoginVerifyEmail.tsx +2 -2
  58. package/src/lib/components/Register.tsx +2 -2
  59. package/src/lib/components/RegisterUserProfile.tsx +3 -3
  60. package/src/lib/components/Template.tsx +11 -31
  61. package/src/lib/components/Terms.tsx +24 -3
  62. package/src/lib/getKcContext/KcContextBase.ts +4 -8
  63. package/src/lib/getKcContext/kcContextMocks/kcContextMocks.ts +21 -9
  64. package/src/lib/i18n/index.tsx +180 -0
  65. package/src/lib/index.ts +3 -11
  66. package/src/lib/useFormValidationSlice.tsx +10 -15
  67. package/lib/i18n/KcLanguageTag.d.ts +0 -35
  68. package/lib/i18n/KcLanguageTag.js +0 -57
  69. package/lib/i18n/KcLanguageTag.js.map +0 -1
  70. package/lib/i18n/kcMessages/login.js +0 -38
  71. package/lib/i18n/kcMessages/login.js.map +0 -1
  72. package/lib/i18n/useKcLanguageTag.d.ts +0 -4
  73. package/lib/i18n/useKcLanguageTag.js +0 -22
  74. package/lib/i18n/useKcLanguageTag.js.map +0 -1
  75. package/lib/i18n/useKcMessage.d.ts +0 -23
  76. package/lib/i18n/useKcMessage.js.map +0 -1
  77. package/src/lib/i18n/KcLanguageTag.ts +0 -63
  78. package/src/lib/i18n/kcMessages/login.ts +0 -50
  79. package/src/lib/i18n/useKcLanguageTag.ts +0 -28
  80. package/src/lib/i18n/useKcMessage.tsx +0 -115
@@ -0,0 +1,180 @@
1
+ import "minimal-polyfills/Object.fromEntries";
2
+ //NOTE for later: https://github.com/remarkjs/react-markdown/blob/236182ecf30bd89c1e5a7652acaf8d0bf81e6170/src/renderers.js#L7-L35
3
+ import ReactMarkdown from "react-markdown";
4
+ import memoize from "memoizee";
5
+ import { kcMessages as kcMessagesBase } from "./generated_kcMessages/15.0.2/login";
6
+ import { assert } from "tsafe/assert";
7
+
8
+ export const kcMessages = {
9
+ ...kcMessagesBase,
10
+ "en": {
11
+ ...kcMessagesBase["en"],
12
+ "termsText": "⏳",
13
+ "shouldBeEqual": "{0} should be equal to {1}",
14
+ "shouldBeDifferent": "{0} should be different to {1}",
15
+ "shouldMatchPattern": "Pattern should match: `/{0}/`",
16
+ "mustBeAnInteger": "Must be an integer",
17
+ "notAValidOption": "Not a valid option",
18
+ },
19
+ "fr": {
20
+ ...kcMessagesBase["fr"],
21
+ /* spell-checker: disable */
22
+ "shouldBeEqual": "{0} doit être egale à {1}",
23
+ "shouldBeDifferent": "{0} doit être différent de {1}",
24
+ "shouldMatchPattern": "Dois respecter le schéma: `/{0}/`",
25
+ "mustBeAnInteger": "Doit être un nombre entiers",
26
+ "notAValidOption": "N'est pas une option valide",
27
+ /* spell-checker: enable */
28
+ },
29
+ };
30
+
31
+ export type KcLanguageTag = keyof typeof kcMessages;
32
+
33
+ type KcContextLike = { locale?: { currentLanguageTag: KcLanguageTag } };
34
+
35
+ export function getCurrentKcLanguageTag(kcContext: KcContextLike) {
36
+ return kcContext.locale?.currentLanguageTag ?? "en";
37
+ }
38
+
39
+ export function getTagLabel(params: {
40
+ kcContext: {
41
+ locale?: {
42
+ supported: { languageTag: KcLanguageTag; label: string }[];
43
+ };
44
+ };
45
+ kcLanguageTag: KcLanguageTag;
46
+ }): string {
47
+ const { kcContext, kcLanguageTag } = params;
48
+
49
+ const { locale } = kcContext;
50
+
51
+ assert(locale !== undefined, "Internationalization not enabled");
52
+
53
+ const targetSupportedLocale = locale.supported.find(({ languageTag }) => languageTag === kcLanguageTag);
54
+
55
+ assert(targetSupportedLocale !== undefined, `${kcLanguageTag} need to be enabled in Keycloak admin`);
56
+
57
+ return targetSupportedLocale.label;
58
+ }
59
+
60
+ export function changeLocale(params: {
61
+ kcContext: {
62
+ locale?: {
63
+ supported: { languageTag: KcLanguageTag; url: string }[];
64
+ };
65
+ };
66
+ kcLanguageTag: KcLanguageTag;
67
+ }): never {
68
+ const { kcContext, kcLanguageTag } = params;
69
+
70
+ const { locale } = kcContext;
71
+
72
+ assert(locale !== undefined, "Internationalization not enabled");
73
+
74
+ const targetSupportedLocale = locale.supported.find(({ languageTag }) => languageTag === kcLanguageTag);
75
+
76
+ assert(targetSupportedLocale !== undefined, `${kcLanguageTag} need to be enabled in Keycloak admin`);
77
+
78
+ window.location.href = targetSupportedLocale.url;
79
+
80
+ assert(false, "never");
81
+ }
82
+
83
+ export type MessageKey = keyof typeof kcMessages["en"];
84
+
85
+ function resolveMsg<Key extends string, DoRenderMarkdown extends boolean>(props: {
86
+ key: Key;
87
+ args: (string | undefined)[];
88
+ kcLanguageTag: string;
89
+ doRenderMarkdown: DoRenderMarkdown;
90
+ }): Key extends MessageKey ? (DoRenderMarkdown extends true ? JSX.Element : string) : undefined {
91
+ const { key, args, kcLanguageTag, doRenderMarkdown } = props;
92
+
93
+ let str = kcMessages[kcLanguageTag as any as "en"][key as MessageKey] ?? kcMessages["en"][key as MessageKey];
94
+
95
+ if (str === undefined) {
96
+ return undefined as any;
97
+ }
98
+
99
+ str = (() => {
100
+ const startIndex = str
101
+ .match(/{[0-9]+}/g)
102
+ ?.map(g => g.match(/{([0-9]+)}/)![1])
103
+ .map(indexStr => parseInt(indexStr))
104
+ .sort((a, b) => a - b)[0];
105
+
106
+ if (startIndex === undefined) {
107
+ return str;
108
+ }
109
+
110
+ args.forEach((arg, i) => {
111
+ if (arg === undefined) {
112
+ return;
113
+ }
114
+
115
+ str = str.replace(new RegExp(`\\{${i + startIndex}\\}`, "g"), arg);
116
+ });
117
+
118
+ return str;
119
+ })();
120
+
121
+ return (
122
+ doRenderMarkdown ? (
123
+ <ReactMarkdown allowDangerousHtml renderers={key === "termsText" ? undefined : { "paragraph": "span" }}>
124
+ {str}
125
+ </ReactMarkdown>
126
+ ) : (
127
+ str
128
+ )
129
+ ) as any;
130
+ }
131
+
132
+ function resolveMsgAdvanced<Key extends string, DoRenderMarkdown extends boolean>(props: {
133
+ key: Key;
134
+ args: (string | undefined)[];
135
+ kcLanguageTag: string;
136
+ doRenderMarkdown: DoRenderMarkdown;
137
+ }): DoRenderMarkdown extends true ? JSX.Element : string {
138
+ const { key, args, kcLanguageTag, doRenderMarkdown } = props;
139
+
140
+ const match = key.match(/^\$\{([^{]+)\}$/);
141
+
142
+ const keyUnwrappedFromCurlyBraces = match === null ? key : match[1];
143
+
144
+ const out = resolveMsg({
145
+ "key": keyUnwrappedFromCurlyBraces,
146
+ args,
147
+ kcLanguageTag,
148
+ doRenderMarkdown,
149
+ });
150
+
151
+ return (out !== undefined ? out : doRenderMarkdown ? <span>{keyUnwrappedFromCurlyBraces}</span> : keyUnwrappedFromCurlyBraces) as any;
152
+ }
153
+
154
+ /**
155
+ * When the language is switched the page is reloaded, this may appear
156
+ * as a bug as you might notice that the language successfully switch before
157
+ * reload.
158
+ * However we need to tell Keycloak that the user have changed the language
159
+ * during login so we can retrieve the "local" field of the JWT encoded accessToken.
160
+ * https://user-images.githubusercontent.com/6702424/138096682-351bb61f-f24e-4caf-91b7-cca8cfa2cb58.mov
161
+ *
162
+ * advancedMsg("${access-denied}") === advancedMsg("access-denied") === msg("access-denied")
163
+ * advancedMsg("${not-a-message-key}") === advancedMsg(not-a-message-key") === "not-a-message-key"
164
+ *
165
+ *
166
+ * NOTE: This function is memoized, it always returns the same object for a given kcContext)
167
+ *
168
+ */
169
+ export const getMsg = memoize((kcContext: KcContextLike) => {
170
+ const kcLanguageTag = getCurrentKcLanguageTag(kcContext);
171
+
172
+ return {
173
+ "msgStr": (key: MessageKey, ...args: (string | undefined)[]): string => resolveMsg({ key, args, kcLanguageTag, "doRenderMarkdown": false }),
174
+ "msg": (key: MessageKey, ...args: (string | undefined)[]): JSX.Element => resolveMsg({ key, args, kcLanguageTag, "doRenderMarkdown": true }),
175
+ "advancedMsg": <Key extends string>(key: Key, ...args: (string | undefined)[]): JSX.Element =>
176
+ resolveMsgAdvanced({ key, args, kcLanguageTag, "doRenderMarkdown": true }),
177
+ "advancedMsgStr": <Key extends string>(key: Key, ...args: (string | undefined)[]): string =>
178
+ resolveMsgAdvanced({ key, args, kcLanguageTag, "doRenderMarkdown": false }),
179
+ };
180
+ });
package/src/lib/index.ts CHANGED
@@ -1,18 +1,10 @@
1
1
  export * from "./getKcContext";
2
2
 
3
- export * from "./i18n/KcLanguageTag";
4
- export * from "./i18n/useKcLanguageTag";
5
- export * from "./i18n/useKcMessage";
6
- export * from "./i18n/kcMessages/login";
3
+ export * from "./i18n";
4
+
5
+ export { useDownloadTerms } from "./components/Terms";
7
6
 
8
7
  export * from "./components/KcProps";
9
- export * from "./components/Login";
10
- export * from "./components/Template";
11
- export * from "./components/KcApp";
12
- export * from "./components/Info";
13
- export * from "./components/Error";
14
- export * from "./components/LoginResetPassword";
15
- export * from "./components/LoginVerifyEmail";
16
8
  export * from "./keycloakJsAdapter";
17
9
  export * from "./useFormValidationSlice";
18
10
 
@@ -1,35 +1,30 @@
1
1
  import "./tools/Array.prototype.every";
2
2
  import { useMemo, useReducer, Fragment } from "react";
3
3
  import type { KcContextBase, Validators, Attribute } from "./getKcContext/KcContextBase";
4
- import { useKcMessage } from "./i18n/useKcMessage";
4
+ import { getMsg } from "./i18n";
5
+ import type { KcLanguageTag } from "./i18n";
5
6
  import { useConstCallback } from "powerhooks/useConstCallback";
6
7
  import { id } from "tsafe/id";
7
- import type { MessageKey } from "./i18n/useKcMessage";
8
+ import type { MessageKey } from "./i18n";
8
9
  import { emailRegexp } from "./tools/emailRegExp";
9
10
 
10
- export type KcContextLike = {
11
- messagesPerField: Pick<KcContextBase.Common["messagesPerField"], "existsError" | "get">;
12
- attributes: { name: string; value?: string; validators: Validators }[];
13
- passwordRequired: boolean;
14
- realm: { registrationEmailAsUsername: boolean };
15
- };
16
-
17
11
  export function useGetErrors(params: {
18
12
  kcContext: {
19
13
  messagesPerField: Pick<KcContextBase.Common["messagesPerField"], "existsError" | "get">;
20
14
  profile: {
21
15
  attributes: { name: string; value?: string; validators: Validators }[];
22
16
  };
17
+ locale?: { currentLanguageTag: KcLanguageTag };
23
18
  };
24
19
  }) {
20
+ const { kcContext } = params;
21
+
25
22
  const {
26
- kcContext: {
27
- messagesPerField,
28
- profile: { attributes },
29
- },
30
- } = params;
23
+ messagesPerField,
24
+ profile: { attributes },
25
+ } = kcContext;
31
26
 
32
- const { msg, msgStr, advancedMsg, advancedMsgStr } = useKcMessage();
27
+ const { msg, msgStr, advancedMsg, advancedMsgStr } = getMsg(kcContext);
33
28
 
34
29
  const getErrors = useConstCallback((params: { name: string; fieldValueByAttributeName: Record<string, { value: string }> }) => {
35
30
  const { name, fieldValueByAttributeName } = params;
@@ -1,35 +0,0 @@
1
- import { kcMessages } from "./kcMessages/login";
2
- export declare type KcLanguageTag = keyof typeof kcMessages;
3
- declare const kcLanguageByTagLabel: {
4
- readonly es: "Español";
5
- readonly it: "Italiano";
6
- readonly fr: "Français";
7
- readonly ca: "Català";
8
- readonly en: "English";
9
- readonly de: "Deutsch";
10
- readonly no: "Norsk";
11
- readonly "pt-BR": "Português (Brasil)";
12
- readonly ru: "Русский";
13
- readonly sk: "Slovenčina";
14
- readonly ja: "日本語";
15
- readonly pl: "Polski";
16
- readonly "zh-CN": "中文简体";
17
- readonly sv: "Svenska";
18
- readonly lt: "Lietuvių";
19
- readonly cs: "Čeština";
20
- readonly nl: "Nederlands";
21
- readonly tr: "Türkçe";
22
- readonly da: "Dansk";
23
- readonly hu: "Magyar";
24
- };
25
- export declare type LanguageLabel = typeof kcLanguageByTagLabel[keyof typeof kcLanguageByTagLabel];
26
- export declare function getKcLanguageTagLabel(language: KcLanguageTag): LanguageLabel;
27
- export declare const kcLanguageTags: ("tr" | "no" | "ca" | "en" | "fr" | "cs" | "da" | "de" | "es" | "hu" | "it" | "ja" | "lt" | "nl" | "pl" | "pt-BR" | "ru" | "sk" | "sv" | "zh-CN")[];
28
- /**
29
- * Pass in "fr-FR" or "français" for example, it will return the AvailableLanguage
30
- * it corresponds to: "fr".
31
- * If there is no reasonable match it's guessed from navigator.language.
32
- * If still no matches "en" is returned.
33
- */
34
- export declare function getBestMatchAmongKcLanguageTag(languageLike: string): KcLanguageTag;
35
- export {};
@@ -1,57 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.getBestMatchAmongKcLanguageTag = exports.kcLanguageTags = exports.getKcLanguageTagLabel = void 0;
4
- var objectKeys_1 = require("tsafe/objectKeys");
5
- var login_1 = require("./kcMessages/login");
6
- var kcLanguageByTagLabel = {
7
- /* spell-checker: disable */
8
- "es": "Español",
9
- "it": "Italiano",
10
- "fr": "Français",
11
- "ca": "Català",
12
- "en": "English",
13
- "de": "Deutsch",
14
- "no": "Norsk",
15
- "pt-BR": "Português (Brasil)",
16
- "ru": "Русский",
17
- "sk": "Slovenčina",
18
- "ja": "日本語",
19
- "pl": "Polski",
20
- "zh-CN": "中文简体",
21
- "sv": "Svenska",
22
- "lt": "Lietuvių",
23
- "cs": "Čeština",
24
- "nl": "Nederlands",
25
- "tr": "Türkçe",
26
- "da": "Dansk",
27
- "hu": "Magyar",
28
- /* spell-checker: enable */
29
- };
30
- function getKcLanguageTagLabel(language) {
31
- var _a;
32
- return (_a = kcLanguageByTagLabel[language]) !== null && _a !== void 0 ? _a : language;
33
- }
34
- exports.getKcLanguageTagLabel = getKcLanguageTagLabel;
35
- exports.kcLanguageTags = (0, objectKeys_1.objectKeys)(login_1.kcMessages);
36
- /**
37
- * Pass in "fr-FR" or "français" for example, it will return the AvailableLanguage
38
- * it corresponds to: "fr".
39
- * If there is no reasonable match it's guessed from navigator.language.
40
- * If still no matches "en" is returned.
41
- */
42
- function getBestMatchAmongKcLanguageTag(languageLike) {
43
- var iso2LanguageLike = languageLike.split("-")[0].toLowerCase();
44
- var kcLanguageTag = exports.kcLanguageTags.find(function (language) {
45
- return language.toLowerCase().includes(iso2LanguageLike) ||
46
- getKcLanguageTagLabel(language).toLocaleLowerCase() === languageLike.toLocaleLowerCase();
47
- });
48
- if (kcLanguageTag !== undefined) {
49
- return kcLanguageTag;
50
- }
51
- if (languageLike !== navigator.language) {
52
- return getBestMatchAmongKcLanguageTag(navigator.language);
53
- }
54
- return "en";
55
- }
56
- exports.getBestMatchAmongKcLanguageTag = getBestMatchAmongKcLanguageTag;
57
- //# sourceMappingURL=KcLanguageTag.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"KcLanguageTag.js","sourceRoot":"","sources":["../../src/lib/i18n/KcLanguageTag.ts"],"names":[],"mappings":";;;AAAA,+CAA8C;AAC9C,4CAAgD;AAIhD,IAAM,oBAAoB,GAAG;IACzB,4BAA4B;IAC5B,IAAI,EAAE,SAAS;IACf,IAAI,EAAE,UAAU;IAChB,IAAI,EAAE,UAAU;IAChB,IAAI,EAAE,QAAQ;IACd,IAAI,EAAE,SAAS;IACf,IAAI,EAAE,SAAS;IACf,IAAI,EAAE,OAAO;IACb,OAAO,EAAE,oBAAoB;IAC7B,IAAI,EAAE,SAAS;IACf,IAAI,EAAE,YAAY;IAClB,IAAI,EAAE,KAAK;IACX,IAAI,EAAE,QAAQ;IACd,OAAO,EAAE,MAAM;IACf,IAAI,EAAE,SAAS;IACf,IAAI,EAAE,UAAU;IAChB,IAAI,EAAE,SAAS;IACf,IAAI,EAAE,YAAY;IAClB,IAAI,EAAE,QAAQ;IACd,IAAI,EAAE,OAAO;IACb,IAAI,EAAE,QAAQ;IACd,2BAA2B;CACrB,CAAC;AAIX,SAAgB,qBAAqB,CAAC,QAAuB;;IACzD,OAAO,MAAA,oBAAoB,CAAC,QAAQ,CAAC,mCAAI,QAAQ,CAAC;AACtD,CAAC;AAFD,sDAEC;AAEY,QAAA,cAAc,GAAG,IAAA,uBAAU,EAAC,kBAAU,CAAC,CAAC;AAErD;;;;;GAKG;AACH,SAAgB,8BAA8B,CAAC,YAAoB;IAC/D,IAAM,gBAAgB,GAAG,YAAY,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC;IAElE,IAAM,aAAa,GAAG,sBAAc,CAAC,IAAI,CACrC,UAAA,QAAQ;QACJ,OAAA,QAAQ,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,gBAAgB,CAAC;YACjD,qBAAqB,CAAC,QAAQ,CAAC,CAAC,iBAAiB,EAAE,KAAK,YAAY,CAAC,iBAAiB,EAAE;IADxF,CACwF,CAC/F,CAAC;IAEF,IAAI,aAAa,KAAK,SAAS,EAAE;QAC7B,OAAO,aAAa,CAAC;KACxB;IAED,IAAI,YAAY,KAAK,SAAS,CAAC,QAAQ,EAAE;QACrC,OAAO,8BAA8B,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC;KAC7D;IAED,OAAO,IAAI,CAAC;AAChB,CAAC;AAlBD,wEAkBC"}
@@ -1,38 +0,0 @@
1
- "use strict";
2
- var __assign = (this && this.__assign) || function () {
3
- __assign = Object.assign || function(t) {
4
- for (var s, i = 1, n = arguments.length; i < n; i++) {
5
- s = arguments[i];
6
- for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
7
- t[p] = s[p];
8
- }
9
- return t;
10
- };
11
- return __assign.apply(this, arguments);
12
- };
13
- Object.defineProperty(exports, "__esModule", { value: true });
14
- exports.kcMessages = exports.evtTermsUpdated = void 0;
15
- var login_1 = require("../generated_kcMessages/15.0.2/login");
16
- var evt_1 = require("evt");
17
- var objectKeys_1 = require("tsafe/objectKeys");
18
- var kcMessages = __assign(__assign({}, login_1.kcMessages), { "en": __assign(__assign({}, login_1.kcMessages["en"]), { "shouldBeEqual": "{0} should be equal to {1}", "shouldBeDifferent": "{0} should be different to {1}", "shouldMatchPattern": "Pattern should match: `/{0}/`", "mustBeAnInteger": "Must be an integer", "notAValidOption": "Not a valid option" }), "fr": __assign(__assign({}, login_1.kcMessages["fr"]), {
19
- /* spell-checker: disable */
20
- "shouldBeEqual": "{0} doit être egale à {1}", "shouldBeDifferent": "{0} doit être différent de {1}", "shouldMatchPattern": "Dois respecter le schéma: `/{0}/`", "mustBeAnInteger": "Doit être un nombre entiers", "notAValidOption": "N'est pas une option valide" }) });
21
- exports.kcMessages = kcMessages;
22
- exports.evtTermsUpdated = evt_1.Evt.asNonPostable(evt_1.Evt.create());
23
- ["termsText", "doAccept", "doDecline", "termsTitle"].forEach(function (key) {
24
- return (0, objectKeys_1.objectKeys)(kcMessages).forEach(function (kcLanguage) {
25
- return Object.defineProperty(kcMessages[kcLanguage], key, (function () {
26
- var value = key === "termsText" ? "⏳" : kcMessages[kcLanguage][key];
27
- return {
28
- "enumerable": true,
29
- "get": function () { return value; },
30
- "set": function (newValue) {
31
- value = newValue;
32
- evt_1.Evt.asPostable(exports.evtTermsUpdated).post();
33
- },
34
- };
35
- })());
36
- });
37
- });
38
- //# sourceMappingURL=login.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"login.js","sourceRoot":"","sources":["../../../src/lib/i18n/kcMessages/login.ts"],"names":[],"mappings":";;;;;;;;;;;;;;AAAA,8DAAoF;AACpF,2BAA0B;AAC1B,+CAA8C;AAE9C,IAAM,UAAU,yBACT,kBAAc,KACjB,IAAI,wBACG,kBAAc,CAAC,IAAI,CAAC,KACvB,eAAe,EAAE,4BAA4B,EAC7C,mBAAmB,EAAE,gCAAgC,EACrD,oBAAoB,EAAE,+BAA+B,EACrD,iBAAiB,EAAE,oBAAoB,EACvC,iBAAiB,EAAE,oBAAoB,KAE3C,IAAI,wBACG,kBAAc,CAAC,IAAI,CAAC;QACvB,4BAA4B;QAC5B,eAAe,EAAE,2BAA2B,EAC5C,mBAAmB,EAAE,gCAAgC,EACrD,oBAAoB,EAAE,mCAAmC,EACzD,iBAAiB,EAAE,6BAA6B,EAChD,iBAAiB,EAAE,6BAA6B,MAGvD,CAAC;AAyBO,gCAAU;AAvBN,QAAA,eAAe,GAAG,SAAG,CAAC,aAAa,CAAC,SAAG,CAAC,MAAM,EAAQ,CAAC,CAAC;AAEpE,CAAC,WAAW,EAAE,UAAU,EAAE,WAAW,EAAE,YAAY,CAAW,CAAC,OAAO,CAAC,UAAA,GAAG;IACvE,OAAA,IAAA,uBAAU,EAAC,UAAU,CAAC,CAAC,OAAO,CAAC,UAAA,UAAU;QACrC,OAAA,MAAM,CAAC,cAAc,CACjB,UAAU,CAAC,UAAU,CAAC,EACtB,GAAG,EACH,CAAC;YACG,IAAI,KAAK,GAAG,GAAG,KAAK,WAAW,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,UAAU,CAAC,UAAU,CAAC,CAAC,GAAG,CAAC,CAAC;YAEpE,OAAO;gBACH,YAAY,EAAE,IAAI;gBAClB,KAAK,EAAE,cAAM,OAAA,KAAK,EAAL,CAAK;gBAClB,KAAK,EAAE,UAAC,QAAgB;oBACpB,KAAK,GAAG,QAAQ,CAAC;oBACjB,SAAG,CAAC,UAAU,CAAC,uBAAe,CAAC,CAAC,IAAI,EAAE,CAAC;gBAC3C,CAAC;aACJ,CAAC;QACN,CAAC,CAAC,EAAE,CACP;IAfD,CAeC,CACJ;AAjBD,CAiBC,CACJ,CAAC"}
@@ -1,4 +0,0 @@
1
- import type { StatefulEvt } from "powerhooks";
2
- import { KcLanguageTag } from "./KcLanguageTag";
3
- export declare const useKcLanguageTag: () => import("powerhooks").UseNamedStateReturnType<"tr" | "no" | "ca" | "en" | "fr" | "cs" | "da" | "de" | "es" | "hu" | "it" | "ja" | "lt" | "nl" | "pl" | "pt-BR" | "ru" | "sk" | "sv" | "zh-CN", "kcLanguageTag">;
4
- export declare function getEvtKcLanguage(): StatefulEvt<KcLanguageTag>;
@@ -1,22 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.getEvtKcLanguage = exports.useKcLanguageTag = void 0;
4
- var useGlobalState_1 = require("powerhooks/useGlobalState");
5
- var getKcContextFromWindow_1 = require("../getKcContext/getKcContextFromWindow");
6
- var KcLanguageTag_1 = require("./KcLanguageTag");
7
- //export const { useKcLanguageTag, evtKcLanguageTag } = createUseGlobalState(
8
- var wrap = (0, useGlobalState_1.createUseGlobalState)("kcLanguageTag", function () {
9
- var _a, _b;
10
- var kcContext = (0, getKcContextFromWindow_1.getKcContextFromWindow)();
11
- var languageLike = (_b = (_a = kcContext === null || kcContext === void 0 ? void 0 : kcContext.locale) === null || _a === void 0 ? void 0 : _a.current) !== null && _b !== void 0 ? _b : (typeof navigator === "undefined" ? undefined : navigator.language);
12
- if (languageLike === undefined) {
13
- return "en";
14
- }
15
- return (0, KcLanguageTag_1.getBestMatchAmongKcLanguageTag)(languageLike);
16
- }, { "persistance": "localStorage" });
17
- exports.useKcLanguageTag = wrap.useKcLanguageTag;
18
- function getEvtKcLanguage() {
19
- return wrap.evtKcLanguageTag;
20
- }
21
- exports.getEvtKcLanguage = getEvtKcLanguage;
22
- //# sourceMappingURL=useKcLanguageTag.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"useKcLanguageTag.js","sourceRoot":"","sources":["../../src/lib/i18n/useKcLanguageTag.ts"],"names":[],"mappings":";;;AAAA,4DAAiE;AACjE,iFAAgF;AAChF,iDAAiE;AAIjE,6EAA6E;AAC7E,IAAM,IAAI,GAAG,IAAA,qCAAoB,EAC7B,eAAe,EACf;;IACI,IAAM,SAAS,GAAG,IAAA,+CAAsB,GAAE,CAAC;IAE3C,IAAM,YAAY,GAAG,MAAA,MAAA,SAAS,aAAT,SAAS,uBAAT,SAAS,CAAE,MAAM,0CAAE,OAAO,mCAAI,CAAC,OAAO,SAAS,KAAK,WAAW,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC;IAEvH,IAAI,YAAY,KAAK,SAAS,EAAE;QAC5B,OAAO,IAAI,CAAC;KACf;IAED,OAAO,IAAA,8CAA8B,EAAC,YAAY,CAAC,CAAC;AACxD,CAAC,EACD,EAAE,aAAa,EAAE,cAAc,EAAE,CACpC,CAAC;AAEa,QAAA,gBAAgB,GAAK,IAAI,kBAAC;AAEzC,SAAgB,gBAAgB;IAC5B,OAAO,IAAI,CAAC,gBAAgB,CAAC;AACjC,CAAC;AAFD,4CAEC"}
@@ -1,23 +0,0 @@
1
- /// <reference types="react" />
2
- import "minimal-polyfills/Object.fromEntries";
3
- import { kcMessages } from "./kcMessages/login";
4
- export { kcMessages };
5
- export declare type MessageKey = keyof typeof kcMessages["en"];
6
- /**
7
- * When the language is switched the page is reloaded, this may appear
8
- * as a bug as you might notice that the language successfully switch before
9
- * reload.
10
- * However we need to tell Keycloak that the user have changed the language
11
- * during login so we can retrieve the "local" field of the JWT encoded accessToken.
12
- * https://user-images.githubusercontent.com/6702424/138096682-351bb61f-f24e-4caf-91b7-cca8cfa2cb58.mov
13
- *
14
- * advancedMsg("${access-denied}") === advancedMsg("access-denied") === msg("access-denied")
15
- * advancedMsg("${not-a-message-key}") === advancedMsg(not-a-message-key") === "not-a-message-key"
16
- *
17
- */
18
- export declare function useKcMessage(): {
19
- msgStr: (key: MessageKey, ...args: (string | undefined)[]) => string;
20
- msg: (key: MessageKey, ...args: (string | undefined)[]) => JSX.Element;
21
- advancedMsg: <Key extends string>(key: Key, ...args: (string | undefined)[]) => JSX.Element;
22
- advancedMsgStr: <Key_1 extends string>(key: Key_1, ...args: (string | undefined)[]) => string;
23
- };
@@ -1 +0,0 @@
1
- {"version":3,"file":"useKcMessage.js","sourceRoot":"","sources":["../../src/lib/i18n/useKcMessage.tsx"],"names":[],"mappings":"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"}
@@ -1,63 +0,0 @@
1
- import { objectKeys } from "tsafe/objectKeys";
2
- import { kcMessages } from "./kcMessages/login";
3
-
4
- export type KcLanguageTag = keyof typeof kcMessages;
5
-
6
- const kcLanguageByTagLabel = {
7
- /* spell-checker: disable */
8
- "es": "Español",
9
- "it": "Italiano",
10
- "fr": "Français",
11
- "ca": "Català",
12
- "en": "English",
13
- "de": "Deutsch",
14
- "no": "Norsk",
15
- "pt-BR": "Português (Brasil)",
16
- "ru": "Русский",
17
- "sk": "Slovenčina",
18
- "ja": "日本語",
19
- "pl": "Polski",
20
- "zh-CN": "中文简体",
21
- "sv": "Svenska",
22
- "lt": "Lietuvių",
23
- "cs": "Čeština",
24
- "nl": "Nederlands",
25
- "tr": "Türkçe",
26
- "da": "Dansk",
27
- "hu": "Magyar",
28
- /* spell-checker: enable */
29
- } as const;
30
-
31
- export type LanguageLabel = typeof kcLanguageByTagLabel[keyof typeof kcLanguageByTagLabel];
32
-
33
- export function getKcLanguageTagLabel(language: KcLanguageTag): LanguageLabel {
34
- return kcLanguageByTagLabel[language] ?? language;
35
- }
36
-
37
- export const kcLanguageTags = objectKeys(kcMessages);
38
-
39
- /**
40
- * Pass in "fr-FR" or "français" for example, it will return the AvailableLanguage
41
- * it corresponds to: "fr".
42
- * If there is no reasonable match it's guessed from navigator.language.
43
- * If still no matches "en" is returned.
44
- */
45
- export function getBestMatchAmongKcLanguageTag(languageLike: string): KcLanguageTag {
46
- const iso2LanguageLike = languageLike.split("-")[0].toLowerCase();
47
-
48
- const kcLanguageTag = kcLanguageTags.find(
49
- language =>
50
- language.toLowerCase().includes(iso2LanguageLike) ||
51
- getKcLanguageTagLabel(language).toLocaleLowerCase() === languageLike.toLocaleLowerCase(),
52
- );
53
-
54
- if (kcLanguageTag !== undefined) {
55
- return kcLanguageTag;
56
- }
57
-
58
- if (languageLike !== navigator.language) {
59
- return getBestMatchAmongKcLanguageTag(navigator.language);
60
- }
61
-
62
- return "en";
63
- }
@@ -1,50 +0,0 @@
1
- import { kcMessages as kcMessagesBase } from "../generated_kcMessages/15.0.2/login";
2
- import { Evt } from "evt";
3
- import { objectKeys } from "tsafe/objectKeys";
4
-
5
- const kcMessages = {
6
- ...kcMessagesBase,
7
- "en": {
8
- ...kcMessagesBase["en"],
9
- "shouldBeEqual": "{0} should be equal to {1}",
10
- "shouldBeDifferent": "{0} should be different to {1}",
11
- "shouldMatchPattern": "Pattern should match: `/{0}/`",
12
- "mustBeAnInteger": "Must be an integer",
13
- "notAValidOption": "Not a valid option",
14
- },
15
- "fr": {
16
- ...kcMessagesBase["fr"],
17
- /* spell-checker: disable */
18
- "shouldBeEqual": "{0} doit être egale à {1}",
19
- "shouldBeDifferent": "{0} doit être différent de {1}",
20
- "shouldMatchPattern": "Dois respecter le schéma: `/{0}/`",
21
- "mustBeAnInteger": "Doit être un nombre entiers",
22
- "notAValidOption": "N'est pas une option valide",
23
- /* spell-checker: enable */
24
- },
25
- };
26
-
27
- export const evtTermsUpdated = Evt.asNonPostable(Evt.create<void>());
28
-
29
- (["termsText", "doAccept", "doDecline", "termsTitle"] as const).forEach(key =>
30
- objectKeys(kcMessages).forEach(kcLanguage =>
31
- Object.defineProperty(
32
- kcMessages[kcLanguage],
33
- key,
34
- (() => {
35
- let value = key === "termsText" ? "⏳" : kcMessages[kcLanguage][key];
36
-
37
- return {
38
- "enumerable": true,
39
- "get": () => value,
40
- "set": (newValue: string) => {
41
- value = newValue;
42
- Evt.asPostable(evtTermsUpdated).post();
43
- },
44
- };
45
- })(),
46
- ),
47
- ),
48
- );
49
-
50
- export { kcMessages };
@@ -1,28 +0,0 @@
1
- import { createUseGlobalState } from "powerhooks/useGlobalState";
2
- import { getKcContextFromWindow } from "../getKcContext/getKcContextFromWindow";
3
- import { getBestMatchAmongKcLanguageTag } from "./KcLanguageTag";
4
- import type { StatefulEvt } from "powerhooks";
5
- import { KcLanguageTag } from "./KcLanguageTag";
6
-
7
- //export const { useKcLanguageTag, evtKcLanguageTag } = createUseGlobalState(
8
- const wrap = createUseGlobalState(
9
- "kcLanguageTag",
10
- () => {
11
- const kcContext = getKcContextFromWindow();
12
-
13
- const languageLike = kcContext?.locale?.current ?? (typeof navigator === "undefined" ? undefined : navigator.language);
14
-
15
- if (languageLike === undefined) {
16
- return "en";
17
- }
18
-
19
- return getBestMatchAmongKcLanguageTag(languageLike);
20
- },
21
- { "persistance": "localStorage" },
22
- );
23
-
24
- export const { useKcLanguageTag } = wrap;
25
-
26
- export function getEvtKcLanguage(): StatefulEvt<KcLanguageTag> {
27
- return wrap.evtKcLanguageTag;
28
- }