Press n or j to go to the next uncovered block, b, p or k for the previous block.
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 | 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 20x 20x 20x 20x 20x 20x 20x 720x 720x 720x 720x 720x 255x 255x 255x 465x 465x 465x 440x 440x 440x 385x 385x 720x 20x 20x 1x 1x 1x 820x 820x 820x 28020x 953x 953x 953x 953x 852x 953x 953x 28020x 378x 1x 1x 1x 86x 86x 86x 86x 86x 86x 86x 86x 475x 475x 475x | import { toJS } from "mobx"
import { isEqual } from "../Util"
// Any classes that the user can edit, save, and then rehydrate should implement this interface
export interface Persistable {
toObject(): any // This should dehydrate any runtime instances to a plain object ready to be JSON stringified
updateFromObject(obj: any): any // This should parse an incoming object, extend the current instance, and create new instances for any non native class types
}
// Todo: see if there's a better way to do this with Mobx
export function objectWithPersistablesToObject<T>(
objWithPersistables: T,
keysToSerialize: string[] = []
): T {
const obj = toJS(objWithPersistables) as any
const keysSet = new Set(keysToSerialize)
Object.keys(obj).forEach((key) => {
const val = (objWithPersistables as any)[key]
const valIsPersistable = val && val.toObject
// Delete any keys we don't want to serialize, if a keep list is provided
if (keysToSerialize.length && !keysSet.has(key)) {
delete obj[key]
return
}
// Val is persistable, call toObject
if (valIsPersistable) obj[key] = val.toObject()
else if (Array.isArray(val))
// Scan array for persistables and seriazile.
obj[key] = val.map((item) =>
item?.toObject ? item.toObject() : item
)
else obj[key] = val
})
return obj as T
}
// Basically does an Object.assign, except if the target is a Persistable, will call updateFromObject on
// that Persistable. It does not recurse. Will only update top level Persistables.
export function updatePersistables(target: any, obj: any): void {
if (obj === undefined) return
for (const key in target) {
if (key in obj) {
const currentVal = target[key]
const currentValIsPersistableObject = currentVal?.updateFromObject
const newVal = obj[key]
if (currentValIsPersistableObject)
currentVal.updateFromObject(newVal)
else target[key] = newVal
}
}
}
// Don't persist properties that haven't changed from the defaults, and don't
// keep properties not on the comparable class
export function deleteRuntimeAndUnchangedProps<T>(
changedObj: T,
defaultObject: T
): T {
const obj = changedObj as any
const defaultObj = defaultObject as any
const defaultKeys = new Set(Object.keys(defaultObj))
Object.keys(obj).forEach((prop) => {
const key = prop as any
if (!defaultKeys.has(key)) {
// Don't persist any runtime props not in the persistable instance
delete obj[key]
return
}
const currentValue = obj[key]
const defaultValue = defaultObj[key]
if (isEqual(currentValue, defaultValue)) {
// Don't persist any values that weren't changed from the default
delete obj[key]
}
})
return obj
}
|