keycloakify 7.6.6 → 7.6.8

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 (32) hide show
  1. package/README.md +56 -5
  2. package/account/index.d.ts +1 -0
  3. package/account/index.js +1 -0
  4. package/account/index.js.map +1 -1
  5. package/account/kcContext/createGetKcContext.d.ts +18 -0
  6. package/account/kcContext/createGetKcContext.js +73 -0
  7. package/account/kcContext/createGetKcContext.js.map +1 -0
  8. package/account/kcContext/getKcContext.d.ts +1 -0
  9. package/account/kcContext/getKcContext.js +7 -49
  10. package/account/kcContext/getKcContext.js.map +1 -1
  11. package/account/pages/Account.js +1 -1
  12. package/account/pages/Account.js.map +1 -1
  13. package/bin/keycloakify/generateKeycloakThemeResources.js +1 -1
  14. package/bin/keycloakify/generateKeycloakThemeResources.js.map +1 -1
  15. package/login/index.d.ts +1 -0
  16. package/login/index.js +1 -0
  17. package/login/index.js.map +1 -1
  18. package/login/kcContext/createGetKcContext.d.ts +18 -0
  19. package/login/kcContext/createGetKcContext.js +114 -0
  20. package/login/kcContext/createGetKcContext.js.map +1 -0
  21. package/login/kcContext/getKcContext.d.ts +1 -0
  22. package/login/kcContext/getKcContext.js +7 -90
  23. package/login/kcContext/getKcContext.js.map +1 -1
  24. package/package.json +25 -4
  25. package/src/account/index.ts +1 -0
  26. package/src/account/kcContext/createGetKcContext.ts +110 -0
  27. package/src/account/kcContext/getKcContext.ts +7 -66
  28. package/src/account/pages/Account.tsx +0 -1
  29. package/src/bin/keycloakify/generateKeycloakThemeResources.ts +1 -1
  30. package/src/login/index.ts +1 -0
  31. package/src/login/kcContext/createGetKcContext.ts +168 -0
  32. package/src/login/kcContext/getKcContext.ts +7 -124
