import type { DeepPartial } from "keycloakify/tools/DeepPartial"; import { deepAssign } from "keycloakify/tools/deepAssign"; import type { ExtendKcContext } from "./getKcContextFromWindow"; import { getKcContextFromWindow } from "./getKcContextFromWindow"; import { pathJoin } from "keycloakify/bin/tools/pathJoin"; import { pathBasename } from "keycloakify/tools/pathBasename"; import { resourcesCommonDirPathRelativeToPublicDir } from "keycloakify/bin/mockTestingResourcesPath"; import { symToStr } from "tsafe/symToStr"; import { kcContextMocks, kcContextCommonMock } from "keycloakify/account/kcContext/kcContextMocks"; export function createGetKcContext(params?: { mockData?: readonly DeepPartial>[]; }) { const { mockData } = params ?? {}; function getKcContext["pageId"] | undefined = undefined>(params?: { mockPageId?: PageId; storyPartialKcContext?: DeepPartial, { pageId: PageId }>>; }): { kcContext: PageId extends undefined ? ExtendKcContext | undefined : Extract, { pageId: PageId }>; } { const { mockPageId, storyPartialKcContext } = params ?? {}; const realKcContext = getKcContextFromWindow(); if (mockPageId !== undefined && realKcContext === undefined) { //TODO maybe trow if no mock fo custom page console.log(`%cKeycloakify: ${symToStr({ mockPageId })} set to ${mockPageId}.`, "background: red; color: yellow; font-size: medium"); const kcContextDefaultMock = kcContextMocks.find(({ pageId }) => pageId === mockPageId); const partialKcContextCustomMock = (() => { const out: DeepPartial> = {}; const mockDataPick = mockData?.find(({ pageId }) => pageId === mockPageId); if (mockDataPick !== undefined) { deepAssign({ "target": out, "source": mockDataPick }); } if (storyPartialKcContext !== undefined) { deepAssign({ "target": out, "source": storyPartialKcContext }); } return Object.keys(out).length === 0 ? undefined : out; })(); if (kcContextDefaultMock === undefined && partialKcContextCustomMock === undefined) { console.warn( [ `WARNING: You declared the non build in page ${mockPageId} but you didn't `, `provide mock data needed to debug the page outside of Keycloak as you are trying to do now.`, `Please check the documentation of the getKcContext function` ].join("\n") ); } const kcContext: any = {}; deepAssign({ "target": kcContext, "source": kcContextDefaultMock !== undefined ? kcContextDefaultMock : { "pageId": mockPageId, ...kcContextCommonMock } }); if (partialKcContextCustomMock !== undefined) { deepAssign({ "target": kcContext, "source": partialKcContextCustomMock }); } return { kcContext }; } if (realKcContext === undefined) { return { "kcContext": undefined as any }; } if (realKcContext.themeType !== "account") { return { "kcContext": undefined as any }; } { const { url } = realKcContext; url.resourcesCommonPath = pathJoin(url.resourcesPath, pathBasename(resourcesCommonDirPathRelativeToPublicDir)); } return { "kcContext": realKcContext as any }; } return { getKcContext }; }