import { Array as YArray, Map as YMap, Text as YText } from 'yjs'; export type Native2Y = T extends Record ? YMap : T extends Array ? YArray : T; export function isPureObject(value: unknown): value is object { return ( typeof value === 'object' && value !== null && !Array.isArray(value) && !(value instanceof YMap) && !(value instanceof YArray) && !(value instanceof YText) ); } export function native2Y(value: T, deep: boolean): Native2Y { if (Array.isArray(value)) { const yArray: YArray = new YArray(); const result = value.map(item => { return deep ? native2Y(item, deep) : item; }); yArray.insert(0, result); return yArray as Native2Y; } if (isPureObject(value)) { const yMap = new YMap(); Object.entries(value).forEach(([key, value]) => { yMap.set(key, deep ? native2Y(value, deep) : value); }); return yMap as Native2Y; } return value as Native2Y; } export function toPlainValue(v: unknown): unknown { if (v instanceof YMap) { const obj: Record = {}; v.forEach((value, key) => { obj[key] = toPlainValue(value); }); return obj; } if (v instanceof YArray) { return v.toArray().map(x => toPlainValue(x)); } return v; } export type UnRecord = Record;