@@ -1,94 +1,11 @@
1
- import { kcContextMocks, kcContextCommonMock } from "./kcContextMocks";
2
- import { deepAssign } from "../../tools/deepAssign";
3
- import { id } from "tsafe/id";
4
- import { exclude } from "tsafe/exclude";
5
- import { assert } from "tsafe/assert";
6
- import { getKcContextFromWindow } from "./getKcContextFromWindow";
7
- import { pathJoin } from "../../bin/tools/pathJoin";
8
- import { pathBasename } from "../../tools/pathBasename";
9
- import { mockTestingResourcesCommonPath } from "../../bin/mockTestingResourcesPath";
10
- import { symToStr } from "tsafe/symToStr";
11
- import { loginThemePageIds } from "../../bin/keycloakify/generateFtl/pageId";
1
+ import { createGetKcContext } from "./createGetKcContext";
2
+ /** @deprecated: Use createGetKcContext instead */
12
3
  export function getKcContext(params) {
13
- var _a, _b;
14
4
  const { mockPageId, mockData } = params !== null && params !== void 0 ? params : {};
15
- const realKcContext = getKcContextFromWindow();
16
- if (mockPageId !== undefined && realKcContext === undefined) {
17
- //TODO maybe trow if no mock fo custom page
18
- console.log([
19
- `%cKeycloakify: ${symToStr({ mockPageId })} set to ${mockPageId}.`,
20
- `If assets are missing make sure you have built your Keycloak theme at least once.`
21
- ].join(" "), "background: red; color: yellow; font-size: medium");
22
- const kcContextDefaultMock = kcContextMocks.find(({ pageId }) => pageId === mockPageId);
23
- const partialKcContextCustomMock = mockData === null || mockData === void 0 ? void 0 : mockData.find(({ pageId }) => pageId === mockPageId);
24
- if (kcContextDefaultMock === undefined && partialKcContextCustomMock === undefined) {
25
- console.warn([
26
- `WARNING: You declared the non build in page ${mockPageId} but you didn't `,
27
- `provide mock data needed to debug the page outside of Keycloak as you are trying to do now.`,
28
- `Please check the documentation of the getKcContext function`
29
- ].join("\n"));
30
- }
31
- const kcContext = {};
32
- deepAssign({
33
- "target": kcContext,
34
- "source": kcContextDefaultMock !== undefined ? kcContextDefaultMock : Object.assign({ "pageId": mockPageId }, kcContextCommonMock)
35
- });
36
- if (partialKcContextCustomMock !== undefined) {
37
- deepAssign({
38
- "target": kcContext,
39
- "source": partialKcContextCustomMock
40
- });
41
- if (partialKcContextCustomMock.pageId === "register-user-profile.ftl" ||
42
- partialKcContextCustomMock.pageId === "update-user-profile.ftl" ||
43
- partialKcContextCustomMock.pageId === "idp-review-user-profile.ftl") {
44
- assert((kcContextDefaultMock === null || kcContextDefaultMock === void 0 ? void 0 : kcContextDefaultMock.pageId) === "register-user-profile.ftl" ||
45
- (kcContextDefaultMock === null || kcContextDefaultMock === void 0 ? void 0 : kcContextDefaultMock.pageId) === "update-user-profile.ftl" ||
46
- (kcContextDefaultMock === null || kcContextDefaultMock === void 0 ? void 0 : kcContextDefaultMock.pageId) === "idp-review-user-profile.ftl");
47
- const { attributes } = kcContextDefaultMock.profile;
48
- id(kcContext).profile.attributes = [];
49
- id(kcContext).profile.attributesByName = {};
50
- const partialAttributes = [
51
- ...((_b = (_a = partialKcContextCustomMock.profile) === null || _a === void 0 ? void 0 : _a.attributes) !== null && _b !== void 0 ? _b : [])
52
- ].filter(exclude(undefined));
53
- attributes.forEach(attribute => {
54
- const partialAttribute = partialAttributes.find(({ name }) => name === attribute.name);
55
- const augmentedAttribute = {};
56
- deepAssign({
57
- "target": augmentedAttribute,
58
- "source": attribute
59
- });
60
- if (partialAttribute !== undefined) {
61
- partialAttributes.splice(partialAttributes.indexOf(partialAttribute), 1);
62
- deepAssign({
63
- "target": augmentedAttribute,
64
- "source": partialAttribute
65
- });
66
- }
67
- id(kcContext).profile.attributes.push(augmentedAttribute);
68
- id(kcContext).profile.attributesByName[augmentedAttribute.name] = augmentedAttribute;
69
- });
70
- partialAttributes
71
- .map(partialAttribute => (Object.assign({ "validators": {} }, partialAttribute)))
72
- .forEach(partialAttribute => {
73
- const { name } = partialAttribute;
74
- assert(name !== undefined, "If you define a mock attribute it must have at least a name");
75
- id(kcContext).profile.attributes.push(partialAttribute);
76
- id(kcContext).profile.attributesByName[name] = partialAttribute;
77
- });
78
- }
79
- }
80
- return { kcContext };
81
- }
82
- if (realKcContext === undefined) {
83
- return { "kcContext": undefined };
84
- }
85
- if (id(loginThemePageIds).indexOf(realKcContext.pageId) < 0 && !("login" in realKcContext)) {
86
- return { "kcContext": undefined };
87
- }
88
- {
89
- const { url } = realKcContext;
90
- url.resourcesCommonPath = pathJoin(url.resourcesPath, pathBasename(mockTestingResourcesCommonPath));
91
- }
92
- return { "kcContext": realKcContext };
5
+ const { getKcContext } = createGetKcContext({
6
+ mockData
7
+ });
8
+ const { kcContext } = getKcContext({ mockPageId });
9
+ return { kcContext };
93
10
  }
