Socket
Socket
Sign inDemoInstall

@antv/graphlib

Package Overview
Dependencies
Maintainers
0
Versions
12
Alerts
File Explorer

Advanced tools

Socket logo

Install Socket

Detect and block malicious and high-risk dependencies

Install

@antv/graphlib - npm Package Compare versions

Comparing version 2.0.2 to 2.0.3

__tests__/bugs/getChildren.spec.ts

2

dist/index.umd.min.js

@@ -1,1 +0,1 @@

!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?t(exports):"function"==typeof define&&define.amd?define(["exports"],t):t((e="undefined"!=typeof globalThis?globalThis:e||self).GraphLib={})}(this,function(e){"use strict";function t(){this._events={}}function d(t,s,e,d){for(;t.length;){var a=t.shift();if(e(a))return!0;s.add(a.id),d(a.id).forEach(e=>{s.has(e.id)||(s.add(e.id),t.push(e))})}return!1}function r(e,t,s,d){if(s(e))return!0;t.add(e.id);for(const a of d(e.id))if(!t.has(a.id)&&r(a,t,s,d))return!0;return!1}t.prototype.on=function(e,t,s){return this._events[e]||(this._events[e]=[]),this._events[e].push({callback:t,once:!!s}),this},t.prototype.once=function(e,t){return this.on(e,t,!0)},t.prototype.emit=function(r){for(var h=this,i=[],e=1;e<arguments.length;e++)i[e-1]=arguments[e];function t(e){for(var t,s,d=e.length,a=0;a<d;a++)e[a]&&(s=(t=e[a]).callback,t.once&&(e.splice(a,1),0===e.length&&delete h._events[r],d--,a--),s.apply(h,i))}var s=this._events[r]||[],d=this._events["*"]||[];t(s),t(d)},t.prototype.off=function(e,t){if(e)if(t){for(var s=this._events[e]||[],d=s.length,a=0;a<d;a++)s[a].callback===t&&(s.splice(a,1),d--,a--);0===s.length&&delete this._events[e]}else delete this._events[e];else this._events={};return this},t.prototype.getEvents=function(){return this._events};const s=()=>!0;class a{graph;nodeFilter;edgeFilter;cacheEnabled;inEdgesMap=new Map;outEdgesMap=new Map;bothEdgesMap=new Map;allNodesMap=new Map;allEdgesMap=new Map;constructor(e){this.graph=e.graph;const d=e.nodeFilter||s,a=e.edgeFilter||s;this.nodeFilter=d,this.edgeFilter=e=>{var{source:t,target:s}=this.graph.getEdgeDetail(e.id);return!(!d(t)||!d(s))&&a(e,t,s)},"auto"===e.cache?(this.cacheEnabled=!0,this.startAutoCache()):"manual"===e.cache?this.cacheEnabled=!0:this.cacheEnabled=!1}clearCache=()=>{this.inEdgesMap.clear(),this.outEdgesMap.clear(),this.bothEdgesMap.clear(),this.allNodesMap.clear(),this.allEdgesMap.clear()};refreshCache=()=>{this.clearCache(),this.updateCache(this.graph.getAllNodes().map(e=>e.id))};updateCache=e=>{const a=new Set;e.forEach(e=>{var t,s,d=this.bothEdgesMap.get(e);d&&d.forEach(e=>a.add(e.id)),this.hasNode(e)?(d=this.graph.getRelatedEdges(e,"in").filter(this.edgeFilter),t=this.graph.getRelatedEdges(e,"out").filter(this.edgeFilter),(s=Array.from(new Set([...d,...t]))).forEach(e=>a.add(e.id)),this.inEdgesMap.set(e,d),this.outEdgesMap.set(e,t),this.bothEdgesMap.set(e,s),this.allNodesMap.set(e,this.graph.getNode(e))):(this.inEdgesMap.delete(e),this.outEdgesMap.delete(e),this.bothEdgesMap.delete(e),this.allNodesMap.delete(e))}),a.forEach(e=>{this.hasEdge(e)?this.allEdgesMap.set(e,this.graph.getEdge(e)):this.allEdgesMap.delete(e)})};startAutoCache(){this.refreshCache(),this.graph.on("changed",this.handleGraphChanged)}stopAutoCache(){this.graph.off("changed",this.handleGraphChanged)}handleGraphChanged=s=>{const d=new Set;s.changes.forEach(e=>{switch(e.type){case"NodeAdded":d.add(e.value.id);break;case"NodeDataUpdated":d.add(e.id);break;case"EdgeAdded":d.add(e.value.source),d.add(e.value.target);break;case"EdgeUpdated":"source"!==e.propertyName&&"target"!==e.propertyName||(d.add(e.oldValue),d.add(e.newValue));break;case"EdgeDataUpdated":var t;s.graph.hasEdge(e.id)&&(t=s.graph.getEdge(e.id),d.add(t.source),d.add(t.target));break;case"EdgeRemoved":d.add(e.value.source),d.add(e.value.target);break;case"NodeRemoved":d.add(e.value.id)}}),this.updateCache(d)};checkNodeExistence(e){this.getNode(e)}hasNode(e){return!!this.graph.hasNode(e)&&(e=this.graph.getNode(e),this.nodeFilter(e))}areNeighbors(t,e){return this.checkNodeExistence(t),this.getNeighbors(e).some(e=>e.id===t)}getNode(e){var t=this.graph.getNode(e);if(this.nodeFilter(t))return t;throw new Error("Node not found for id: "+e)}getRelatedEdges(e,t){return this.checkNodeExistence(e),this.cacheEnabled?("in"===t?this.inEdgesMap:"out"===t?this.outEdgesMap:this.bothEdgesMap).get(e):this.graph.getRelatedEdges(e,t).filter(this.edgeFilter)}getDegree(e,t){return this.getRelatedEdges(e,t).length}getSuccessors(e){e=this.getRelatedEdges(e,"out").map(e=>this.getNode(e.target));return Array.from(new Set(e))}getPredecessors(e){e=this.getRelatedEdges(e,"in").map(e=>this.getNode(e.source));return Array.from(new Set(e))}getNeighbors(e){var t=this.getPredecessors(e),e=this.getSuccessors(e);return Array.from(new Set([...t,...e]))}hasEdge(e){return!!this.graph.hasEdge(e)&&(e=this.graph.getEdge(e),this.edgeFilter(e))}getEdge(e){var t=this.graph.getEdge(e);if(this.edgeFilter(t))return t;throw new Error("Edge not found for id: "+e)}getEdgeDetail(e){e=this.getEdge(e);return{edge:e,source:this.getNode(e.source),target:this.getNode(e.target)}}hasTreeStructure(e){return this.graph.hasTreeStructure(e)}getRoots(e){return this.graph.getRoots(e).filter(this.nodeFilter)}getChildren(e,t){return this.checkNodeExistence(e),this.graph.getChildren(e,t).filter(this.nodeFilter)}getParent(e,t){this.checkNodeExistence(e);e=this.graph.getParent(e,t);return e&&this.nodeFilter(e)?e:null}getAllNodes(){return this.cacheEnabled?Array.from(this.allNodesMap.values()):this.graph.getAllNodes().filter(this.nodeFilter)}getAllEdges(){return this.cacheEnabled?Array.from(this.allEdgesMap.values()):this.graph.getAllEdges().filter(this.edgeFilter)}bfs(e,t,s="out"){s={in:this.getPredecessors.bind(this),out:this.getSuccessors.bind(this),both:this.getNeighbors.bind(this)}[s];d([this.getNode(e)],new Set,t,s)}dfs(e,t,s="out"){s={in:this.getPredecessors.bind(this),out:this.getSuccessors.bind(this),both:this.getNeighbors.bind(this)}[s];r(this.getNode(e),new Set,t,s)}}class h extends t{nodeMap=new Map;edgeMap=new Map;inEdgesMap=new Map;outEdgesMap=new Map;bothEdgesMap=new Map;treeIndices=new Map;changes=[];batchCount=0;onChanged=()=>{};constructor(e){super(),e&&(e.nodes&&this.addNodes(e.nodes),e.edges&&this.addEdges(e.edges),e.tree&&this.addTree(e.tree),e.onChanged)&&(this.onChanged=e.onChanged)}batch=e=>{this.batchCount+=1,e(),--this.batchCount,this.batchCount||this.commit()};commit(){var e=this.changes,e=(this.changes=[],{graph:this,changes:e});this.emit("changed",e),this.onChanged(e)}reduceChanges(e){let a=[];return e.forEach(d=>{switch(d.type){case"NodeRemoved":{let s=!1;a=a.filter(e=>{var t;return"NodeAdded"===e.type?((t=e.value.id===d.value.id)&&(s=!0),!t):"NodeDataUpdated"===e.type?e.id!==d.value.id:"TreeStructureChanged"!==e.type||e.nodeId!==d.value.id}),s||a.push(d);break}case"EdgeRemoved":{let s=!1;a=a.filter(e=>{var t;return"EdgeAdded"===e.type?((t=e.value.id===d.value.id)&&(s=!0),!t):"EdgeDataUpdated"!==e.type&&"EdgeUpdated"!==e.type||e.id!==d.value.id}),s||a.push(d);break}case"NodeDataUpdated":case"EdgeDataUpdated":case"EdgeUpdated":var e=a.findIndex(e=>e.type===d.type&&e.id===d.id&&(void 0===d.propertyName||e.propertyName===d.propertyName)),t=a[e];t?void 0!==d.propertyName?t.newValue=d.newValue:(a.splice(e,1),a.push(d)):a.push(d);break;case"TreeStructureDetached":(a=a.filter(e=>"TreeStructureAttached"!==e.type&&"TreeStructureChanged"!==e.type||e.treeKey!==d.treeKey)).push(d);break;case"TreeStructureChanged":t=a.find(e=>"TreeStructureChanged"===e.type&&e.treeKey===d.treeKey&&e.nodeId===d.nodeId);t?t.newParentId=d.newParentId:a.push(d);break;default:a.push(d)}}),a}checkNodeExistence(e){this.getNode(e)}hasNode(e){return this.nodeMap.has(e)}areNeighbors(t,e){return this.getNeighbors(e).some(e=>e.id===t)}getNode(e){var t=this.nodeMap.get(e);if(t)return t;throw new Error("Node not found for id: "+e)}getRelatedEdges(e,t){var s;return this.checkNodeExistence(e),"in"===t?(s=this.inEdgesMap.get(e),Array.from(s)):"out"===t?(s=this.outEdgesMap.get(e),Array.from(s)):(t=this.bothEdgesMap.get(e),Array.from(t))}getDegree(e,t){return this.getRelatedEdges(e,t).length}getSuccessors(e){e=this.getRelatedEdges(e,"out").map(e=>this.getNode(e.target));return Array.from(new Set(e))}getPredecessors(e){e=this.getRelatedEdges(e,"in").map(e=>this.getNode(e.source));return Array.from(new Set(e))}getNeighbors(e){var t=this.getPredecessors(e),e=this.getSuccessors(e);return Array.from(new Set([...t,...e]))}doAddNode(t){if(this.hasNode(t.id))throw new Error("Node already exists: "+t.id);this.nodeMap.set(t.id,t),this.inEdgesMap.set(t.id,new Set),this.outEdgesMap.set(t.id,new Set),this.bothEdgesMap.set(t.id,new Set),this.treeIndices.forEach(e=>{e.childrenMap.set(t.id,new Set)}),this.changes.push({type:"NodeAdded",value:t})}addNodes(t){this.batch(()=>{for(const e of t)this.doAddNode(e)})}addNode(e){this.addNodes([e])}doRemoveNode(e){var t=this.getNode(e);this.bothEdgesMap.get(e)?.forEach(e=>this.doRemoveEdge(e.id)),this.nodeMap.delete(e),this.treeIndices.forEach(t=>{t.childrenMap.get(e)?.forEach(e=>{t.parentMap.delete(e.id)}),t.parentMap.delete(e),t.childrenMap.delete(e)}),this.changes.push({type:"NodeRemoved",value:t})}removeNodes(e){this.batch(()=>{e.forEach(e=>this.doRemoveNode(e))})}removeNode(e){this.removeNodes([e])}updateNodeDataProperty(s,d,a){const r=this.getNode(s);this.batch(()=>{var e=r.data[d],t=a;r.data[d]=t,this.changes.push({type:"NodeDataUpdated",id:s,propertyName:d,oldValue:e,newValue:t})})}mergeNodeData(s,e){this.batch(()=>{Object.entries(e).forEach(([e,t])=>{this.updateNodeDataProperty(s,e,t)})})}updateNodeData(...e){const d=e[0],a=this.getNode(d);if("string"==typeof e[1])this.updateNodeDataProperty(d,e[1],e[2]);else{let s;var t;"function"==typeof e[1]?(t=e[1],s=t(a.data)):"object"==typeof e[1]&&(s=e[1]),this.batch(()=>{var e=a.data,t=s;a.data=s,this.changes.push({type:"NodeDataUpdated",id:d,oldValue:e,newValue:t})})}}checkEdgeExistence(e){if(!this.hasEdge(e))throw new Error("Edge not found for id: "+e)}hasEdge(e){return this.edgeMap.has(e)}getEdge(e){return this.checkEdgeExistence(e),this.edgeMap.get(e)}getEdgeDetail(e){e=this.getEdge(e);return{edge:e,source:this.getNode(e.source),target:this.getNode(e.target)}}doAddEdge(e){if(this.hasEdge(e.id))throw new Error("Edge already exists: "+e.id);this.checkNodeExistence(e.source),this.checkNodeExistence(e.target),this.edgeMap.set(e.id,e);var t=this.inEdgesMap.get(e.target),s=this.outEdgesMap.get(e.source),d=this.bothEdgesMap.get(e.source),a=this.bothEdgesMap.get(e.target);t.add(e),s.add(e),d.add(e),a.add(e),this.changes.push({type:"EdgeAdded",value:e})}addEdges(t){this.batch(()=>{for(const e of t)this.doAddEdge(e)})}addEdge(e){this.addEdges([e])}doRemoveEdge(e){var t=this.getEdge(e),s=this.outEdgesMap.get(t.source),d=this.inEdgesMap.get(t.target),a=this.bothEdgesMap.get(t.source),r=this.bothEdgesMap.get(t.target);s.delete(t),d.delete(t),a.delete(t),r.delete(t),this.edgeMap.delete(e),this.changes.push({type:"EdgeRemoved",value:t})}removeEdges(e){this.batch(()=>{e.forEach(e=>this.doRemoveEdge(e))})}removeEdge(e){this.removeEdges([e])}updateEdgeSource(e,t){var s=this.getEdge(e);this.checkNodeExistence(t);const d=s.source,a=t;this.outEdgesMap.get(d).delete(s),this.bothEdgesMap.get(d).delete(s),this.outEdgesMap.get(a).add(s),this.bothEdgesMap.get(a).add(s),s.source=t,this.batch(()=>{this.changes.push({type:"EdgeUpdated",id:e,propertyName:"source",oldValue:d,newValue:a})})}updateEdgeTarget(e,t){var s=this.getEdge(e);this.checkNodeExistence(t);const d=s.target,a=t;this.inEdgesMap.get(d).delete(s),this.bothEdgesMap.get(d).delete(s),this.inEdgesMap.get(a).add(s),this.bothEdgesMap.get(a).add(s),s.target=t,this.batch(()=>{this.changes.push({type:"EdgeUpdated",id:e,propertyName:"target",oldValue:d,newValue:a})})}updateEdgeDataProperty(s,d,a){const r=this.getEdge(s);this.batch(()=>{var e=r.data[d],t=a;r.data[d]=t,this.changes.push({type:"EdgeDataUpdated",id:s,propertyName:d,oldValue:e,newValue:t})})}updateEdgeData(...e){const d=e[0],a=this.getEdge(d);if("string"==typeof e[1])this.updateEdgeDataProperty(d,e[1],e[2]);else{let s;var t;"function"==typeof e[1]?(t=e[1],s=t(a.data)):"object"==typeof e[1]&&(s=e[1]),this.batch(()=>{var e=a.data,t=s;a.data=s,this.changes.push({type:"EdgeDataUpdated",id:d,oldValue:e,newValue:t})})}}mergeEdgeData(s,e){this.batch(()=>{Object.entries(e).forEach(([e,t])=>{this.updateEdgeDataProperty(s,e,t)})})}checkTreeExistence(e){if(!this.hasTreeStructure(e))throw new Error("Tree structure not found for treeKey: "+e)}hasTreeStructure(e){return this.treeIndices.has(e)}attachTreeStructure(e){this.treeIndices.has(e)||(this.treeIndices.set(e,{parentMap:new Map,childrenMap:new Map}),this.batch(()=>{this.changes.push({type:"TreeStructureAttached",treeKey:e})}))}detachTreeStructure(e){this.checkTreeExistence(e),this.treeIndices.delete(e),this.batch(()=>{this.changes.push({type:"TreeStructureDetached",treeKey:e})})}addTree(d,a){this.batch(()=>{this.attachTreeStructure(a);for(var e=[],t=Array.isArray(d)?d:[d];t.length;){var s=t.shift();e.push(s),s.children&&t.push(...s.children)}this.addNodes(e),e.forEach(t=>{t.children?.forEach(e=>{this.setParent(e.id,t.id,a)})})})}getRoots(t){return this.checkTreeExistence(t),this.getAllNodes().filter(e=>!this.getParent(e.id,t))}getChildren(e,t){this.checkNodeExistence(e),this.checkTreeExistence(t);t=this.treeIndices.get(t).childrenMap.get(e);return Array.from(t||[])}getParent(e,t){return this.checkNodeExistence(e),this.checkTreeExistence(t),this.treeIndices.get(t).parentMap.get(e)||null}getAncestors(e,t){var s,d=[];let a=this.getNode(e);for(;s=this.getParent(a.id,t);)d.push(s),a=s;return d}setParent(t,s,d){this.checkTreeExistence(d);var a=this.treeIndices.get(d),r=this.getNode(t);const h=a.parentMap.get(t);if(h?.id!==s)if(void 0===s)h&&a.childrenMap.get(h.id)?.delete(r),a.parentMap.delete(t);else{const i=this.getNode(s);a.parentMap.set(t,i),h&&a.childrenMap.get(h.id)?.delete(r);let e=a.childrenMap.get(i.id);e||(e=new Set,a.childrenMap.set(i.id,e)),e.add(r),this.batch(()=>{this.changes.push({type:"TreeStructureChanged",treeKey:d,nodeId:t,oldParentId:h?.id,newParentId:i.id})})}}dfsTree(e,t,s){return r(this.getNode(e),new Set,t,e=>this.getChildren(e,s))}bfsTree(e,t,s){return d([this.getNode(e)],new Set,t,e=>this.getChildren(e,s))}getAllNodes(){return Array.from(this.nodeMap.values())}getAllEdges(){return Array.from(this.edgeMap.values())}bfs(e,t,s="out"){s={in:this.getPredecessors.bind(this),out:this.getSuccessors.bind(this),both:this.getNeighbors.bind(this)}[s];return d([this.getNode(e)],new Set,t,s)}dfs(e,t,s="out"){s={in:this.getPredecessors.bind(this),out:this.getSuccessors.bind(this),both:this.getNeighbors.bind(this)}[s];return r(this.getNode(e),new Set,t,s)}clone(){var e=this.getAllNodes().map(e=>({...e,data:{...e.data}})),t=this.getAllEdges().map(e=>({...e,data:{...e.data}}));const r=new h({nodes:e,edges:t});return this.treeIndices.forEach(({parentMap:e,childrenMap:t},s)=>{const d=new Map,a=(e.forEach((e,t)=>{d.set(t,r.getNode(e.id))}),new Map);t.forEach((e,t)=>{a.set(t,new Set(Array.from(e).map(e=>r.getNode(e.id))))}),r.treeIndices.set(s,{parentMap:d,childrenMap:a})}),r}toJSON(){return JSON.stringify({nodes:this.getAllNodes(),edges:this.getAllEdges()})}createView(e){return new a({graph:this,...e})}}e.Graph=h,e.GraphView=a,Object.defineProperty(e,"__esModule",{value:!0})});
!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?t(exports):"function"==typeof define&&define.amd?define(["exports"],t):t((e="undefined"!=typeof globalThis?globalThis:e||self).GraphLib={})}(this,(function(e){"use strict";var t=function(){function e(){this._events={}}return e.prototype.on=function(e,t,s){return this._events[e]||(this._events[e]=[]),this._events[e].push({callback:t,once:!!s}),this},e.prototype.once=function(e,t){return this.on(e,t,!0)},e.prototype.emit=function(e){for(var t=this,s=[],d=1;d<arguments.length;d++)s[d-1]=arguments[d];var r=this._events[e]||[],a=this._events["*"]||[],h=function(d){for(var r=d.length,a=0;a<r;a++)if(d[a]){var h=d[a],i=h.callback;h.once&&(d.splice(a,1),0===d.length&&delete t._events[e],r--,a--),i.apply(t,s)}};h(r),h(a)},e.prototype.off=function(e,t){if(e)if(t){for(var s=this._events[e]||[],d=s.length,r=0;r<d;r++)s[r].callback===t&&(s.splice(r,1),d--,r--);0===s.length&&delete this._events[e]}else delete this._events[e];else this._events={};return this},e.prototype.getEvents=function(){return this._events},e}();function s(e,t,s,d){for(;e.length;){const r=e.shift();if(s(r))return!0;t.add(r.id),d(r.id).forEach((s=>{t.has(s.id)||(t.add(s.id),e.push(s))}))}return!1}function d(e,t,s,r){if(s(e))return!0;t.add(e.id);for(const a of r(e.id))if(!t.has(a.id)&&d(a,t,s,r))return!0;return!1}const r=()=>!0;class a{graph;nodeFilter;edgeFilter;cacheEnabled;inEdgesMap=new Map;outEdgesMap=new Map;bothEdgesMap=new Map;allNodesMap=new Map;allEdgesMap=new Map;constructor(e){this.graph=e.graph;const t=e.nodeFilter||r,s=e.edgeFilter||r;this.nodeFilter=t,this.edgeFilter=e=>{const{source:d,target:r}=this.graph.getEdgeDetail(e.id);return!(!t(d)||!t(r))&&s(e,d,r)},"auto"===e.cache?(this.cacheEnabled=!0,this.startAutoCache()):"manual"===e.cache?this.cacheEnabled=!0:this.cacheEnabled=!1}clearCache=()=>{this.inEdgesMap.clear(),this.outEdgesMap.clear(),this.bothEdgesMap.clear(),this.allNodesMap.clear(),this.allEdgesMap.clear()};refreshCache=()=>{this.clearCache(),this.updateCache(this.graph.getAllNodes().map((e=>e.id)))};updateCache=e=>{const t=new Set;e.forEach((e=>{const s=this.bothEdgesMap.get(e);if(s&&s.forEach((e=>t.add(e.id))),this.hasNode(e)){const s=this.graph.getRelatedEdges(e,"in").filter(this.edgeFilter),d=this.graph.getRelatedEdges(e,"out").filter(this.edgeFilter),r=Array.from(new Set([...s,...d]));r.forEach((e=>t.add(e.id))),this.inEdgesMap.set(e,s),this.outEdgesMap.set(e,d),this.bothEdgesMap.set(e,r),this.allNodesMap.set(e,this.graph.getNode(e))}else this.inEdgesMap.delete(e),this.outEdgesMap.delete(e),this.bothEdgesMap.delete(e),this.allNodesMap.delete(e)})),t.forEach((e=>{this.hasEdge(e)?this.allEdgesMap.set(e,this.graph.getEdge(e)):this.allEdgesMap.delete(e)}))};startAutoCache(){this.refreshCache(),this.graph.on("changed",this.handleGraphChanged)}stopAutoCache(){this.graph.off("changed",this.handleGraphChanged)}handleGraphChanged=e=>{const t=new Set;e.changes.forEach((s=>{switch(s.type){case"NodeAdded":case"NodeRemoved":t.add(s.value.id);break;case"NodeDataUpdated":t.add(s.id);break;case"EdgeAdded":case"EdgeRemoved":t.add(s.value.source),t.add(s.value.target);break;case"EdgeUpdated":"source"!==s.propertyName&&"target"!==s.propertyName||(t.add(s.oldValue),t.add(s.newValue));break;case"EdgeDataUpdated":if(e.graph.hasEdge(s.id)){const d=e.graph.getEdge(s.id);t.add(d.source),t.add(d.target)}}})),this.updateCache(t)};checkNodeExistence(e){this.getNode(e)}hasNode(e){if(!this.graph.hasNode(e))return!1;const t=this.graph.getNode(e);return this.nodeFilter(t)}areNeighbors(e,t){return this.checkNodeExistence(e),this.getNeighbors(t).some((t=>t.id===e))}getNode(e){const t=this.graph.getNode(e);if(!this.nodeFilter(t))throw new Error("Node not found for id: "+e);return t}getRelatedEdges(e,t){if(this.checkNodeExistence(e),this.cacheEnabled)return"in"===t?this.inEdgesMap.get(e):"out"===t?this.outEdgesMap.get(e):this.bothEdgesMap.get(e);return this.graph.getRelatedEdges(e,t).filter(this.edgeFilter)}getDegree(e,t){return this.getRelatedEdges(e,t).length}getSuccessors(e){const t=this.getRelatedEdges(e,"out").map((e=>this.getNode(e.target)));return Array.from(new Set(t))}getPredecessors(e){const t=this.getRelatedEdges(e,"in").map((e=>this.getNode(e.source)));return Array.from(new Set(t))}getNeighbors(e){const t=this.getPredecessors(e),s=this.getSuccessors(e);return Array.from(new Set([...t,...s]))}hasEdge(e){if(!this.graph.hasEdge(e))return!1;const t=this.graph.getEdge(e);return this.edgeFilter(t)}getEdge(e){const t=this.graph.getEdge(e);if(!this.edgeFilter(t))throw new Error("Edge not found for id: "+e);return t}getEdgeDetail(e){const t=this.getEdge(e);return{edge:t,source:this.getNode(t.source),target:this.getNode(t.target)}}hasTreeStructure(e){return this.graph.hasTreeStructure(e)}getRoots(e){return this.graph.getRoots(e).filter(this.nodeFilter)}getChildren(e,t){return this.checkNodeExistence(e),this.graph.getChildren(e,t).filter(this.nodeFilter)}getParent(e,t){this.checkNodeExistence(e);const s=this.graph.getParent(e,t);return s&&this.nodeFilter(s)?s:null}getAllNodes(){return this.cacheEnabled?Array.from(this.allNodesMap.values()):this.graph.getAllNodes().filter(this.nodeFilter)}getAllEdges(){return this.cacheEnabled?Array.from(this.allEdgesMap.values()):this.graph.getAllEdges().filter(this.edgeFilter)}bfs(e,t,d="out"){const r={in:this.getPredecessors.bind(this),out:this.getSuccessors.bind(this),both:this.getNeighbors.bind(this)}[d];s([this.getNode(e)],new Set,t,r)}dfs(e,t,s="out"){const r={in:this.getPredecessors.bind(this),out:this.getSuccessors.bind(this),both:this.getNeighbors.bind(this)}[s];d(this.getNode(e),new Set,t,r)}}class h extends t{nodeMap=new Map;edgeMap=new Map;inEdgesMap=new Map;outEdgesMap=new Map;bothEdgesMap=new Map;treeIndices=new Map;changes=[];batchCount=0;onChanged=()=>{};constructor(e){super(),e&&(e.nodes&&this.addNodes(e.nodes),e.edges&&this.addEdges(e.edges),e.tree&&this.addTree(e.tree),e.onChanged&&(this.onChanged=e.onChanged))}batch=e=>{this.batchCount+=1,e(),this.batchCount-=1,this.batchCount||this.commit()};commit(){const e=this.changes;this.changes=[];const t={graph:this,changes:e};this.emit("changed",t),this.onChanged(t)}reduceChanges(e){let t=[];return e.forEach((e=>{switch(e.type){case"NodeRemoved":{let s=!1;t=t.filter((t=>{if("NodeAdded"===t.type){const d=t.value.id===e.value.id;return d&&(s=!0),!d}return"NodeDataUpdated"===t.type?t.id!==e.value.id:"TreeStructureChanged"!==t.type||t.nodeId!==e.value.id})),s||t.push(e);break}case"EdgeRemoved":{let s=!1;t=t.filter((t=>{if("EdgeAdded"===t.type){const d=t.value.id===e.value.id;return d&&(s=!0),!d}return"EdgeDataUpdated"!==t.type&&"EdgeUpdated"!==t.type||t.id!==e.value.id})),s||t.push(e);break}case"NodeDataUpdated":case"EdgeDataUpdated":case"EdgeUpdated":{const s=t.findIndex((t=>t.type===e.type&&t.id===e.id&&(void 0===e.propertyName||t.propertyName===e.propertyName))),d=t[s];d?void 0!==e.propertyName?d.newValue=e.newValue:(t.splice(s,1),t.push(e)):t.push(e);break}case"TreeStructureDetached":t=t.filter((t=>"TreeStructureAttached"===t.type?t.treeKey!==e.treeKey:"TreeStructureChanged"!==t.type||t.treeKey!==e.treeKey)),t.push(e);break;case"TreeStructureChanged":{const s=t.find((t=>"TreeStructureChanged"===t.type&&t.treeKey===e.treeKey&&t.nodeId===e.nodeId));s?s.newParentId=e.newParentId:t.push(e);break}default:t.push(e)}})),t}checkNodeExistence(e){this.getNode(e)}hasNode(e){return this.nodeMap.has(e)}areNeighbors(e,t){return this.getNeighbors(t).some((t=>t.id===e))}getNode(e){const t=this.nodeMap.get(e);if(!t)throw new Error("Node not found for id: "+e);return t}getRelatedEdges(e,t){if(this.checkNodeExistence(e),"in"===t){const t=this.inEdgesMap.get(e);return Array.from(t)}if("out"===t){const t=this.outEdgesMap.get(e);return Array.from(t)}{const t=this.bothEdgesMap.get(e);return Array.from(t)}}getDegree(e,t){return this.getRelatedEdges(e,t).length}getSuccessors(e){const t=this.getRelatedEdges(e,"out").map((e=>this.getNode(e.target)));return Array.from(new Set(t))}getPredecessors(e){const t=this.getRelatedEdges(e,"in").map((e=>this.getNode(e.source)));return Array.from(new Set(t))}getNeighbors(e){const t=this.getPredecessors(e),s=this.getSuccessors(e);return Array.from(new Set([...t,...s]))}doAddNode(e){if(this.hasNode(e.id))throw new Error("Node already exists: "+e.id);this.nodeMap.set(e.id,e),this.inEdgesMap.set(e.id,new Set),this.outEdgesMap.set(e.id,new Set),this.bothEdgesMap.set(e.id,new Set),this.treeIndices.forEach((t=>{t.childrenMap.set(e.id,new Set)})),this.changes.push({type:"NodeAdded",value:e})}addNodes(e){this.batch((()=>{for(const t of e)this.doAddNode(t)}))}addNode(e){this.addNodes([e])}doRemoveNode(e){const t=this.getNode(e),s=this.bothEdgesMap.get(e);s?.forEach((e=>this.doRemoveEdge(e.id))),this.nodeMap.delete(e),this.treeIndices.forEach((s=>{s.childrenMap.get(e)?.forEach((e=>{s.parentMap.delete(e.id)}));const d=s.parentMap.get(e);d&&s.childrenMap.get(d.id)?.delete(t),s.parentMap.delete(e),s.childrenMap.delete(e)})),this.bothEdgesMap.delete(e),this.inEdgesMap.delete(e),this.outEdgesMap.delete(e),this.changes.push({type:"NodeRemoved",value:t})}removeNodes(e){this.batch((()=>{e.forEach((e=>this.doRemoveNode(e)))}))}removeNode(e){this.removeNodes([e])}updateNodeDataProperty(e,t,s){const d=this.getNode(e);this.batch((()=>{const r=d.data[t],a=s;d.data[t]=a,this.changes.push({type:"NodeDataUpdated",id:e,propertyName:t,oldValue:r,newValue:a})}))}mergeNodeData(e,t){this.batch((()=>{Object.entries(t).forEach((([t,s])=>{this.updateNodeDataProperty(e,t,s)}))}))}updateNodeData(...e){const t=e[0],s=this.getNode(t);if("string"==typeof e[1])return void this.updateNodeDataProperty(t,e[1],e[2]);let d;if("function"==typeof e[1]){const t=e[1];d=t(s.data)}else"object"==typeof e[1]&&(d=e[1]);this.batch((()=>{const e=s.data,r=d;s.data=d,this.changes.push({type:"NodeDataUpdated",id:t,oldValue:e,newValue:r})}))}checkEdgeExistence(e){if(!this.hasEdge(e))throw new Error("Edge not found for id: "+e)}hasEdge(e){return this.edgeMap.has(e)}getEdge(e){return this.checkEdgeExistence(e),this.edgeMap.get(e)}getEdgeDetail(e){const t=this.getEdge(e);return{edge:t,source:this.getNode(t.source),target:this.getNode(t.target)}}doAddEdge(e){if(this.hasEdge(e.id))throw new Error("Edge already exists: "+e.id);this.checkNodeExistence(e.source),this.checkNodeExistence(e.target),this.edgeMap.set(e.id,e);const t=this.inEdgesMap.get(e.target),s=this.outEdgesMap.get(e.source),d=this.bothEdgesMap.get(e.source),r=this.bothEdgesMap.get(e.target);t.add(e),s.add(e),d.add(e),r.add(e),this.changes.push({type:"EdgeAdded",value:e})}addEdges(e){this.batch((()=>{for(const t of e)this.doAddEdge(t)}))}addEdge(e){this.addEdges([e])}doRemoveEdge(e){const t=this.getEdge(e),s=this.outEdgesMap.get(t.source),d=this.inEdgesMap.get(t.target),r=this.bothEdgesMap.get(t.source),a=this.bothEdgesMap.get(t.target);s.delete(t),d.delete(t),r.delete(t),a.delete(t),this.edgeMap.delete(e),this.changes.push({type:"EdgeRemoved",value:t})}removeEdges(e){this.batch((()=>{e.forEach((e=>this.doRemoveEdge(e)))}))}removeEdge(e){this.removeEdges([e])}updateEdgeSource(e,t){const s=this.getEdge(e);this.checkNodeExistence(t);const d=s.source,r=t;this.outEdgesMap.get(d).delete(s),this.bothEdgesMap.get(d).delete(s),this.outEdgesMap.get(r).add(s),this.bothEdgesMap.get(r).add(s),s.source=t,this.batch((()=>{this.changes.push({type:"EdgeUpdated",id:e,propertyName:"source",oldValue:d,newValue:r})}))}updateEdgeTarget(e,t){const s=this.getEdge(e);this.checkNodeExistence(t);const d=s.target,r=t;this.inEdgesMap.get(d).delete(s),this.bothEdgesMap.get(d).delete(s),this.inEdgesMap.get(r).add(s),this.bothEdgesMap.get(r).add(s),s.target=t,this.batch((()=>{this.changes.push({type:"EdgeUpdated",id:e,propertyName:"target",oldValue:d,newValue:r})}))}updateEdgeDataProperty(e,t,s){const d=this.getEdge(e);this.batch((()=>{const r=d.data[t],a=s;d.data[t]=a,this.changes.push({type:"EdgeDataUpdated",id:e,propertyName:t,oldValue:r,newValue:a})}))}updateEdgeData(...e){const t=e[0],s=this.getEdge(t);if("string"==typeof e[1])return void this.updateEdgeDataProperty(t,e[1],e[2]);let d;if("function"==typeof e[1]){const t=e[1];d=t(s.data)}else"object"==typeof e[1]&&(d=e[1]);this.batch((()=>{const e=s.data,r=d;s.data=d,this.changes.push({type:"EdgeDataUpdated",id:t,oldValue:e,newValue:r})}))}mergeEdgeData(e,t){this.batch((()=>{Object.entries(t).forEach((([t,s])=>{this.updateEdgeDataProperty(e,t,s)}))}))}checkTreeExistence(e){if(!this.hasTreeStructure(e))throw new Error("Tree structure not found for treeKey: "+e)}hasTreeStructure(e){return this.treeIndices.has(e)}attachTreeStructure(e){this.treeIndices.has(e)||(this.treeIndices.set(e,{parentMap:new Map,childrenMap:new Map}),this.batch((()=>{this.changes.push({type:"TreeStructureAttached",treeKey:e})})))}detachTreeStructure(e){this.checkTreeExistence(e),this.treeIndices.delete(e),this.batch((()=>{this.changes.push({type:"TreeStructureDetached",treeKey:e})}))}addTree(e,t){this.batch((()=>{this.attachTreeStructure(t);const s=[],d=Array.isArray(e)?e:[e];for(;d.length;){const e=d.shift();s.push(e),e.children&&d.push(...e.children)}this.addNodes(s),s.forEach((e=>{e.children?.forEach((s=>{this.setParent(s.id,e.id,t)}))}))}))}getRoots(e){return this.checkTreeExistence(e),this.getAllNodes().filter((t=>!this.getParent(t.id,e)))}getChildren(e,t){this.checkNodeExistence(e),this.checkTreeExistence(t);const s=this.treeIndices.get(t).childrenMap.get(e);return Array.from(s||[])}getParent(e,t){this.checkNodeExistence(e),this.checkTreeExistence(t);return this.treeIndices.get(t).parentMap.get(e)||null}getAncestors(e,t){const s=[];let d,r=this.getNode(e);for(;d=this.getParent(r.id,t);)s.push(d),r=d;return s}setParent(e,t,s){this.checkTreeExistence(s);const d=this.treeIndices.get(s),r=this.getNode(e),a=d.parentMap.get(e);if(a?.id===t)return;if(void 0===t)return a&&d.childrenMap.get(a.id)?.delete(r),void d.parentMap.delete(e);const h=this.getNode(t);d.parentMap.set(e,h),a&&d.childrenMap.get(a.id)?.delete(r);let i=d.childrenMap.get(h.id);i||(i=new Set,d.childrenMap.set(h.id,i)),i.add(r),this.batch((()=>{this.changes.push({type:"TreeStructureChanged",treeKey:s,nodeId:e,oldParentId:a?.id,newParentId:h.id})}))}dfsTree(e,t,s){return d(this.getNode(e),new Set,t,(e=>this.getChildren(e,s)))}bfsTree(e,t,d){return s([this.getNode(e)],new Set,t,(e=>this.getChildren(e,d)))}getAllNodes(){return Array.from(this.nodeMap.values())}getAllEdges(){return Array.from(this.edgeMap.values())}bfs(e,t,d="out"){const r={in:this.getPredecessors.bind(this),out:this.getSuccessors.bind(this),both:this.getNeighbors.bind(this)}[d];return s([this.getNode(e)],new Set,t,r)}dfs(e,t,s="out"){const r={in:this.getPredecessors.bind(this),out:this.getSuccessors.bind(this),both:this.getNeighbors.bind(this)}[s];return d(this.getNode(e),new Set,t,r)}clone(){const e=this.getAllNodes().map((e=>({...e,data:{...e.data}}))),t=this.getAllEdges().map((e=>({...e,data:{...e.data}}))),s=new h({nodes:e,edges:t});return this.treeIndices.forEach((({parentMap:e,childrenMap:t},d)=>{const r=new Map;e.forEach(((e,t)=>{r.set(t,s.getNode(e.id))}));const a=new Map;t.forEach(((e,t)=>{a.set(t,new Set(Array.from(e).map((e=>s.getNode(e.id)))))})),s.treeIndices.set(d,{parentMap:r,childrenMap:a})})),s}toJSON(){return JSON.stringify({nodes:this.getAllNodes(),edges:this.getAllEdges()})}createView(e){return new a({graph:this,...e})}}e.Graph=h,e.GraphView=a,Object.defineProperty(e,"__esModule",{value:!0})}));

