const temporalObjectTags = new Set([ '[object Temporal.Duration]', '[object Temporal.Instant]', '[object Temporal.PlainDate]', '[object Temporal.PlainDateTime]', '[object Temporal.PlainMonthDay]', '[object Temporal.PlainTime]', '[object Temporal.PlainYearMonth]', '[object Temporal.ZonedDateTime]', ]); const isTemporalValue = (value: unknown): boolean => { return value != null && temporalObjectTags.has(Object.prototype.toString.call(value)); }; const getComparableSpreadsheetCellValue = (value: unknown): unknown => { if (value == null) { return ''; } if (isTemporalValue(value)) { return value.toString(); } return value; }; const getRuntimeSpreadsheetCellValue = (value: unknown): unknown => { if (isTemporalValue(value)) { return value.toString(); } return value; }; export const getSpreadsheetRowsRuntimeData = (rows: any[][]): any[][] => { return (rows || []).map(row => (row || []).map(getRuntimeSpreadsheetCellValue)); }; export const spreadsheetCellValuesEqual = (oldValue: unknown, newValue: unknown): boolean => { const oldComparable = getComparableSpreadsheetCellValue(oldValue) as any; const newComparable = getComparableSpreadsheetCellValue(newValue) as any; if (oldComparable == newComparable) { return true; } try { return oldComparable >= newComparable && oldComparable <= newComparable; } catch { return false; } };