94
11
  //# sourceMappingURL=getKcContext.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"getKcContext.js","sourceRoot":"","sources":["../../src/login/kcContext/getKcContext.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"getKcContext.js","sourceRoot":"","sources":["../../src/login/kcContext/getKcContext.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAE1D,kDAAkD;AAClD,MAAM,UAAU,YAAY,CAAwD,MAGnF;IACG,MAAM,EAAE,UAAU,EAAE,QAAQ,EAAE,GAAG,MAAM,aAAN,MAAM,cAAN,MAAM,GAAI,EAAE,CAAC;IAE9C,MAAM,EAAE,YAAY,EAAE,GAAG,kBAAkB,CAAqB;QAC5D,QAAQ;KACX,CAAC,CAAC;IAEH,MAAM,EAAE,SAAS,EAAE,GAAG,YAAY,CAAC,EAAE,UAAU,EAAE,CAAC,CAAC;IAEnD,OAAO,EAAE,SAAS,EAAE,CAAC;AACzB,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "keycloakify",
3
- "version": "7.6.6",
3
+ "version": "7.6.8",
4
4
  "description": "Create Keycloak themes using React",
5
5
  "repository": {
6
6
  "type": "git",
@@ -58,6 +58,7 @@
58
58
  "src/account/i18n/index.ts",
59
59
  "src/account/index.ts",
60
60
  "src/account/kcContext/KcContext.ts",
61
+ "src/account/kcContext/createGetKcContext.ts",
61
62
  "src/account/kcContext/getKcContext.ts",
62
63
  "src/account/kcContext/getKcContextFromWindow.ts",
63
64
  "src/account/kcContext/index.ts",
@@ -144,6 +145,7 @@
144
145
  "src/login/i18n/index.ts",
145
146
  "src/login/index.ts",
146
147
  "src/login/kcContext/KcContext.ts",
148
+ "src/login/kcContext/createGetKcContext.ts",
147
149
  "src/login/kcContext/getKcContext.ts",
148
150
  "src/login/kcContext/getKcContextFromWindow.ts",
149
151
  "src/login/kcContext/index.ts",
@@ -285,6 +287,9 @@
285
287
  "account/kcContext/KcContext.d.ts",
286
288
  "account/kcContext/KcContext.js",
287
289
  "account/kcContext/KcContext.js.map",
290
+ "account/kcContext/createGetKcContext.d.ts",
291
+ "account/kcContext/createGetKcContext.js",
292
+ "account/kcContext/createGetKcContext.js.map",
288
293
  "account/kcContext/getKcContext.d.ts",
289
294
  "account/kcContext/getKcContext.js",
290
295
  "account/kcContext/getKcContext.js.map",
@@ -538,6 +543,9 @@
538
543
  "login/kcContext/KcContext.d.ts",
539
544
  "login/kcContext/KcContext.js",
540
545
  "login/kcContext/KcContext.js.map",
546
+ "login/kcContext/createGetKcContext.d.ts",
547
+ "login/kcContext/createGetKcContext.js",
548
+ "login/kcContext/createGetKcContext.js.map",
541
549
  "login/kcContext/getKcContext.d.ts",
542
550
  "login/kcContext/getKcContext.js",
543
551
  "login/kcContext/getKcContext.js.map",
@@ -696,23 +704,36 @@
696
704
  },