@@ -370,5 +370,11 @@ import EventEmitter from '@antv/event-emitter';

});
const parent = tree.parentMap.get(id);
if (parent)
tree.childrenMap.get(parent.id)?.delete(node);
tree.parentMap.delete(id);
tree.childrenMap.delete(id);
});
this.bothEdgesMap.delete(id);
this.inEdgesMap.delete(id);
this.outEdgesMap.delete(id);
this.changes.push({ type: 'NodeRemoved', value: node });

@@ -375,0 +381,0 @@ }

{
"testTimeout": 30000,
"preset": "ts-jest",
"globals": {
"ts-jest": {
"tsconfig": {
"target": "esnext",
"allowJs": true,
"sourceMap": true
}
}
},
"collectCoverage": false,

@@ -17,3 +7,15 @@ "testRegex": "(/__tests__/.*\\.(test|spec))\\.ts$",

"src/**/*.ts"
]
],
"transform": {
"^.+\\.ts$": [
"ts-jest",
{
"tsconfig": {
"target": "esnext",
"allowJs": true,
"sourceMap": true
}
}
]
}
}

@@ -376,5 +376,11 @@ "use strict";

});
const parent = tree.parentMap.get(id);
if (parent)
tree.childrenMap.get(parent.id)?.delete(node);
tree.parentMap.delete(id);
tree.childrenMap.delete(id);
});
this.bothEdgesMap.delete(id);
this.inEdgesMap.delete(id);
this.outEdgesMap.delete(id);
this.changes.push({ type: 'NodeRemoved', value: node });

