canner-compiler
Version:
Compiler for Canner CMS schema
204 lines (180 loc) • 5.66 kB
JavaScript
"use strict";
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.default = void 0;
var _objectSpread2 = _interopRequireDefault(require("@babel/runtime/helpers/objectSpread"));
var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck"));
var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/createClass"));
var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
var _get = _interopRequireDefault(require("lodash/get"));
var _set = _interopRequireDefault(require("lodash/set"));
var _isArray = _interopRequireDefault(require("lodash/isArray"));
var _unset = _interopRequireDefault(require("lodash/unset"));
var TreeHandler =
/*#__PURE__*/
function () {
function TreeHandler(tree) {
(0, _classCallCheck2.default)(this, TreeHandler);
(0, _defineProperty2.default)(this, "tree", void 0);
this.tree = tree;
}
(0, _createClass2.default)(TreeHandler, [{
key: "getNode",
value: function getNode(route) {
// info.children.0.children.1
route = this.transformRoute(route);
return (0, _get.default)(this.tree, route, {});
}
}, {
key: "getPath",
value: function getPath(route) {
route = this.transformRoute(route);
return {
parent: this.getParentNode(route),
node: this.getNode(route)
};
}
}, {
key: "getTree",
value: function getTree() {
return this.tree;
}
}, {
key: "transformRoute",
value: function transformRoute(route) {
route = route.replace(/\.children\./g, '.').replace(/\./g, '.children.');
return route;
}
}, {
key: "setNode",
value: function setNode(route, node) {
var routes = this.transformRoute(route).split('.');
(0, _set.default)(this.tree, routes, node);
return this;
}
}, {
key: "setChildren",
value: function setChildren(route, nodes) {
if (!(0, _isArray.default)(nodes)) {
nodes = [nodes];
}
var routes = this.transformRoute(route).split('.');
routes.push('children');
(0, _set.default)(this.tree, routes, nodes);
return this;
}
}, {
key: "injectChildren",
value: function injectChildren(route, opts) {
var _this = this;
var routes = this.transformRoute(route).split('.');
routes.push('children');
var children = (0, _get.default)(this.tree, routes, []);
children.forEach(function (child, i) {
child = (0, _objectSpread2.default)({}, child, opts);
(0, _set.default)(_this.tree, routes.concat(i), child);
});
return this;
}
}, {
key: "injectChildrenFrom",
value: function injectChildrenFrom(route, opts, filter) {
var _this2 = this;
var routes = this.transformRoute(route).split('.');
routes.push('children');
var children = (0, _get.default)(this.tree, routes, []);
children.forEach(function (child, i) {
if (filter(child)) {
child = (0, _objectSpread2.default)({}, child, opts);
(0, _set.default)(_this2.tree, routes.concat(i), child);
}
});
return this;
}
}, {
key: "removeNode",
value: function removeNode(route) {
var parent = this.getParentNode(route);
var routes = this.transformRoute(route).split('.');
if (routes.length < 2) {
(0, _unset.default)(this.tree, routes);
return this;
}
var parentRoute = routes.slice(0, -2).join('.');
var index = routes[route.length - 1];
parent.children.splice(index, 1);
this.setNode(parentRoute, parent);
return this;
}
}, {
key: "getParentNode",
value: function getParentNode(route) {
var routes = this.transformRoute(route).split('.');
if (routes.length < 2) {
return this.getTree();
}
var parentRoute = routes.slice(0, -2).join('.');
return this.getNode(parentRoute);
}
}, {
key: "getSiblingNodes",
value: function getSiblingNodes(route) {
var category = 'top';
var sibling = {
top: [],
down: []
};
var rankInChildren = Number(route.slice(route.lastIndexOf('.') + 1));
var parent = this.getParentNode(route);
parent.children.forEach(function (child, i) {
if (i === rankInChildren) {
category = 'down';
} else {
sibling[category].push(child);
}
});
return sibling;
}
}, {
key: "getAncestryNodes",
value: function getAncestryNodes(route) {
return this.getAncestryNodesFrom(route, function () {
return true;
});
}
}, {
key: "getAncestryNodesFrom",
value: function getAncestryNodesFrom(route, filter) {
var nodes = [];
var routes = route.split('.');
while (routes.length) {
var parent = this.getParentNode(routes.join('.'));
if (filter(parent)) {
nodes.unshift(parent);
}
routes.pop();
}
return nodes;
}
}, {
key: "pushChildren",
value: function pushChildren(route, newNode) {
var node = this.getNode(route);
node.children.push(newNode);
this.setNode(route, node);
return this;
}
}, {
key: "unshiftChildren",
value: function unshiftChildren(route, newNode) {
var node = this.getNode(route);
node.children.unshift(newNode);
this.setNode(route, node);
return this;
}
}]);
return TreeHandler;
}();
exports.default = TreeHandler;