697
705
  "devDependencies": {
698
706
  "@babel/core": "^7.0.0",
707
+ "@storybook/addon-a11y": "^6.5.16",
708
+ "@storybook/addon-actions": "^6.5.13",
709
+ "@storybook/addon-essentials": "^6.5.13",
710
+ "@storybook/addon-interactions": "^6.5.13",
711
+ "@storybook/addon-links": "^6.5.13",
712
+ "@storybook/builder-webpack5": "^6.5.13",
713
+ "@storybook/manager-webpack5": "^6.5.13",
714
+ "@storybook/react": "^6.5.13",
715
+ "@storybook/testing-library": "^0.0.13",
699
716
  "@types/make-fetch-happen": "^10.0.1",
700
717
  "@types/minimist": "^1.2.2",
701
718
  "@types/node": "^18.15.3",
702
- "@types/react": "18.0.9",
719
+ "@types/react": "^18.0.35",
720
+ "@types/react-dom": "^18.0.11",
703
721
  "@types/yauzl": "^2.10.0",
704
722
  "concurrently": "^7.6.0",
705
723
  "copyfiles": "^2.4.1",
724
+ "eslint-plugin-storybook": "^0.6.7",
706
725
  "husky": "^4.3.8",
707
726
  "lint-staged": "^11.0.0",
708
727
  "prettier": "^2.3.0",
709
728
  "properties-parser": "^0.3.1",
710
- "react": "18.1.0",
729
+ "react": "^18.2.0",
730
+ "react-dom": "^18.2.0",
711
731
  "rimraf": "^3.0.2",
712
732
  "scripting-tools": "^0.19.13",
733
+ "storybook-dark-mode": "^1.1.2",
713
734
  "ts-node": "^10.9.1",
714
735
  "tsc-alias": "^1.8.3",
715
- "typescript": "^5.0.1-rc",
736
+ "typescript": "^5.0.4",
716
737
  "vitest": "^0.29.8",
717
738
  "zod-to-json-schema": "^3.20.4"
718
739
  },
@@ -3,6 +3,7 @@ import Fallback from "keycloakify/account/Fallback";
3
3
  export default Fallback;
4
4
 
5
5
  export { getKcContext } from "keycloakify/account/kcContext/getKcContext";
6
+ export { createGetKcContext } from "keycloakify/account/kcContext/createGetKcContext";
6
7
  export { createUseI18n } from "keycloakify/account/i18n/i18n";
7
8
 
8
9
  export type { PageProps } from "keycloakify/account/pages/PageProps";
