You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
			
				
					144 lines
				
				3.6 KiB
			
		
		
			
		
	
	
					144 lines
				
				3.6 KiB
			| 
								 
											4 years ago
										 
									 | 
							
								"use strict";
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								Object.defineProperty(exports, "__esModule", {
							 | 
						||
| 
								 | 
							
								  value: true
							 | 
						||
| 
								 | 
							
								});
							 | 
						||
| 
								 | 
							
								exports.createPath = createPath;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								function _extends() { _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								function findParent(_ref, cb) {
							 | 
						||
| 
								 | 
							
								  var parentPath = _ref.parentPath;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  if (parentPath == null) {
							 | 
						||
| 
								 | 
							
								    throw new Error("node is root");
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  var currentPath = parentPath;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  while (cb(currentPath) !== false) {
							 | 
						||
| 
								 | 
							
								    // Hit the root node, stop
							 | 
						||
| 
								 | 
							
								    // $FlowIgnore
							 | 
						||
| 
								 | 
							
								    if (currentPath.parentPath == null) {
							 | 
						||
| 
								 | 
							
								      return null;
							 | 
						||
| 
								 | 
							
								    } // $FlowIgnore
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    currentPath = currentPath.parentPath;
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  return currentPath.node;
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								function insertBefore(context, newNode) {
							 | 
						||
| 
								 | 
							
								  return insert(context, newNode);
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								function insertAfter(context, newNode) {
							 | 
						||
| 
								 | 
							
								  return insert(context, newNode, 1);
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								function insert(_ref2, newNode) {
							 | 
						||
| 
								 | 
							
								  var node = _ref2.node,
							 | 
						||
| 
								 | 
							
								      inList = _ref2.inList,
							 | 
						||
| 
								 | 
							
								      parentPath = _ref2.parentPath,
							 | 
						||
| 
								 | 
							
								      parentKey = _ref2.parentKey;
							 | 
						||
| 
								 | 
							
								  var indexOffset = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 0;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  if (!inList) {
							 | 
						||
| 
								 | 
							
								    throw new Error('inList' + " error: " + ("insert can only be used for nodes that are within lists" || "unknown"));
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  if (!(parentPath != null)) {
							 | 
						||
| 
								 | 
							
								    throw new Error('parentPath != null' + " error: " + ("Can not remove root node" || "unknown"));
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  // $FlowIgnore
							 | 
						||
| 
								 | 
							
								  var parentList = parentPath.node[parentKey];
							 | 
						||
| 
								 | 
							
								  var indexInList = parentList.findIndex(function (n) {
							 | 
						||
| 
								 | 
							
								    return n === node;
							 | 
						||
| 
								 | 
							
								  });
							 | 
						||
| 
								 | 
							
								  parentList.splice(indexInList + indexOffset, 0, newNode);
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								function remove(_ref3) {
							 | 
						||
| 
								 | 
							
								  var node = _ref3.node,
							 | 
						||
| 
								 | 
							
								      parentKey = _ref3.parentKey,
							 | 
						||
| 
								 | 
							
								      parentPath = _ref3.parentPath;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  if (!(parentPath != null)) {
							 | 
						||
| 
								 | 
							
								    throw new Error('parentPath != null' + " error: " + ("Can not remove root node" || "unknown"));
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  // $FlowIgnore
							 | 
						||
| 
								 | 
							
								  var parentNode = parentPath.node; // $FlowIgnore
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  var parentProperty = parentNode[parentKey];
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  if (Array.isArray(parentProperty)) {
							 | 
						||
| 
								 | 
							
								    // $FlowIgnore
							 | 
						||
| 
								 | 
							
								    parentNode[parentKey] = parentProperty.filter(function (n) {
							 | 
						||
| 
								 | 
							
								      return n !== node;
							 | 
						||
| 
								 | 
							
								    });
							 | 
						||
| 
								 | 
							
								  } else {
							 | 
						||
| 
								 | 
							
								    // $FlowIgnore
							 | 
						||
| 
								 | 
							
								    delete parentNode[parentKey];
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  node._deleted = true;
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								function stop(context) {
							 | 
						||
| 
								 | 
							
								  context.shouldStop = true;
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								function replaceWith(context, newNode) {
							 | 
						||
| 
								 | 
							
								  // $FlowIgnore
							 | 
						||
| 
								 | 
							
								  var parentNode = context.parentPath.node; // $FlowIgnore
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  var parentProperty = parentNode[context.parentKey];
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  if (Array.isArray(parentProperty)) {
							 | 
						||
| 
								 | 
							
								    var indexInList = parentProperty.findIndex(function (n) {
							 | 
						||
| 
								 | 
							
								      return n === context.node;
							 | 
						||
| 
								 | 
							
								    });
							 | 
						||
| 
								 | 
							
								    parentProperty.splice(indexInList, 1, newNode);
							 | 
						||
| 
								 | 
							
								  } else {
							 | 
						||
| 
								 | 
							
								    // $FlowIgnore
							 | 
						||
| 
								 | 
							
								    parentNode[context.parentKey] = newNode;
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  context.node._deleted = true;
							 | 
						||
| 
								 | 
							
								  context.node = newNode;
							 | 
						||
| 
								 | 
							
								} // bind the context to the first argument of node operations
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								function bindNodeOperations(operations, context) {
							 | 
						||
| 
								 | 
							
								  var keys = Object.keys(operations);
							 | 
						||
| 
								 | 
							
								  var boundOperations = {};
							 | 
						||
| 
								 | 
							
								  keys.forEach(function (key) {
							 | 
						||
| 
								 | 
							
								    boundOperations[key] = operations[key].bind(null, context);
							 | 
						||
| 
								 | 
							
								  });
							 | 
						||
| 
								 | 
							
								  return boundOperations;
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								function createPathOperations(context) {
							 | 
						||
| 
								 | 
							
								  // $FlowIgnore
							 | 
						||
| 
								 | 
							
								  return bindNodeOperations({
							 | 
						||
| 
								 | 
							
								    findParent: findParent,
							 | 
						||
| 
								 | 
							
								    replaceWith: replaceWith,
							 | 
						||
| 
								 | 
							
								    remove: remove,
							 | 
						||
| 
								 | 
							
								    insertBefore: insertBefore,
							 | 
						||
| 
								 | 
							
								    insertAfter: insertAfter,
							 | 
						||
| 
								 | 
							
								    stop: stop
							 | 
						||
| 
								 | 
							
								  }, context);
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								function createPath(context) {
							 | 
						||
| 
								 | 
							
								  var path = _extends({}, context); // $FlowIgnore
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  Object.assign(path, createPathOperations(path)); // $FlowIgnore
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  return path;
							 | 
						||
| 
								 | 
							
								}
							 |