import type { ExtendKcContext, KcContext as KcContextBase, PageId as PageId_builtin } from "./KcContext"; import type { DeepPartial } from "../../tools/DeepPartial"; import { deepAssign } from "../../tools/deepAssign"; import { structuredCloneButFunctions } from "../../tools/structuredCloneButFunctions"; import { kcContextMocks, kcContextCommonMock } from "./kcContextMocks"; import { exclude } from "tsafe/exclude"; export function createGetKcContextMock< KcContextExtension extends { properties?: Record }, KcContextExtensionPerPage extends Record<`${string}.ftl`, Record> >(params: { kcContextExtension: KcContextExtension; kcContextExtensionPerPage: KcContextExtensionPerPage; overrides?: DeepPartial; overridesPerPage?: { [PageId in PageId_builtin | keyof KcContextExtensionPerPage]?: DeepPartial< Extract, { pageId: PageId }> >; }; }) { const { kcContextExtension, kcContextExtensionPerPage, overrides: overrides_global, overridesPerPage: overridesPerPage_global } = params; type KcContext = ExtendKcContext; function getKcContextMock(params: { pageId: PageId; overrides?: DeepPartial>; }): Extract { const { pageId, overrides } = params; const kcContextMock = structuredCloneButFunctions( kcContextMocks.find(kcContextMock => kcContextMock.pageId === pageId) ?? { ...kcContextCommonMock, pageId } ); [ kcContextExtension, kcContextExtensionPerPage[pageId], overrides_global, overridesPerPage_global?.[pageId], overrides ] .filter(exclude(undefined)) .forEach(overrides => deepAssign({ target: kcContextMock, source: overrides }) ); // @ts-expect-error: We know what we are doing return kcContextMock; } return { getKcContextMock }; }