UNPKG

held

Version:

Detect paths within an object which held external references.

100 lines (84 loc) 2.68 kB
'use strict'; Object.defineProperty(exports, "__esModule", { value: true }); var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); var _util = require('./util'); function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } function inspect(value, refMap) { return (0, _util.fnMap)(value, (0, _util.createRefMapper)(refMap)); } /** * Inspects a value for memory leaks. * * ``` * let value = { ... } * * const inspector = new Inspector(value); * * value = null * ``` * * If you want to check for cross references among several objects pass in an object like so: * ``` * const inspector = new Inspector({ * obj1, * obj2, * obj3. * ...etc. * }); * ``` * * Note: If you use destroy() each and every object reference within will be nullified. */ var Inspector = function () { function Inspector(value) { _classCallCheck(this, Inspector); Object.defineProperty(this, '_refMap', { enumerable: true, writable: true, value: new Map() }); this._value = value; inspect(this._value, this._refMap); this._detectors = (0, _util.createDetectors)(this._refMap); } _createClass(Inspector, [{ key: 'leaked', value: function leaked() { var detected = []; this._detectors.forEach(function (detector) { if (detector.isLeaking()) { detected.push({ type: detector.type, paths: detector.paths }); } }); return detected; } }, { key: 'crossed', value: function crossed() { return this.leaked().filter(function (object) { return object.paths.length > 1; }); } }, { key: 'destroy', value: function destroy() { (0, _util.deRef)(this._value, this._refMap); this._value = null; return this.leaked(); } }], [{ key: 'held', value: function held(object) { var inspector = new Inspector(object); return inspector; } }]); return Inspector; }(); exports.default = Inspector; module.exports = exports['default'];