keycloakify 2.2.0 → 2.5.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +21 -0
- package/README.md +156 -127
- package/bin/KeycloakVersion.js.map +1 -1
- package/bin/build-keycloak-theme/build-keycloak-theme.js +57 -54
- package/bin/build-keycloak-theme/build-keycloak-theme.js.map +1 -1
- package/bin/build-keycloak-theme/ftlValuesGlobalName.js.map +1 -1
- package/bin/build-keycloak-theme/generateDebugFiles/generateDebugFiles.js +4 -11
- package/bin/build-keycloak-theme/generateDebugFiles/generateDebugFiles.js.map +1 -1
- package/bin/build-keycloak-theme/generateFtl/common.ftl +72 -56
- package/bin/build-keycloak-theme/generateFtl/generateFtl.d.ts +1 -1
- package/bin/build-keycloak-theme/generateFtl/generateFtl.js +47 -44
- package/bin/build-keycloak-theme/generateFtl/generateFtl.js.map +1 -1
- package/bin/build-keycloak-theme/generateJavaStackFiles.js +12 -8
- package/bin/build-keycloak-theme/generateJavaStackFiles.js.map +1 -1
- package/bin/build-keycloak-theme/generateKeycloakThemeResources.js +20 -21
- package/bin/build-keycloak-theme/generateKeycloakThemeResources.js.map +1 -1
- package/bin/build-keycloak-theme/index.js.map +1 -1
- package/bin/build-keycloak-theme/replaceImportFromStatic.js +18 -30
- package/bin/build-keycloak-theme/replaceImportFromStatic.js.map +1 -1
- package/bin/download-builtin-keycloak-theme.js +2 -2
- package/bin/download-builtin-keycloak-theme.js.map +1 -1
- package/bin/generate-i18n-messages.js +9 -11
- package/bin/generate-i18n-messages.js.map +1 -1
- package/bin/link_in_test_app.js +6 -22
- package/bin/link_in_test_app.js.map +1 -1
- package/bin/tools/crawl.js.map +1 -1
- package/bin/tools/downloadAndUnzip.js +4 -5
- package/bin/tools/downloadAndUnzip.js.map +1 -1
- package/bin/tools/grant-exec-perms.js +4 -3
- package/bin/tools/grant-exec-perms.js.map +1 -1
- package/bin/tools/isInside.js.map +1 -1
- package/bin/tools/rm.js +1 -1
- package/bin/tools/rm.js.map +1 -1
- package/bin/tools/transformCodebase.js +7 -3
- package/bin/tools/transformCodebase.js.map +1 -1
- package/lib/components/Error.js +1 -2
- package/lib/components/Error.js.map +1 -1
- package/lib/components/Info.js +1 -15
- package/lib/components/Info.js.map +1 -1
- package/lib/components/KcApp.js +23 -10
- package/lib/components/KcApp.js.map +1 -1
- package/lib/components/KcProps.d.ts +4 -2
- package/lib/components/KcProps.js +10 -8
- package/lib/components/KcProps.js.map +1 -1
- package/lib/components/Login.js +20 -18
- package/lib/components/Login.js.map +1 -1
- package/lib/components/LoginIdpLinkConfirm.js.map +1 -1
- package/lib/components/LoginOtp.js +14 -15
- package/lib/components/LoginOtp.js.map +1 -1
- package/lib/components/LoginResetPassword.js +5 -7
- package/lib/components/LoginResetPassword.js.map +1 -1
- package/lib/components/LoginUpdateProfile.js +1 -5
- package/lib/components/LoginUpdateProfile.js.map +1 -1
- package/lib/components/LoginVerifyEmail.js.map +1 -1
- package/lib/components/Register.js +1 -4
- package/lib/components/Register.js.map +1 -1
- package/lib/components/RegisterUserProfile.d.ts +6 -0
- package/lib/components/RegisterUserProfile.js +78 -0
- package/lib/components/RegisterUserProfile.js.map +1 -0
- package/lib/components/Template.js +28 -43
- package/lib/components/Template.js.map +1 -1
- package/lib/components/Terms.js.map +1 -1
- package/lib/getKcContext/KcContextBase.d.ts +78 -18
- package/lib/getKcContext/KcContextBase.js +2 -3
- package/lib/getKcContext/KcContextBase.js.map +1 -1
- package/lib/getKcContext/getKcContext.d.ts +1 -3
- package/lib/getKcContext/getKcContext.js +5 -9
- package/lib/getKcContext/getKcContext.js.map +1 -1
- package/lib/getKcContext/kcContextMocks/kcContextMocks.d.ts +1 -0
- package/lib/getKcContext/kcContextMocks/kcContextMocks.js +187 -55
- package/lib/getKcContext/kcContextMocks/kcContextMocks.js.map +1 -1
- package/lib/getKcContext/kcContextMocks/urlResourcesPath.js.map +1 -1
- package/lib/i18n/KcLanguageTag.d.ts +25 -2
- package/lib/i18n/KcLanguageTag.js +27 -27
- package/lib/i18n/KcLanguageTag.js.map +1 -1
- package/lib/i18n/generated_kcMessages/11.0.3/account.js +27 -27
- package/lib/i18n/generated_kcMessages/11.0.3/account.js.map +1 -1
- package/lib/i18n/generated_kcMessages/11.0.3/admin.js +23 -23
- package/lib/i18n/generated_kcMessages/11.0.3/admin.js.map +1 -1
- package/lib/i18n/generated_kcMessages/11.0.3/email.js +97 -97
- package/lib/i18n/generated_kcMessages/11.0.3/email.js.map +1 -1
- package/lib/i18n/generated_kcMessages/11.0.3/login.js +30 -30
- package/lib/i18n/generated_kcMessages/11.0.3/login.js.map +1 -1
- package/lib/i18n/generated_kcMessages/15.0.2/account.js +29 -29
- package/lib/i18n/generated_kcMessages/15.0.2/account.js.map +1 -1
- package/lib/i18n/generated_kcMessages/15.0.2/admin.js +23 -23
- package/lib/i18n/generated_kcMessages/15.0.2/admin.js.map +1 -1
- package/lib/i18n/generated_kcMessages/15.0.2/email.js +111 -111
- package/lib/i18n/generated_kcMessages/15.0.2/email.js.map +1 -1
- package/lib/i18n/generated_kcMessages/15.0.2/login.js +32 -32
- package/lib/i18n/generated_kcMessages/15.0.2/login.js.map +1 -1
- package/lib/i18n/kcMessages/login.js +1 -1
- package/lib/i18n/kcMessages/login.js.map +1 -1
- package/lib/i18n/useKcLanguageTag.js +1 -3
- package/lib/i18n/useKcLanguageTag.js.map +1 -1
- package/lib/i18n/useKcMessage.d.ts +4 -2
- package/lib/i18n/useKcMessage.js +12 -3
- package/lib/i18n/useKcMessage.js.map +1 -1
- package/lib/keycloakJsAdapter.d.ts +6 -6
- package/lib/keycloakJsAdapter.js +10 -12
- package/lib/keycloakJsAdapter.js.map +1 -1
- package/lib/tools/ReactComponent.d.ts +2 -0
- package/lib/tools/ReactComponent.js +3 -0
- package/lib/tools/ReactComponent.js.map +1 -0
- package/lib/tools/allPropertiesValuesToUndefined.js +1 -2
- package/lib/tools/allPropertiesValuesToUndefined.js.map +1 -1
- package/lib/tools/appendHead.js +16 -12
- package/lib/tools/appendHead.js.map +1 -1
- package/lib/tools/assert.js.map +1 -1
- package/lib/tools/deepAssign.js +3 -4
- package/lib/tools/deepAssign.js.map +1 -1
- package/lib/tools/deepClone.js.map +1 -1
- package/package.json +25 -5
- package/src/bin/KeycloakVersion.ts +0 -2
- package/src/bin/build-keycloak-theme/build-keycloak-theme.ts +70 -77
- package/src/bin/build-keycloak-theme/ftlValuesGlobalName.ts +1 -2
- package/src/bin/build-keycloak-theme/generateDebugFiles/generateDebugFiles.ts +26 -37
- package/src/bin/build-keycloak-theme/generateDebugFiles/index.ts +1 -1
- package/src/bin/build-keycloak-theme/generateFtl/common.ftl +72 -56
- package/src/bin/build-keycloak-theme/generateFtl/generateFtl.ts +75 -95
- package/src/bin/build-keycloak-theme/generateFtl/index.ts +1 -1
- package/src/bin/build-keycloak-theme/generateJavaStackFiles.ts +38 -56
- package/src/bin/build-keycloak-theme/generateKeycloakThemeResources.ts +47 -85
- package/src/bin/build-keycloak-theme/index.ts +2 -4
- package/src/bin/build-keycloak-theme/replaceImportFromStatic.ts +34 -78
- package/src/bin/download-builtin-keycloak-theme.ts +5 -19
- package/src/bin/generate-i18n-messages.ts +13 -25
- package/src/bin/link_in_test_app.ts +9 -38
- package/src/bin/tools/crawl.ts +2 -12
- package/src/bin/tools/downloadAndUnzip.ts +6 -22
- package/src/bin/tools/getProjectRoot.ts +1 -1
- package/src/bin/tools/grant-exec-perms.ts +8 -7
- package/src/bin/tools/isInside.ts +2 -9
- package/src/bin/tools/rm.ts +21 -32
- package/src/bin/tools/transformCodebase.ts +20 -43
- package/src/lib/components/Error.tsx +3 -7
- package/src/lib/components/Info.tsx +23 -47
- package/src/lib/components/KcApp.tsx +25 -13
- package/src/lib/components/KcProps.ts +94 -92
- package/src/lib/components/Login.tsx +126 -116
- package/src/lib/components/LoginIdpLinkConfirm.tsx +38 -53
- package/src/lib/components/LoginOtp.tsx +39 -76
- package/src/lib/components/LoginResetPassword.tsx +9 -26
- package/src/lib/components/LoginUpdateProfile.tsx +104 -117
- package/src/lib/components/LoginVerifyEmail.tsx +3 -12
- package/src/lib/components/Register.tsx +76 -46
- package/src/lib/components/RegisterUserProfile.tsx +201 -0
- package/src/lib/components/Template.tsx +109 -161
- package/src/lib/components/Terms.tsx +4 -13
- package/src/lib/getKcContext/KcContextBase.ts +104 -53
- package/src/lib/getKcContext/getKcContext.ts +47 -78
- package/src/lib/getKcContext/index.ts +2 -2
- package/src/lib/getKcContext/kcContextMocks/index.ts +1 -1
- package/src/lib/getKcContext/kcContextMocks/kcContextMocks.ts +362 -241
- package/src/lib/getKcContext/kcContextMocks/urlResourcesPath.ts +1 -2
- package/src/lib/i18n/KcLanguageTag.ts +34 -45
- package/src/lib/i18n/generated_kcMessages/11.0.3/account.ts +3086 -3059
- package/src/lib/i18n/generated_kcMessages/11.0.3/admin.ts +248 -239
- package/src/lib/i18n/generated_kcMessages/11.0.3/email.ts +848 -633
- package/src/lib/i18n/generated_kcMessages/11.0.3/login.ts +4466 -4359
- package/src/lib/i18n/generated_kcMessages/15.0.2/account.ts +4247 -4202
- package/src/lib/i18n/generated_kcMessages/15.0.2/admin.ts +273 -264
- package/src/lib/i18n/generated_kcMessages/15.0.2/email.ts +997 -749
- package/src/lib/i18n/generated_kcMessages/15.0.2/login.ts +5352 -5212
- package/src/lib/i18n/kcMessages/login.ts +4 -9
- package/src/lib/i18n/useKcLanguageTag.ts +2 -16
- package/src/lib/i18n/useKcMessage.tsx +26 -15
- package/src/lib/index.ts +0 -1
- package/src/lib/keycloakJsAdapter.ts +23 -53
- package/src/lib/tools/AndByDiscriminatingKey.ts +16 -30
- package/src/lib/tools/DeepPartial.ts +1 -2
- package/src/lib/tools/ReactComponent.ts +4 -0
- package/src/lib/tools/allPropertiesValuesToUndefined.ts +1 -6
- package/src/lib/tools/appendHead.ts +28 -25
- package/src/lib/tools/assert.ts +1 -2
- package/src/lib/tools/deepAssign.ts +28 -46
- package/src/lib/tools/deepClone.ts +2 -3
@@ -1,4 +1,3 @@
|
|
1
|
-
|
2
1
|
import { kcMessages } from "../generated_kcMessages/15.0.2/login";
|
3
2
|
import { Evt } from "evt";
|
4
3
|
import { objectKeys } from "tsafe/objectKeys";
|
@@ -11,7 +10,6 @@ export const evtTermsUpdated = Evt.asNonPostable(Evt.create<void>());
|
|
11
10
|
kcMessages[kcLanguage],
|
12
11
|
key,
|
13
12
|
(() => {
|
14
|
-
|
15
13
|
let value = key === "termsText" ? "⏳" : kcMessages[kcLanguage][key];
|
16
14
|
|
17
15
|
return {
|
@@ -20,14 +18,11 @@ export const evtTermsUpdated = Evt.asNonPostable(Evt.create<void>());
|
|
20
18
|
"set": (newValue: string) => {
|
21
19
|
value = newValue;
|
22
20
|
Evt.asPostable(evtTermsUpdated).post();
|
23
|
-
}
|
21
|
+
},
|
24
22
|
};
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
)
|
29
|
-
)
|
23
|
+
})(),
|
24
|
+
),
|
25
|
+
),
|
30
26
|
);
|
31
27
|
|
32
28
|
export { kcMessages };
|
33
|
-
|
@@ -1,35 +1,24 @@
|
|
1
|
-
|
2
1
|
import { createUseGlobalState } from "powerhooks/useGlobalState";
|
3
2
|
import { getKcContext } from "../getKcContext";
|
4
3
|
import { getBestMatchAmongKcLanguageTag } from "./KcLanguageTag";
|
5
4
|
import type { StatefulEvt } from "powerhooks";
|
6
5
|
import { KcLanguageTag } from "./KcLanguageTag";
|
7
6
|
|
8
|
-
|
9
7
|
//export const { useKcLanguageTag, evtKcLanguageTag } = createUseGlobalState(
|
10
8
|
const wrap = createUseGlobalState(
|
11
9
|
"kcLanguageTag",
|
12
10
|
() => {
|
13
|
-
|
14
|
-
|
15
11
|
const { kcContext } = getKcContext();
|
16
12
|
|
17
|
-
const languageLike =
|
18
|
-
kcContext?.locale?.current ??
|
19
|
-
(
|
20
|
-
typeof navigator === "undefined" ?
|
21
|
-
undefined :
|
22
|
-
navigator.language
|
23
|
-
);
|
13
|
+
const languageLike = kcContext?.locale?.current ?? (typeof navigator === "undefined" ? undefined : navigator.language);
|
24
14
|
|
25
15
|
if (languageLike === undefined) {
|
26
16
|
return "en";
|
27
17
|
}
|
28
18
|
|
29
19
|
return getBestMatchAmongKcLanguageTag(languageLike);
|
30
|
-
|
31
20
|
},
|
32
|
-
{ "persistance": "localStorage" }
|
21
|
+
{ "persistance": "localStorage" },
|
33
22
|
);
|
34
23
|
|
35
24
|
export const { useKcLanguageTag } = wrap;
|
@@ -37,6 +26,3 @@ export const { useKcLanguageTag } = wrap;
|
|
37
26
|
export function getEvtKcLanguage(): StatefulEvt<KcLanguageTag> {
|
38
27
|
return wrap.evtKcLanguageTag;
|
39
28
|
}
|
40
|
-
|
41
|
-
|
42
|
-
|
@@ -1,15 +1,16 @@
|
|
1
|
-
|
2
1
|
import { useCallback, useReducer } from "react";
|
3
2
|
import { useKcLanguageTag } from "./useKcLanguageTag";
|
4
3
|
import { kcMessages, evtTermsUpdated } from "./kcMessages/login";
|
5
|
-
import type { ReactNode } from "react";
|
6
4
|
import { useEvt } from "evt/hooks";
|
7
5
|
//NOTE for later: https://github.com/remarkjs/react-markdown/blob/236182ecf30bd89c1e5a7652acaf8d0bf81e6170/src/renderers.js#L7-L35
|
8
6
|
import ReactMarkdown from "react-markdown";
|
7
|
+
import { id } from "tsafe/id";
|
8
|
+
|
9
|
+
export { kcMessages };
|
9
10
|
|
10
11
|
export type MessageKey = keyof typeof kcMessages["en"];
|
11
12
|
|
12
|
-
/**
|
13
|
+
/**
|
13
14
|
* When the language is switched the page is reloaded, this may appear
|
14
15
|
* as a bug as you might notice that the language successfully switch before
|
15
16
|
* reload.
|
@@ -17,7 +18,6 @@ export type MessageKey = keyof typeof kcMessages["en"];
|
|
17
18
|
* during login so we can retrieve the "local" field of the JWT encoded accessToken.
|
18
19
|
*/
|
19
20
|
export function useKcMessage() {
|
20
|
-
|
21
21
|
const { kcLanguageTag } = useKcLanguageTag();
|
22
22
|
|
23
23
|
const [trigger, forceUpdate] = useReducer((counter: number) => counter + 1, 0);
|
@@ -26,33 +26,44 @@ export function useKcMessage() {
|
|
26
26
|
|
27
27
|
const msgStr = useCallback(
|
28
28
|
(key: MessageKey, ...args: (string | undefined)[]): string => {
|
29
|
-
|
30
29
|
let str: string = kcMessages[kcLanguageTag as any as "en"][key] ?? kcMessages["en"][key];
|
31
30
|
|
32
31
|
args.forEach((arg, i) => {
|
33
|
-
|
34
32
|
if (arg === undefined) {
|
35
33
|
return;
|
36
34
|
}
|
37
35
|
|
38
36
|
str = str.replace(new RegExp(`\\{${i}\\}`, "g"), arg);
|
39
|
-
|
40
37
|
});
|
41
38
|
|
42
39
|
return str;
|
43
|
-
|
44
40
|
},
|
45
|
-
[kcLanguageTag, trigger]
|
41
|
+
[kcLanguageTag, trigger],
|
46
42
|
);
|
47
43
|
|
48
|
-
const msg = useCallback<(...args: Parameters<typeof msgStr>) =>
|
49
|
-
(key, ...args) =>
|
44
|
+
const msg = useCallback<(...args: Parameters<typeof msgStr>) => JSX.Element>(
|
45
|
+
(key, ...args) => (
|
50
46
|
<ReactMarkdown allowDangerousHtml renderers={key === "termsText" ? undefined : { "paragraph": "span" }}>
|
51
47
|
{msgStr(key, ...args)}
|
52
|
-
</ReactMarkdown
|
53
|
-
|
48
|
+
</ReactMarkdown>
|
49
|
+
),
|
50
|
+
[msgStr],
|
54
51
|
);
|
55
52
|
|
56
|
-
|
53
|
+
const advancedMsg = useCallback(
|
54
|
+
(key: string): string | undefined => {
|
55
|
+
const match = key.match(/^\$\{([^{]+)\}$/);
|
56
|
+
|
57
|
+
const resolvedKey = match === null ? key : match[1];
|
58
|
+
|
59
|
+
const out =
|
60
|
+
id<Record<string, string | undefined>>(kcMessages[kcLanguageTag])[resolvedKey] ??
|
61
|
+
id<Record<string, string | undefined>>(kcMessages["en"])[resolvedKey];
|
62
|
+
|
63
|
+
return out !== undefined ? out : match === null ? key : undefined;
|
64
|
+
},
|
65
|
+
[msgStr],
|
66
|
+
);
|
57
67
|
|
58
|
-
}
|
68
|
+
return { msg, msgStr, advancedMsg };
|
69
|
+
}
|
package/src/lib/index.ts
CHANGED
@@ -1,7 +1,4 @@
|
|
1
|
-
|
2
|
-
|
3
1
|
export declare namespace keycloak_js {
|
4
|
-
|
5
2
|
export type KeycloakPromiseCallback<T> = (result: T) => void;
|
6
3
|
export class KeycloakPromise<TSuccess, TError> extends Promise<TSuccess> {
|
7
4
|
success(callback: KeycloakPromiseCallback<TSuccess>): KeycloakPromise<TSuccess, TError>;
|
@@ -12,7 +9,7 @@ export declare namespace keycloak_js {
|
|
12
9
|
logout(options?: KeycloakLogoutOptions): KeycloakPromise<void, void>;
|
13
10
|
register(options?: KeycloakLoginOptions): KeycloakPromise<void, void>;
|
14
11
|
accountManagement(): KeycloakPromise<void, void>;
|
15
|
-
redirectUri(options: { redirectUri: string
|
12
|
+
redirectUri(options: { redirectUri: string }, encodeHash: boolean): string;
|
16
13
|
}
|
17
14
|
export interface KeycloakLogoutOptions {
|
18
15
|
redirectUri?: string;
|
@@ -20,7 +17,7 @@ export declare namespace keycloak_js {
|
|
20
17
|
export interface KeycloakLoginOptions {
|
21
18
|
scope?: string;
|
22
19
|
redirectUri?: string;
|
23
|
-
prompt?:
|
20
|
+
prompt?: "none" | "login";
|
24
21
|
action?: string;
|
25
22
|
maxAge?: number;
|
26
23
|
loginHint?: string;
|
@@ -30,73 +27,48 @@ export declare namespace keycloak_js {
|
|
30
27
|
}
|
31
28
|
|
32
29
|
export type KeycloakInstance = Record<
|
33
|
-
"createLoginUrl" |
|
34
|
-
"createLogoutUrl" |
|
35
|
-
"createRegisterUrl",
|
30
|
+
"createLoginUrl" | "createLogoutUrl" | "createRegisterUrl",
|
36
31
|
(options: KeycloakLoginOptions | undefined) => string
|
37
32
|
> & {
|
38
33
|
createAccountUrl(): string;
|
39
34
|
redirectUri?: string;
|
40
|
-
}
|
41
|
-
|
35
|
+
};
|
42
36
|
}
|
43
37
|
|
44
38
|
/**
|
45
|
-
* NOTE: This is just a slightly modified version of the default adapter in keycloak-js
|
46
|
-
* The goal here is just to be able to inject search param in url before keycloak redirect.
|
47
|
-
* Our use case for it is to pass over the login screen the states of useGlobalState
|
48
|
-
* namely isDarkModeEnabled, lgn...
|
49
|
-
*/
|
50
|
-
export function createKeycloakAdapter(
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
}
|
55
|
-
): keycloak_js.KeycloakAdapter {
|
56
|
-
|
39
|
+
* NOTE: This is just a slightly modified version of the default adapter in keycloak-js
|
40
|
+
* The goal here is just to be able to inject search param in url before keycloak redirect.
|
41
|
+
* Our use case for it is to pass over the login screen the states of useGlobalState
|
42
|
+
* namely isDarkModeEnabled, lgn...
|
43
|
+
*/
|
44
|
+
export function createKeycloakAdapter(params: {
|
45
|
+
keycloakInstance: keycloak_js.KeycloakInstance;
|
46
|
+
transformUrlBeforeRedirect(url: string): string;
|
47
|
+
}): keycloak_js.KeycloakAdapter {
|
57
48
|
const { keycloakInstance, transformUrlBeforeRedirect } = params;
|
58
49
|
|
59
|
-
const neverResolvingPromise: keycloak_js.KeycloakPromise<void, void> = Object.defineProperties(
|
60
|
-
|
61
|
-
{
|
62
|
-
|
63
|
-
"error": { "value": () => { } }
|
64
|
-
}
|
65
|
-
) as any;
|
50
|
+
const neverResolvingPromise: keycloak_js.KeycloakPromise<void, void> = Object.defineProperties(new Promise(() => {}), {
|
51
|
+
"success": { "value": () => {} },
|
52
|
+
"error": { "value": () => {} },
|
53
|
+
}) as any;
|
66
54
|
|
67
55
|
return {
|
68
56
|
"login": options => {
|
69
|
-
window.location.href=
|
70
|
-
transformUrlBeforeRedirect(
|
71
|
-
keycloakInstance.createLoginUrl(
|
72
|
-
options
|
73
|
-
)
|
74
|
-
);
|
57
|
+
window.location.href = transformUrlBeforeRedirect(keycloakInstance.createLoginUrl(options));
|
75
58
|
return neverResolvingPromise;
|
76
59
|
},
|
77
60
|
"logout": options => {
|
78
|
-
window.location.replace(
|
79
|
-
transformUrlBeforeRedirect(
|
80
|
-
keycloakInstance.createLogoutUrl(
|
81
|
-
options
|
82
|
-
)
|
83
|
-
)
|
84
|
-
);
|
61
|
+
window.location.replace(transformUrlBeforeRedirect(keycloakInstance.createLogoutUrl(options)));
|
85
62
|
return neverResolvingPromise;
|
86
63
|
},
|
87
64
|
"register": options => {
|
88
|
-
window.location.href =
|
89
|
-
transformUrlBeforeRedirect(
|
90
|
-
keycloakInstance.createRegisterUrl(
|
91
|
-
options
|
92
|
-
)
|
93
|
-
);
|
65
|
+
window.location.href = transformUrlBeforeRedirect(keycloakInstance.createRegisterUrl(options));
|
94
66
|
|
95
67
|
return neverResolvingPromise;
|
96
68
|
},
|
97
69
|
"accountManagement": () => {
|
98
70
|
var accountUrl = transformUrlBeforeRedirect(keycloakInstance.createAccountUrl());
|
99
|
-
if (typeof accountUrl !==
|
71
|
+
if (typeof accountUrl !== "undefined") {
|
100
72
|
window.location.href = accountUrl;
|
101
73
|
} else {
|
102
74
|
throw new Error("Not supported by the OIDC server");
|
@@ -111,8 +83,6 @@ export function createKeycloakAdapter(
|
|
111
83
|
} else {
|
112
84
|
return window.location.href;
|
113
85
|
}
|
114
|
-
}
|
86
|
+
},
|
115
87
|
};
|
116
|
-
|
117
|
-
|
118
|
-
}
|
88
|
+
}
|
@@ -1,35 +1,21 @@
|
|
1
|
-
|
2
1
|
export type AndByDiscriminatingKey<
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
AndByDiscriminatingKey.Tf1<DiscriminatingKey, U1, U1, U2>;
|
2
|
+
DiscriminatingKey extends string,
|
3
|
+
U1 extends Record<DiscriminatingKey, string>,
|
4
|
+
U2 extends Record<DiscriminatingKey, string>,
|
5
|
+
> = AndByDiscriminatingKey.Tf1<DiscriminatingKey, U1, U1, U2>;
|
8
6
|
|
9
7
|
export declare namespace AndByDiscriminatingKey {
|
8
|
+
export type Tf1<
|
9
|
+
DiscriminatingKey extends string,
|
10
|
+
U1,
|
11
|
+
U1Again extends Record<DiscriminatingKey, string>,
|
12
|
+
U2 extends Record<DiscriminatingKey, string>,
|
13
|
+
> = U1 extends Pick<U2, DiscriminatingKey> ? Tf2<DiscriminatingKey, U1, U2, U1Again> : U1;
|
10
14
|
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
U1 extends Pick<U2, DiscriminatingKey> ?
|
18
|
-
Tf2<DiscriminatingKey, U1, U2, U1Again> :
|
19
|
-
U1;
|
20
|
-
|
21
|
-
export type Tf2<
|
22
|
-
DiscriminatingKey extends string,
|
23
|
-
SingletonU1 extends Record<DiscriminatingKey, string>,
|
24
|
-
U2,
|
25
|
-
U1 extends Record<DiscriminatingKey, string>
|
26
|
-
> =
|
27
|
-
U2 extends Pick<SingletonU1, DiscriminatingKey> ?
|
28
|
-
U2 & SingletonU1 :
|
29
|
-
U2 extends Pick<U1, DiscriminatingKey> ?
|
30
|
-
never :
|
31
|
-
U2;
|
32
|
-
|
15
|
+
export type Tf2<
|
16
|
+
DiscriminatingKey extends string,
|
17
|
+
SingletonU1 extends Record<DiscriminatingKey, string>,
|
18
|
+
U2,
|
19
|
+
U1 extends Record<DiscriminatingKey, string>,
|
20
|
+
> = U2 extends Pick<SingletonU1, DiscriminatingKey> ? U2 & SingletonU1 : U2 extends Pick<U1, DiscriminatingKey> ? never : U2;
|
33
21
|
}
|
34
|
-
|
35
|
-
|
@@ -1,10 +1,5 @@
|
|
1
|
-
|
2
|
-
|
3
1
|
import "minimal-polyfills/Object.fromEntries";
|
4
2
|
|
5
3
|
export function allPropertiesValuesToUndefined<T extends Record<string, unknown>>(obj: T): Record<keyof T, undefined> {
|
6
|
-
return Object.fromEntries(
|
7
|
-
Object.entries(obj)
|
8
|
-
.map(([key]) => [key, undefined])
|
9
|
-
) as any;
|
4
|
+
return Object.fromEntries(Object.entries(obj).map(([key]) => [key, undefined])) as any;
|
10
5
|
}
|
@@ -1,23 +1,25 @@
|
|
1
|
-
|
2
1
|
import { Deferred } from "evt/tools/Deferred";
|
3
2
|
|
4
3
|
export function appendHead(
|
5
|
-
params:
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
4
|
+
params:
|
5
|
+
| {
|
6
|
+
type: "css";
|
7
|
+
href: string;
|
8
|
+
}
|
9
|
+
| {
|
10
|
+
type: "javascript";
|
11
|
+
src: string;
|
12
|
+
},
|
12
13
|
) {
|
13
|
-
|
14
14
|
const htmlElement = document.createElement(
|
15
15
|
(() => {
|
16
16
|
switch (params.type) {
|
17
|
-
case "css":
|
18
|
-
|
17
|
+
case "css":
|
18
|
+
return "link";
|
19
|
+
case "javascript":
|
20
|
+
return "script";
|
19
21
|
}
|
20
|
-
})()
|
22
|
+
})(),
|
21
23
|
);
|
22
24
|
|
23
25
|
const dLoaded = new Deferred<void>();
|
@@ -28,22 +30,23 @@ export function appendHead(
|
|
28
30
|
htmlElement,
|
29
31
|
(() => {
|
30
32
|
switch (params.type) {
|
31
|
-
case "css":
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
33
|
+
case "css":
|
34
|
+
return {
|
35
|
+
"href": params.href,
|
36
|
+
"type": "text/css",
|
37
|
+
"rel": "stylesheet",
|
38
|
+
"media": "screen,print",
|
39
|
+
};
|
40
|
+
case "javascript":
|
41
|
+
return {
|
42
|
+
"src": params.src,
|
43
|
+
"type": "text/javascript",
|
44
|
+
};
|
41
45
|
}
|
42
|
-
})()
|
46
|
+
})(),
|
43
47
|
);
|
44
48
|
|
45
49
|
document.getElementsByTagName("head")[0].appendChild(htmlElement);
|
46
50
|
|
47
51
|
return dLoaded.pr;
|
48
|
-
|
49
|
-
}
|
52
|
+
}
|
package/src/lib/tools/assert.ts
CHANGED
@@ -1,2 +1 @@
|
|
1
|
-
|
2
|
-
export { assert } from "tsafe/assert";
|
1
|
+
export { assert } from "tsafe/assert";
|
@@ -1,59 +1,41 @@
|
|
1
|
-
|
2
1
|
import { assert } from "tsafe/assert";
|
3
2
|
import { is } from "tsafe/is";
|
4
3
|
|
5
4
|
//Warning: Be mindful that because of array this is not idempotent.
|
6
|
-
export function deepAssign(
|
7
|
-
|
8
|
-
target: Record<string, unknown>;
|
9
|
-
source: Record<string, unknown>;
|
10
|
-
}
|
11
|
-
) {
|
12
|
-
|
13
|
-
const { target, source } = params;
|
14
|
-
|
15
|
-
Object.keys(source).forEach(key => {
|
16
|
-
var dereferencedSource = source[key];
|
17
|
-
|
18
|
-
if (
|
19
|
-
target[key] === undefined ||
|
20
|
-
!(dereferencedSource instanceof Object)
|
21
|
-
) {
|
22
|
-
|
23
|
-
Object.defineProperty(
|
24
|
-
target,
|
25
|
-
key,
|
26
|
-
{
|
27
|
-
"enumerable": true,
|
28
|
-
"writable": true,
|
29
|
-
"configurable": true,
|
30
|
-
"value": dereferencedSource
|
31
|
-
}
|
32
|
-
);
|
33
|
-
|
34
|
-
return;
|
35
|
-
}
|
5
|
+
export function deepAssign(params: { target: Record<string, unknown>; source: Record<string, unknown> }) {
|
6
|
+
const { target, source } = params;
|
36
7
|
|
37
|
-
|
8
|
+
Object.keys(source).forEach(key => {
|
9
|
+
var dereferencedSource = source[key];
|
38
10
|
|
39
|
-
|
11
|
+
if (target[key] === undefined || !(dereferencedSource instanceof Object)) {
|
12
|
+
Object.defineProperty(target, key, {
|
13
|
+
"enumerable": true,
|
14
|
+
"writable": true,
|
15
|
+
"configurable": true,
|
16
|
+
"value": dereferencedSource,
|
17
|
+
});
|
40
18
|
|
41
|
-
|
42
|
-
|
19
|
+
return;
|
20
|
+
}
|
43
21
|
|
44
|
-
|
22
|
+
const dereferencedTarget = target[key];
|
45
23
|
|
46
|
-
|
47
|
-
|
24
|
+
if (dereferencedSource instanceof Array) {
|
25
|
+
assert(is<unknown[]>(dereferencedTarget));
|
26
|
+
assert(is<unknown[]>(dereferencedSource));
|
48
27
|
|
49
|
-
|
50
|
-
assert(is<Record<string, unknown>>(dereferencedSource));
|
28
|
+
dereferencedSource.forEach(entry => dereferencedTarget.push(entry));
|
51
29
|
|
52
|
-
|
53
|
-
|
54
|
-
"source": dereferencedSource
|
55
|
-
});
|
30
|
+
return;
|
31
|
+
}
|
56
32
|
|
57
|
-
|
33
|
+
assert(is<Record<string, unknown>>(dereferencedTarget));
|
34
|
+
assert(is<Record<string, unknown>>(dereferencedSource));
|
58
35
|
|
59
|
-
|
36
|
+
deepAssign({
|
37
|
+
"target": dereferencedTarget,
|
38
|
+
"source": dereferencedSource,
|
39
|
+
});
|
40
|
+
});
|
41
|
+
}
|