@@ -0,0 +1,110 @@
1
+ import type { DeepPartial } from "keycloakify/tools/DeepPartial";
2
+ import { deepAssign } from "keycloakify/tools/deepAssign";
3
+ import type { ExtendKcContext } from "./getKcContextFromWindow";
4
+ import { getKcContextFromWindow } from "./getKcContextFromWindow";
5
+ import { pathJoin } from "keycloakify/bin/tools/pathJoin";
6
+ import { pathBasename } from "keycloakify/tools/pathBasename";
7
+ import { mockTestingResourcesCommonPath } from "keycloakify/bin/mockTestingResourcesPath";
8
+ import { symToStr } from "tsafe/symToStr";
9
+ import { kcContextMocks, kcContextCommonMock } from "keycloakify/account/kcContext/kcContextMocks";
10
+ import { id } from "tsafe/id";
11
+ import { accountThemePageIds } from "keycloakify/bin/keycloakify/generateFtl/pageId";
12
+
13
+ export function createGetKcContext<KcContextExtension extends { pageId: string } = never>(params?: {
14
+ mockData?: readonly DeepPartial<ExtendKcContext<KcContextExtension>>[];
15
+ }) {
16
+ const { mockData } = params ?? {};
17
+
18
+ function getKcContext<PageId extends ExtendKcContext<KcContextExtension>["pageId"] | undefined = undefined>(params?: {
19
+ mockPageId?: PageId;
20
+ storyParams?: DeepPartial<Extract<ExtendKcContext<KcContextExtension>, { pageId: PageId }>>;
21
+ }): {
22
+ kcContext: PageId extends undefined
23
+ ? ExtendKcContext<KcContextExtension> | undefined
24
+ : Extract<ExtendKcContext<KcContextExtension>, { pageId: PageId }>;
25
+ } {
26
+ const { mockPageId, storyParams } = params ?? {};
27
+
28
+ const realKcContext = getKcContextFromWindow<KcContextExtension>();
29
+
30
+ if (mockPageId !== undefined && realKcContext === undefined) {
31
+ //TODO maybe trow if no mock fo custom page
32
+
33
+ console.log(
34
+ [
35
+ `%cKeycloakify: ${symToStr({ mockPageId })} set to ${mockPageId}.`,
36
+ `If assets are missing make sure you have built your Keycloak theme at least once.`
37
+ ].join(" "),
38
+ "background: red; color: yellow; font-size: medium"
39
+ );
40
+
41
+ const kcContextDefaultMock = kcContextMocks.find(({ pageId }) => pageId === mockPageId);
42
+
43
+ const partialKcContextCustomMock = (() => {
44
+ const out: DeepPartial<ExtendKcContext<KcContextExtension>> = {};
45
+
46
+ const mockDataPick = mockData?.find(({ pageId }) => pageId === mockPageId);
47
+
48
+ if (mockDataPick !== undefined) {
49
+ deepAssign({
50
+ "target": out,
51
+ "source": mockDataPick
52
+ });
53
+ }
54
+
55
+ if (storyParams !== undefined) {
56
+ deepAssign({
57
+ "target": out,
58
+ "source": storyParams
59
+ });
60
+ }
61
+
62
+ return Object.keys(out).length === 0 ? undefined : out;
63
+ })();
64
+
65
+ if (kcContextDefaultMock === undefined && partialKcContextCustomMock === undefined) {
66
+ console.warn(
67
+ [
68
+ `WARNING: You declared the non build in page ${mockPageId} but you didn't `,
69
+ `provide mock data needed to debug the page outside of Keycloak as you are trying to do now.`,
70
+ `Please check the documentation of the getKcContext function`
71
+ ].join("\n")
72
+ );
73
+ }
74
+
75
+ const kcContext: any = {};
76
+
77
+ deepAssign({
78
+ "target": kcContext,
79
+ "source": kcContextDefaultMock !== undefined ? kcContextDefaultMock : { "pageId": mockPageId, ...kcContextCommonMock }
80
+ });
81
+
82
+ if (partialKcContextCustomMock !== undefined) {
83
+ deepAssign({
84
+ "target": kcContext,
85
+ "source": partialKcContextCustomMock
86
+ });
87
+ }
88
+
89
+ return { kcContext };
90
+ }
91
+
92
+ if (realKcContext === undefined) {
93
+ return { "kcContext": undefined as any };
94
+ }
95
+
96
+ if (id<readonly string[]>(accountThemePageIds).indexOf(realKcContext.pageId) < 0 && !("account" in realKcContext)) {
97
+ return { "kcContext": undefined as any };
98
+ }
99
+
100
+ {
101
+ const { url } = realKcContext;
102
+
103
+ url.resourcesCommonPath = pathJoin(url.resourcesPath, pathBasename(mockTestingResourcesCommonPath));
104
+ }
105
+
106
+ return { "kcContext": realKcContext as any };
107
+ }
108
+
109
+ return { getKcContext };
110
+ }
@@ -1,78 +1,19 @@
1
1
  import type { DeepPartial } from "keycloakify/tools/DeepPartial";
2
- import { deepAssign } from "keycloakify/tools/deepAssign";
3
2
  import type { ExtendKcContext } from "./getKcContextFromWindow";
4
- import { getKcContextFromWindow } from "./getKcContextFromWindow";
5
- import { pathJoin } from "keycloakify/bin/tools/pathJoin";
6
- import { pathBasename } from "keycloakify/tools/pathBasename";
7
- import { mockTestingResourcesCommonPath } from "keycloakify/bin/mockTestingResourcesPath";
8
- import { symToStr } from "tsafe/symToStr";
9
- import { kcContextMocks, kcContextCommonMock } from "keycloakify/account/kcContext/kcContextMocks";
10
- import { id } from "tsafe/id";
11
- import { accountThemePageIds } from "keycloakify/bin/keycloakify/generateFtl/pageId";
3
+ import { createGetKcContext } from "./createGetKcContext";
12
4
 
