UNPKG

treem

Version:

High performance conversion of flat data (like SQL result rows) into nested objects.

203 lines (182 loc) 17.6 kB
'use strict'; Object.defineProperty(exports, "__esModule", { value: true }); var _classCallCheck2 = require('babel-runtime/helpers/classCallCheck'); var _classCallCheck3 = _interopRequireDefault(_classCallCheck2); var _createClass2 = require('babel-runtime/helpers/createClass'); var _createClass3 = _interopRequireDefault(_createClass2); var _equalArray = require('equal-array'); var _equalArray2 = _interopRequireDefault(_equalArray); var _header = require('./header'); var _header2 = _interopRequireDefault(_header); var _node = require('./node'); var _node2 = _interopRequireDefault(_node); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } var DEFAULT_KEY_SYMBOL = '#'; var DEFAULT_COLLECTION_SYMBOL = '+'; var DEFAULT_SEPARATOR_SYMBOL = '.'; var Treem = function () { function Treem() { var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; (0, _classCallCheck3.default)(this, Treem); var symbols = { key: DEFAULT_KEY_SYMBOL, collection: DEFAULT_COLLECTION_SYMBOL, separator: DEFAULT_SEPARATOR_SYMBOL }; if (options.symbols !== undefined) { if (options.symbols.key !== undefined) { symbols.key = options.symbols.key; } if (options.symbols.collection !== undefined) { symbols.collection = options.symbols.collection; } if (options.symbols.separator !== undefined) { symbols.separator = options.symbols.separator; } } this._separator = symbols.separator; // default options this._config = { headers: undefined, reuseObject: 'key', overwriteObject: false, root: 'collection', wrap: { single: function single() { return {}; }, collection: function collection() { return []; } }, detect: { key: function key(node) { return { check: node.startsWith(symbols.key), name: node.substring(symbols.key.length) }; }, collection: function collection(node) { return { check: node.startsWith(symbols.collection), name: node.substring(symbols.collection.length) }; } }, prune: function prune(x) { return x === undefined || x === null; }, equalArray: new _equalArray2.default() }; this._config.headers = options.headers; if (options.reuseObject !== undefined) { this._config.reuseObject = options.reuseObject; } if (options.overwriteObject !== undefined) { this._config.overwriteObject = options.overwriteObject; } if (options.root !== undefined) { this._config.root = options.root; } if (options.wrap !== undefined) { if (options.wrap.single !== undefined) { this._config.wrap.single = options.wrap.single; } if (options.wrap.collection !== undefined) { this._config.wrap.collection = options.wrap.collection; } } if (options.detect !== undefined) { if (options.detect.key !== undefined) { this._config.detect.key = options.detect.key; } if (options.detect.collection !== undefined) { this._config.detect.collection = options.detect.collection; } } if (options.prune !== undefined) { if (options.prune !== true) { if (options.prune === false) { this._config.prune = function () { return false; }; } else { this._config.prune = options.prune; } } } this.reset(); } (0, _createClass3.default)(Treem, [{ key: 'reset', value: function reset() { this._firstFeed = true; if (this._config.root === 'collection') { this._data = this._config.wrap.collection(''); } else { this._data = this._config.wrap.single(''); } this._root = undefined; } }, { key: 'fill', value: function fill(rows) { this.reset(); this.feed(rows); } }, { key: 'feed', value: function feed(rows) { var _this = this; if (rows.length === 0) return; if (this._root === undefined) { var headers = this._config.headers; if (headers === undefined) { headers = {}; for (var property in rows[0]) { headers[property] = property; } } this._root = this._makeRoot(headers); } if (this._config.root === 'collection') { rows.forEach(function (row) { return _this._root.add(row, _this); }); } else { var start = 0; if (this._firstFeed) { this._root.add(rows[0], this); start = 1; } var memData = this._data; for (var i = start; i < rows.length; i++) { this._root.add(rows[i], this); if (!this._config.overwriteObject) { this._data = memData; } } } this._firstFeed = false; } }, { key: '_makeRoot', value: function _makeRoot(headers) { var columns = []; for (var header in headers) { columns.push(new _header2.default(header, headers[header], this._separator, this._config.detect)); } return new _node2.default('_data', columns, this._config, this._config.root === 'collection'); } }, { key: 'data', get: function get() { return this._data; } }]); return Treem; }(); exports.default = Treem; //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy90cmVlbS5qcyJdLCJuYW1lcyI6WyJERUZBVUxUX0tFWV9TWU1CT0wiLCJERUZBVUxUX0NPTExFQ1RJT05fU1lNQk9MIiwiREVGQVVMVF9TRVBBUkFUT1JfU1lNQk9MIiwiVHJlZW0iLCJvcHRpb25zIiwic3ltYm9scyIsImtleSIsImNvbGxlY3Rpb24iLCJzZXBhcmF0b3IiLCJ1bmRlZmluZWQiLCJfc2VwYXJhdG9yIiwiX2NvbmZpZyIsImhlYWRlcnMiLCJyZXVzZU9iamVjdCIsIm92ZXJ3cml0ZU9iamVjdCIsInJvb3QiLCJ3cmFwIiwic2luZ2xlIiwiZGV0ZWN0IiwiY2hlY2siLCJub2RlIiwic3RhcnRzV2l0aCIsIm5hbWUiLCJzdWJzdHJpbmciLCJsZW5ndGgiLCJwcnVuZSIsIngiLCJlcXVhbEFycmF5IiwicmVzZXQiLCJfZmlyc3RGZWVkIiwiX2RhdGEiLCJfcm9vdCIsInJvd3MiLCJmZWVkIiwicHJvcGVydHkiLCJfbWFrZVJvb3QiLCJmb3JFYWNoIiwiYWRkIiwicm93Iiwic3RhcnQiLCJtZW1EYXRhIiwiaSIsImNvbHVtbnMiLCJoZWFkZXIiLCJwdXNoIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7OztBQUFBOzs7O0FBQ0E7Ozs7QUFDQTs7Ozs7O0FBRUEsSUFBTUEscUJBQXFCLEdBQTNCO0FBQ0EsSUFBTUMsNEJBQTRCLEdBQWxDO0FBQ0EsSUFBTUMsMkJBQTJCLEdBQWpDOztJQUVxQkMsSztBQUVuQixtQkFBMEI7QUFBQSxRQUFkQyxPQUFjLHVFQUFKLEVBQUk7QUFBQTs7QUFDeEIsUUFBTUMsVUFBVTtBQUNkQyxXQUFLTixrQkFEUztBQUVkTyxrQkFBWU4seUJBRkU7QUFHZE8saUJBQVdOO0FBSEcsS0FBaEI7QUFLQSxRQUFJRSxRQUFRQyxPQUFSLEtBQW9CSSxTQUF4QixFQUFtQztBQUNqQyxVQUFJTCxRQUFRQyxPQUFSLENBQWdCQyxHQUFoQixLQUF3QkcsU0FBNUIsRUFBdUM7QUFDckNKLGdCQUFRQyxHQUFSLEdBQWNG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VCxFQUFrQndCLE9BQWxCLEVBQTJCLEtBQUsvQixPQUFoQyxFQUF5QyxLQUFLQSxPQUFMLENBQWFJLElBQWIsS0FBc0IsWUFBL0QsQ0FBUDtBQUNEOzs7d0JBM0RVO0FBQ1QsYUFBTyxLQUFLZSxLQUFaO0FBQ0Q7Ozs7O2tCQXZGa0IzQixLIiwiZmlsZSI6InRyZWVtLmpzIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IEVxdWFsQXJyYXkgZnJvbSAnZXF1YWwtYXJyYXknO1xuaW1wb3J0IEhlYWRlciBmcm9tICcuL2hlYWRlcic7XG5pbXBvcnQgTm9kZSBmcm9tICcuL25vZGUnO1xuXG5jb25zdCBERUZBVUxUX0tFWV9TWU1CT0wgPSAnIyc7XG5jb25zdCBERUZBVUxUX0NPTExFQ1RJT05fU1lNQk9MID0gJysnO1xuY29uc3QgREVGQVVMVF9TRVBBUkFUT1JfU1lNQk9MID0gJy4nO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBUcmVlbSB7XG5cbiAgY29uc3RydWN0b3Iob3B0aW9ucyA9IHt9KSB7XG4gICAgY29uc3Qgc3ltYm9scyA9IHtcbiAgICAgIGtleTogREVGQVVMVF9LRVlfU1lNQk9MLFxuICAgICAgY29sbGVjdGlvbjogREVGQVVMVF9DT0xMRUNUSU9OX1NZTUJPTCxcbiAgICAgIHNlcGFyYXRvcjogREVGQVVMVF9TRVBBUkFUT1JfU1lNQk9MXG4gICAgfVxuICAgIGlmIChvcHRpb25zLnN5bWJvbHMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgaWYgKG9wdGlvbnMuc3ltYm9scy5rZXkgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBzeW1ib2xzLmtleSA9IG9wdGlvbnMuc3ltYm9scy5rZXk7XG4gICAgICB9XG4gICAgICBpZiAob3B0aW9ucy5zeW1ib2xzLmNvbGxlY3Rpb24gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBzeW1ib2xzLmNvbGxlY3Rpb24gPSBvcHRpb25zLnN5bWJvbHMuY29sbGVjdGlvbjtcbiAgICAgIH1cbiAgICAgIGlmIChvcHRpb25zLnN5bWJvbHMuc2VwYXJhdG9yICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgc3ltYm9scy5zZXBhcmF0b3IgPSBvcHRpb25zLnN5bWJvbHMuc2VwYXJhdG9yO1xuICAgICAgfVxuICAgIH1cbiAgICB0aGlzLl9zZXBhcmF0b3IgPSBzeW1ib2xzLnNlcGFyYXRvcjtcbiAgICAvLyBkZWZhdWx0IG9wdGlvbnNcbiAgICB0aGlzLl9jb25maWcgPSB7XG4gICAgICBoZWFkZXJzOiB1bmRlZmluZWQsXG4gICAgICByZXVzZU9iamVjdDogJ2tleScsXG4gICAgICBvdmVyd3JpdGVPYmplY3Q6IGZhbHNlLFxuICAgICAgcm9vdDogJ2NvbGxlY3Rpb24nLFxuICAgICAgd3JhcDoge1xuICAgICAgICBzaW5nbGU6ICgpID0+IHtyZXR1cm4ge319LFxuICAgICAgICBjb2xsZWN0aW9uOiAoKSA9PiBbXVxuICAgICAgfSxcbiAgICAgIGRldGVjdDoge1xuICAgICAgICBrZXk6IG5vZGUgPT4ge1xuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBjaGVjazogbm9kZS5zdGFydHNXaXRoKHN5bWJvbHMua2V5KSxcbiAgICAgICAgICAgIG5hbWU6IG5vZGUuc3Vic3RyaW5nKHN5bWJvbHMua2V5Lmxlbmd0aClcbiAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIGNvbGxlY3Rpb246IG5vZGUgPT4ge1xuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBjaGVjazogbm9kZS5zdGFydHNXaXRoKHN5bWJvbHMuY29sbGVjdGlvbiksXG4gICAgICAgICAgICBuYW1lOiBub2RlLnN1YnN0cmluZyhzeW1ib2xzLmNvbGxlY3Rpb24ubGVuZ3RoKVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIHBydW5lOiB4ID0+IHggPT09IHVuZGVmaW5lZCB8fCB4ID09PSBudWxsLFxuICAgICAgZXF1YWxBcnJheTogbmV3IEVxdWFsQXJyYXkoKVxuICAgIH1cbiAgICB0aGlzLl9jb25maWcuaGVhZGVycyA9IG9wdGlvbnMuaGVhZGVycztcbiAgICBpZiAob3B0aW9ucy5yZXVzZU9iamVjdCAhPT0gdW5kZWZpbmVkKSAge1xuICAgICAgdGhpcy5fY29uZmlnLnJldXNlT2JqZWN0ID0gb3B0aW9ucy5yZXVzZU9iamVjdDtcbiAgICB9XG4gICAgaWYgKG9wdGlvbnMub3ZlcndyaXRlT2JqZWN0ICE9PSB1bmRlZmluZWQpICB7XG4gICAgICB0aGlzLl9jb25maWcub3ZlcndyaXRlT2JqZWN0ID0gb3B0aW9ucy5vdmVyd3JpdGVPYmplY3Q7XG4gICAgfVxuICAgIGlmIChvcHRpb25zLnJvb3QgIT09IHVuZGVmaW5lZCkgIHtcbiAgICAgIHRoaXMuX2NvbmZpZy5yb290ID0gb3B0aW9ucy5yb290O1xuICAgIH1cbiAgICBpZiAob3B0aW9ucy53cmFwICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGlmIChvcHRpb25zLndyYXAuc2luZ2xlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgdGhpcy5fY29uZmlnLndyYXAuc2luZ2xlID0gb3B0aW9ucy53cmFwLnNpbmdsZTtcbiAgICAgIH1cbiAgICAgIGlmIChvcHRpb25zLndyYXAuY29sbGVjdGlvbiAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHRoaXMuX2NvbmZpZy53cmFwLmNvbGxlY3Rpb24gPSBvcHRpb25zLndyYXAuY29sbGVjdGlvbjtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKG9wdGlvbnMuZGV0ZWN0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGlmIChvcHRpb25zLmRldGVjdC5rZXkgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICB0aGlzLl9jb25maWcuZGV0ZWN0LmtleSA9IG9wdGlvbnMuZGV0ZWN0LmtleTtcbiAgICAgIH1cbiAgICAgIGlmIChvcHRpb25zLmRldGVjdC5jb2xsZWN0aW9uICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgdGhpcy5fY29uZmlnLmRldGVjdC5jb2xsZWN0aW9uID0gb3B0aW9ucy5kZXRlY3QuY29sbGVjdGlvbjtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKG9wdGlvbnMucHJ1bmUgIT09IHVuZGVmaW5lZCkgIHtcbiAgICAgIGlmIChvcHRpb25zLnBydW5lICE9PSB0cnVlKSB7XG4gICAgICAgIGlmIChvcHRpb25zLnBydW5lID09PSBmYWxzZSkge1xuICAgICAgICAgIHRoaXMuX2NvbmZpZy5wcnVuZSA9ICgpID0+IGZhbHNlO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMuX2NvbmZpZy5wcnVuZSA9IG9wdGlvbnMucHJ1bmU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgdGhpcy5yZXNldCgpO1xuICB9XG5cbiAgZ2V0IGRhdGEoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2RhdGE7XG4gIH1cblxuICByZXNldCgpIHtcbiAgICB0aGlzLl9maXJzdEZlZWQgPSB0cnVlO1xuICAgIGlmICh0aGlzLl9jb25maWcucm9vdCA9PT0gJ2NvbGxlY3Rpb24nKSB7XG4gICAgICB0aGlzLl9kYXRhID0gdGhpcy5fY29uZmlnLndyYXAuY29sbGVjdGlvbignJyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuX2RhdGEgPSB0aGlzLl9jb25maWcud3JhcC5zaW5nbGUoJycpO1xuICAgIH1cbiAgICB0aGlzLl9yb290ID0gdW5kZWZpbmVkO1xuICB9XG5cbiAgZmlsbChyb3dzKSB7XG4gICAgdGhpcy5yZXNldCgpO1xuICAgIHRoaXMuZmVlZChyb3dzKTtcbiAgfVxuXG4gIGZlZWQocm93cykge1xuICAgIGlmIChyb3dzLmxlbmd0aCA9PT0gMCkgcmV0dXJuO1xuXG4gICAgaWYgKHRoaXMuX3Jvb3QgPT09IHVuZGVmaW5lZCkge1xuICAgICAgbGV0IGhlYWRlcnMgPSB0aGlzLl9jb25maWcuaGVhZGVycztcbiAgICAgIGlmIChoZWFkZXJzID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgaGVhZGVycyA9IHt9O1xuICAgICAgICBmb3IgKGxldCBwcm9wZXJ0eSBpbiByb3dzWzBdKSB7XG4gICAgICAgICAgaGVhZGVyc1twcm9wZXJ0eV0gPSBwcm9wZXJ0eTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgdGhpcy5fcm9vdCA9IHRoaXMuX21ha2VSb290KGhlYWRlcnMpO1xuICAgIH1cblxuICAgIGlmICh0aGlzLl9jb25maWcucm9vdCA9PT0gJ2NvbGxlY3Rpb24nKSB7XG4gICAgICByb3dzLmZvckVhY2gocm93ID0+IHRoaXMuX3Jvb3QuYWRkKHJvdywgdGhpcykpO1xuICAgIH0gZWxzZSB7XG4gICAgICBsZXQgc3RhcnQgPSAwO1xuICAgICAgaWYgKHRoaXMuX2ZpcnN0RmVlZCkge1xuICAgICAgICB0aGlzLl9yb290LmFkZChyb3dzWzBdLCB0aGlzKTtcbiAgICAgICAgc3RhcnQgPSAxO1xuICAgICAgfVxuICAgICAgY29uc3QgbWVtRGF0YSA9IHRoaXMuX2RhdGE7XG4gICAgICBmb3IgKGxldCBpID0gc3RhcnQ7IGkgPCByb3dzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHRoaXMuX3Jvb3QuYWRkKHJvd3NbaV0sIHRoaXMpO1xuICAgICAgICBpZiAoIXRoaXMuX2NvbmZpZy5vdmVyd3JpdGVPYmplY3QpIHtcbiAgICAgICAgICB0aGlzLl9kYXRhID0gbWVtRGF0YTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHRoaXMuX2ZpcnN0RmVlZCA9IGZhbHNlO1xuICB9XG5cbiAgX21ha2VSb290KGhlYWRlcnMpIHtcbiAgICBjb25zdCBjb2x1bW5zID0gW107XG4gICAgZm9yIChsZXQgaGVhZGVyIGluIGhlYWRlcnMpIHtcbiAgICAgIGNvbHVtbnMucHVzaChuZXcgSGVhZGVyKGhlYWRlciwgaGVhZGVyc1toZWFkZXJdLCB0aGlzLl9zZXBhcmF0b3IsIHRoaXMuX2NvbmZpZy5kZXRlY3QpKTtcbiAgICB9XG4gICAgcmV0dXJuIG5ldyBOb2RlKCdfZGF0YScsIGNvbHVtbnMsIHRoaXMuX2NvbmZpZywgdGhpcy5fY29uZmlnLnJvb3QgPT09ICdjb2xsZWN0aW9uJyk7XG4gIH1cblxufVxuIl19