UNPKG

canner-compiler

Version:

Compiler for Canner CMS schema

204 lines (180 loc) 5.66 kB
"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;