5
+ /** @deprecated: Use createGetKcContext instead */
13
6
  export function getKcContext<KcContextExtension extends { pageId: string } = never>(params?: {
14
7
  mockPageId?: ExtendKcContext<KcContextExtension>["pageId"];
15
8
  mockData?: readonly DeepPartial<ExtendKcContext<KcContextExtension>>[];
16
9
  }): { kcContext: ExtendKcContext<KcContextExtension> | undefined } {
17
10
  const { mockPageId, mockData } = params ?? {};
18
11
 
19
- const realKcContext = getKcContextFromWindow<KcContextExtension>();
12
+ const { getKcContext } = createGetKcContext({
13
+ mockData
14
+ });
20
15
 
21
- if (mockPageId !== undefined && realKcContext === undefined) {
22
- //TODO maybe trow if no mock fo custom page
16
+ const { kcContext } = getKcContext({ mockPageId });
23
17
 
24
- console.log(
25
- [
26
- `%cKeycloakify: ${symToStr({ mockPageId })} set to ${mockPageId}.`,
27
- `If assets are missing make sure you have built your Keycloak theme at least once.`
28
- ].join(" "),
29
- "background: red; color: yellow; font-size: medium"
30
- );
31
-
32
- const kcContextDefaultMock = kcContextMocks.find(({ pageId }) => pageId === mockPageId);
33
-
34
- const partialKcContextCustomMock = mockData?.find(({ pageId }) => pageId === mockPageId);
35
-
36
- if (kcContextDefaultMock === undefined && partialKcContextCustomMock === undefined) {
37
- console.warn(
38
- [
39
- `WARNING: You declared the non build in page ${mockPageId} but you didn't `,
40
- `provide mock data needed to debug the page outside of Keycloak as you are trying to do now.`,
41
- `Please check the documentation of the getKcContext function`
42
- ].join("\n")
43
- );
44
- }
45
-
46
- const kcContext: any = {};
47
-
48
- deepAssign({
49
- "target": kcContext,
50
- "source": kcContextDefaultMock !== undefined ? kcContextDefaultMock : { "pageId": mockPageId, ...kcContextCommonMock }
51
- });
52
-
53
- if (partialKcContextCustomMock !== undefined) {
54
- deepAssign({
55
- "target": kcContext,
56
- "source": partialKcContextCustomMock
57
- });
58
- }
59
-
60
- return { kcContext };
61
- }
62
-
63
- if (realKcContext === undefined) {
64
- return { "kcContext": undefined };
65
- }
66
-
67
- if (id<readonly string[]>(accountThemePageIds).indexOf(realKcContext.pageId) < 0 && !("account" in realKcContext)) {
68
- return { "kcContext": undefined };
69
- }
70
-
71
- {
72
- const { url } = realKcContext;
73
-
74
- url.resourcesCommonPath = pathJoin(url.resourcesPath, pathBasename(mockTestingResourcesCommonPath));
75
- }
76
-
77
- return { "kcContext": realKcContext };
18
+ return { kcContext };
78
19
  }
