import { projectDeviceSyncFields, type ProjectDeviceSyncField, } from "../../shared/constants/project-device-sync-fields.js"; export function parseOverriddenFields( value: string | null | undefined ): ProjectDeviceSyncField[] { if (!value) { return []; } try { const parsed: unknown = JSON.parse(value); if (!Array.isArray(parsed)) { return []; } return parsed.filter((field): field is ProjectDeviceSyncField => projectDeviceSyncFields.includes(field as ProjectDeviceSyncField) ); } catch { return []; } } export function serializeOverriddenFields( fields: Iterable ): string | undefined { const fieldSet = new Set(fields); const unique = projectDeviceSyncFields.filter((field) => fieldSet.has(field)); return unique.length > 0 ? JSON.stringify(unique) : undefined; } export function deriveOverriddenFieldsForLocalEdit( current: { linkedProjectDeviceId: string | null | undefined; overriddenFields: string | null | undefined; } & Partial>, patch: Partial> ): string | null | undefined { if ( !current.linkedProjectDeviceId || Object.prototype.hasOwnProperty.call(patch, "overriddenFields") ) { return patch.overriddenFields as string | null | undefined; } const overrides = new Set(parseOverriddenFields(current.overriddenFields)); for (const field of projectDeviceSyncFields) { if ( Object.prototype.hasOwnProperty.call(patch, field) && (patch[field] ?? null) !== (current[field] ?? null) ) { overrides.add(field); } } return serializeOverriddenFields(overrides); }