import type { IV30LegacySessionGroupsDocument } from './v30_sessionlayoutitemrefs.js'; import type { TControllerSessionId } from '../ts_interfaces/index.js'; type TObject = Record; export interface IProtocolV18LayoutMigrationResult { document: IV30LegacySessionGroupsDocument; migrated: boolean; } export interface IProtocolV18LegacySessionGroup { id: string; name: string; sessionIds: Array; } export interface IProtocolV18LegacySessionGroupsDocument extends Omit { groups: IProtocolV18LegacySessionGroup[]; ungroupedSessionIds?: Array; } const isPlainObject = (valueArg: unknown): valueArg is TObject => typeof valueArg === 'object' && valueArg !== null && !Array.isArray(valueArg); const isLegacyTerminalId = (valueArg: unknown): boolean => isPlainObject(valueArg) && valueArg.harnessId === 'controller'; export const migrateProtocolV18SessionLayoutDocument = ( valueArg: IProtocolV18LegacySessionGroupsDocument, ): IProtocolV18LayoutMigrationResult => { const groups = valueArg.groups.map((group) => ({ ...group, sessionIds: group.sessionIds.filter( (sessionId): sessionId is TControllerSessionId => !isLegacyTerminalId(sessionId), ), })); const ungroupedSessionIds = (valueArg.ungroupedSessionIds ?? []) .filter((sessionId): sessionId is TControllerSessionId => !isLegacyTerminalId(sessionId)); const migrated = groups.some((group, index) => ( group.sessionIds.length !== valueArg.groups[index].sessionIds.length )) || ungroupedSessionIds.length !== (valueArg.ungroupedSessionIds ?? []).length; if (!migrated) return { document: valueArg as IV30LegacySessionGroupsDocument, migrated: false }; return { document: { ...valueArg, groups, ungroupedSessionIds, revision: (valueArg.revision ?? 0) + 1, }, migrated: true, }; };