@@ -124,7 +124,6 @@ export default function LogoutConfirm(props: PageProps<Extract<KcContext, { page
124
124
  >
125
125
  {msg("doCancel")}
126
126
  </button>
127
- I
128
127
  </div>
129
128
  </div>
130
129
  </div>
@@ -184,7 +184,7 @@ export async function generateKeycloakThemeResources(params: {
184
184
  const themeResourcesDirPath = pathJoin(themeDirPath, "resources");
185
185
 
186
186
  transformCodebase({
187
- "srcDirPath": pathJoin(tmpDirPath, "keycloak", "login", "resources"),
187
+ "srcDirPath": pathJoin(tmpDirPath, "keycloak", themeType, "resources"),
188
188
  "destDirPath": themeResourcesDirPath
189
189
  });
190
190
 
@@ -4,6 +4,7 @@ export default Fallback;
4
4
 
5
5
  export { useDownloadTerms } from "keycloakify/login/lib/useDownloadTerms";
6
6
  export { getKcContext } from "keycloakify/login/kcContext/getKcContext";
7
+ export { createGetKcContext } from "keycloakify/login/kcContext/createGetKcContext";
7
8
  export { createUseI18n } from "keycloakify/login/i18n/i18n";
8
9
 
9
10
  export type { PageProps } from "keycloakify/login/pages/PageProps";
@@ -0,0 +1,168 @@
1
+ import type { KcContext, Attribute } from "./KcContext";
2
+ import { kcContextMocks, kcContextCommonMock } from "./kcContextMocks";
3
+ import type { DeepPartial } from "keycloakify/tools/DeepPartial";
4
+ import { deepAssign } from "keycloakify/tools/deepAssign";
5
+ import { id } from "tsafe/id";
6
+ import { exclude } from "tsafe/exclude";
7
+ import { assert } from "tsafe/assert";
8
+ import type { ExtendKcContext } from "./getKcContextFromWindow";
9
+ import { getKcContextFromWindow } from "./getKcContextFromWindow";
10
+ import { pathJoin } from "keycloakify/bin/tools/pathJoin";
11
+ import { pathBasename } from "keycloakify/tools/pathBasename";
12
+ import { mockTestingResourcesCommonPath } from "keycloakify/bin/mockTestingResourcesPath";
13
+ import { symToStr } from "tsafe/symToStr";
14
+ import { loginThemePageIds } from "keycloakify/bin/keycloakify/generateFtl/pageId";
15
+
16
+ export function createGetKcContext<KcContextExtension extends { pageId: string } = never>(params?: {
17
+ mockData?: readonly DeepPartial<ExtendKcContext<KcContextExtension>>[];
18
+ }) {
19
+ const { mockData } = params ?? {};
20
+
21
+ function getKcContext<PageId extends ExtendKcContext<KcContextExtension>["pageId"] | undefined = undefined>(params?: {
22
+ mockPageId?: PageId;
23
+ storyParams?: DeepPartial<Extract<ExtendKcContext<KcContextExtension>, { pageId: PageId }>>;
24
+ }): {
25
+ kcContext: PageId extends undefined
26
+ ? ExtendKcContext<KcContextExtension> | undefined
27
+ : Extract<ExtendKcContext<KcContextExtension>, { pageId: PageId }>;
28
+ } {
29
+ const { mockPageId, storyParams } = params ?? {};
30
+
31
+ const realKcContext = getKcContextFromWindow<KcContextExtension>();
32
+
33
+ if (mockPageId !== undefined && realKcContext === undefined) {
34
+ //TODO maybe trow if no mock fo custom page
35
+
36
+ console.log(
37
+ [
38
+ `%cKeycloakify: ${symToStr({ mockPageId })} set to ${mockPageId}.`,
39
+ `If assets are missing make sure you have built your Keycloak theme at least once.`
40
+ ].join(" "),
41
+ "background: red; color: yellow; font-size: medium"
42
+ );
43
+
44
+ const kcContextDefaultMock = kcContextMocks.find(({ pageId }) => pageId === mockPageId);
45
+
46
+ const partialKcContextCustomMock = (() => {
47
+ const out: DeepPartial<ExtendKcContext<KcContextExtension>> = {};
48
+
49
+ const mockDataPick = mockData?.find(({ pageId }) => pageId === mockPageId);
50
+
51
+ if (mockDataPick !== undefined) {
52
+ deepAssign({
53
+ "target": out,
54
+ "source": mockDataPick
55
+ });
56
+ }
57
+
58
+ if (storyParams !== undefined) {
59
+ deepAssign({
60
+ "target": out,
61
+ "source": storyParams
62
+ });
63
+ }
64
+
65
+ return Object.keys(out).length === 0 ? undefined : out;
66
+ })();
67
+
68
+ if (kcContextDefaultMock === undefined && partialKcContextCustomMock === undefined) {
69
+ console.warn(
70
+ [
71
+ `WARNING: You declared the non build in page ${mockPageId} but you didn't `,
72
+ `provide mock data needed to debug the page outside of Keycloak as you are trying to do now.`,
73
+ `Please check the documentation of the getKcContext function`
74
+ ].join("\n")
75
+ );
76
+ }
77
+
78
+ const kcContext: any = {};
79
+
80
+ deepAssign({
81
+ "target": kcContext,
82
+ "source": kcContextDefaultMock !== undefined ? kcContextDefaultMock : { "pageId": mockPageId, ...kcContextCommonMock }
83
+ });
84
+
85
+ if (partialKcContextCustomMock !== undefined) {
86
+ deepAssign({
87
+ "target": kcContext,
88
+ "source": partialKcContextCustomMock
89
+ });
90
+
91
+ if (
92
+ partialKcContextCustomMock.pageId === "register-user-profile.ftl" ||
93
+ partialKcContextCustomMock.pageId === "update-user-profile.ftl" ||
94
+ partialKcContextCustomMock.pageId === "idp-review-user-profile.ftl"
95
+ ) {
96
+ assert(
97
+ kcContextDefaultMock?.pageId === "register-user-profile.ftl" ||
98
+ kcContextDefaultMock?.pageId === "update-user-profile.ftl" ||
99
+ kcContextDefaultMock?.pageId === "idp-review-user-profile.ftl"
100
+ );
101
+
102
+ const { attributes } = kcContextDefaultMock.profile;
103
+
104
+ id<KcContext.RegisterUserProfile>(kcContext).profile.attributes = [];
105
+ id<KcContext.RegisterUserProfile>(kcContext).profile.attributesByName = {};
106
+
107
+ const partialAttributes = [
108
+ ...((partialKcContextCustomMock as DeepPartial<KcContext.RegisterUserProfile>).profile?.attributes ?? [])
109
+ ].filter(exclude(undefined));
110
+
111
+ attributes.forEach(attribute => {
112
+ const partialAttribute = partialAttributes.find(({ name }) => name === attribute.name);
113
+
114
+ const augmentedAttribute: Attribute = {} as any;
115
+
116
+ deepAssign({
117
+ "target": augmentedAttribute,
118
+ "source": attribute
119
+ });
120
+
121
+ if (partialAttribute !== undefined) {
122
+ partialAttributes.splice(partialAttributes.indexOf(partialAttribute), 1);
123
+
124
+ deepAssign({
125
+ "target": augmentedAttribute,
126
+ "source": partialAttribute
127
+ });
128
+ }
129
+
130
+ id<KcContext.RegisterUserProfile>(kcContext).profile.attributes.push(augmentedAttribute);
131
+ id<KcContext.RegisterUserProfile>(kcContext).profile.attributesByName[augmentedAttribute.name] = augmentedAttribute;
132
+ });
133
+
134
+ partialAttributes
135
+ .map(partialAttribute => ({ "validators": {}, ...partialAttribute }))
136
+ .forEach(partialAttribute => {
137
+ const { name } = partialAttribute;
138
+
139
+ assert(name !== undefined, "If you define a mock attribute it must have at least a name");
140
+
141
+ id<KcContext.RegisterUserProfile>(kcContext).profile.attributes.push(partialAttribute as any);
142
+ id<KcContext.RegisterUserProfile>(kcContext).profile.attributesByName[name] = partialAttribute as any;
143
+ });
144
+ }
145
+ }
146
+
147
+ return { kcContext };
148
+ }
149
+
150
+ if (realKcContext === undefined) {
151
+ return { "kcContext": undefined as any };
152
+ }
153
+
154
+ if (id<readonly string[]>(loginThemePageIds).indexOf(realKcContext.pageId) < 0 && !("login" in realKcContext)) {
155
+ return { "kcContext": undefined as any };
156
+ }
157
+
158
+ {
159
+ const { url } = realKcContext;
160
+
161
+ url.resourcesCommonPath = pathJoin(url.resourcesPath, pathBasename(mockTestingResourcesCommonPath));
162
+ }
163
+
164
+ return { "kcContext": realKcContext as any };
165
+ }
166
+
167
+ return { getKcContext };
168
+ }