import { isVariables } from "./variables" type BaseType = string | number | boolean | null | undefined | bigint | symbol export function cloneData(value: any, node?: any, location?: any) { return baseCloneDeep(value, new WeakMap(), node, location) } function baseCloneDeep( value: T, cache: WeakMap, node?: any, location?: any ): T | Object | Array | Date | RegExp { if (!isObject>(value)) return value if (node && isVariables(value)) { return node?.timelineVariables[location[0]]?.[value.key] } if (cache.has(value)) return cache.get(value) let result: RegExp | Date | Array | Record const tag = getTag(value) if (tag === '[object RegExp]') { result = new RegExp((value as RegExp).source, (value as RegExp).flags) } else if (tag === '[object Date]') { result = new Date((value as any) - 0) } else if (tag === '[object Array]') { result = [] } else { result = {} } cache.set(value, result) for (const key in value) { if (value.hasOwnProperty(key)) { const item = value[key]; (result as Record)[key] = baseCloneDeep(item, cache, node, location) } } return result } function isObject(value: unknown): value is T { return typeof value === 'object' && value !== null } function getTag(value: unknown): string { return Object.prototype.toString.call(value) }