treem
Version:
High performance conversion of flat data (like SQL result rows) into nested objects.
203 lines (182 loc) • 17.6 kB
JavaScript
'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