@@ -381,0 +387,0 @@ }

{
"name": "@antv/graphlib",
"version": "2.0.2",
"version": "2.0.3",
"main": "lib/index.js",
"module": "esm/index.js",
"types": "lib/index.d.ts",
"unpkg": "dist/index.umd.min.js",
"sideEffects": false,

@@ -19,7 +23,2 @@ "scripts": {

},
"license": "MIT",
"main": "lib/index.js",
"module": "esm/index.js",
"types": "lib/index.d.ts",
"unpkg": "dist/index.umd.min.js",
"dependencies": {

@@ -30,27 +29,27 @@ "@antv/event-emitter": "^0.1.3"

"@commitlint/cli": "^11.0.0",
"@rollup/plugin-commonjs": "^21.0.2",
"@types/jest": "^29.2.4",
"@typescript-eslint/eslint-plugin": "^5.46.1",
"@typescript-eslint/parser": "^5.46.1",
"@rollup/plugin-commonjs": "^21.1.0",
"@rollup/plugin-node-resolve": "^15.2.3",
"@rollup/plugin-terser": "^0.4.4",
"@types/jest": "^29.5.12",
"@typescript-eslint/eslint-plugin": "^5.62.0",
"@typescript-eslint/parser": "^5.62.0",
"cross-env": "^7.0.3",
"eslint": "^8.29.0",
"eslint-plugin-import": "^2.26.0",
"husky": "^8.0.2",
"jest": "^29.3.1",
"eslint": "^8.57.0",
"eslint-plugin-import": "^2.29.1",
"husky": "^8.0.3",
"jest": "^29.7.0",
"limit-size": "^0.1.4",
"lint-staged": "^13.1.0",
"lint-staged": "^13.3.0",
"npm-run-all": "^4.1.5",
"prettier": "^2.8.1",
"prettier": "^2.8.8",
"rimraf": "^3.0.2",
"rollup": "^2.39.0",
"rollup-plugin-node-resolve": "^5.2.0",
"rollup": "^2.79.1",
"rollup-plugin-polyfill-node": "^0.8.0",
"rollup-plugin-typescript": "^1.0.1",
"rollup-plugin-uglify": "^6.0.4",
"rollup-plugin-visualizer": "^5.6.0",
"ts-jest": "^29.0.3",
"tslib": "^2.4.1",
"typedoc": "^0.23.24",
"typedoc-plugin-markdown": "^3.14.0",
"typescript": "^4.9.4"
"rollup-plugin-typescript2": "^0.35.0",
"rollup-plugin-visualizer": "^5.12.0",
"ts-jest": "^29.1.5",
"tslib": "^2.6.3",
"typedoc": "^0.25.13",
"typedoc-plugin-markdown": "^3.17.1",
"typescript": "^4.9.5"
},

@@ -67,3 +66,3 @@ "lint-staged": {

"path": "dist/index.umd.min.js",
"limit": "10 Kb",
"limit": "5 Kb",
"gzip": true

@@ -83,3 +82,4 @@ }

"registry": "https://registry.npmjs.org"
}
},
"license": "MIT"
}

