UNPKG

chain-able

Version:

interfaces that describe their intentions.

60 lines (51 loc) 5.54 kB
var ObjectProperties = require('./util/props') var traverse = require('./traverse') var isObj = require('./is/obj') var isArray = require('./is/array') // function gc() { // if (typeof window !== 'undefined') window.global = window // if (typeof global.gc === 'function') global.gc() // } /** * @see https://stackoverflow.com/questions/1947995/when-should-i-use-delete-vs-setting-elements-to-null-in-javascript * @see https://v8project.blogspot.ca/2015/08/getting-garbage-collection-for-free.html * @see https://github.com/natewatson999/js-gc * @see https://github.com/siddMahen/node-gc * @see http://buildnewgames.com/garbage-collector-friendly-code/ * @see https://stackoverflow.com/questions/27597335/ensuring-object-can-be-garbage-collected * @see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Memory_Management * * @TODO: , blacklist = [] * @TODO: put all GC events into a cached map and debounce the operation * * @since 4.0.0 * @desc remove all methods, mark for garbage collection * @param {Object} obj * @param {Array<string>} ignore * @return {void} */ function markForGarbageCollection(obj) { var props = ObjectProperties(obj) traverse(obj).forEach(function(x) { var ref = this; var value = ref.value; // @NOTE: just delete the main path first, later we can use cleaner // const shouldIgnore = path // .map(pathPart => ignore.includes(pathPart)) // .includes(true) // !shouldIgnore && /* istanbul ignore else: safety for bottom up */ // ensure the longest paths in traverser are used... if (!isArray(value) && !isObj(value)) { this.remove() } }) // simple fast easy cleanup for (var p = 0; p < props.length; p++) { delete obj[p] } props = undefined obj = undefined } module.exports = markForGarbageCollection //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2MuanMiLCJzb3VyY2VzIjpbImdjLmpzIl0sInNvdXJjZXNDb250ZW50IjpbImNvbnN0IE9iamVjdFByb3BlcnRpZXMgPSByZXF1aXJlKCcuL3V0aWwvcHJvcHMnKVxuY29uc3QgdHJhdmVyc2UgPSByZXF1aXJlKCcuL3RyYXZlcnNlJylcbmNvbnN0IGlzT2JqID0gcmVxdWlyZSgnLi9pcy9vYmonKVxuY29uc3QgaXNBcnJheSA9IHJlcXVpcmUoJy4vaXMvYXJyYXknKVxuXG4vLyBmdW5jdGlvbiBnYygpIHtcbi8vICAgaWYgKHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnKSB3aW5kb3cuZ2xvYmFsID0gd2luZG93XG4vLyAgIGlmICh0eXBlb2YgZ2xvYmFsLmdjID09PSAnZnVuY3Rpb24nKSBnbG9iYWwuZ2MoKVxuLy8gfVxuXG4vKipcbiAqIEBzZWUgaHR0cHM6Ly9zdGFja292ZXJmbG93LmNvbS9xdWVzdGlvbnMvMTk0Nzk5NS93aGVuLXNob3VsZC1pLXVzZS1kZWxldGUtdnMtc2V0dGluZy1lbGVtZW50cy10by1udWxsLWluLWphdmFzY3JpcHRcbiAqIEBzZWUgaHR0cHM6Ly92OHByb2plY3QuYmxvZ3Nwb3QuY2EvMjAxNS8wOC9nZXR0aW5nLWdhcmJhZ2UtY29sbGVjdGlvbi1mb3ItZnJlZS5odG1sXG4gKiBAc2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9uYXRld2F0c29uOTk5L2pzLWdjXG4gKiBAc2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9zaWRkTWFoZW4vbm9kZS1nY1xuICogQHNlZSBodHRwOi8vYnVpbGRuZXdnYW1lcy5jb20vZ2FyYmFnZS1jb2xsZWN0b3ItZnJpZW5kbHktY29kZS9cbiAqIEBzZWUgaHR0cHM6Ly9zdGFja292ZXJmbG93LmNvbS9xdWVzdGlvbnMvMjc1OTczMzUvZW5zdXJpbmctb2JqZWN0LWNhbi1iZS1nYXJiYWdlLWNvbGxlY3RlZFxuICogQHNlZSBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9KYXZhU2NyaXB0L01lbW9yeV9NYW5hZ2VtZW50XG4gKlxuICogQFRPRE86ICwgYmxhY2tsaXN0ID0gW11cbiAqIEBUT0RPOiBwdXQgYWxsIEdDIGV2ZW50cyBpbnRvIGEgY2FjaGVkIG1hcCBhbmQgZGVib3VuY2UgdGhlIG9wZXJhdGlvblxuICpcbiAqIEBzaW5jZSA0LjAuMFxuICogQGRlc2MgcmVtb3ZlIGFsbCBtZXRob2RzLCBtYXJrIGZvciBnYXJiYWdlIGNvbGxlY3Rpb25cbiAqIEBwYXJhbSB7T2JqZWN0fSBvYmpcbiAqIEBwYXJhbSB7QXJyYXk8c3RyaW5nPn0gaWdub3JlXG4gKiBAcmV0dXJuIHt2b2lkfVxuICovXG5mdW5jdGlvbiBtYXJrRm9yR2FyYmFnZUNvbGxlY3Rpb24ob2JqKSB7XG4gIGxldCBwcm9wcyA9IE9iamVjdFByb3BlcnRpZXMob2JqKVxuXG4gIHRyYXZlcnNlKG9iaikuZm9yRWFjaChmdW5jdGlvbih4KSB7XG4gICAgY29uc3Qge3ZhbHVlfSA9IHRoaXNcblxuICAgIC8vIEBOT1RFOiBqdXN0IGRlbGV0ZSB0aGUgbWFpbiBwYXRoIGZpcnN0LCBsYXRlciB3ZSBjYW4gdXNlIGNsZWFuZXJcbiAgICAvLyBjb25zdCBzaG91bGRJZ25vcmUgPSBwYXRoXG4gICAgLy8gICAubWFwKHBhdGhQYXJ0ID0+IGlnbm9yZS5pbmNsdWRlcyhwYXRoUGFydCkpXG4gICAgLy8gICAuaW5jbHVkZXModHJ1ZSlcbiAgICAvLyAgICFzaG91bGRJZ25vcmUgJiZcblxuICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBlbHNlOiBzYWZldHkgZm9yIGJvdHRvbSB1cCAqL1xuICAgIC8vIGVuc3VyZSB0aGUgbG9uZ2VzdCBwYXRocyBpbiB0cmF2ZXJzZXIgYXJlIHVzZWQuLi5cbiAgICBpZiAoIWlzQXJyYXkodmFsdWUpICYmICFpc09iaih2YWx1ZSkpIHtcbiAgICAgIHRoaXMucmVtb3ZlKClcbiAgICB9XG4gIH0pXG5cbiAgLy8gc2ltcGxlIGZhc3QgZWFzeSBjbGVhbnVwXG4gIGZvciAobGV0IHAgPSAwOyBwIDwgcHJvcHMubGVuZ3RoOyBwKyspIHtcbiAgICBkZWxldGUgb2JqW3BdXG4gIH1cblxuICBwcm9wcyA9IHVuZGVmaW5lZFxuICBvYmogPSB1bmRlZmluZWRcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBtYXJrRm9yR2FyYmFnZUNvbGxlY3Rpb25cbiJdLCJuYW1lcyI6WyJjb25zdCIsImxldCJdLCJtYXBwaW5ncyI6IkFBQUFBLEdBQUssQ0FBQyxnQkFBZ0IsR0FBRyxPQUFPLENBQUMsY0FBYyxDQUFDO0FBQ2hEQSxHQUFLLENBQUMsUUFBUSxHQUFHLE9BQU8sQ0FBQyxZQUFZLENBQUM7QUFDdENBLEdBQUssQ0FBQyxLQUFLLEdBQUcsT0FBTyxDQUFDLFVBQVUsQ0FBQztBQUNqQ0EsR0FBSyxDQUFDLE9BQU8sR0FBRyxPQUFPLENBQUMsWUFBWSxDQUFDOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBeUJyQyxTQUFTLHdCQUF3QixDQUFDLEdBQUcsRUFBRTtFQUNyQ0MsR0FBRyxDQUFDLEtBQUssR0FBRyxnQkFBZ0IsQ0FBQyxHQUFHLENBQUM7O0VBRWpDLFFBQVEsQ0FBQyxHQUFHLENBQUMsQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLEVBQUU7SUFDaEMsQUFBSyxBQUFRLE9BQUEsR0FBRyxJQUFJO0lBQWIsSUFBQSxLQUFLLGFBQU4sQUFBTSxBQUFROzs7Ozs7Ozs7O0lBVXBCLElBQUksQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLEVBQUU7TUFDcEMsSUFBSSxDQUFDLE1BQU0sRUFBRTtLQUNkO0dBQ0YsQ0FBQzs7O0VBR0YsS0FBS0EsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEtBQUssQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUU7SUFDckMsT0FBTyxHQUFHLENBQUMsQ0FBQyxDQUFDO0dBQ2Q7O0VBRUQsS0FBSyxHQUFHLFNBQVM7RUFDakIsR0FBRyxHQUFHLFNBQVM7Q0FDaEI7O0FBRUQsTUFBTSxDQUFDLE9BQU8sR0FBRyx3QkFBd0I7In0=