Spaces:
Sleeping
Sleeping
; | |
const Reach = require('./reach'); | |
const internals = {}; | |
exports.keys = function (obj, options = {}) { | |
return options.symbols !== false ? Reflect.ownKeys(obj) : Object.getOwnPropertyNames(obj); // Defaults to true | |
}; | |
exports.store = function (source, keys) { | |
const storage = new Map(); | |
for (let i = 0; i < keys.length; ++i) { | |
const key = keys[i]; | |
const value = Reach(source, key); | |
if (typeof value === 'object' || | |
typeof value === 'function') { | |
storage.set(key, value); | |
internals.reachSet(source, key, undefined); | |
} | |
} | |
return storage; | |
}; | |
exports.restore = function (copy, source, storage) { | |
for (const [key, value] of storage) { | |
internals.reachSet(copy, key, value); | |
internals.reachSet(source, key, value); | |
} | |
}; | |
internals.reachSet = function (obj, key, value) { | |
const path = Array.isArray(key) ? key : key.split('.'); | |
let ref = obj; | |
for (let i = 0; i < path.length; ++i) { | |
const segment = path[i]; | |
if (i + 1 === path.length) { | |
ref[segment] = value; | |
} | |
ref = ref[segment]; | |
} | |
}; | |