@@ -1,11 +0,21 @@

# Graphlib
<h1 align="center">
<b>@antv/graphlib</b>
</h1>
> a lib containing multible usages for graph structure, graph algorithm, and other graph ops.
<div align="center">
> A library containing multible usages for graph structure, graph algorithm, and other graph ops.
>
> 一个包含方便的图结构,图算法,以及其他操作图的方法的图库,为 antv 上层提供相应的图基础能力
> 一个包含方便的图结构,图算法,以及其他操作图的方法的图库,为 AntV 上层提供相应的图基础能力。
![build status](https://img.shields.io/github/workflow/status/antvis/graphlib/Build) ![coverage status](https://img.shields.io/codecov/c/github/antvis/graphlib)
[![build](https://github.com/antvis/graphlib/actions/workflows/build.yml/badge.svg)](https://github.com/antvis/graphlib/actions/workflows/build.yml)
[![Coverage Status](https://coveralls.io/repos/github/antvis/graphlib/badge.svg?branch=master)](https://coveralls.io/github/antvis/graphlib?branch=master)
[![npm Version](https://img.shields.io/npm/v/@antv/graphlib.svg)](https://www.npmjs.com/package/@antv/graphlib)
[![npm Download](https://img.shields.io/npm/dm/@antv/graphlib.svg)](https://www.npmjs.com/package/@antv/graphlib)
[![npm License](https://img.shields.io/npm/l/@antv/graphlib.svg)](https://www.npmjs.com/package/@antv/graphlib)
## Features
</div>
## ✨ Features
- Manage graph structure data with simple APIs.

@@ -15,3 +25,3 @@ - Easily batch multiple changes for performance optimization.

## API
## 📖 API

@@ -23,3 +33,3 @@ ### Classes

## Change Log
## 🗂 Change Log

@@ -33,1 +43,5 @@ #### 2.0.2

- 🎉 Release new version
## 📄 License
MIT@[AntV](https://github.com/antvis).

@@ -402,5 +402,12 @@ import EventEmitter from '@antv/event-emitter';

});
const parent = tree.parentMap.get(id);
if (parent) tree.childrenMap.get(parent.id)?.delete(node);
tree.parentMap.delete(id);
tree.childrenMap.delete(id);
});
this.bothEdgesMap.delete(id);
this.inEdgesMap.delete(id);
this.outEdgesMap.delete(id);
this.changes.push({ type: 'NodeRemoved', value: node });

@@ -407,0 +414,0 @@ }

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

SocketSocket SOC 2 Logo

Product

  • Package Alerts
  • Integrations
  • Docs
  • Pricing
  • FAQ
  • Roadmap
  • Changelog

Packages

npm

Stay in touch

Get open source security insights delivered straight into your inbox.


  • Terms
  • Privacy
  • Security

Made with ⚡️ by Socket Inc