UNPKG

foop

Version:

interfaces that describe their intentions.

82 lines (74 loc) 6.76 kB
var ObjectProperties = require('../util/props') var traverse = require('../traverse') var isObj = require('../is/obj') var isArray = require('../is/array') var keys = require('../util/keysObjOrArray') // function gc() { // if (typeof window !== 'undefined') window.global = window // if (typeof global.gc === 'function') global.gc() // } /** * @since 4.0.0 * @desc remove all methods, mark for garbage collection * * @param {Object} obj object to traverse and clear * @return {void} * * @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 = [] param * @TODO put all GC events into a cached map and debounce the operation * * @example * * var scoped = {} * var ref = () => scoped * var obj = {scoped, ref, eh: true} * * markForGarbageCollection(obj) * //=> void * * obj * //=> undefined|{} * */ function markForGarbageCollection(obj) { // @TODO: ArrayOrObj loop... like tons of libs do... // let props = isObj(obj) ? ObjectProperties(obj) : obj //isArray(obj) ? obj var props = keys(obj) for (var p = 0; p < props.length; p++) { if (isObj(obj[p])) { markForGarbageCollection(obj[p]) } delete obj[p] } // traverse(obj).forEach(function(x) { // const {value} = this // // // @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 (let p = 0; p < props.length; p++) { // delete obj[p] // } props = undefined obj = undefined } module.exports = markForGarbageCollection //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2MuanMiLCJzb3VyY2VzIjpbImdjLmpzIl0sInNvdXJjZXNDb250ZW50IjpbImNvbnN0IE9iamVjdFByb3BlcnRpZXMgPSByZXF1aXJlKCcuLi91dGlsL3Byb3BzJylcbmNvbnN0IHRyYXZlcnNlID0gcmVxdWlyZSgnLi4vdHJhdmVyc2UnKVxuY29uc3QgaXNPYmogPSByZXF1aXJlKCcuLi9pcy9vYmonKVxuY29uc3QgaXNBcnJheSA9IHJlcXVpcmUoJy4uL2lzL2FycmF5JylcbmNvbnN0IGtleXMgPSByZXF1aXJlKCcuLi91dGlsL2tleXNPYmpPckFycmF5JylcblxuLy8gZnVuY3Rpb24gZ2MoKSB7XG4vLyAgIGlmICh0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJykgd2luZG93Lmdsb2JhbCA9IHdpbmRvd1xuLy8gICBpZiAodHlwZW9mIGdsb2JhbC5nYyA9PT0gJ2Z1bmN0aW9uJykgZ2xvYmFsLmdjKClcbi8vIH1cblxuLyoqXG4gKiBAc2luY2UgNC4wLjBcbiAqIEBkZXNjIHJlbW92ZSBhbGwgbWV0aG9kcywgbWFyayBmb3IgZ2FyYmFnZSBjb2xsZWN0aW9uXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IG9iaiBvYmplY3QgdG8gdHJhdmVyc2UgYW5kIGNsZWFyXG4gKiBAcmV0dXJuIHt2b2lkfVxuICpcbiAqIEBzZWUgaHR0cHM6Ly9zdGFja292ZXJmbG93LmNvbS9xdWVzdGlvbnMvMTk0Nzk5NS93aGVuLXNob3VsZC1pLXVzZS1kZWxldGUtdnMtc2V0dGluZy1lbGVtZW50cy10by1udWxsLWluLWphdmFzY3JpcHRcbiAqIEBzZWUgaHR0cHM6Ly92OHByb2plY3QuYmxvZ3Nwb3QuY2EvMjAxNS8wOC9nZXR0aW5nLWdhcmJhZ2UtY29sbGVjdGlvbi1mb3ItZnJlZS5odG1sXG4gKiBAc2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9uYXRld2F0c29uOTk5L2pzLWdjXG4gKiBAc2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9zaWRkTWFoZW4vbm9kZS1nY1xuICogQHNlZSBodHRwOi8vYnVpbGRuZXdnYW1lcy5jb20vZ2FyYmFnZS1jb2xsZWN0b3ItZnJpZW5kbHktY29kZS9cbiAqIEBzZWUgaHR0cHM6Ly9zdGFja292ZXJmbG93LmNvbS9xdWVzdGlvbnMvMjc1OTczMzUvZW5zdXJpbmctb2JqZWN0LWNhbi1iZS1nYXJiYWdlLWNvbGxlY3RlZFxuICogQHNlZSBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9KYXZhU2NyaXB0L01lbW9yeV9NYW5hZ2VtZW50XG4gKlxuICogQFRPRE8gYmxhY2tsaXN0ID0gW10gcGFyYW1cbiAqIEBUT0RPIHB1dCBhbGwgR0MgZXZlbnRzIGludG8gYSBjYWNoZWQgbWFwIGFuZCBkZWJvdW5jZSB0aGUgb3BlcmF0aW9uXG4gKlxuICogQGV4YW1wbGVcbiAqXG4gKiAgdmFyIHNjb3BlZCA9IHt9XG4gKiAgdmFyIHJlZiA9ICgpID0+IHNjb3BlZFxuICogIHZhciBvYmogPSB7c2NvcGVkLCByZWYsIGVoOiB0cnVlfVxuICpcbiAqICBtYXJrRm9yR2FyYmFnZUNvbGxlY3Rpb24ob2JqKVxuICogIC8vPT4gdm9pZFxuICpcbiAqICBvYmpcbiAqICAvLz0+IHVuZGVmaW5lZHx7fVxuICpcbiAqL1xuZnVuY3Rpb24gbWFya0ZvckdhcmJhZ2VDb2xsZWN0aW9uKG9iaikge1xuICAvLyBAVE9ETzogQXJyYXlPck9iaiBsb29wLi4uIGxpa2UgdG9ucyBvZiBsaWJzIGRvLi4uXG4gIC8vIGxldCBwcm9wcyA9IGlzT2JqKG9iaikgPyBPYmplY3RQcm9wZXJ0aWVzKG9iaikgOiBvYmogLy9pc0FycmF5KG9iaikgPyBvYmpcbiAgbGV0IHByb3BzID0ga2V5cyhvYmopXG5cbiAgZm9yIChsZXQgcCA9IDA7IHAgPCBwcm9wcy5sZW5ndGg7IHArKykge1xuICAgIGlmIChpc09iaihvYmpbcF0pKSB7XG4gICAgICBtYXJrRm9yR2FyYmFnZUNvbGxlY3Rpb24ob2JqW3BdKVxuICAgIH1cbiAgICBkZWxldGUgb2JqW3BdXG4gIH1cblxuICAvLyB0cmF2ZXJzZShvYmopLmZvckVhY2goZnVuY3Rpb24oeCkge1xuICAvLyAgIGNvbnN0IHt2YWx1ZX0gPSB0aGlzXG4gIC8vXG4gIC8vICAgLy8gQE5PVEU6IGp1c3QgZGVsZXRlIHRoZSBtYWluIHBhdGggZmlyc3QsIGxhdGVyIHdlIGNhbiB1c2UgY2xlYW5lclxuICAvLyAgIC8vIGNvbnN0IHNob3VsZElnbm9yZSA9IHBhdGhcbiAgLy8gICAvLyAgIC5tYXAocGF0aFBhcnQgPT4gaWdub3JlLmluY2x1ZGVzKHBhdGhQYXJ0KSlcbiAgLy8gICAvLyAgIC5pbmNsdWRlcyh0cnVlKVxuICAvLyAgIC8vICAgIXNob3VsZElnbm9yZSAmJlxuICAvL1xuICAvLyAgIC8qIGlzdGFuYnVsIGlnbm9yZSBlbHNlOiBzYWZldHkgZm9yIGJvdHRvbSB1cCAqL1xuICAvLyAgIC8vIGVuc3VyZSB0aGUgbG9uZ2VzdCBwYXRocyBpbiB0cmF2ZXJzZXIgYXJlIHVzZWQuLi5cbiAgLy8gICBpZiAoIWlzQXJyYXkodmFsdWUpICYmICFpc09iaih2YWx1ZSkpIHtcbiAgLy8gICAgIHRoaXMucmVtb3ZlKClcbiAgLy8gICB9XG4gIC8vIH0pXG5cbiAgLy8gc2ltcGxlIGZhc3QgZWFzeSBjbGVhbnVwXG4gIC8vIGZvciAobGV0IHAgPSAwOyBwIDwgcHJvcHMubGVuZ3RoOyBwKyspIHtcbiAgLy8gICBkZWxldGUgb2JqW3BdXG4gIC8vIH1cblxuICBwcm9wcyA9IHVuZGVmaW5lZFxuICBvYmogPSB1bmRlZmluZWRcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBtYXJrRm9yR2FyYmFnZUNvbGxlY3Rpb25cbiJdLCJuYW1lcyI6WyJjb25zdCIsImxldCJdLCJtYXBwaW5ncyI6IkFBQUFBLEdBQUssQ0FBQyxnQkFBZ0IsR0FBRyxPQUFPLENBQUMsZUFBZSxDQUFDO0FBQ2pEQSxHQUFLLENBQUMsUUFBUSxHQUFHLE9BQU8sQ0FBQyxhQUFhLENBQUM7QUFDdkNBLEdBQUssQ0FBQyxLQUFLLEdBQUcsT0FBTyxDQUFDLFdBQVcsQ0FBQztBQUNsQ0EsR0FBSyxDQUFDLE9BQU8sR0FBRyxPQUFPLENBQUMsYUFBYSxDQUFDO0FBQ3RDQSxHQUFLLENBQUMsSUFBSSxHQUFHLE9BQU8sQ0FBQyx3QkFBd0IsQ0FBQzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFzQzlDLFNBQVMsd0JBQXdCLENBQUMsR0FBRyxFQUFFOzs7RUFHckNDLEdBQUcsQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQzs7RUFFckIsS0FBS0EsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEtBQUssQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUU7SUFDckMsSUFBSSxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUU7TUFDakIsd0JBQXdCLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0tBQ2pDO0lBQ0QsT0FBTyxHQUFHLENBQUMsQ0FBQyxDQUFDO0dBQ2Q7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0VBdUJELEtBQUssR0FBRyxTQUFTO0VBQ2pCLEdBQUcsR0FBRyxTQUFTO0NBQ2hCOztBQUVELE1BQU0sQ0FBQyxPQUFPLEdBQUcsd0JBQXdCOyJ9