From 5ef998a29331b95c7c3fd50b2247849e50b80592 Mon Sep 17 00:00:00 2001 From: Wenxuan Feng <279357596@qq.com> Date: Tue, 22 Mar 2022 23:16:51 +0800 Subject: [PATCH 01/85] feat: Initial --- README.md | 1 + ReadMe-CN.md | 18 ++++++++++++++++++ 2 files changed, 19 insertions(+) create mode 100644 ReadMe-CN.md diff --git a/README.md b/README.md index e9ed04b8..d7410616 100644 --- a/README.md +++ b/README.md @@ -1,3 +1,4 @@ +> English | [中文](ReadMe-CN.md) # Important! diff --git a/ReadMe-CN.md b/ReadMe-CN.md new file mode 100644 index 00000000..57d8311e --- /dev/null +++ b/ReadMe-CN.md @@ -0,0 +1,18 @@ +# 进度 +- [ ] 翻译 [API](https://github.com/dagrejs/graphlib/wiki/API-Reference) - 2022/03/22 23:08 + +> 中文 | [English](ReadMe.md) + +[TOC] + +# 介绍 +`Graphlib`是一个JavaScript Lib库,为无向和有向多变图提供数据结构,以及可以一起使用的算法。 + +[![Build Status](https://secure.travis-ci.org/dagrejs/graphlib.svg)](http://travis-ci.org/dagrejs/graphlib) + +更多学习内容, 查看[wiki](https://github.com/cpettitt/graphlib/wiki)。 + +# API 指南 +本部分主要阐述graphlib的概念并提供API指南。默认情况下,graphlib函数和对象暴露在graphlib的命名空间下。 + + From dd7da652412ab4595acc815ef90f06523ac4e607 Mon Sep 17 00:00:00 2001 From: Wenxuan Feng <279357596@qq.com> Date: Wed, 23 Mar 2022 20:54:48 +0800 Subject: [PATCH 02/85] feat: new --- ReadMe-CN.md | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-) diff --git a/ReadMe-CN.md b/ReadMe-CN.md index 57d8311e..58ec1afd 100644 --- a/ReadMe-CN.md +++ b/ReadMe-CN.md @@ -15,4 +15,20 @@ # API 指南 本部分主要阐述graphlib的概念并提供API指南。默认情况下,graphlib函数和对象暴露在graphlib的命名空间下。 - +# 图像概念 +Graphlib有一种图类型: Graph。 +创建一个新的实例: +```js +var g = new Graph(); +``` +默认情况下,将会创建一个不允许多边或者复合节点的有向图。以下则是参数选项: +- `directed`:设置为`true`时, 得到一个有向图。`false`时, 得到一个无向图。无向图不会把节点的顺序视为第一要务。换句话说, 对无向图来说`g.edge("a", "b") === g.edge("b", "a")`。默认为`true` +- `multigraph`: 设置为`true`时, 允许图像在同一对节点之间有多条边。默认: `false`。 +- `compound`: 设置为`true`时, 允许图像有复合节点。 可以是其他节点的父节点。 默认为`false`。 + +可以在constructor中通过对象配置属性。比如,创建一个有向复合多边图: +```js +var g = new Graph({ directed: true, compound: true, multigraph: true }); +``` + +# 展示节点和边线 From 22c48ba0de6bc5a4a0d94a4bdd652fc95aaeb1b2 Mon Sep 17 00:00:00 2001 From: Wenxuan Feng <279357596@qq.com> Date: Wed, 23 Mar 2022 21:06:46 +0800 Subject: [PATCH 03/85] feat: new --- ReadMe-CN.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ReadMe-CN.md b/ReadMe-CN.md index 58ec1afd..409a4cd8 100644 --- a/ReadMe-CN.md +++ b/ReadMe-CN.md @@ -1,5 +1,5 @@ # 进度 -- [ ] 翻译 [API](https://github.com/dagrejs/graphlib/wiki/API-Reference) - 2022/03/22 23:08 +- [ ] 翻译 [API](https://github.com/dagrejs/graphlib/wiki/API-Reference) - 2022/03/23 21:06 > 中文 | [English](ReadMe.md) From 3f1dbe981be1b178f0ed930571c483b3a652b937 Mon Sep 17 00:00:00 2001 From: Wenxuan Feng <279357596@qq.com> Date: Thu, 24 Mar 2022 11:45:25 +0800 Subject: [PATCH 04/85] feat: multigraph --- ReadMe-CN.md | 67 +++++++++++++++++++++++++++++++++++++++++- static/multigraph.jpg | Bin 0 -> 107440 bytes 2 files changed, 66 insertions(+), 1 deletion(-) create mode 100644 static/multigraph.jpg diff --git a/ReadMe-CN.md b/ReadMe-CN.md index 409a4cd8..04796308 100644 --- a/ReadMe-CN.md +++ b/ReadMe-CN.md @@ -31,4 +31,69 @@ var g = new Graph(); var g = new Graph({ directed: true, compound: true, multigraph: true }); ``` -# 展示节点和边线 +# 展现节点和边线 +在graphlib中,节点由用户提供的字符串id表示。 所有节点相关的函数都使用此字符串id作为唯一标识节点的方式。以下为与节点交互的例子: +```js +var g = new Graph(); +g.setNode("my-id", "my-label"); + +g.node("my-id"); // return "my-label" +``` + +graphlib中的边由他们连接的节点标识。比如: +```js +var g = new Graph(); + +g.setEdge("source", "target", "my-label"); +g.edge("source", "target"); // return my-label +``` + +但是,为了进行各种类型的边缘查询,我们需要一种方法去唯一标识单个对象里的边。(比如:[outEdges](https://github.com/dagrejs/graphlib/wiki/API-Reference#outEdges))。我们使用`edgeObj`应对,而此主要由以下组成: +- `v`: 源id或者是边线上的尾节点。 +- `w`: 目标id或者是边线上的头节点。 +- `name`(可选): 唯一标识多边边线([multi-edge](https://github.com/dagrejs/graphlib/wiki/API-Reference#multigraphs))的名称。 + +任何采用了一个边线id的边缘函数也可以使用`edgeObj`: +```js +var g = new Graph(); + +g.setEdge("source", "target", "my-label") +g.edge({ v: "source", w: "target" }); // return my-label +``` + +# Multigraphs +multigraphs的数学概念: [multigraph](https://en.wikipedia.org/wiki/Multigraph) + + +多重图是一种在一对节点中可以拥有多条边的图。默认情况下, graphlib的图像不是多重图, 需要在构造体中设置多重图的属性为`true`: +```js +var g = new Graph({ multigraph: true }) +``` +在两个节点由多条边的情况下,我们需要相同的办法去识别每一条边。 我们称这样的属性为`name`。 这有关于相同节点之间的几条边的例子: +```js +var g = new Graph({ multigraph: true }) + +g.setEdge("a", "b", "edge1-label", "edge1") +g.setEdge("a", "b", "edge2-label", "edge2") + +g.edge("a", "b", "edge1") +g.edge("a", "b", "edge2") + +g.edges() +/** + * return [ + * { v: "a", w: "b", name: "edge1" }, + * { v: "a", w: "b", name: "edge2" } + * ] + */ +``` + +多重图也允许创建没有名字的一条边 +```js +var g = new Graph({ multigraph: true }) + +g.setEdge("a", "b", "my-label") +g.edge({ v: "a", w: "b" }) +``` + +# 复合图 \ No newline at end of file diff --git a/static/multigraph.jpg b/static/multigraph.jpg new file mode 100644 index 0000000000000000000000000000000000000000..72465eecc57c9662ae6687a467395819521226fa GIT binary patch literal 107440 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

!B-##s8T~epzaA^A#LQNz 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

3eU7T5Ck(8wRpd=2iQ;YQsJ~ZR2P8 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 Date: Sat, 26 Mar 2022 17:45:32 +0800 Subject: [PATCH 05/85] feat: new --- ReadMe-CN.md | 219 +++++++++++++++++++++++++++++++++++++- static/alg.components.jpg | Bin 0 -> 35154 bytes test.js | 5 + 3 files changed, 223 insertions(+), 1 deletion(-) create mode 100644 static/alg.components.jpg create mode 100644 test.js diff --git a/ReadMe-CN.md b/ReadMe-CN.md index 04796308..84f60ebc 100644 --- a/ReadMe-CN.md +++ b/ReadMe-CN.md @@ -96,4 +96,221 @@ g.setEdge("a", "b", "my-label") g.edge({ v: "a", w: "b" }) ``` -# 复合图 \ No newline at end of file +# 复合图 +复合图就是一个节点可以是其他节点的父节点。子节点组成一个"子图"。 以下例子为构建一个复合图并与之交互: +```js +var g = new Graph({ compound: true }); + +g.setParent("a", "parent"); +g.setParent("b", "parent"); + +g.parent("a"); // returns "parent" +g.parent("b"); // returns "parent" + +g.parent("parent"); // returns undefined +``` + +# 默认标签 +当一个节点或边没有创建标签时,会被默认分配一个标签。详情请看这两个API: +- [setDefaultNodeLabel](https://github.com/dagrejs/graphlib/wiki/API-Reference#setDefaultNodeLabel) +- [setDefaultEdgeLabel](https://github.com/dagrejs/graphlib/wiki/API-Reference#setDefaultEdgeLabel) + +# Graph API + +## graph.isDirected() +如果图是有向图的话,会返回`true`。 +有向图会将在线段里的节点顺序是做有意义的,而无向图则会忽视。以下例子证明了不同: +```js +var directed = new Graph({ directed: true }); + +directed.setEdge("a", "b", "my-label"); +directed.edge("a", "b"); // returns my-label +directed.edge("b", "a"); // returns undefined + +var undirected = new Graph({ directed: false }); +undirected.setEdge("a", "b", "my-label"); +undirected.edge("a", "b"); // returns my-label +undirected.edge("b", "a"); // returns my-label +``` + +## graph.isMultigraph() +如果图是多重图,返回`true`。[Multigraph](https://github.com/dagrejs/graphlib/wiki/API-Reference#multigraphs) + +## graph.isCompound() +如果是复合图,返回`true`。[compound](https://github.com/dagrejs/graphlib/wiki/API-Reference#compound-graphs) + +## graph.graph() +返回为图形分配的标签。 如果没有指定标签,则返回`undefined`。 +```js +var g = new Graph(); + +g.graph(); // return undefined +g.setGraph("graph-label"); +g.graph(); // return "graph-label" +``` + +## graph.setGraph(label) +为图像设置标签。 + +## graph.nodeCount() +返回图像中节点的数量。 + +## graph.edgeCount() +返回节点中边线的数量。 + +## graph.setDefaultNodeLabel(val) +设置一个新的默认值,以便于在没有指定标签创建节点时,分配过去。 +如果`val`不是一个函数,将会作为标签分配。 +如果是一个函数, 正被创建的节点的id将会调用此函数。 + +## graph.setDefaultEdgeLabel(val) +为没有分配标签的线段指定一个新的默认标签。 +如果`val`不是函数,则作为标签。 +如果是函数,则会随着参数`(v, w, name)`而被调用。 + +## graph.nodes() +返回图像里的所有节点id。 +使用[node(v)](https://github.com/dagrejs/graphlib/wiki/API-Reference#node)获取每个节点的标签,花费`O(|v|)`的时间。 + +## graph.edges() +返回图中的每个边线的[edgeObj](https://github.com/dagrejs/graphlib/wiki/API-Reference#node-and-edge-representation)。 +使用[edge(edgeObj)](https://github.com/dagrejs/graphlib/wiki/API-Reference#edge)获取每个边线的标签。花费`O(|v|)`的时间。 + +## graph.sources() +返回图中没有入边的节点。 + +## graph.sinks() +返回途中没有出边的节点。 + +## graph.hasNode(v) +如果图里存在节点的id为`v`,则返回`true`。 + +## graph.node(v) +如果图中存在id为`v`的节点,则返回指定的标签,否则返回`undefined`。 + +## graph.setNode(v, [label]) +在图中创建或更新节点v的值。 如果提供了label,则更新掉。如果没有提供,在创建过程中会分配一个默认的标签。[default node label](https://github.com/dagrejs/graphlib/wiki/API-Reference#default-labels)。 + +返回图,允许图和其他的函数连接起来。 + +## graph.removeNode(v) +移除图中id为`v`的节点,如果不存在则不处理。如果节点被移除,也会移除所有边。 +返回图,允许图和其他的函数连接起来。 + +## graph.predecessors(v) +返回指定节点的所有前导节点,如果图中不存在此节点,则返回`undefined`. 如果是无向图,则会返回`undefined`,应该使用[neighbors](https://github.com/dagrejs/graphlib/wiki/API-Reference#neighbors)。 + +## graph.successors(v) +返回指定节点的所有后续节点。如果图中没有此节点,则返回`undefined`. 如果是无向图,则会返回`undefined`,应该使用[neighbors](https://github.com/dagrejs/graphlib/wiki/API-Reference#neighbors)。 + +## graph.neighbors(v) +返回指定节点的前导节点或者后续节点。如果图中没有此节点,则返回`undefined`。 + +## graph.inEdges(v, [u]) +返回所有指向节点(v)的边。 可以过滤出只来自于节点u的边。 +对无向图来说都是`undefined`,请使用[nodeEdges](https://github.com/dagrejs/graphlib/wiki/API-Reference#nodeEdges)。 +如果图中没有节点`v`,则返回`undefined`。 + + +## graph.outEdges(v, [w]) +返回所有指向节点的边。可以过滤出只指向节点w的边。 +对无向图来说都是`undefined`,请使用[nodeEdges](https://github.com/dagrejs/graphlib/wiki/API-Reference#nodeEdges)。 +如果图中没有节点`v`,则返回`undefined`。 + +## graph.nodeEdges(v, [w]) +返回所有与节点v有关的边,而不管方向。 +可以过滤出节点v和w之间的所有线段,无论方向。 +如果图中没有节点`v`,则返回`undefined`。 + +## graph.parent(v) +返回节点v的父节点。 +如果节点没有父节点或不在图中,则返回`undefined`。 +如果不是复合图的话,始终返回`undefined`。 + +## graph.children(v) +返回节点v的所有孩子节点。 +如果不在图中则返回`undefined`。 +如果不是复合图,始终返回`[]`。 + +## graph.setParent(v, parent) +如果`parent`有值,则设置为节点v的父节点; 如果没有值,则移除节点v的父节点。 +如果图不是复合图,则抛出异常。 +返回值为图本身,允许被连接到其他的函数内。 + +## graph.hasEdge(v, w, [name]) / graph.hasEdge(edgeObj) +如果图中的节点v和节点w之间存在一条边,名字为`name`,则返回`true`。 +[name]参数只适用于多重图。 +对于无向图来说,v和w可以互换位置。 + +## graph.edge(v, w, [name]) / graph.edge(edgeObj) +如果图中节点v和w之间存在线段,并带有可选名称,则返回线段(v,w)的标签。 +如果图中没有这条线,则返回`undefined`。 +参数[name]只适用于多重图。 +无向图中,v,w可以互换。 + +## graph.setEdge(v, w, [label], [name]) / graph.setEdge(edgeObj, [label]) +使用参数[name]去创建或更新(v,w)的边。 +如果提供了[label],则将其设置为边的值。而如果没有被提供,则将分配给默认的标签。 +参数[name]只适用于多重图。 +返回值为图本身,允许被连接到其他的函数内。 + +## graph.removeEdge(v, w, [name]) +如果图中的节点v,w之间有一条可选名[name]的边,则移除它。否则将无效。 +参数[name]只适用于多重图。 +无向图中,v,w可以互换。 + + +# 序列化 +## json.write(g) +创建可以用JSON序列化为字符串的图形的JSONrepresentation。稍后可以使用[json-read](https://github.com/dagrejs/graphlib/wiki/API-Reference#json-read)恢复图形。 + +```js +var g = new graphlib.Graph(); +g.setNode("a", { label: "node a" }); +g.setNode("b", { label: "node b" }); +g.setEdge("a", "b", { label: "edge a->b" }); +graphlib.json.write(g); +// Returns the object: +// +// { +// "options": { +// "directed": true, +// "multigraph": false, +// "compound": false +// }, +// "nodes": [ +// { "v": "a", "value": { "label": "node a" } }, +// { "v": "b", "value": { "label": "node b" } } +// ], +// "edges": [ +// { "v": "a", "w": "b", "value": { "label": "edge a->b" } } +// ] +// } +``` + +## json.read(json) +将输入的json转换为图像的展示类型。比如,我们使用`json-write`将图像序列化为`str`的字符串,我们可以使用以下的办法去恢复: +```js +var g2 = graphlib.json.read(JSON.parse(str)); +// or, in order to copy the graph +var g3 = graphlib.json.read(graphlib.json.write(g)) + +g2.nodes(); +// ['a', 'b'] +g2.edges() +// [ { v: 'a', w: 'b' } ] +``` + +# 算法 +## alg.components(graph) +找到图中所有的连接部分,并且将这些部分作为数组返回。 +每个组件本身就是一个数组,包含组件中节点id。 + +```js +graphlib.alg.components(g); +// => [ [ 'A', 'B', 'C', 'D' ], +// [ 'E', 'F', 'G' ], +// [ 'H', 'I' ] ] +``` + +## alg.dijkstra(graph, source, weightFn, edgeFn) diff --git a/static/alg.components.jpg b/static/alg.components.jpg new file mode 100644 index 0000000000000000000000000000000000000000..558d52ade16ac852dcabf41fbefc495b3da69b4b GIT binary patch literal 35154 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

%mVH=&^z;uL(76LQ$P*!fgpkQi|T=CSvhksap_G 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 Date: Sat, 26 Mar 2022 18:17:34 +0800 Subject: [PATCH 06/85] feat: new --- ReadMe-CN.md | 29 +++++++++++++++++++++++++++++ static/dijkstra-source.png | Bin 0 -> 22103 bytes 2 files changed, 29 insertions(+) create mode 100644 static/dijkstra-source.png diff --git a/ReadMe-CN.md b/ReadMe-CN.md index 84f60ebc..f5f6cd74 100644 --- a/ReadMe-CN.md +++ b/ReadMe-CN.md @@ -314,3 +314,32 @@ graphlib.alg.components(g); ``` ## alg.dijkstra(graph, source, weightFn, edgeFn) +此算法是[Dijkstra]算法的js版本. 旨在从g的源节点到其他任意节点的最短路径。 + +这个函数将会返回一个map结构: +`v -> { distance, predecessor }` + +distance属性会保存从source到v的最短路径权重之和。 +如果从source过来没有路径,则结果为正无穷大。 + +predecessor属性可以按照相反顺序遍历source到v的每个元素。 + +根据`weightFn(e)`来返回边e的权重。如果没有赋值,默认的每条边的权重是1. +如果任何遍历的边具有负边权重,则此函数将抛出错误。 + +edgeFn(v)会返回与节点v相关的所有边的ID,以便进行最短路径遍历。默认使用`g.outEdges`。 + +例子: + + +```js +function weight(e) { return g.edge(e); } + +graphlib.alg.dijkstra(g, "A", weight); +// => { A: { distance: 0 }, +// B: { distance: 6, predecessor: 'C' }, +// C: { distance: 4, predecessor: 'A' }, +// D: { distance: 2, predecessor: 'A' }, +// E: { distance: 8, predecessor: 'F' }, +// F: { distance: 4, predecessor: 'D' } } +``` \ No newline at end of file diff --git a/static/dijkstra-source.png b/static/dijkstra-source.png new file mode 100644 index 0000000000000000000000000000000000000000..4494dac5fcfcab273ef497bdaf2a4de604ffc821 GIT binary patch literal 22103 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 Date: Sat, 26 Mar 2022 18:18:01 +0800 Subject: [PATCH 07/85] feat: dijkstra --- test.js | 5 ----- 1 file changed, 5 deletions(-) delete mode 100644 test.js diff --git a/test.js b/test.js deleted file mode 100644 index fae69c6c..00000000 --- a/test.js +++ /dev/null @@ -1,5 +0,0 @@ -var g = new Graph(); - -g.graph(); // return undefined -g.setGraph("graph-label"); -g.graph(); // return "graph-label" \ No newline at end of file From 62a88f64cfa1dddf04083a1ef744a92090c0086d Mon Sep 17 00:00:00 2001 From: Wenxuan Feng <279357596@qq.com> Date: Sun, 27 Mar 2022 18:40:15 +0800 Subject: [PATCH 08/85] feat: new --- ReadMe-CN.md | 172 ++++++++++++++++++++++++++++++- static/dijkstraAll.png | Bin 0 -> 22103 bytes static/minimum_spanning_tree.png | Bin 0 -> 16020 bytes static/postorder.png | Bin 0 -> 14805 bytes static/preorder.png | Bin 0 -> 14805 bytes static/prim-input.png | Bin 0 -> 25990 bytes static/tarjan.png | Bin 0 -> 30667 bytes static/topsort.png | Bin 0 -> 11142 bytes test.js | 0 9 files changed, 171 insertions(+), 1 deletion(-) create mode 100644 static/dijkstraAll.png create mode 100644 static/minimum_spanning_tree.png create mode 100644 static/postorder.png create mode 100644 static/preorder.png create mode 100644 static/prim-input.png create mode 100644 static/tarjan.png create mode 100644 static/topsort.png create mode 100644 test.js diff --git a/ReadMe-CN.md b/ReadMe-CN.md index f5f6cd74..1a9b321c 100644 --- a/ReadMe-CN.md +++ b/ReadMe-CN.md @@ -5,6 +5,12 @@ [TOC] +# 安装 +## npm Install +```shell +$ npm install @dagrejs/graphlib +``` + # 介绍 `Graphlib`是一个JavaScript Lib库,为无向和有向多变图提供数据结构,以及可以一起使用的算法。 @@ -342,4 +348,168 @@ graphlib.alg.dijkstra(g, "A", weight); // D: { distance: 2, predecessor: 'A' }, // E: { distance: 8, predecessor: 'F' }, // F: { distance: 4, predecessor: 'D' } } -``` \ No newline at end of file +``` + +## alg.dijkstraAll(graph, weightFn, edgeFn) +此函数用于查找从每个节点到其他每个可到达节点到最短距离。 +与`alg.dijkstra`类似,但返回的不是单个数组,而是返回一个map映射: `source -> alg.dijkstra(g, source, weightFn, edgeFn)` + +函数的`weightFn`返回边`e`的权重。如果没有指定,则默认为1。如果可遍历的边有负数,则会立即抛出错误。 + +函数的`edgeFn(u)`返回所有与节点`u`有关的边的id,以便于进行最短路径的遍历。默认使用`g.outEdges`。 + +例子: + + +```js +function weight(e) { return g.edge(e); } + +graphlib.alg.dijkstraAll(g, function(e) { return g.edge(e); }); + +// => { A: +// { A: { distance: 0 }, +// B: { distance: 6, predecessor: 'C' }, +// C: { distance: 4, predecessor: 'A' }, +// D: { distance: 2, predecessor: 'A' }, +// E: { distance: 8, predecessor: 'F' }, +// F: { distance: 4, predecessor: 'D' } }, +// B: +// { A: { distance: Infinity }, +// B: { distance: 0 }, +// C: { distance: Infinity }, +// D: { distance: Infinity }, +// E: { distance: 6, predecessor: 'B' }, +// F: { distance: Infinity } }, +// C: { ... }, +// D: { ... }, +// E: { ... }, +// F: { ... } } +``` + +## alg.findCycles(graph) +假定存在一个图`g`,此函数将会返回图中循环的部分。 + +由于图中不止有1个循环,所以该函数返回有循环体所构成的数组,而每个循环体由涉及的节点id构成。 + +如果要判断图是否有循环部分,请使用`g.isAcyclic`则更为高效。 + +```js +var g = new graphlib.Graph(); +g.setNode(1); +g.setNode(2); +g.setNode(3); +g.setEdge(1, 2); +g.setEdge(2, 3); + +graphlib.alg.findCycles(g); +// => [] + +g.setEdge(3, 1); +graphlib.alg.findCycles(g); +// => [ [ '3', '2', '1' ] ] + +g.setNode(4); +g.setNode(5); +g.setEdge(4, 5); +g.setEdge(5, 4); +graphlib.alg.findCycles(g); +// => [ [ '3', '2', '1' ], [ '5', '4' ] ] +``` + +## alg.isAcyclic(graph) +给定一个图`g`,如果该图有循环的部分,则返回`true`。否则,返回`false`。 + +该函数会返回检测到的第一个循环体。如果要获取全部内容,请使用`alg.findCycles`。 + +```js +var g = new graphlib.Graph(); +g.setNode(1); +g.setNode(2); +g.setNode(3); +g.setEdge(1, 2); +g.setEdge(2, 3); + +graphlib.alg.isAcyclic(g); +// => true + +g.setEdge(3, 1); +graphlib.alg.isAcyclic(g); +// => false +``` + +## alg.postorder(graph, vs) +该函数将会从图像g的节点vs开始,进行后序遍历。 + +对于访问的每个节点,假定节点名为`v`,将会调用`callback(v)`。 + +```js +graphlib.alg.postorder(g, "A"); +// => One of: +// [ "B", "D", "E", C", "A" ] +// [ "B", "E", "D", C", "A" ] +// [ "D", "E", "C", B", "A" ] +// [ "E", "D", "C", B", "A" ] +``` + +## alg.preorder(graph, vs) +该函数将会从图像g的节点vs开始,进行前序遍历。 +对于访问的每个节点,假定节点名为`v`,将会调用`callback(v)`。 + +```js +graphlib.alg.preorder(g, "A"); +// => One of: +// [ "A", "B", "C", "D", "E" ] +// [ "A", "B", "C", "E", "D" ] +// [ "A", "C", "D", "E", "B" ] +// [ "A", "C", "E", "D", "B" ] +``` + +## alg.prim(graph, weightFn) +Prim算法采用连通无向图,并生成最小生成树。 +[Prim's algorithm](https://en.wikipedia.org/wiki/Prim's_algorithm). + +该函数将会以无向图的形式返回最小生成树。这个算法取自《算法导论》。 + +weightFn(e)将会返回边的权重e,如果图没有被联通,则会抛出异常。 + + +```js +function weight(e) { return g(e); } +graphlib.alg.prim(g, weight); +``` + +返回的树,以图的形式展现: + + +## alg.tarjan(graph) +[Tarjan's algorithm](http://en.wikipedia.org/wiki/Tarjan's_strongly_connected_components_algorithm) + +该函数是Tarjan算法的一个实现,该算法在有向图g中找到所有[强连通分量](http://en.wikipedia.org/wiki/Strongly_connected_component) + +每个强连通分量由节点组成,这些节点可以通过定向边到达分量中的所有其他节点。 + +如果一个强连接的组件既不能到达图中的任何其他特定节点,也不能被该节点访问,则该组件可以由单个节点组成。多个节点的组件要保证至少有一个循环。 + +此函数将会返回一个组件数组。每个组件本身也是一个数组,并且包含了组件内所有节点的id。 + +```js +graphlib.alg.tarjan(g); +// => [ [ 'F', 'G' ], +// [ 'H', 'D', 'C' ], +// [ 'E', 'B', 'A' ] ] +``` + +## alg.topsort(graph) +[topological sorting](https://en.wikipedia.org/wiki/Topological_sorting) + +topological 排序算法的实现。 + +给定一个图`g`,该函数返回一个节点数组,使得每个边`u -> v`, u出现在v之前。 +如果图有循环,则不可能生成列表,并抛出异常。 + + +```js +graphlib.alg.topsort(g) +// [ '1', '2', '3', '4' ] or [ '1', '3', '2', '4' ] +``` + diff --git a/static/dijkstraAll.png b/static/dijkstraAll.png new file mode 100644 index 0000000000000000000000000000000000000000..4494dac5fcfcab273ef497bdaf2a4de604ffc821 GIT binary patch literal 22103 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 EKdr2fhX4Qo literal 0 HcmV?d00001 diff --git a/static/tarjan.png b/static/tarjan.png new file mode 100644 index 0000000000000000000000000000000000000000..4e5b3c724d74ee6a5ccc5cc9fcea22e3c3ce3cc0 GIT binary patch literal 30667 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 Date: Sun, 27 Mar 2022 18:41:33 +0800 Subject: [PATCH 09/85] feat: commit --- ReadMe-CN.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ReadMe-CN.md b/ReadMe-CN.md index 1a9b321c..f9bb7b93 100644 --- a/ReadMe-CN.md +++ b/ReadMe-CN.md @@ -1,5 +1,5 @@ # 进度 -- [ ] 翻译 [API](https://github.com/dagrejs/graphlib/wiki/API-Reference) - 2022/03/23 21:06 +- [x] 翻译 [API](https://github.com/dagrejs/graphlib/wiki/API-Reference) - 2022/03/23 21:06 > 中文 | [English](ReadMe.md) From d659b23ee23466caccf6114c63b521a742647713 Mon Sep 17 00:00:00 2001 From: Wenxuan Feng <279357596@qq.com> Date: Sun, 27 Mar 2022 18:42:35 +0800 Subject: [PATCH 10/85] feat: new --- README-EN.md | 24 +++ README.md | 517 +++++++++++++++++++++++++++++++++++++++++++++++++-- ReadMe-CN.md | 515 -------------------------------------------------- 3 files changed, 528 insertions(+), 528 deletions(-) create mode 100644 README-EN.md delete mode 100644 ReadMe-CN.md diff --git a/README-EN.md b/README-EN.md new file mode 100644 index 00000000..31fd3f9b --- /dev/null +++ b/README-EN.md @@ -0,0 +1,24 @@ +> English | [中文](ReadMe.md) + +# Important! + +**This project does not have a maintainer or active project members. There won’t be any support or attention to pull requests. Please do not contact previous maintainers unless you are qualified and have the resources to make a serious commitment to fully take over ownership of the project.** + + + +# Graphlib + +Graphlib is a JavaScript library that provides data structures for undirected +and directed multi-graphs along with algorithms that can be used with them. + +[![Build Status](https://secure.travis-ci.org/dagrejs/graphlib.svg)](http://travis-ci.org/dagrejs/graphlib) + +To learn more [see our Wiki](https://github.com/cpettitt/graphlib/wiki). + +# License + +Graphlib is licensed under the terms of the MIT License. See the +[LICENSE](LICENSE) file +for details. + +[npm package manager]: http://npmjs.org/ diff --git a/README.md b/README.md index d7410616..fa18bc39 100644 --- a/README.md +++ b/README.md @@ -1,24 +1,515 @@ -> English | [中文](ReadMe-CN.md) +# 进度 +- [x] 翻译 [API](https://github.com/dagrejs/graphlib/wiki/API-Reference) - 2022/03/23 21:06 -# Important! +> 中文 | [English](ReadMe-EN.md) -**This project does not have a maintainer or active project members. There won’t be any support or attention to pull requests. Please do not contact previous maintainers unless you are qualified and have the resources to make a serious commitment to fully take over ownership of the project.** +[TOC] +# 安装 +## npm Install +```shell +$ npm install @dagrejs/graphlib +``` +# 介绍 +`Graphlib`是一个JavaScript Lib库,为无向和有向多变图提供数据结构,以及可以一起使用的算法。 -# Graphlib +[![Build Status](https://secure.travis-ci.org/dagrejs/graphlib.svg)](http://travis-ci.org/dagrejs/graphlib) -Graphlib is a JavaScript library that provides data structures for undirected -and directed multi-graphs along with algorithms that can be used with them. +更多学习内容, 查看[wiki](https://github.com/cpettitt/graphlib/wiki)。 -[![Build Status](https://secure.travis-ci.org/dagrejs/graphlib.svg)](http://travis-ci.org/dagrejs/graphlib) +# API 指南 +本部分主要阐述graphlib的概念并提供API指南。默认情况下,graphlib函数和对象暴露在graphlib的命名空间下。 + +# 图像概念 +Graphlib有一种图类型: Graph。 +创建一个新的实例: +```js +var g = new Graph(); +``` +默认情况下,将会创建一个不允许多边或者复合节点的有向图。以下则是参数选项: +- `directed`:设置为`true`时, 得到一个有向图。`false`时, 得到一个无向图。无向图不会把节点的顺序视为第一要务。换句话说, 对无向图来说`g.edge("a", "b") === g.edge("b", "a")`。默认为`true` +- `multigraph`: 设置为`true`时, 允许图像在同一对节点之间有多条边。默认: `false`。 +- `compound`: 设置为`true`时, 允许图像有复合节点。 可以是其他节点的父节点。 默认为`false`。 + +可以在constructor中通过对象配置属性。比如,创建一个有向复合多边图: +```js +var g = new Graph({ directed: true, compound: true, multigraph: true }); +``` + +# 展现节点和边线 +在graphlib中,节点由用户提供的字符串id表示。 所有节点相关的函数都使用此字符串id作为唯一标识节点的方式。以下为与节点交互的例子: +```js +var g = new Graph(); +g.setNode("my-id", "my-label"); + +g.node("my-id"); // return "my-label" +``` + +graphlib中的边由他们连接的节点标识。比如: +```js +var g = new Graph(); + +g.setEdge("source", "target", "my-label"); +g.edge("source", "target"); // return my-label +``` + +但是,为了进行各种类型的边缘查询,我们需要一种方法去唯一标识单个对象里的边。(比如:[outEdges](https://github.com/dagrejs/graphlib/wiki/API-Reference#outEdges))。我们使用`edgeObj`应对,而此主要由以下组成: +- `v`: 源id或者是边线上的尾节点。 +- `w`: 目标id或者是边线上的头节点。 +- `name`(可选): 唯一标识多边边线([multi-edge](https://github.com/dagrejs/graphlib/wiki/API-Reference#multigraphs))的名称。 + +任何采用了一个边线id的边缘函数也可以使用`edgeObj`: +```js +var g = new Graph(); + +g.setEdge("source", "target", "my-label") +g.edge({ v: "source", w: "target" }); // return my-label +``` + +# Multigraphs +multigraphs的数学概念: [multigraph](https://en.wikipedia.org/wiki/Multigraph) + + +多重图是一种在一对节点中可以拥有多条边的图。默认情况下, graphlib的图像不是多重图, 需要在构造体中设置多重图的属性为`true`: +```js +var g = new Graph({ multigraph: true }) +``` +在两个节点由多条边的情况下,我们需要相同的办法去识别每一条边。 我们称这样的属性为`name`。 这有关于相同节点之间的几条边的例子: +```js +var g = new Graph({ multigraph: true }) + +g.setEdge("a", "b", "edge1-label", "edge1") +g.setEdge("a", "b", "edge2-label", "edge2") + +g.edge("a", "b", "edge1") +g.edge("a", "b", "edge2") + +g.edges() +/** + * return [ + * { v: "a", w: "b", name: "edge1" }, + * { v: "a", w: "b", name: "edge2" } + * ] + */ +``` + +多重图也允许创建没有名字的一条边 +```js +var g = new Graph({ multigraph: true }) + +g.setEdge("a", "b", "my-label") +g.edge({ v: "a", w: "b" }) +``` + +# 复合图 +复合图就是一个节点可以是其他节点的父节点。子节点组成一个"子图"。 以下例子为构建一个复合图并与之交互: +```js +var g = new Graph({ compound: true }); + +g.setParent("a", "parent"); +g.setParent("b", "parent"); + +g.parent("a"); // returns "parent" +g.parent("b"); // returns "parent" + +g.parent("parent"); // returns undefined +``` + +# 默认标签 +当一个节点或边没有创建标签时,会被默认分配一个标签。详情请看这两个API: +- [setDefaultNodeLabel](https://github.com/dagrejs/graphlib/wiki/API-Reference#setDefaultNodeLabel) +- [setDefaultEdgeLabel](https://github.com/dagrejs/graphlib/wiki/API-Reference#setDefaultEdgeLabel) + +# Graph API + +## graph.isDirected() +如果图是有向图的话,会返回`true`。 +有向图会将在线段里的节点顺序是做有意义的,而无向图则会忽视。以下例子证明了不同: +```js +var directed = new Graph({ directed: true }); + +directed.setEdge("a", "b", "my-label"); +directed.edge("a", "b"); // returns my-label +directed.edge("b", "a"); // returns undefined + +var undirected = new Graph({ directed: false }); +undirected.setEdge("a", "b", "my-label"); +undirected.edge("a", "b"); // returns my-label +undirected.edge("b", "a"); // returns my-label +``` + +## graph.isMultigraph() +如果图是多重图,返回`true`。[Multigraph](https://github.com/dagrejs/graphlib/wiki/API-Reference#multigraphs) + +## graph.isCompound() +如果是复合图,返回`true`。[compound](https://github.com/dagrejs/graphlib/wiki/API-Reference#compound-graphs) + +## graph.graph() +返回为图形分配的标签。 如果没有指定标签,则返回`undefined`。 +```js +var g = new Graph(); + +g.graph(); // return undefined +g.setGraph("graph-label"); +g.graph(); // return "graph-label" +``` + +## graph.setGraph(label) +为图像设置标签。 + +## graph.nodeCount() +返回图像中节点的数量。 + +## graph.edgeCount() +返回节点中边线的数量。 + +## graph.setDefaultNodeLabel(val) +设置一个新的默认值,以便于在没有指定标签创建节点时,分配过去。 +如果`val`不是一个函数,将会作为标签分配。 +如果是一个函数, 正被创建的节点的id将会调用此函数。 + +## graph.setDefaultEdgeLabel(val) +为没有分配标签的线段指定一个新的默认标签。 +如果`val`不是函数,则作为标签。 +如果是函数,则会随着参数`(v, w, name)`而被调用。 + +## graph.nodes() +返回图像里的所有节点id。 +使用[node(v)](https://github.com/dagrejs/graphlib/wiki/API-Reference#node)获取每个节点的标签,花费`O(|v|)`的时间。 + +## graph.edges() +返回图中的每个边线的[edgeObj](https://github.com/dagrejs/graphlib/wiki/API-Reference#node-and-edge-representation)。 +使用[edge(edgeObj)](https://github.com/dagrejs/graphlib/wiki/API-Reference#edge)获取每个边线的标签。花费`O(|v|)`的时间。 + +## graph.sources() +返回图中没有入边的节点。 + +## graph.sinks() +返回途中没有出边的节点。 + +## graph.hasNode(v) +如果图里存在节点的id为`v`,则返回`true`。 + +## graph.node(v) +如果图中存在id为`v`的节点,则返回指定的标签,否则返回`undefined`。 + +## graph.setNode(v, [label]) +在图中创建或更新节点v的值。 如果提供了label,则更新掉。如果没有提供,在创建过程中会分配一个默认的标签。[default node label](https://github.com/dagrejs/graphlib/wiki/API-Reference#default-labels)。 + +返回图,允许图和其他的函数连接起来。 + +## graph.removeNode(v) +移除图中id为`v`的节点,如果不存在则不处理。如果节点被移除,也会移除所有边。 +返回图,允许图和其他的函数连接起来。 + +## graph.predecessors(v) +返回指定节点的所有前导节点,如果图中不存在此节点,则返回`undefined`. 如果是无向图,则会返回`undefined`,应该使用[neighbors](https://github.com/dagrejs/graphlib/wiki/API-Reference#neighbors)。 + +## graph.successors(v) +返回指定节点的所有后续节点。如果图中没有此节点,则返回`undefined`. 如果是无向图,则会返回`undefined`,应该使用[neighbors](https://github.com/dagrejs/graphlib/wiki/API-Reference#neighbors)。 + +## graph.neighbors(v) +返回指定节点的前导节点或者后续节点。如果图中没有此节点,则返回`undefined`。 + +## graph.inEdges(v, [u]) +返回所有指向节点(v)的边。 可以过滤出只来自于节点u的边。 +对无向图来说都是`undefined`,请使用[nodeEdges](https://github.com/dagrejs/graphlib/wiki/API-Reference#nodeEdges)。 +如果图中没有节点`v`,则返回`undefined`。 + + +## graph.outEdges(v, [w]) +返回所有指向节点的边。可以过滤出只指向节点w的边。 +对无向图来说都是`undefined`,请使用[nodeEdges](https://github.com/dagrejs/graphlib/wiki/API-Reference#nodeEdges)。 +如果图中没有节点`v`,则返回`undefined`。 + +## graph.nodeEdges(v, [w]) +返回所有与节点v有关的边,而不管方向。 +可以过滤出节点v和w之间的所有线段,无论方向。 +如果图中没有节点`v`,则返回`undefined`。 + +## graph.parent(v) +返回节点v的父节点。 +如果节点没有父节点或不在图中,则返回`undefined`。 +如果不是复合图的话,始终返回`undefined`。 + +## graph.children(v) +返回节点v的所有孩子节点。 +如果不在图中则返回`undefined`。 +如果不是复合图,始终返回`[]`。 + +## graph.setParent(v, parent) +如果`parent`有值,则设置为节点v的父节点; 如果没有值,则移除节点v的父节点。 +如果图不是复合图,则抛出异常。 +返回值为图本身,允许被连接到其他的函数内。 + +## graph.hasEdge(v, w, [name]) / graph.hasEdge(edgeObj) +如果图中的节点v和节点w之间存在一条边,名字为`name`,则返回`true`。 +[name]参数只适用于多重图。 +对于无向图来说,v和w可以互换位置。 + +## graph.edge(v, w, [name]) / graph.edge(edgeObj) +如果图中节点v和w之间存在线段,并带有可选名称,则返回线段(v,w)的标签。 +如果图中没有这条线,则返回`undefined`。 +参数[name]只适用于多重图。 +无向图中,v,w可以互换。 + +## graph.setEdge(v, w, [label], [name]) / graph.setEdge(edgeObj, [label]) +使用参数[name]去创建或更新(v,w)的边。 +如果提供了[label],则将其设置为边的值。而如果没有被提供,则将分配给默认的标签。 +参数[name]只适用于多重图。 +返回值为图本身,允许被连接到其他的函数内。 + +## graph.removeEdge(v, w, [name]) +如果图中的节点v,w之间有一条可选名[name]的边,则移除它。否则将无效。 +参数[name]只适用于多重图。 +无向图中,v,w可以互换。 + + +# 序列化 +## json.write(g) +创建可以用JSON序列化为字符串的图形的JSONrepresentation。稍后可以使用[json-read](https://github.com/dagrejs/graphlib/wiki/API-Reference#json-read)恢复图形。 + +```js +var g = new graphlib.Graph(); +g.setNode("a", { label: "node a" }); +g.setNode("b", { label: "node b" }); +g.setEdge("a", "b", { label: "edge a->b" }); +graphlib.json.write(g); +// Returns the object: +// +// { +// "options": { +// "directed": true, +// "multigraph": false, +// "compound": false +// }, +// "nodes": [ +// { "v": "a", "value": { "label": "node a" } }, +// { "v": "b", "value": { "label": "node b" } } +// ], +// "edges": [ +// { "v": "a", "w": "b", "value": { "label": "edge a->b" } } +// ] +// } +``` + +## json.read(json) +将输入的json转换为图像的展示类型。比如,我们使用`json-write`将图像序列化为`str`的字符串,我们可以使用以下的办法去恢复: +```js +var g2 = graphlib.json.read(JSON.parse(str)); +// or, in order to copy the graph +var g3 = graphlib.json.read(graphlib.json.write(g)) + +g2.nodes(); +// ['a', 'b'] +g2.edges() +// [ { v: 'a', w: 'b' } ] +``` + +# 算法 +## alg.components(graph) +找到图中所有的连接部分,并且将这些部分作为数组返回。 +每个组件本身就是一个数组,包含组件中节点id。 + +```js +graphlib.alg.components(g); +// => [ [ 'A', 'B', 'C', 'D' ], +// [ 'E', 'F', 'G' ], +// [ 'H', 'I' ] ] +``` + +## alg.dijkstra(graph, source, weightFn, edgeFn) +此算法是[Dijkstra]算法的js版本. 旨在从g的源节点到其他任意节点的最短路径。 + +这个函数将会返回一个map结构: +`v -> { distance, predecessor }` + +distance属性会保存从source到v的最短路径权重之和。 +如果从source过来没有路径,则结果为正无穷大。 + +predecessor属性可以按照相反顺序遍历source到v的每个元素。 + +根据`weightFn(e)`来返回边e的权重。如果没有赋值,默认的每条边的权重是1. +如果任何遍历的边具有负边权重,则此函数将抛出错误。 + +edgeFn(v)会返回与节点v相关的所有边的ID,以便进行最短路径遍历。默认使用`g.outEdges`。 + +例子: + + +```js +function weight(e) { return g.edge(e); } + +graphlib.alg.dijkstra(g, "A", weight); +// => { A: { distance: 0 }, +// B: { distance: 6, predecessor: 'C' }, +// C: { distance: 4, predecessor: 'A' }, +// D: { distance: 2, predecessor: 'A' }, +// E: { distance: 8, predecessor: 'F' }, +// F: { distance: 4, predecessor: 'D' } } +``` + +## alg.dijkstraAll(graph, weightFn, edgeFn) +此函数用于查找从每个节点到其他每个可到达节点到最短距离。 +与`alg.dijkstra`类似,但返回的不是单个数组,而是返回一个map映射: `source -> alg.dijkstra(g, source, weightFn, edgeFn)` + +函数的`weightFn`返回边`e`的权重。如果没有指定,则默认为1。如果可遍历的边有负数,则会立即抛出错误。 + +函数的`edgeFn(u)`返回所有与节点`u`有关的边的id,以便于进行最短路径的遍历。默认使用`g.outEdges`。 + +例子: + + +```js +function weight(e) { return g.edge(e); } + +graphlib.alg.dijkstraAll(g, function(e) { return g.edge(e); }); + +// => { A: +// { A: { distance: 0 }, +// B: { distance: 6, predecessor: 'C' }, +// C: { distance: 4, predecessor: 'A' }, +// D: { distance: 2, predecessor: 'A' }, +// E: { distance: 8, predecessor: 'F' }, +// F: { distance: 4, predecessor: 'D' } }, +// B: +// { A: { distance: Infinity }, +// B: { distance: 0 }, +// C: { distance: Infinity }, +// D: { distance: Infinity }, +// E: { distance: 6, predecessor: 'B' }, +// F: { distance: Infinity } }, +// C: { ... }, +// D: { ... }, +// E: { ... }, +// F: { ... } } +``` + +## alg.findCycles(graph) +假定存在一个图`g`,此函数将会返回图中循环的部分。 + +由于图中不止有1个循环,所以该函数返回有循环体所构成的数组,而每个循环体由涉及的节点id构成。 + +如果要判断图是否有循环部分,请使用`g.isAcyclic`则更为高效。 + +```js +var g = new graphlib.Graph(); +g.setNode(1); +g.setNode(2); +g.setNode(3); +g.setEdge(1, 2); +g.setEdge(2, 3); + +graphlib.alg.findCycles(g); +// => [] + +g.setEdge(3, 1); +graphlib.alg.findCycles(g); +// => [ [ '3', '2', '1' ] ] + +g.setNode(4); +g.setNode(5); +g.setEdge(4, 5); +g.setEdge(5, 4); +graphlib.alg.findCycles(g); +// => [ [ '3', '2', '1' ], [ '5', '4' ] ] +``` + +## alg.isAcyclic(graph) +给定一个图`g`,如果该图有循环的部分,则返回`true`。否则,返回`false`。 + +该函数会返回检测到的第一个循环体。如果要获取全部内容,请使用`alg.findCycles`。 + +```js +var g = new graphlib.Graph(); +g.setNode(1); +g.setNode(2); +g.setNode(3); +g.setEdge(1, 2); +g.setEdge(2, 3); + +graphlib.alg.isAcyclic(g); +// => true + +g.setEdge(3, 1); +graphlib.alg.isAcyclic(g); +// => false +``` + +## alg.postorder(graph, vs) +该函数将会从图像g的节点vs开始,进行后序遍历。 + +对于访问的每个节点,假定节点名为`v`,将会调用`callback(v)`。 + +```js +graphlib.alg.postorder(g, "A"); +// => One of: +// [ "B", "D", "E", C", "A" ] +// [ "B", "E", "D", C", "A" ] +// [ "D", "E", "C", B", "A" ] +// [ "E", "D", "C", B", "A" ] +``` + +## alg.preorder(graph, vs) +该函数将会从图像g的节点vs开始,进行前序遍历。 +对于访问的每个节点,假定节点名为`v`,将会调用`callback(v)`。 + +```js +graphlib.alg.preorder(g, "A"); +// => One of: +// [ "A", "B", "C", "D", "E" ] +// [ "A", "B", "C", "E", "D" ] +// [ "A", "C", "D", "E", "B" ] +// [ "A", "C", "E", "D", "B" ] +``` + +## alg.prim(graph, weightFn) +Prim算法采用连通无向图,并生成最小生成树。 +[Prim's algorithm](https://en.wikipedia.org/wiki/Prim's_algorithm). + +该函数将会以无向图的形式返回最小生成树。这个算法取自《算法导论》。 + +weightFn(e)将会返回边的权重e,如果图没有被联通,则会抛出异常。 + + +```js +function weight(e) { return g(e); } +graphlib.alg.prim(g, weight); +``` + +返回的树,以图的形式展现: + + +## alg.tarjan(graph) +[Tarjan's algorithm](http://en.wikipedia.org/wiki/Tarjan's_strongly_connected_components_algorithm) + +该函数是Tarjan算法的一个实现,该算法在有向图g中找到所有[强连通分量](http://en.wikipedia.org/wiki/Strongly_connected_component) + +每个强连通分量由节点组成,这些节点可以通过定向边到达分量中的所有其他节点。 + +如果一个强连接的组件既不能到达图中的任何其他特定节点,也不能被该节点访问,则该组件可以由单个节点组成。多个节点的组件要保证至少有一个循环。 + +此函数将会返回一个组件数组。每个组件本身也是一个数组,并且包含了组件内所有节点的id。 + +```js +graphlib.alg.tarjan(g); +// => [ [ 'F', 'G' ], +// [ 'H', 'D', 'C' ], +// [ 'E', 'B', 'A' ] ] +``` + +## alg.topsort(graph) +[topological sorting](https://en.wikipedia.org/wiki/Topological_sorting) -To learn more [see our Wiki](https://github.com/cpettitt/graphlib/wiki). +topological 排序算法的实现。 -# License +给定一个图`g`,该函数返回一个节点数组,使得每个边`u -> v`, u出现在v之前。 +如果图有循环,则不可能生成列表,并抛出异常。 + -Graphlib is licensed under the terms of the MIT License. See the -[LICENSE](LICENSE) file -for details. +```js +graphlib.alg.topsort(g) +// [ '1', '2', '3', '4' ] or [ '1', '3', '2', '4' ] +``` -[npm package manager]: http://npmjs.org/ diff --git a/ReadMe-CN.md b/ReadMe-CN.md deleted file mode 100644 index f9bb7b93..00000000 --- a/ReadMe-CN.md +++ /dev/null @@ -1,515 +0,0 @@ -# 进度 -- [x] 翻译 [API](https://github.com/dagrejs/graphlib/wiki/API-Reference) - 2022/03/23 21:06 - -> 中文 | [English](ReadMe.md) - -[TOC] - -# 安装 -## npm Install -```shell -$ npm install @dagrejs/graphlib -``` - -# 介绍 -`Graphlib`是一个JavaScript Lib库,为无向和有向多变图提供数据结构,以及可以一起使用的算法。 - -[![Build Status](https://secure.travis-ci.org/dagrejs/graphlib.svg)](http://travis-ci.org/dagrejs/graphlib) - -更多学习内容, 查看[wiki](https://github.com/cpettitt/graphlib/wiki)。 - -# API 指南 -本部分主要阐述graphlib的概念并提供API指南。默认情况下,graphlib函数和对象暴露在graphlib的命名空间下。 - -# 图像概念 -Graphlib有一种图类型: Graph。 -创建一个新的实例: -```js -var g = new Graph(); -``` -默认情况下,将会创建一个不允许多边或者复合节点的有向图。以下则是参数选项: -- `directed`:设置为`true`时, 得到一个有向图。`false`时, 得到一个无向图。无向图不会把节点的顺序视为第一要务。换句话说, 对无向图来说`g.edge("a", "b") === g.edge("b", "a")`。默认为`true` -- `multigraph`: 设置为`true`时, 允许图像在同一对节点之间有多条边。默认: `false`。 -- `compound`: 设置为`true`时, 允许图像有复合节点。 可以是其他节点的父节点。 默认为`false`。 - -可以在constructor中通过对象配置属性。比如,创建一个有向复合多边图: -```js -var g = new Graph({ directed: true, compound: true, multigraph: true }); -``` - -# 展现节点和边线 -在graphlib中,节点由用户提供的字符串id表示。 所有节点相关的函数都使用此字符串id作为唯一标识节点的方式。以下为与节点交互的例子: -```js -var g = new Graph(); -g.setNode("my-id", "my-label"); - -g.node("my-id"); // return "my-label" -``` - -graphlib中的边由他们连接的节点标识。比如: -```js -var g = new Graph(); - -g.setEdge("source", "target", "my-label"); -g.edge("source", "target"); // return my-label -``` - -但是,为了进行各种类型的边缘查询,我们需要一种方法去唯一标识单个对象里的边。(比如:[outEdges](https://github.com/dagrejs/graphlib/wiki/API-Reference#outEdges))。我们使用`edgeObj`应对,而此主要由以下组成: -- `v`: 源id或者是边线上的尾节点。 -- `w`: 目标id或者是边线上的头节点。 -- `name`(可选): 唯一标识多边边线([multi-edge](https://github.com/dagrejs/graphlib/wiki/API-Reference#multigraphs))的名称。 - -任何采用了一个边线id的边缘函数也可以使用`edgeObj`: -```js -var g = new Graph(); - -g.setEdge("source", "target", "my-label") -g.edge({ v: "source", w: "target" }); // return my-label -``` - -# Multigraphs -multigraphs的数学概念: [multigraph](https://en.wikipedia.org/wiki/Multigraph) - - -多重图是一种在一对节点中可以拥有多条边的图。默认情况下, graphlib的图像不是多重图, 需要在构造体中设置多重图的属性为`true`: -```js -var g = new Graph({ multigraph: true }) -``` -在两个节点由多条边的情况下,我们需要相同的办法去识别每一条边。 我们称这样的属性为`name`。 这有关于相同节点之间的几条边的例子: -```js -var g = new Graph({ multigraph: true }) - -g.setEdge("a", "b", "edge1-label", "edge1") -g.setEdge("a", "b", "edge2-label", "edge2") - -g.edge("a", "b", "edge1") -g.edge("a", "b", "edge2") - -g.edges() -/** - * return [ - * { v: "a", w: "b", name: "edge1" }, - * { v: "a", w: "b", name: "edge2" } - * ] - */ -``` - -多重图也允许创建没有名字的一条边 -```js -var g = new Graph({ multigraph: true }) - -g.setEdge("a", "b", "my-label") -g.edge({ v: "a", w: "b" }) -``` - -# 复合图 -复合图就是一个节点可以是其他节点的父节点。子节点组成一个"子图"。 以下例子为构建一个复合图并与之交互: -```js -var g = new Graph({ compound: true }); - -g.setParent("a", "parent"); -g.setParent("b", "parent"); - -g.parent("a"); // returns "parent" -g.parent("b"); // returns "parent" - -g.parent("parent"); // returns undefined -``` - -# 默认标签 -当一个节点或边没有创建标签时,会被默认分配一个标签。详情请看这两个API: -- [setDefaultNodeLabel](https://github.com/dagrejs/graphlib/wiki/API-Reference#setDefaultNodeLabel) -- [setDefaultEdgeLabel](https://github.com/dagrejs/graphlib/wiki/API-Reference#setDefaultEdgeLabel) - -# Graph API - -## graph.isDirected() -如果图是有向图的话,会返回`true`。 -有向图会将在线段里的节点顺序是做有意义的,而无向图则会忽视。以下例子证明了不同: -```js -var directed = new Graph({ directed: true }); - -directed.setEdge("a", "b", "my-label"); -directed.edge("a", "b"); // returns my-label -directed.edge("b", "a"); // returns undefined - -var undirected = new Graph({ directed: false }); -undirected.setEdge("a", "b", "my-label"); -undirected.edge("a", "b"); // returns my-label -undirected.edge("b", "a"); // returns my-label -``` - -## graph.isMultigraph() -如果图是多重图,返回`true`。[Multigraph](https://github.com/dagrejs/graphlib/wiki/API-Reference#multigraphs) - -## graph.isCompound() -如果是复合图,返回`true`。[compound](https://github.com/dagrejs/graphlib/wiki/API-Reference#compound-graphs) - -## graph.graph() -返回为图形分配的标签。 如果没有指定标签,则返回`undefined`。 -```js -var g = new Graph(); - -g.graph(); // return undefined -g.setGraph("graph-label"); -g.graph(); // return "graph-label" -``` - -## graph.setGraph(label) -为图像设置标签。 - -## graph.nodeCount() -返回图像中节点的数量。 - -## graph.edgeCount() -返回节点中边线的数量。 - -## graph.setDefaultNodeLabel(val) -设置一个新的默认值,以便于在没有指定标签创建节点时,分配过去。 -如果`val`不是一个函数,将会作为标签分配。 -如果是一个函数, 正被创建的节点的id将会调用此函数。 - -## graph.setDefaultEdgeLabel(val) -为没有分配标签的线段指定一个新的默认标签。 -如果`val`不是函数,则作为标签。 -如果是函数,则会随着参数`(v, w, name)`而被调用。 - -## graph.nodes() -返回图像里的所有节点id。 -使用[node(v)](https://github.com/dagrejs/graphlib/wiki/API-Reference#node)获取每个节点的标签,花费`O(|v|)`的时间。 - -## graph.edges() -返回图中的每个边线的[edgeObj](https://github.com/dagrejs/graphlib/wiki/API-Reference#node-and-edge-representation)。 -使用[edge(edgeObj)](https://github.com/dagrejs/graphlib/wiki/API-Reference#edge)获取每个边线的标签。花费`O(|v|)`的时间。 - -## graph.sources() -返回图中没有入边的节点。 - -## graph.sinks() -返回途中没有出边的节点。 - -## graph.hasNode(v) -如果图里存在节点的id为`v`,则返回`true`。 - -## graph.node(v) -如果图中存在id为`v`的节点,则返回指定的标签,否则返回`undefined`。 - -## graph.setNode(v, [label]) -在图中创建或更新节点v的值。 如果提供了label,则更新掉。如果没有提供,在创建过程中会分配一个默认的标签。[default node label](https://github.com/dagrejs/graphlib/wiki/API-Reference#default-labels)。 - -返回图,允许图和其他的函数连接起来。 - -## graph.removeNode(v) -移除图中id为`v`的节点,如果不存在则不处理。如果节点被移除,也会移除所有边。 -返回图,允许图和其他的函数连接起来。 - -## graph.predecessors(v) -返回指定节点的所有前导节点,如果图中不存在此节点,则返回`undefined`. 如果是无向图,则会返回`undefined`,应该使用[neighbors](https://github.com/dagrejs/graphlib/wiki/API-Reference#neighbors)。 - -## graph.successors(v) -返回指定节点的所有后续节点。如果图中没有此节点,则返回`undefined`. 如果是无向图,则会返回`undefined`,应该使用[neighbors](https://github.com/dagrejs/graphlib/wiki/API-Reference#neighbors)。 - -## graph.neighbors(v) -返回指定节点的前导节点或者后续节点。如果图中没有此节点,则返回`undefined`。 - -## graph.inEdges(v, [u]) -返回所有指向节点(v)的边。 可以过滤出只来自于节点u的边。 -对无向图来说都是`undefined`,请使用[nodeEdges](https://github.com/dagrejs/graphlib/wiki/API-Reference#nodeEdges)。 -如果图中没有节点`v`,则返回`undefined`。 - - -## graph.outEdges(v, [w]) -返回所有指向节点的边。可以过滤出只指向节点w的边。 -对无向图来说都是`undefined`,请使用[nodeEdges](https://github.com/dagrejs/graphlib/wiki/API-Reference#nodeEdges)。 -如果图中没有节点`v`,则返回`undefined`。 - -## graph.nodeEdges(v, [w]) -返回所有与节点v有关的边,而不管方向。 -可以过滤出节点v和w之间的所有线段,无论方向。 -如果图中没有节点`v`,则返回`undefined`。 - -## graph.parent(v) -返回节点v的父节点。 -如果节点没有父节点或不在图中,则返回`undefined`。 -如果不是复合图的话,始终返回`undefined`。 - -## graph.children(v) -返回节点v的所有孩子节点。 -如果不在图中则返回`undefined`。 -如果不是复合图,始终返回`[]`。 - -## graph.setParent(v, parent) -如果`parent`有值,则设置为节点v的父节点; 如果没有值,则移除节点v的父节点。 -如果图不是复合图,则抛出异常。 -返回值为图本身,允许被连接到其他的函数内。 - -## graph.hasEdge(v, w, [name]) / graph.hasEdge(edgeObj) -如果图中的节点v和节点w之间存在一条边,名字为`name`,则返回`true`。 -[name]参数只适用于多重图。 -对于无向图来说,v和w可以互换位置。 - -## graph.edge(v, w, [name]) / graph.edge(edgeObj) -如果图中节点v和w之间存在线段,并带有可选名称,则返回线段(v,w)的标签。 -如果图中没有这条线,则返回`undefined`。 -参数[name]只适用于多重图。 -无向图中,v,w可以互换。 - -## graph.setEdge(v, w, [label], [name]) / graph.setEdge(edgeObj, [label]) -使用参数[name]去创建或更新(v,w)的边。 -如果提供了[label],则将其设置为边的值。而如果没有被提供,则将分配给默认的标签。 -参数[name]只适用于多重图。 -返回值为图本身,允许被连接到其他的函数内。 - -## graph.removeEdge(v, w, [name]) -如果图中的节点v,w之间有一条可选名[name]的边,则移除它。否则将无效。 -参数[name]只适用于多重图。 -无向图中,v,w可以互换。 - - -# 序列化 -## json.write(g) -创建可以用JSON序列化为字符串的图形的JSONrepresentation。稍后可以使用[json-read](https://github.com/dagrejs/graphlib/wiki/API-Reference#json-read)恢复图形。 - -```js -var g = new graphlib.Graph(); -g.setNode("a", { label: "node a" }); -g.setNode("b", { label: "node b" }); -g.setEdge("a", "b", { label: "edge a->b" }); -graphlib.json.write(g); -// Returns the object: -// -// { -// "options": { -// "directed": true, -// "multigraph": false, -// "compound": false -// }, -// "nodes": [ -// { "v": "a", "value": { "label": "node a" } }, -// { "v": "b", "value": { "label": "node b" } } -// ], -// "edges": [ -// { "v": "a", "w": "b", "value": { "label": "edge a->b" } } -// ] -// } -``` - -## json.read(json) -将输入的json转换为图像的展示类型。比如,我们使用`json-write`将图像序列化为`str`的字符串,我们可以使用以下的办法去恢复: -```js -var g2 = graphlib.json.read(JSON.parse(str)); -// or, in order to copy the graph -var g3 = graphlib.json.read(graphlib.json.write(g)) - -g2.nodes(); -// ['a', 'b'] -g2.edges() -// [ { v: 'a', w: 'b' } ] -``` - -# 算法 -## alg.components(graph) -找到图中所有的连接部分,并且将这些部分作为数组返回。 -每个组件本身就是一个数组,包含组件中节点id。 - -```js -graphlib.alg.components(g); -// => [ [ 'A', 'B', 'C', 'D' ], -// [ 'E', 'F', 'G' ], -// [ 'H', 'I' ] ] -``` - -## alg.dijkstra(graph, source, weightFn, edgeFn) -此算法是[Dijkstra]算法的js版本. 旨在从g的源节点到其他任意节点的最短路径。 - -这个函数将会返回一个map结构: -`v -> { distance, predecessor }` - -distance属性会保存从source到v的最短路径权重之和。 -如果从source过来没有路径,则结果为正无穷大。 - -predecessor属性可以按照相反顺序遍历source到v的每个元素。 - -根据`weightFn(e)`来返回边e的权重。如果没有赋值,默认的每条边的权重是1. -如果任何遍历的边具有负边权重,则此函数将抛出错误。 - -edgeFn(v)会返回与节点v相关的所有边的ID,以便进行最短路径遍历。默认使用`g.outEdges`。 - -例子: - - -```js -function weight(e) { return g.edge(e); } - -graphlib.alg.dijkstra(g, "A", weight); -// => { A: { distance: 0 }, -// B: { distance: 6, predecessor: 'C' }, -// C: { distance: 4, predecessor: 'A' }, -// D: { distance: 2, predecessor: 'A' }, -// E: { distance: 8, predecessor: 'F' }, -// F: { distance: 4, predecessor: 'D' } } -``` - -## alg.dijkstraAll(graph, weightFn, edgeFn) -此函数用于查找从每个节点到其他每个可到达节点到最短距离。 -与`alg.dijkstra`类似,但返回的不是单个数组,而是返回一个map映射: `source -> alg.dijkstra(g, source, weightFn, edgeFn)` - -函数的`weightFn`返回边`e`的权重。如果没有指定,则默认为1。如果可遍历的边有负数,则会立即抛出错误。 - -函数的`edgeFn(u)`返回所有与节点`u`有关的边的id,以便于进行最短路径的遍历。默认使用`g.outEdges`。 - -例子: - - -```js -function weight(e) { return g.edge(e); } - -graphlib.alg.dijkstraAll(g, function(e) { return g.edge(e); }); - -// => { A: -// { A: { distance: 0 }, -// B: { distance: 6, predecessor: 'C' }, -// C: { distance: 4, predecessor: 'A' }, -// D: { distance: 2, predecessor: 'A' }, -// E: { distance: 8, predecessor: 'F' }, -// F: { distance: 4, predecessor: 'D' } }, -// B: -// { A: { distance: Infinity }, -// B: { distance: 0 }, -// C: { distance: Infinity }, -// D: { distance: Infinity }, -// E: { distance: 6, predecessor: 'B' }, -// F: { distance: Infinity } }, -// C: { ... }, -// D: { ... }, -// E: { ... }, -// F: { ... } } -``` - -## alg.findCycles(graph) -假定存在一个图`g`,此函数将会返回图中循环的部分。 - -由于图中不止有1个循环,所以该函数返回有循环体所构成的数组,而每个循环体由涉及的节点id构成。 - -如果要判断图是否有循环部分,请使用`g.isAcyclic`则更为高效。 - -```js -var g = new graphlib.Graph(); -g.setNode(1); -g.setNode(2); -g.setNode(3); -g.setEdge(1, 2); -g.setEdge(2, 3); - -graphlib.alg.findCycles(g); -// => [] - -g.setEdge(3, 1); -graphlib.alg.findCycles(g); -// => [ [ '3', '2', '1' ] ] - -g.setNode(4); -g.setNode(5); -g.setEdge(4, 5); -g.setEdge(5, 4); -graphlib.alg.findCycles(g); -// => [ [ '3', '2', '1' ], [ '5', '4' ] ] -``` - -## alg.isAcyclic(graph) -给定一个图`g`,如果该图有循环的部分,则返回`true`。否则,返回`false`。 - -该函数会返回检测到的第一个循环体。如果要获取全部内容,请使用`alg.findCycles`。 - -```js -var g = new graphlib.Graph(); -g.setNode(1); -g.setNode(2); -g.setNode(3); -g.setEdge(1, 2); -g.setEdge(2, 3); - -graphlib.alg.isAcyclic(g); -// => true - -g.setEdge(3, 1); -graphlib.alg.isAcyclic(g); -// => false -``` - -## alg.postorder(graph, vs) -该函数将会从图像g的节点vs开始,进行后序遍历。 - -对于访问的每个节点,假定节点名为`v`,将会调用`callback(v)`。 - -```js -graphlib.alg.postorder(g, "A"); -// => One of: -// [ "B", "D", "E", C", "A" ] -// [ "B", "E", "D", C", "A" ] -// [ "D", "E", "C", B", "A" ] -// [ "E", "D", "C", B", "A" ] -``` - -## alg.preorder(graph, vs) -该函数将会从图像g的节点vs开始,进行前序遍历。 -对于访问的每个节点,假定节点名为`v`,将会调用`callback(v)`。 - -```js -graphlib.alg.preorder(g, "A"); -// => One of: -// [ "A", "B", "C", "D", "E" ] -// [ "A", "B", "C", "E", "D" ] -// [ "A", "C", "D", "E", "B" ] -// [ "A", "C", "E", "D", "B" ] -``` - -## alg.prim(graph, weightFn) -Prim算法采用连通无向图,并生成最小生成树。 -[Prim's algorithm](https://en.wikipedia.org/wiki/Prim's_algorithm). - -该函数将会以无向图的形式返回最小生成树。这个算法取自《算法导论》。 - -weightFn(e)将会返回边的权重e,如果图没有被联通,则会抛出异常。 - - -```js -function weight(e) { return g(e); } -graphlib.alg.prim(g, weight); -``` - -返回的树,以图的形式展现: - - -## alg.tarjan(graph) -[Tarjan's algorithm](http://en.wikipedia.org/wiki/Tarjan's_strongly_connected_components_algorithm) - -该函数是Tarjan算法的一个实现,该算法在有向图g中找到所有[强连通分量](http://en.wikipedia.org/wiki/Strongly_connected_component) - -每个强连通分量由节点组成,这些节点可以通过定向边到达分量中的所有其他节点。 - -如果一个强连接的组件既不能到达图中的任何其他特定节点,也不能被该节点访问,则该组件可以由单个节点组成。多个节点的组件要保证至少有一个循环。 - -此函数将会返回一个组件数组。每个组件本身也是一个数组,并且包含了组件内所有节点的id。 - -```js -graphlib.alg.tarjan(g); -// => [ [ 'F', 'G' ], -// [ 'H', 'D', 'C' ], -// [ 'E', 'B', 'A' ] ] -``` - -## alg.topsort(graph) -[topological sorting](https://en.wikipedia.org/wiki/Topological_sorting) - -topological 排序算法的实现。 - -给定一个图`g`,该函数返回一个节点数组,使得每个边`u -> v`, u出现在v之前。 -如果图有循环,则不可能生成列表,并抛出异常。 - - -```js -graphlib.alg.topsort(g) -// [ '1', '2', '3', '4' ] or [ '1', '3', '2', '4' ] -``` - From 2d9314a23f9326967900f416fccff4b9f655a25c Mon Sep 17 00:00:00 2001 From: Gnought <1684105+gnought@users.noreply.github.com> Date: Mon, 17 Apr 2023 01:02:25 +0800 Subject: [PATCH 11/85] Update typings to allow label as a object --- index.d.ts | 17 ++++++++--------- 1 file changed, 8 insertions(+), 9 deletions(-) diff --git a/index.d.ts b/index.d.ts index b2609fcd..2dee3086 100644 --- a/index.d.ts +++ b/index.d.ts @@ -138,12 +138,12 @@ declare module '@dagrejs/graphlib' { setPath(nodes: string[], label?: any): Graph; /** - * Detects whether graph has a node with specified name or not. - - * - * @argument name - name of the node. - * @returns true if graph has node with specified name, false - otherwise. - */ + * Detects whether graph has a node with specified name or not. + + * + * @argument name - name of the node. + * @returns true if graph has node with specified name, false - otherwise. + */ hasNode(name: string): boolean; /** @@ -361,14 +361,14 @@ declare module '@dagrejs/graphlib' { * @argument label - label value. * @returns the graph, allowing this to be chained with other functions. */ - setGraph(label: string): Graph; + setGraph(label: any): Graph; /** * Gets the graph label. * * @returns currently assigned label for the graph or undefined if no label assigned. */ - graph(): void | string; + graph(): any; /** * Gets the number of nodes in the graph. @@ -599,4 +599,3 @@ declare module '@dagrejs/graphlib' { function postorder(graph: Graph, vs: string[]): string[]; } } - From 1d25dd15d625c4864f7099acdd72c9f01f79af46 Mon Sep 17 00:00:00 2001 From: David Newell Date: Tue, 23 May 2023 16:29:07 +0000 Subject: [PATCH 12/85] Adding an edge function that always returns an object --- bower.json | 5 ++--- index.d.ts | 20 ++++++++++++++++++++ lib/graph.js | 13 +++++++++++++ test/graph-test.js | 10 ++++++++++ 4 files changed, 45 insertions(+), 3 deletions(-) diff --git a/bower.json b/bower.json index 22c46f58..188ddc36 100644 --- a/bower.json +++ b/bower.json @@ -1,6 +1,6 @@ { "name": "graphlib", - "version": "2.1.8", + "version": "2.1.11-pre", "main": [ "dist/graphlib.core.js" ], @@ -18,6 +18,5 @@ "package.json", "src/**", "test/**" - ], - "dependencies": {} + ] } diff --git a/index.d.ts b/index.d.ts index b2609fcd..2ab207d7 100644 --- a/index.d.ts +++ b/index.d.ts @@ -230,6 +230,26 @@ declare module '@dagrejs/graphlib' { */ edge(e: Edge): any; + /** + * Gets the label for the specified edge and converts it to an object. + * Complexity: O(1). + * + * @argument v - edge source node. + * @argument w - edge sink node. + * @argument name - name of the edge (actual for multigraph). + * @returns value associated with specified edge. + */ + edgeAsObj(v: string, w: string, name?: string): Object; + + /** + * Gets the label for the specified edge and converts it to an object. + * Complexity: O(1). + * + * @argument edge - edge descriptor. + * @returns value associated with specified edge. + */ + edgeAsObj(e: Edge): Object; + /** * Detects whether the graph contains specified edge or not. No subgraphs are considered. * Complexity: O(1). diff --git a/lib/graph.js b/lib/graph.js index 525c3ad4..0b466cd3 100644 --- a/lib/graph.js +++ b/lib/graph.js @@ -558,6 +558,19 @@ class Graph { return this.#edgeLabels[e]; } + /** + * Gets the label for the specified edge and converts it to an object. + * Complexity: O(1) + */ + edgeAsObj() { + const edge = this.edge(...arguments); + if (typeof edge !== "object") { + return {label: edge}; + } + + return edge; + } + /** * Detects whether the graph contains specified edge or not. No subgraphs are considered. * Complexity: O(1). diff --git a/test/graph-test.js b/test/graph-test.js index e32eb408..bdd163a9 100644 --- a/test/graph-test.js +++ b/test/graph-test.js @@ -658,6 +658,7 @@ describe("Graph", function() { expect(g.edges()).eqls([{ v: "1", w: "2" }]); expect(g.edge("1", "2")).to.equal("foo"); expect(g.edge(1, 2)).to.equal("foo"); + expect(g.edgeAsObj(1, 2)).to.eql({label: "foo"}); }); it("uses the stringified form of the id #2", function() { @@ -666,6 +667,7 @@ describe("Graph", function() { expect(g.edges()).eqls([{ v: "1", w: "2" }]); expect(g.edge("1", "2")).to.equal("foo"); expect(g.edge(1, 2)).to.equal("foo"); + expect(g.edgeAsObj(1, 2)).to.eql({label: "foo"}); }); it("uses the stringified form of the id with a name", function() { @@ -673,6 +675,7 @@ describe("Graph", function() { g.setEdge(1, 2, "foo", 3); expect(g.edge("1", "2", "3")).to.equal("foo"); expect(g.edge(1, 2, 3)).to.equal("foo"); + expect(g.edgeAsObj(1, 2, 3)).to.eql({label: "foo"}); expect(g.edges()).eqls([{ v: "1", w: "2", name: "3" }]); }); @@ -762,22 +765,29 @@ describe("Graph", function() { it("returns the value of the edge if it is part of the graph", function() { g.setEdge("a", "b", { foo: "bar" }); expect(g.edge("a", "b")).to.eql({ foo: "bar" }); + expect(g.edgeAsObj("a", "b")).to.eql({ foo: "bar" }); expect(g.edge({ v: "a", w: "b" })).to.eql({ foo: "bar" }); + expect(g.edgeAsObj({ v: "a", w: "b" })).to.eql({ foo: "bar" }); expect(g.edge("b", "a")).to.be.undefined; + expect(g.edgeAsObj("b", "a")).to.eql({label: undefined }); }); it("returns the value of a multi-edge if it is part of the graph", function() { var g = new Graph({ multigraph: true }); g.setEdge("a", "b", { bar: "baz" }, "foo"); expect(g.edge("a", "b", "foo")).to.eql({ bar: "baz" }); + expect(g.edgeAsObj("a", "b", "foo")).to.eql({ bar: "baz" }); expect(g.edge("a", "b")).to.be.undefined; + expect(g.edgeAsObj("a", "b")).to.eql({label: undefined}); }); it("returns an edge in either direction in an undirected graph", function() { var g = new Graph({ directed: false }); g.setEdge("a", "b", { foo: "bar" }); expect(g.edge("a", "b")).to.eql({ foo: "bar" }); + expect(g.edgeAsObj("a", "b")).to.eql({ foo: "bar" }); expect(g.edge("b", "a")).to.eql({ foo: "bar" }); + expect(g.edgeAsObj("b", "a")).to.eql({ foo: "bar" }); }); }); From 692a4adf2dd4289b7818615e568b91c635960fcc Mon Sep 17 00:00:00 2001 From: David Newell Date: Tue, 23 May 2023 16:32:57 +0000 Subject: [PATCH 13/85] Releasing 2.1.13 --- package.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index 5ff8d993..7cb27e07 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@dagrejs/graphlib", - "version": "2.1.13-pre", + "version": "2.1.13", "description": "A directed and undirected multi-graph library", "author": "Chris Pettitt ", "license": "MIT", @@ -48,4 +48,4 @@ "type": "git", "url": "https://github.com/dagrejs/graphlib.git" } -} \ No newline at end of file +} From cf2ccaa4023597982d16a90f31337a127545d573 Mon Sep 17 00:00:00 2001 From: David Newell Date: Tue, 23 May 2023 18:34:14 +0200 Subject: [PATCH 14/85] Building dist before release --- bower.json | 2 +- dist/graphlib.core.js | 15 ++++++++++++++- dist/graphlib.core.min.js | 6 +++++- dist/graphlib.js | 15 ++++++++++++++- dist/graphlib.min.js | 6 +++++- lib/version.js | 2 +- package-lock.json | 4 ++-- 7 files changed, 42 insertions(+), 8 deletions(-) diff --git a/bower.json b/bower.json index 671b6db7..272f18b6 100644 --- a/bower.json +++ b/bower.json @@ -1,6 +1,6 @@ { "name": "graphlib", - "version": "2.1.12", + "version": "2.1.13", "main": [ "dist/graphlib.core.js" ], diff --git a/dist/graphlib.core.js b/dist/graphlib.core.js index 09d909ef..98478b34 100644 --- a/dist/graphlib.core.js +++ b/dist/graphlib.core.js @@ -1163,6 +1163,19 @@ class Graph { return this.#edgeLabels[e]; } + /** + * Gets the label for the specified edge and converts it to an object. + * Complexity: O(1) + */ + edgeAsObj() { + const edge = this.edge(...arguments); + if (typeof edge !== "object") { + return {label: edge}; + } + + return edge; + } + /** * Detects whether the graph contains specified edge or not. No subgraphs are considered. * Complexity: O(1). @@ -1377,7 +1390,7 @@ function read(json) { } },{"./graph":16}],19:[function(require,module,exports){ -module.exports = '2.1.12'; +module.exports = '2.1.13'; },{}]},{},[1])(1) }); diff --git a/dist/graphlib.core.min.js b/dist/graphlib.core.min.js index 95d89f3d..1dd2a361 100644 --- a/dist/graphlib.core.min.js +++ b/dist/graphlib.core.min.js @@ -259,6 +259,10 @@ v=edgeObj.v;w=edgeObj.w;Object.freeze(edgeObj);this.#edgeObjs[e]=edgeObj;increme * Gets the label for the specified edge. * Complexity: O(1). */edge(v,w,name){var e=arguments.length===1?edgeObjToId(this.#isDirected,arguments[0]):edgeArgsToId(this.#isDirected,v,w,name);return this.#edgeLabels[e]} +/** + * Gets the label for the specified edge and converts it to an object. + * Complexity: O(1) + */edgeAsObj(){const edge=this.edge(...arguments);if(typeof edge!=="object"){return{label:edge}}return edge} /** * Detects whether the graph contains specified edge or not. No subgraphs are considered. * Complexity: O(1). @@ -297,4 +301,4 @@ module.exports={Graph:require("./graph"),version:require("./version")}},{"./grap * // ['a', 'b'] * g2.edges() * // [ { v: 'a', w: 'b' } ] - */function read(json){var g=new Graph(json.options).setGraph(json.value);json.nodes.forEach(function(entry){g.setNode(entry.v,entry.value);if(entry.parent){g.setParent(entry.v,entry.parent)}});json.edges.forEach(function(entry){g.setEdge({v:entry.v,w:entry.w,name:entry.name},entry.value)});return g}},{"./graph":16}],19:[function(require,module,exports){module.exports="2.1.12"},{}]},{},[1])(1)}); + */function read(json){var g=new Graph(json.options).setGraph(json.value);json.nodes.forEach(function(entry){g.setNode(entry.v,entry.value);if(entry.parent){g.setParent(entry.v,entry.parent)}});json.edges.forEach(function(entry){g.setEdge({v:entry.v,w:entry.w,name:entry.name},entry.value)});return g}},{"./graph":16}],19:[function(require,module,exports){module.exports="2.1.13"},{}]},{},[1])(1)}); diff --git a/dist/graphlib.js b/dist/graphlib.js index 09d909ef..98478b34 100644 --- a/dist/graphlib.js +++ b/dist/graphlib.js @@ -1163,6 +1163,19 @@ class Graph { return this.#edgeLabels[e]; } + /** + * Gets the label for the specified edge and converts it to an object. + * Complexity: O(1) + */ + edgeAsObj() { + const edge = this.edge(...arguments); + if (typeof edge !== "object") { + return {label: edge}; + } + + return edge; + } + /** * Detects whether the graph contains specified edge or not. No subgraphs are considered. * Complexity: O(1). @@ -1377,7 +1390,7 @@ function read(json) { } },{"./graph":16}],19:[function(require,module,exports){ -module.exports = '2.1.12'; +module.exports = '2.1.13'; },{}]},{},[1])(1) }); diff --git a/dist/graphlib.min.js b/dist/graphlib.min.js index 95d89f3d..1dd2a361 100644 --- a/dist/graphlib.min.js +++ b/dist/graphlib.min.js @@ -259,6 +259,10 @@ v=edgeObj.v;w=edgeObj.w;Object.freeze(edgeObj);this.#edgeObjs[e]=edgeObj;increme * Gets the label for the specified edge. * Complexity: O(1). */edge(v,w,name){var e=arguments.length===1?edgeObjToId(this.#isDirected,arguments[0]):edgeArgsToId(this.#isDirected,v,w,name);return this.#edgeLabels[e]} +/** + * Gets the label for the specified edge and converts it to an object. + * Complexity: O(1) + */edgeAsObj(){const edge=this.edge(...arguments);if(typeof edge!=="object"){return{label:edge}}return edge} /** * Detects whether the graph contains specified edge or not. No subgraphs are considered. * Complexity: O(1). @@ -297,4 +301,4 @@ module.exports={Graph:require("./graph"),version:require("./version")}},{"./grap * // ['a', 'b'] * g2.edges() * // [ { v: 'a', w: 'b' } ] - */function read(json){var g=new Graph(json.options).setGraph(json.value);json.nodes.forEach(function(entry){g.setNode(entry.v,entry.value);if(entry.parent){g.setParent(entry.v,entry.parent)}});json.edges.forEach(function(entry){g.setEdge({v:entry.v,w:entry.w,name:entry.name},entry.value)});return g}},{"./graph":16}],19:[function(require,module,exports){module.exports="2.1.12"},{}]},{},[1])(1)}); + */function read(json){var g=new Graph(json.options).setGraph(json.value);json.nodes.forEach(function(entry){g.setNode(entry.v,entry.value);if(entry.parent){g.setParent(entry.v,entry.parent)}});json.edges.forEach(function(entry){g.setEdge({v:entry.v,w:entry.w,name:entry.name},entry.value)});return g}},{"./graph":16}],19:[function(require,module,exports){module.exports="2.1.13"},{}]},{},[1])(1)}); diff --git a/lib/version.js b/lib/version.js index c141a233..ece4efde 100644 --- a/lib/version.js +++ b/lib/version.js @@ -1 +1 @@ -module.exports = '2.1.13-pre'; +module.exports = '2.1.13'; diff --git a/package-lock.json b/package-lock.json index 3d50ccf9..2eadc941 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "@dagrejs/graphlib", - "version": "2.1.12", + "version": "2.1.13", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "@dagrejs/graphlib", - "version": "2.1.12", + "version": "2.1.13", "license": "MIT", "devDependencies": { "benchmark": "2.1.4", From 4135771ed81ba583e94897adebb2ac3020e8659e Mon Sep 17 00:00:00 2001 From: David Newell Date: Tue, 23 May 2023 18:35:16 +0200 Subject: [PATCH 15/85] Bump version and set as pre-release --- lib/version.js | 2 +- package.json | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/lib/version.js b/lib/version.js index ece4efde..02120ec0 100644 --- a/lib/version.js +++ b/lib/version.js @@ -1 +1 @@ -module.exports = '2.1.13'; +module.exports = '2.1.14-pre'; diff --git a/package.json b/package.json index 7cb27e07..fea57832 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@dagrejs/graphlib", - "version": "2.1.13", + "version": "2.1.14-pre", "description": "A directed and undirected multi-graph library", "author": "Chris Pettitt ", "license": "MIT", @@ -48,4 +48,4 @@ "type": "git", "url": "https://github.com/dagrejs/graphlib.git" } -} +} \ No newline at end of file From c4a97192ea8f4522b53fcf0aefa1cfed95a87768 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 23 May 2023 16:37:01 +0000 Subject: [PATCH 16/85] Bump engine.io from 6.4.1 to 6.4.2 Bumps [engine.io](https://github.com/socketio/engine.io) from 6.4.1 to 6.4.2. - [Release notes](https://github.com/socketio/engine.io/releases) - [Changelog](https://github.com/socketio/engine.io/blob/main/CHANGELOG.md) - [Commits](https://github.com/socketio/engine.io/compare/6.4.1...6.4.2) --- updated-dependencies: - dependency-name: engine.io dependency-type: indirect ... Signed-off-by: dependabot[bot] --- package-lock.json | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/package-lock.json b/package-lock.json index 2eadc941..2be2a418 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "@dagrejs/graphlib", - "version": "2.1.13", + "version": "2.1.14-pre", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "@dagrejs/graphlib", - "version": "2.1.13", + "version": "2.1.14-pre", "license": "MIT", "devDependencies": { "benchmark": "2.1.4", @@ -1819,9 +1819,10 @@ } }, "node_modules/engine.io": { - "version": "6.4.1", + "version": "6.4.2", + "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-6.4.2.tgz", + "integrity": "sha512-FKn/3oMiJjrOEOeUub2WCox6JhxBXq/Zn3fZOMCBxKnNYtsdKjxhl7yR3fZhM9PV+rdE75SU5SYMc+2PGzo+Tg==", "dev": true, - "license": "MIT", "dependencies": { "@types/cookie": "^0.4.1", "@types/cors": "^2.8.12", @@ -6935,7 +6936,9 @@ "dev": true }, "engine.io": { - "version": "6.4.1", + "version": "6.4.2", + "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-6.4.2.tgz", + "integrity": "sha512-FKn/3oMiJjrOEOeUub2WCox6JhxBXq/Zn3fZOMCBxKnNYtsdKjxhl7yR3fZhM9PV+rdE75SU5SYMc+2PGzo+Tg==", "dev": true, "requires": { "@types/cookie": "^0.4.1", From 2d88e12458c27da03ca3290b1a8b39a841f1ca0e Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 24 May 2023 01:33:14 +0000 Subject: [PATCH 17/85] Bump socket.io-parser from 4.2.2 to 4.2.3 Bumps [socket.io-parser](https://github.com/socketio/socket.io-parser) from 4.2.2 to 4.2.3. - [Release notes](https://github.com/socketio/socket.io-parser/releases) - [Changelog](https://github.com/socketio/socket.io-parser/blob/main/CHANGELOG.md) - [Commits](https://github.com/socketio/socket.io-parser/compare/4.2.2...4.2.3) --- updated-dependencies: - dependency-name: socket.io-parser dependency-type: indirect ... Signed-off-by: dependabot[bot] --- package-lock.json | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/package-lock.json b/package-lock.json index 2eadc941..4fdd6b96 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "@dagrejs/graphlib", - "version": "2.1.13", + "version": "2.1.14-pre", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "@dagrejs/graphlib", - "version": "2.1.13", + "version": "2.1.14-pre", "license": "MIT", "devDependencies": { "benchmark": "2.1.4", @@ -4941,9 +4941,10 @@ } }, "node_modules/socket.io-parser": { - "version": "4.2.2", + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-4.2.3.tgz", + "integrity": "sha512-JMafRntWVO2DCJimKsRTh/wnqVvO4hrfwOqtO7f+uzwsQMuxO6VwImtYxaQ+ieoyshWOTJyV0fA21lccEXRPpQ==", "dev": true, - "license": "MIT", "dependencies": { "@socket.io/component-emitter": "~3.1.0", "debug": "~4.3.1" @@ -8949,7 +8950,9 @@ } }, "socket.io-parser": { - "version": "4.2.2", + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-4.2.3.tgz", + "integrity": "sha512-JMafRntWVO2DCJimKsRTh/wnqVvO4hrfwOqtO7f+uzwsQMuxO6VwImtYxaQ+ieoyshWOTJyV0fA21lccEXRPpQ==", "dev": true, "requires": { "@socket.io/component-emitter": "~3.1.0", From 8bc30b31c2af0d4cc2d25de185f449c0c27b42a2 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 18 Jul 2023 21:17:29 +0000 Subject: [PATCH 18/85] Bump word-wrap from 1.2.3 to 1.2.4 Bumps [word-wrap](https://github.com/jonschlinkert/word-wrap) from 1.2.3 to 1.2.4. - [Release notes](https://github.com/jonschlinkert/word-wrap/releases) - [Commits](https://github.com/jonschlinkert/word-wrap/compare/1.2.3...1.2.4) --- updated-dependencies: - dependency-name: word-wrap dependency-type: indirect ... Signed-off-by: dependabot[bot] --- package-lock.json | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/package-lock.json b/package-lock.json index 39856c92..7c7e5c8d 100644 --- a/package-lock.json +++ b/package-lock.json @@ -5522,9 +5522,10 @@ "license": "ISC" }, "node_modules/word-wrap": { - "version": "1.2.3", + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.4.tgz", + "integrity": "sha512-2V81OA4ugVo5pRo46hAoD2ivUJx8jXmWXfUkY4KFNw0hEptvN0QfH3K4nHiwzGeKl5rFKedV48QVoqYavy4YpA==", "dev": true, - "license": "MIT", "engines": { "node": ">=0.10.0" } @@ -9335,7 +9336,9 @@ "dev": true }, "word-wrap": { - "version": "1.2.3", + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.4.tgz", + "integrity": "sha512-2V81OA4ugVo5pRo46hAoD2ivUJx8jXmWXfUkY4KFNw0hEptvN0QfH3K4nHiwzGeKl5rFKedV48QVoqYavy4YpA==", "dev": true }, "workerpool": { From 134c87f952e26b05b003b5a8b92d2aa7fe300254 Mon Sep 17 00:00:00 2001 From: moxi Date: Mon, 21 Aug 2023 02:27:19 +0800 Subject: [PATCH 19/85] feat: rename readme --- README-EN.md | 24 --- README.md | 517 ++------------------------------------------------- README_ZH.md | 515 ++++++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 528 insertions(+), 528 deletions(-) delete mode 100644 README-EN.md create mode 100644 README_ZH.md diff --git a/README-EN.md b/README-EN.md deleted file mode 100644 index 31fd3f9b..00000000 --- a/README-EN.md +++ /dev/null @@ -1,24 +0,0 @@ -> English | [中文](ReadMe.md) - -# Important! - -**This project does not have a maintainer or active project members. There won’t be any support or attention to pull requests. Please do not contact previous maintainers unless you are qualified and have the resources to make a serious commitment to fully take over ownership of the project.** - - - -# Graphlib - -Graphlib is a JavaScript library that provides data structures for undirected -and directed multi-graphs along with algorithms that can be used with them. - -[![Build Status](https://secure.travis-ci.org/dagrejs/graphlib.svg)](http://travis-ci.org/dagrejs/graphlib) - -To learn more [see our Wiki](https://github.com/cpettitt/graphlib/wiki). - -# License - -Graphlib is licensed under the terms of the MIT License. See the -[LICENSE](LICENSE) file -for details. - -[npm package manager]: http://npmjs.org/ diff --git a/README.md b/README.md index fa18bc39..31fd3f9b 100644 --- a/README.md +++ b/README.md @@ -1,515 +1,24 @@ -# 进度 -- [x] 翻译 [API](https://github.com/dagrejs/graphlib/wiki/API-Reference) - 2022/03/23 21:06 +> English | [中文](ReadMe.md) -> 中文 | [English](ReadMe-EN.md) +# Important! -[TOC] +**This project does not have a maintainer or active project members. There won’t be any support or attention to pull requests. Please do not contact previous maintainers unless you are qualified and have the resources to make a serious commitment to fully take over ownership of the project.** -# 安装 -## npm Install -```shell -$ npm install @dagrejs/graphlib -``` -# 介绍 -`Graphlib`是一个JavaScript Lib库,为无向和有向多变图提供数据结构,以及可以一起使用的算法。 -[![Build Status](https://secure.travis-ci.org/dagrejs/graphlib.svg)](http://travis-ci.org/dagrejs/graphlib) - -更多学习内容, 查看[wiki](https://github.com/cpettitt/graphlib/wiki)。 - -# API 指南 -本部分主要阐述graphlib的概念并提供API指南。默认情况下,graphlib函数和对象暴露在graphlib的命名空间下。 - -# 图像概念 -Graphlib有一种图类型: Graph。 -创建一个新的实例: -```js -var g = new Graph(); -``` -默认情况下,将会创建一个不允许多边或者复合节点的有向图。以下则是参数选项: -- `directed`:设置为`true`时, 得到一个有向图。`false`时, 得到一个无向图。无向图不会把节点的顺序视为第一要务。换句话说, 对无向图来说`g.edge("a", "b") === g.edge("b", "a")`。默认为`true` -- `multigraph`: 设置为`true`时, 允许图像在同一对节点之间有多条边。默认: `false`。 -- `compound`: 设置为`true`时, 允许图像有复合节点。 可以是其他节点的父节点。 默认为`false`。 - -可以在constructor中通过对象配置属性。比如,创建一个有向复合多边图: -```js -var g = new Graph({ directed: true, compound: true, multigraph: true }); -``` - -# 展现节点和边线 -在graphlib中,节点由用户提供的字符串id表示。 所有节点相关的函数都使用此字符串id作为唯一标识节点的方式。以下为与节点交互的例子: -```js -var g = new Graph(); -g.setNode("my-id", "my-label"); - -g.node("my-id"); // return "my-label" -``` - -graphlib中的边由他们连接的节点标识。比如: -```js -var g = new Graph(); - -g.setEdge("source", "target", "my-label"); -g.edge("source", "target"); // return my-label -``` - -但是,为了进行各种类型的边缘查询,我们需要一种方法去唯一标识单个对象里的边。(比如:[outEdges](https://github.com/dagrejs/graphlib/wiki/API-Reference#outEdges))。我们使用`edgeObj`应对,而此主要由以下组成: -- `v`: 源id或者是边线上的尾节点。 -- `w`: 目标id或者是边线上的头节点。 -- `name`(可选): 唯一标识多边边线([multi-edge](https://github.com/dagrejs/graphlib/wiki/API-Reference#multigraphs))的名称。 - -任何采用了一个边线id的边缘函数也可以使用`edgeObj`: -```js -var g = new Graph(); - -g.setEdge("source", "target", "my-label") -g.edge({ v: "source", w: "target" }); // return my-label -``` - -# Multigraphs -multigraphs的数学概念: [multigraph](https://en.wikipedia.org/wiki/Multigraph) - - -多重图是一种在一对节点中可以拥有多条边的图。默认情况下, graphlib的图像不是多重图, 需要在构造体中设置多重图的属性为`true`: -```js -var g = new Graph({ multigraph: true }) -``` -在两个节点由多条边的情况下,我们需要相同的办法去识别每一条边。 我们称这样的属性为`name`。 这有关于相同节点之间的几条边的例子: -```js -var g = new Graph({ multigraph: true }) - -g.setEdge("a", "b", "edge1-label", "edge1") -g.setEdge("a", "b", "edge2-label", "edge2") - -g.edge("a", "b", "edge1") -g.edge("a", "b", "edge2") - -g.edges() -/** - * return [ - * { v: "a", w: "b", name: "edge1" }, - * { v: "a", w: "b", name: "edge2" } - * ] - */ -``` - -多重图也允许创建没有名字的一条边 -```js -var g = new Graph({ multigraph: true }) - -g.setEdge("a", "b", "my-label") -g.edge({ v: "a", w: "b" }) -``` - -# 复合图 -复合图就是一个节点可以是其他节点的父节点。子节点组成一个"子图"。 以下例子为构建一个复合图并与之交互: -```js -var g = new Graph({ compound: true }); - -g.setParent("a", "parent"); -g.setParent("b", "parent"); - -g.parent("a"); // returns "parent" -g.parent("b"); // returns "parent" - -g.parent("parent"); // returns undefined -``` - -# 默认标签 -当一个节点或边没有创建标签时,会被默认分配一个标签。详情请看这两个API: -- [setDefaultNodeLabel](https://github.com/dagrejs/graphlib/wiki/API-Reference#setDefaultNodeLabel) -- [setDefaultEdgeLabel](https://github.com/dagrejs/graphlib/wiki/API-Reference#setDefaultEdgeLabel) - -# Graph API - -## graph.isDirected() -如果图是有向图的话,会返回`true`。 -有向图会将在线段里的节点顺序是做有意义的,而无向图则会忽视。以下例子证明了不同: -```js -var directed = new Graph({ directed: true }); - -directed.setEdge("a", "b", "my-label"); -directed.edge("a", "b"); // returns my-label -directed.edge("b", "a"); // returns undefined - -var undirected = new Graph({ directed: false }); -undirected.setEdge("a", "b", "my-label"); -undirected.edge("a", "b"); // returns my-label -undirected.edge("b", "a"); // returns my-label -``` - -## graph.isMultigraph() -如果图是多重图,返回`true`。[Multigraph](https://github.com/dagrejs/graphlib/wiki/API-Reference#multigraphs) - -## graph.isCompound() -如果是复合图,返回`true`。[compound](https://github.com/dagrejs/graphlib/wiki/API-Reference#compound-graphs) - -## graph.graph() -返回为图形分配的标签。 如果没有指定标签,则返回`undefined`。 -```js -var g = new Graph(); - -g.graph(); // return undefined -g.setGraph("graph-label"); -g.graph(); // return "graph-label" -``` - -## graph.setGraph(label) -为图像设置标签。 - -## graph.nodeCount() -返回图像中节点的数量。 - -## graph.edgeCount() -返回节点中边线的数量。 - -## graph.setDefaultNodeLabel(val) -设置一个新的默认值,以便于在没有指定标签创建节点时,分配过去。 -如果`val`不是一个函数,将会作为标签分配。 -如果是一个函数, 正被创建的节点的id将会调用此函数。 - -## graph.setDefaultEdgeLabel(val) -为没有分配标签的线段指定一个新的默认标签。 -如果`val`不是函数,则作为标签。 -如果是函数,则会随着参数`(v, w, name)`而被调用。 - -## graph.nodes() -返回图像里的所有节点id。 -使用[node(v)](https://github.com/dagrejs/graphlib/wiki/API-Reference#node)获取每个节点的标签,花费`O(|v|)`的时间。 - -## graph.edges() -返回图中的每个边线的[edgeObj](https://github.com/dagrejs/graphlib/wiki/API-Reference#node-and-edge-representation)。 -使用[edge(edgeObj)](https://github.com/dagrejs/graphlib/wiki/API-Reference#edge)获取每个边线的标签。花费`O(|v|)`的时间。 - -## graph.sources() -返回图中没有入边的节点。 - -## graph.sinks() -返回途中没有出边的节点。 - -## graph.hasNode(v) -如果图里存在节点的id为`v`,则返回`true`。 - -## graph.node(v) -如果图中存在id为`v`的节点,则返回指定的标签,否则返回`undefined`。 - -## graph.setNode(v, [label]) -在图中创建或更新节点v的值。 如果提供了label,则更新掉。如果没有提供,在创建过程中会分配一个默认的标签。[default node label](https://github.com/dagrejs/graphlib/wiki/API-Reference#default-labels)。 - -返回图,允许图和其他的函数连接起来。 - -## graph.removeNode(v) -移除图中id为`v`的节点,如果不存在则不处理。如果节点被移除,也会移除所有边。 -返回图,允许图和其他的函数连接起来。 - -## graph.predecessors(v) -返回指定节点的所有前导节点,如果图中不存在此节点,则返回`undefined`. 如果是无向图,则会返回`undefined`,应该使用[neighbors](https://github.com/dagrejs/graphlib/wiki/API-Reference#neighbors)。 - -## graph.successors(v) -返回指定节点的所有后续节点。如果图中没有此节点,则返回`undefined`. 如果是无向图,则会返回`undefined`,应该使用[neighbors](https://github.com/dagrejs/graphlib/wiki/API-Reference#neighbors)。 - -## graph.neighbors(v) -返回指定节点的前导节点或者后续节点。如果图中没有此节点,则返回`undefined`。 - -## graph.inEdges(v, [u]) -返回所有指向节点(v)的边。 可以过滤出只来自于节点u的边。 -对无向图来说都是`undefined`,请使用[nodeEdges](https://github.com/dagrejs/graphlib/wiki/API-Reference#nodeEdges)。 -如果图中没有节点`v`,则返回`undefined`。 - - -## graph.outEdges(v, [w]) -返回所有指向节点的边。可以过滤出只指向节点w的边。 -对无向图来说都是`undefined`,请使用[nodeEdges](https://github.com/dagrejs/graphlib/wiki/API-Reference#nodeEdges)。 -如果图中没有节点`v`,则返回`undefined`。 - -## graph.nodeEdges(v, [w]) -返回所有与节点v有关的边,而不管方向。 -可以过滤出节点v和w之间的所有线段,无论方向。 -如果图中没有节点`v`,则返回`undefined`。 +# Graphlib -## graph.parent(v) -返回节点v的父节点。 -如果节点没有父节点或不在图中,则返回`undefined`。 -如果不是复合图的话,始终返回`undefined`。 +Graphlib is a JavaScript library that provides data structures for undirected +and directed multi-graphs along with algorithms that can be used with them. -## graph.children(v) -返回节点v的所有孩子节点。 -如果不在图中则返回`undefined`。 -如果不是复合图,始终返回`[]`。 - -## graph.setParent(v, parent) -如果`parent`有值,则设置为节点v的父节点; 如果没有值,则移除节点v的父节点。 -如果图不是复合图,则抛出异常。 -返回值为图本身,允许被连接到其他的函数内。 - -## graph.hasEdge(v, w, [name]) / graph.hasEdge(edgeObj) -如果图中的节点v和节点w之间存在一条边,名字为`name`,则返回`true`。 -[name]参数只适用于多重图。 -对于无向图来说,v和w可以互换位置。 - -## graph.edge(v, w, [name]) / graph.edge(edgeObj) -如果图中节点v和w之间存在线段,并带有可选名称,则返回线段(v,w)的标签。 -如果图中没有这条线,则返回`undefined`。 -参数[name]只适用于多重图。 -无向图中,v,w可以互换。 - -## graph.setEdge(v, w, [label], [name]) / graph.setEdge(edgeObj, [label]) -使用参数[name]去创建或更新(v,w)的边。 -如果提供了[label],则将其设置为边的值。而如果没有被提供,则将分配给默认的标签。 -参数[name]只适用于多重图。 -返回值为图本身,允许被连接到其他的函数内。 - -## graph.removeEdge(v, w, [name]) -如果图中的节点v,w之间有一条可选名[name]的边,则移除它。否则将无效。 -参数[name]只适用于多重图。 -无向图中,v,w可以互换。 - - -# 序列化 -## json.write(g) -创建可以用JSON序列化为字符串的图形的JSONrepresentation。稍后可以使用[json-read](https://github.com/dagrejs/graphlib/wiki/API-Reference#json-read)恢复图形。 - -```js -var g = new graphlib.Graph(); -g.setNode("a", { label: "node a" }); -g.setNode("b", { label: "node b" }); -g.setEdge("a", "b", { label: "edge a->b" }); -graphlib.json.write(g); -// Returns the object: -// -// { -// "options": { -// "directed": true, -// "multigraph": false, -// "compound": false -// }, -// "nodes": [ -// { "v": "a", "value": { "label": "node a" } }, -// { "v": "b", "value": { "label": "node b" } } -// ], -// "edges": [ -// { "v": "a", "w": "b", "value": { "label": "edge a->b" } } -// ] -// } -``` - -## json.read(json) -将输入的json转换为图像的展示类型。比如,我们使用`json-write`将图像序列化为`str`的字符串,我们可以使用以下的办法去恢复: -```js -var g2 = graphlib.json.read(JSON.parse(str)); -// or, in order to copy the graph -var g3 = graphlib.json.read(graphlib.json.write(g)) - -g2.nodes(); -// ['a', 'b'] -g2.edges() -// [ { v: 'a', w: 'b' } ] -``` - -# 算法 -## alg.components(graph) -找到图中所有的连接部分,并且将这些部分作为数组返回。 -每个组件本身就是一个数组,包含组件中节点id。 - -```js -graphlib.alg.components(g); -// => [ [ 'A', 'B', 'C', 'D' ], -// [ 'E', 'F', 'G' ], -// [ 'H', 'I' ] ] -``` - -## alg.dijkstra(graph, source, weightFn, edgeFn) -此算法是[Dijkstra]算法的js版本. 旨在从g的源节点到其他任意节点的最短路径。 - -这个函数将会返回一个map结构: -`v -> { distance, predecessor }` - -distance属性会保存从source到v的最短路径权重之和。 -如果从source过来没有路径,则结果为正无穷大。 - -predecessor属性可以按照相反顺序遍历source到v的每个元素。 - -根据`weightFn(e)`来返回边e的权重。如果没有赋值,默认的每条边的权重是1. -如果任何遍历的边具有负边权重,则此函数将抛出错误。 - -edgeFn(v)会返回与节点v相关的所有边的ID,以便进行最短路径遍历。默认使用`g.outEdges`。 - -例子: - - -```js -function weight(e) { return g.edge(e); } - -graphlib.alg.dijkstra(g, "A", weight); -// => { A: { distance: 0 }, -// B: { distance: 6, predecessor: 'C' }, -// C: { distance: 4, predecessor: 'A' }, -// D: { distance: 2, predecessor: 'A' }, -// E: { distance: 8, predecessor: 'F' }, -// F: { distance: 4, predecessor: 'D' } } -``` - -## alg.dijkstraAll(graph, weightFn, edgeFn) -此函数用于查找从每个节点到其他每个可到达节点到最短距离。 -与`alg.dijkstra`类似,但返回的不是单个数组,而是返回一个map映射: `source -> alg.dijkstra(g, source, weightFn, edgeFn)` - -函数的`weightFn`返回边`e`的权重。如果没有指定,则默认为1。如果可遍历的边有负数,则会立即抛出错误。 - -函数的`edgeFn(u)`返回所有与节点`u`有关的边的id,以便于进行最短路径的遍历。默认使用`g.outEdges`。 - -例子: - - -```js -function weight(e) { return g.edge(e); } - -graphlib.alg.dijkstraAll(g, function(e) { return g.edge(e); }); - -// => { A: -// { A: { distance: 0 }, -// B: { distance: 6, predecessor: 'C' }, -// C: { distance: 4, predecessor: 'A' }, -// D: { distance: 2, predecessor: 'A' }, -// E: { distance: 8, predecessor: 'F' }, -// F: { distance: 4, predecessor: 'D' } }, -// B: -// { A: { distance: Infinity }, -// B: { distance: 0 }, -// C: { distance: Infinity }, -// D: { distance: Infinity }, -// E: { distance: 6, predecessor: 'B' }, -// F: { distance: Infinity } }, -// C: { ... }, -// D: { ... }, -// E: { ... }, -// F: { ... } } -``` - -## alg.findCycles(graph) -假定存在一个图`g`,此函数将会返回图中循环的部分。 - -由于图中不止有1个循环,所以该函数返回有循环体所构成的数组,而每个循环体由涉及的节点id构成。 - -如果要判断图是否有循环部分,请使用`g.isAcyclic`则更为高效。 - -```js -var g = new graphlib.Graph(); -g.setNode(1); -g.setNode(2); -g.setNode(3); -g.setEdge(1, 2); -g.setEdge(2, 3); - -graphlib.alg.findCycles(g); -// => [] - -g.setEdge(3, 1); -graphlib.alg.findCycles(g); -// => [ [ '3', '2', '1' ] ] - -g.setNode(4); -g.setNode(5); -g.setEdge(4, 5); -g.setEdge(5, 4); -graphlib.alg.findCycles(g); -// => [ [ '3', '2', '1' ], [ '5', '4' ] ] -``` - -## alg.isAcyclic(graph) -给定一个图`g`,如果该图有循环的部分,则返回`true`。否则,返回`false`。 - -该函数会返回检测到的第一个循环体。如果要获取全部内容,请使用`alg.findCycles`。 - -```js -var g = new graphlib.Graph(); -g.setNode(1); -g.setNode(2); -g.setNode(3); -g.setEdge(1, 2); -g.setEdge(2, 3); - -graphlib.alg.isAcyclic(g); -// => true - -g.setEdge(3, 1); -graphlib.alg.isAcyclic(g); -// => false -``` - -## alg.postorder(graph, vs) -该函数将会从图像g的节点vs开始,进行后序遍历。 - -对于访问的每个节点,假定节点名为`v`,将会调用`callback(v)`。 - -```js -graphlib.alg.postorder(g, "A"); -// => One of: -// [ "B", "D", "E", C", "A" ] -// [ "B", "E", "D", C", "A" ] -// [ "D", "E", "C", B", "A" ] -// [ "E", "D", "C", B", "A" ] -``` - -## alg.preorder(graph, vs) -该函数将会从图像g的节点vs开始,进行前序遍历。 -对于访问的每个节点,假定节点名为`v`,将会调用`callback(v)`。 - -```js -graphlib.alg.preorder(g, "A"); -// => One of: -// [ "A", "B", "C", "D", "E" ] -// [ "A", "B", "C", "E", "D" ] -// [ "A", "C", "D", "E", "B" ] -// [ "A", "C", "E", "D", "B" ] -``` - -## alg.prim(graph, weightFn) -Prim算法采用连通无向图,并生成最小生成树。 -[Prim's algorithm](https://en.wikipedia.org/wiki/Prim's_algorithm). - -该函数将会以无向图的形式返回最小生成树。这个算法取自《算法导论》。 - -weightFn(e)将会返回边的权重e,如果图没有被联通,则会抛出异常。 - - -```js -function weight(e) { return g(e); } -graphlib.alg.prim(g, weight); -``` - -返回的树,以图的形式展现: - - -## alg.tarjan(graph) -[Tarjan's algorithm](http://en.wikipedia.org/wiki/Tarjan's_strongly_connected_components_algorithm) - -该函数是Tarjan算法的一个实现,该算法在有向图g中找到所有[强连通分量](http://en.wikipedia.org/wiki/Strongly_connected_component) - -每个强连通分量由节点组成,这些节点可以通过定向边到达分量中的所有其他节点。 - -如果一个强连接的组件既不能到达图中的任何其他特定节点,也不能被该节点访问,则该组件可以由单个节点组成。多个节点的组件要保证至少有一个循环。 - -此函数将会返回一个组件数组。每个组件本身也是一个数组,并且包含了组件内所有节点的id。 - -```js -graphlib.alg.tarjan(g); -// => [ [ 'F', 'G' ], -// [ 'H', 'D', 'C' ], -// [ 'E', 'B', 'A' ] ] -``` - -## alg.topsort(graph) -[topological sorting](https://en.wikipedia.org/wiki/Topological_sorting) +[![Build Status](https://secure.travis-ci.org/dagrejs/graphlib.svg)](http://travis-ci.org/dagrejs/graphlib) -topological 排序算法的实现。 +To learn more [see our Wiki](https://github.com/cpettitt/graphlib/wiki). -给定一个图`g`,该函数返回一个节点数组,使得每个边`u -> v`, u出现在v之前。 -如果图有循环,则不可能生成列表,并抛出异常。 - +# License -```js -graphlib.alg.topsort(g) -// [ '1', '2', '3', '4' ] or [ '1', '3', '2', '4' ] -``` +Graphlib is licensed under the terms of the MIT License. See the +[LICENSE](LICENSE) file +for details. +[npm package manager]: http://npmjs.org/ diff --git a/README_ZH.md b/README_ZH.md new file mode 100644 index 00000000..fa18bc39 --- /dev/null +++ b/README_ZH.md @@ -0,0 +1,515 @@ +# 进度 +- [x] 翻译 [API](https://github.com/dagrejs/graphlib/wiki/API-Reference) - 2022/03/23 21:06 + +> 中文 | [English](ReadMe-EN.md) + +[TOC] + +# 安装 +## npm Install +```shell +$ npm install @dagrejs/graphlib +``` + +# 介绍 +`Graphlib`是一个JavaScript Lib库,为无向和有向多变图提供数据结构,以及可以一起使用的算法。 + +[![Build Status](https://secure.travis-ci.org/dagrejs/graphlib.svg)](http://travis-ci.org/dagrejs/graphlib) + +更多学习内容, 查看[wiki](https://github.com/cpettitt/graphlib/wiki)。 + +# API 指南 +本部分主要阐述graphlib的概念并提供API指南。默认情况下,graphlib函数和对象暴露在graphlib的命名空间下。 + +# 图像概念 +Graphlib有一种图类型: Graph。 +创建一个新的实例: +```js +var g = new Graph(); +``` +默认情况下,将会创建一个不允许多边或者复合节点的有向图。以下则是参数选项: +- `directed`:设置为`true`时, 得到一个有向图。`false`时, 得到一个无向图。无向图不会把节点的顺序视为第一要务。换句话说, 对无向图来说`g.edge("a", "b") === g.edge("b", "a")`。默认为`true` +- `multigraph`: 设置为`true`时, 允许图像在同一对节点之间有多条边。默认: `false`。 +- `compound`: 设置为`true`时, 允许图像有复合节点。 可以是其他节点的父节点。 默认为`false`。 + +可以在constructor中通过对象配置属性。比如,创建一个有向复合多边图: +```js +var g = new Graph({ directed: true, compound: true, multigraph: true }); +``` + +# 展现节点和边线 +在graphlib中,节点由用户提供的字符串id表示。 所有节点相关的函数都使用此字符串id作为唯一标识节点的方式。以下为与节点交互的例子: +```js +var g = new Graph(); +g.setNode("my-id", "my-label"); + +g.node("my-id"); // return "my-label" +``` + +graphlib中的边由他们连接的节点标识。比如: +```js +var g = new Graph(); + +g.setEdge("source", "target", "my-label"); +g.edge("source", "target"); // return my-label +``` + +但是,为了进行各种类型的边缘查询,我们需要一种方法去唯一标识单个对象里的边。(比如:[outEdges](https://github.com/dagrejs/graphlib/wiki/API-Reference#outEdges))。我们使用`edgeObj`应对,而此主要由以下组成: +- `v`: 源id或者是边线上的尾节点。 +- `w`: 目标id或者是边线上的头节点。 +- `name`(可选): 唯一标识多边边线([multi-edge](https://github.com/dagrejs/graphlib/wiki/API-Reference#multigraphs))的名称。 + +任何采用了一个边线id的边缘函数也可以使用`edgeObj`: +```js +var g = new Graph(); + +g.setEdge("source", "target", "my-label") +g.edge({ v: "source", w: "target" }); // return my-label +``` + +# Multigraphs +multigraphs的数学概念: [multigraph](https://en.wikipedia.org/wiki/Multigraph) + + +多重图是一种在一对节点中可以拥有多条边的图。默认情况下, graphlib的图像不是多重图, 需要在构造体中设置多重图的属性为`true`: +```js +var g = new Graph({ multigraph: true }) +``` +在两个节点由多条边的情况下,我们需要相同的办法去识别每一条边。 我们称这样的属性为`name`。 这有关于相同节点之间的几条边的例子: +```js +var g = new Graph({ multigraph: true }) + +g.setEdge("a", "b", "edge1-label", "edge1") +g.setEdge("a", "b", "edge2-label", "edge2") + +g.edge("a", "b", "edge1") +g.edge("a", "b", "edge2") + +g.edges() +/** + * return [ + * { v: "a", w: "b", name: "edge1" }, + * { v: "a", w: "b", name: "edge2" } + * ] + */ +``` + +多重图也允许创建没有名字的一条边 +```js +var g = new Graph({ multigraph: true }) + +g.setEdge("a", "b", "my-label") +g.edge({ v: "a", w: "b" }) +``` + +# 复合图 +复合图就是一个节点可以是其他节点的父节点。子节点组成一个"子图"。 以下例子为构建一个复合图并与之交互: +```js +var g = new Graph({ compound: true }); + +g.setParent("a", "parent"); +g.setParent("b", "parent"); + +g.parent("a"); // returns "parent" +g.parent("b"); // returns "parent" + +g.parent("parent"); // returns undefined +``` + +# 默认标签 +当一个节点或边没有创建标签时,会被默认分配一个标签。详情请看这两个API: +- [setDefaultNodeLabel](https://github.com/dagrejs/graphlib/wiki/API-Reference#setDefaultNodeLabel) +- [setDefaultEdgeLabel](https://github.com/dagrejs/graphlib/wiki/API-Reference#setDefaultEdgeLabel) + +# Graph API + +## graph.isDirected() +如果图是有向图的话,会返回`true`。 +有向图会将在线段里的节点顺序是做有意义的,而无向图则会忽视。以下例子证明了不同: +```js +var directed = new Graph({ directed: true }); + +directed.setEdge("a", "b", "my-label"); +directed.edge("a", "b"); // returns my-label +directed.edge("b", "a"); // returns undefined + +var undirected = new Graph({ directed: false }); +undirected.setEdge("a", "b", "my-label"); +undirected.edge("a", "b"); // returns my-label +undirected.edge("b", "a"); // returns my-label +``` + +## graph.isMultigraph() +如果图是多重图,返回`true`。[Multigraph](https://github.com/dagrejs/graphlib/wiki/API-Reference#multigraphs) + +## graph.isCompound() +如果是复合图,返回`true`。[compound](https://github.com/dagrejs/graphlib/wiki/API-Reference#compound-graphs) + +## graph.graph() +返回为图形分配的标签。 如果没有指定标签,则返回`undefined`。 +```js +var g = new Graph(); + +g.graph(); // return undefined +g.setGraph("graph-label"); +g.graph(); // return "graph-label" +``` + +## graph.setGraph(label) +为图像设置标签。 + +## graph.nodeCount() +返回图像中节点的数量。 + +## graph.edgeCount() +返回节点中边线的数量。 + +## graph.setDefaultNodeLabel(val) +设置一个新的默认值,以便于在没有指定标签创建节点时,分配过去。 +如果`val`不是一个函数,将会作为标签分配。 +如果是一个函数, 正被创建的节点的id将会调用此函数。 + +## graph.setDefaultEdgeLabel(val) +为没有分配标签的线段指定一个新的默认标签。 +如果`val`不是函数,则作为标签。 +如果是函数,则会随着参数`(v, w, name)`而被调用。 + +## graph.nodes() +返回图像里的所有节点id。 +使用[node(v)](https://github.com/dagrejs/graphlib/wiki/API-Reference#node)获取每个节点的标签,花费`O(|v|)`的时间。 + +## graph.edges() +返回图中的每个边线的[edgeObj](https://github.com/dagrejs/graphlib/wiki/API-Reference#node-and-edge-representation)。 +使用[edge(edgeObj)](https://github.com/dagrejs/graphlib/wiki/API-Reference#edge)获取每个边线的标签。花费`O(|v|)`的时间。 + +## graph.sources() +返回图中没有入边的节点。 + +## graph.sinks() +返回途中没有出边的节点。 + +## graph.hasNode(v) +如果图里存在节点的id为`v`,则返回`true`。 + +## graph.node(v) +如果图中存在id为`v`的节点,则返回指定的标签,否则返回`undefined`。 + +## graph.setNode(v, [label]) +在图中创建或更新节点v的值。 如果提供了label,则更新掉。如果没有提供,在创建过程中会分配一个默认的标签。[default node label](https://github.com/dagrejs/graphlib/wiki/API-Reference#default-labels)。 + +返回图,允许图和其他的函数连接起来。 + +## graph.removeNode(v) +移除图中id为`v`的节点,如果不存在则不处理。如果节点被移除,也会移除所有边。 +返回图,允许图和其他的函数连接起来。 + +## graph.predecessors(v) +返回指定节点的所有前导节点,如果图中不存在此节点,则返回`undefined`. 如果是无向图,则会返回`undefined`,应该使用[neighbors](https://github.com/dagrejs/graphlib/wiki/API-Reference#neighbors)。 + +## graph.successors(v) +返回指定节点的所有后续节点。如果图中没有此节点,则返回`undefined`. 如果是无向图,则会返回`undefined`,应该使用[neighbors](https://github.com/dagrejs/graphlib/wiki/API-Reference#neighbors)。 + +## graph.neighbors(v) +返回指定节点的前导节点或者后续节点。如果图中没有此节点,则返回`undefined`。 + +## graph.inEdges(v, [u]) +返回所有指向节点(v)的边。 可以过滤出只来自于节点u的边。 +对无向图来说都是`undefined`,请使用[nodeEdges](https://github.com/dagrejs/graphlib/wiki/API-Reference#nodeEdges)。 +如果图中没有节点`v`,则返回`undefined`。 + + +## graph.outEdges(v, [w]) +返回所有指向节点的边。可以过滤出只指向节点w的边。 +对无向图来说都是`undefined`,请使用[nodeEdges](https://github.com/dagrejs/graphlib/wiki/API-Reference#nodeEdges)。 +如果图中没有节点`v`,则返回`undefined`。 + +## graph.nodeEdges(v, [w]) +返回所有与节点v有关的边,而不管方向。 +可以过滤出节点v和w之间的所有线段,无论方向。 +如果图中没有节点`v`,则返回`undefined`。 + +## graph.parent(v) +返回节点v的父节点。 +如果节点没有父节点或不在图中,则返回`undefined`。 +如果不是复合图的话,始终返回`undefined`。 + +## graph.children(v) +返回节点v的所有孩子节点。 +如果不在图中则返回`undefined`。 +如果不是复合图,始终返回`[]`。 + +## graph.setParent(v, parent) +如果`parent`有值,则设置为节点v的父节点; 如果没有值,则移除节点v的父节点。 +如果图不是复合图,则抛出异常。 +返回值为图本身,允许被连接到其他的函数内。 + +## graph.hasEdge(v, w, [name]) / graph.hasEdge(edgeObj) +如果图中的节点v和节点w之间存在一条边,名字为`name`,则返回`true`。 +[name]参数只适用于多重图。 +对于无向图来说,v和w可以互换位置。 + +## graph.edge(v, w, [name]) / graph.edge(edgeObj) +如果图中节点v和w之间存在线段,并带有可选名称,则返回线段(v,w)的标签。 +如果图中没有这条线,则返回`undefined`。 +参数[name]只适用于多重图。 +无向图中,v,w可以互换。 + +## graph.setEdge(v, w, [label], [name]) / graph.setEdge(edgeObj, [label]) +使用参数[name]去创建或更新(v,w)的边。 +如果提供了[label],则将其设置为边的值。而如果没有被提供,则将分配给默认的标签。 +参数[name]只适用于多重图。 +返回值为图本身,允许被连接到其他的函数内。 + +## graph.removeEdge(v, w, [name]) +如果图中的节点v,w之间有一条可选名[name]的边,则移除它。否则将无效。 +参数[name]只适用于多重图。 +无向图中,v,w可以互换。 + + +# 序列化 +## json.write(g) +创建可以用JSON序列化为字符串的图形的JSONrepresentation。稍后可以使用[json-read](https://github.com/dagrejs/graphlib/wiki/API-Reference#json-read)恢复图形。 + +```js +var g = new graphlib.Graph(); +g.setNode("a", { label: "node a" }); +g.setNode("b", { label: "node b" }); +g.setEdge("a", "b", { label: "edge a->b" }); +graphlib.json.write(g); +// Returns the object: +// +// { +// "options": { +// "directed": true, +// "multigraph": false, +// "compound": false +// }, +// "nodes": [ +// { "v": "a", "value": { "label": "node a" } }, +// { "v": "b", "value": { "label": "node b" } } +// ], +// "edges": [ +// { "v": "a", "w": "b", "value": { "label": "edge a->b" } } +// ] +// } +``` + +## json.read(json) +将输入的json转换为图像的展示类型。比如,我们使用`json-write`将图像序列化为`str`的字符串,我们可以使用以下的办法去恢复: +```js +var g2 = graphlib.json.read(JSON.parse(str)); +// or, in order to copy the graph +var g3 = graphlib.json.read(graphlib.json.write(g)) + +g2.nodes(); +// ['a', 'b'] +g2.edges() +// [ { v: 'a', w: 'b' } ] +``` + +# 算法 +## alg.components(graph) +找到图中所有的连接部分,并且将这些部分作为数组返回。 +每个组件本身就是一个数组,包含组件中节点id。 + +```js +graphlib.alg.components(g); +// => [ [ 'A', 'B', 'C', 'D' ], +// [ 'E', 'F', 'G' ], +// [ 'H', 'I' ] ] +``` + +## alg.dijkstra(graph, source, weightFn, edgeFn) +此算法是[Dijkstra]算法的js版本. 旨在从g的源节点到其他任意节点的最短路径。 + +这个函数将会返回一个map结构: +`v -> { distance, predecessor }` + +distance属性会保存从source到v的最短路径权重之和。 +如果从source过来没有路径,则结果为正无穷大。 + +predecessor属性可以按照相反顺序遍历source到v的每个元素。 + +根据`weightFn(e)`来返回边e的权重。如果没有赋值,默认的每条边的权重是1. +如果任何遍历的边具有负边权重,则此函数将抛出错误。 + +edgeFn(v)会返回与节点v相关的所有边的ID,以便进行最短路径遍历。默认使用`g.outEdges`。 + +例子: + + +```js +function weight(e) { return g.edge(e); } + +graphlib.alg.dijkstra(g, "A", weight); +// => { A: { distance: 0 }, +// B: { distance: 6, predecessor: 'C' }, +// C: { distance: 4, predecessor: 'A' }, +// D: { distance: 2, predecessor: 'A' }, +// E: { distance: 8, predecessor: 'F' }, +// F: { distance: 4, predecessor: 'D' } } +``` + +## alg.dijkstraAll(graph, weightFn, edgeFn) +此函数用于查找从每个节点到其他每个可到达节点到最短距离。 +与`alg.dijkstra`类似,但返回的不是单个数组,而是返回一个map映射: `source -> alg.dijkstra(g, source, weightFn, edgeFn)` + +函数的`weightFn`返回边`e`的权重。如果没有指定,则默认为1。如果可遍历的边有负数,则会立即抛出错误。 + +函数的`edgeFn(u)`返回所有与节点`u`有关的边的id,以便于进行最短路径的遍历。默认使用`g.outEdges`。 + +例子: + + +```js +function weight(e) { return g.edge(e); } + +graphlib.alg.dijkstraAll(g, function(e) { return g.edge(e); }); + +// => { A: +// { A: { distance: 0 }, +// B: { distance: 6, predecessor: 'C' }, +// C: { distance: 4, predecessor: 'A' }, +// D: { distance: 2, predecessor: 'A' }, +// E: { distance: 8, predecessor: 'F' }, +// F: { distance: 4, predecessor: 'D' } }, +// B: +// { A: { distance: Infinity }, +// B: { distance: 0 }, +// C: { distance: Infinity }, +// D: { distance: Infinity }, +// E: { distance: 6, predecessor: 'B' }, +// F: { distance: Infinity } }, +// C: { ... }, +// D: { ... }, +// E: { ... }, +// F: { ... } } +``` + +## alg.findCycles(graph) +假定存在一个图`g`,此函数将会返回图中循环的部分。 + +由于图中不止有1个循环,所以该函数返回有循环体所构成的数组,而每个循环体由涉及的节点id构成。 + +如果要判断图是否有循环部分,请使用`g.isAcyclic`则更为高效。 + +```js +var g = new graphlib.Graph(); +g.setNode(1); +g.setNode(2); +g.setNode(3); +g.setEdge(1, 2); +g.setEdge(2, 3); + +graphlib.alg.findCycles(g); +// => [] + +g.setEdge(3, 1); +graphlib.alg.findCycles(g); +// => [ [ '3', '2', '1' ] ] + +g.setNode(4); +g.setNode(5); +g.setEdge(4, 5); +g.setEdge(5, 4); +graphlib.alg.findCycles(g); +// => [ [ '3', '2', '1' ], [ '5', '4' ] ] +``` + +## alg.isAcyclic(graph) +给定一个图`g`,如果该图有循环的部分,则返回`true`。否则,返回`false`。 + +该函数会返回检测到的第一个循环体。如果要获取全部内容,请使用`alg.findCycles`。 + +```js +var g = new graphlib.Graph(); +g.setNode(1); +g.setNode(2); +g.setNode(3); +g.setEdge(1, 2); +g.setEdge(2, 3); + +graphlib.alg.isAcyclic(g); +// => true + +g.setEdge(3, 1); +graphlib.alg.isAcyclic(g); +// => false +``` + +## alg.postorder(graph, vs) +该函数将会从图像g的节点vs开始,进行后序遍历。 + +对于访问的每个节点,假定节点名为`v`,将会调用`callback(v)`。 + +```js +graphlib.alg.postorder(g, "A"); +// => One of: +// [ "B", "D", "E", C", "A" ] +// [ "B", "E", "D", C", "A" ] +// [ "D", "E", "C", B", "A" ] +// [ "E", "D", "C", B", "A" ] +``` + +## alg.preorder(graph, vs) +该函数将会从图像g的节点vs开始,进行前序遍历。 +对于访问的每个节点,假定节点名为`v`,将会调用`callback(v)`。 + +```js +graphlib.alg.preorder(g, "A"); +// => One of: +// [ "A", "B", "C", "D", "E" ] +// [ "A", "B", "C", "E", "D" ] +// [ "A", "C", "D", "E", "B" ] +// [ "A", "C", "E", "D", "B" ] +``` + +## alg.prim(graph, weightFn) +Prim算法采用连通无向图,并生成最小生成树。 +[Prim's algorithm](https://en.wikipedia.org/wiki/Prim's_algorithm). + +该函数将会以无向图的形式返回最小生成树。这个算法取自《算法导论》。 + +weightFn(e)将会返回边的权重e,如果图没有被联通,则会抛出异常。 + + +```js +function weight(e) { return g(e); } +graphlib.alg.prim(g, weight); +``` + +返回的树,以图的形式展现: + + +## alg.tarjan(graph) +[Tarjan's algorithm](http://en.wikipedia.org/wiki/Tarjan's_strongly_connected_components_algorithm) + +该函数是Tarjan算法的一个实现,该算法在有向图g中找到所有[强连通分量](http://en.wikipedia.org/wiki/Strongly_connected_component) + +每个强连通分量由节点组成,这些节点可以通过定向边到达分量中的所有其他节点。 + +如果一个强连接的组件既不能到达图中的任何其他特定节点,也不能被该节点访问,则该组件可以由单个节点组成。多个节点的组件要保证至少有一个循环。 + +此函数将会返回一个组件数组。每个组件本身也是一个数组,并且包含了组件内所有节点的id。 + +```js +graphlib.alg.tarjan(g); +// => [ [ 'F', 'G' ], +// [ 'H', 'D', 'C' ], +// [ 'E', 'B', 'A' ] ] +``` + +## alg.topsort(graph) +[topological sorting](https://en.wikipedia.org/wiki/Topological_sorting) + +topological 排序算法的实现。 + +给定一个图`g`,该函数返回一个节点数组,使得每个边`u -> v`, u出现在v之前。 +如果图有循环,则不可能生成列表,并抛出异常。 + + +```js +graphlib.alg.topsort(g) +// [ '1', '2', '3', '4' ] or [ '1', '3', '2', '4' ] +``` + From c9c59a7b4c787a19789bb3d3c074d124e0a3aa9b Mon Sep 17 00:00:00 2001 From: Wenxuan Feng <279357596@qq.com> Date: Tue, 22 Mar 2022 23:16:51 +0800 Subject: [PATCH 20/85] feat: Initial --- README.md | 1 + ReadMe-CN.md | 18 ++++++++++++++++++ 2 files changed, 19 insertions(+) create mode 100644 ReadMe-CN.md diff --git a/README.md b/README.md index f440f722..98192efe 100644 --- a/README.md +++ b/README.md @@ -1,3 +1,4 @@ +> English | [中文](ReadMe-CN.md) # Graphlib Graphlib is a JavaScript library that provides data structures for undirected diff --git a/ReadMe-CN.md b/ReadMe-CN.md new file mode 100644 index 00000000..57d8311e --- /dev/null +++ b/ReadMe-CN.md @@ -0,0 +1,18 @@ +# 进度 +- [ ] 翻译 [API](https://github.com/dagrejs/graphlib/wiki/API-Reference) - 2022/03/22 23:08 + +> 中文 | [English](ReadMe.md) + +[TOC] + +# 介绍 +`Graphlib`是一个JavaScript Lib库,为无向和有向多变图提供数据结构,以及可以一起使用的算法。 + +[![Build Status](https://secure.travis-ci.org/dagrejs/graphlib.svg)](http://travis-ci.org/dagrejs/graphlib) + +更多学习内容, 查看[wiki](https://github.com/cpettitt/graphlib/wiki)。 + +# API 指南 +本部分主要阐述graphlib的概念并提供API指南。默认情况下,graphlib函数和对象暴露在graphlib的命名空间下。 + + From 755ea9e49e8d79e3dae4795f608e04fb81ea78ce Mon Sep 17 00:00:00 2001 From: Wenxuan Feng <279357596@qq.com> Date: Wed, 23 Mar 2022 20:54:48 +0800 Subject: [PATCH 21/85] feat: new --- ReadMe-CN.md | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-) diff --git a/ReadMe-CN.md b/ReadMe-CN.md index 57d8311e..58ec1afd 100644 --- a/ReadMe-CN.md +++ b/ReadMe-CN.md @@ -15,4 +15,20 @@ # API 指南 本部分主要阐述graphlib的概念并提供API指南。默认情况下,graphlib函数和对象暴露在graphlib的命名空间下。 - +# 图像概念 +Graphlib有一种图类型: Graph。 +创建一个新的实例: +```js +var g = new Graph(); +``` +默认情况下,将会创建一个不允许多边或者复合节点的有向图。以下则是参数选项: +- `directed`:设置为`true`时, 得到一个有向图。`false`时, 得到一个无向图。无向图不会把节点的顺序视为第一要务。换句话说, 对无向图来说`g.edge("a", "b") === g.edge("b", "a")`。默认为`true` +- `multigraph`: 设置为`true`时, 允许图像在同一对节点之间有多条边。默认: `false`。 +- `compound`: 设置为`true`时, 允许图像有复合节点。 可以是其他节点的父节点。 默认为`false`。 + +可以在constructor中通过对象配置属性。比如,创建一个有向复合多边图: +```js +var g = new Graph({ directed: true, compound: true, multigraph: true }); +``` + +# 展示节点和边线 From 0d8b8f6e6a0dc60eb0f15c6f248fe7ca164b57fc Mon Sep 17 00:00:00 2001 From: Wenxuan Feng <279357596@qq.com> Date: Wed, 23 Mar 2022 21:06:46 +0800 Subject: [PATCH 22/85] feat: new --- ReadMe-CN.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ReadMe-CN.md b/ReadMe-CN.md index 58ec1afd..409a4cd8 100644 --- a/ReadMe-CN.md +++ b/ReadMe-CN.md @@ -1,5 +1,5 @@ # 进度 -- [ ] 翻译 [API](https://github.com/dagrejs/graphlib/wiki/API-Reference) - 2022/03/22 23:08 +- [ ] 翻译 [API](https://github.com/dagrejs/graphlib/wiki/API-Reference) - 2022/03/23 21:06 > 中文 | [English](ReadMe.md) From 91ccd339d52ded77b0d2c97875897146a22b7292 Mon Sep 17 00:00:00 2001 From: Wenxuan Feng <279357596@qq.com> Date: Thu, 24 Mar 2022 11:45:25 +0800 Subject: [PATCH 23/85] feat: multigraph --- ReadMe-CN.md | 67 +++++++++++++++++++++++++++++++++++++++++- static/multigraph.jpg | Bin 0 -> 107440 bytes 2 files changed, 66 insertions(+), 1 deletion(-) create mode 100644 static/multigraph.jpg diff --git a/ReadMe-CN.md b/ReadMe-CN.md index 409a4cd8..04796308 100644 --- a/ReadMe-CN.md +++ b/ReadMe-CN.md @@ -31,4 +31,69 @@ var g = new Graph(); var g = new Graph({ directed: true, compound: true, multigraph: true }); ``` -# 展示节点和边线 +# 展现节点和边线 +在graphlib中,节点由用户提供的字符串id表示。 所有节点相关的函数都使用此字符串id作为唯一标识节点的方式。以下为与节点交互的例子: +```js +var g = new Graph(); +g.setNode("my-id", "my-label"); + +g.node("my-id"); // return "my-label" +``` + +graphlib中的边由他们连接的节点标识。比如: +```js +var g = new Graph(); + +g.setEdge("source", "target", "my-label"); +g.edge("source", "target"); // return my-label +``` + +但是,为了进行各种类型的边缘查询,我们需要一种方法去唯一标识单个对象里的边。(比如:[outEdges](https://github.com/dagrejs/graphlib/wiki/API-Reference#outEdges))。我们使用`edgeObj`应对,而此主要由以下组成: +- `v`: 源id或者是边线上的尾节点。 +- `w`: 目标id或者是边线上的头节点。 +- `name`(可选): 唯一标识多边边线([multi-edge](https://github.com/dagrejs/graphlib/wiki/API-Reference#multigraphs))的名称。 + +任何采用了一个边线id的边缘函数也可以使用`edgeObj`: +```js +var g = new Graph(); + +g.setEdge("source", "target", "my-label") +g.edge({ v: "source", w: "target" }); // return my-label +``` + +# Multigraphs +multigraphs的数学概念: [multigraph](https://en.wikipedia.org/wiki/Multigraph) + + +多重图是一种在一对节点中可以拥有多条边的图。默认情况下, graphlib的图像不是多重图, 需要在构造体中设置多重图的属性为`true`: +```js +var g = new Graph({ multigraph: true }) +``` +在两个节点由多条边的情况下,我们需要相同的办法去识别每一条边。 我们称这样的属性为`name`。 这有关于相同节点之间的几条边的例子: +```js +var g = new Graph({ multigraph: true }) + +g.setEdge("a", "b", "edge1-label", "edge1") +g.setEdge("a", "b", "edge2-label", "edge2") + +g.edge("a", "b", "edge1") +g.edge("a", "b", "edge2") + +g.edges() +/** + * return [ + * { v: "a", w: "b", name: "edge1" }, + * { v: "a", w: "b", name: "edge2" } + * ] + */ +``` + +多重图也允许创建没有名字的一条边 +```js +var g = new Graph({ multigraph: true }) + +g.setEdge("a", "b", "my-label") +g.edge({ v: "a", w: "b" }) +``` + +# 复合图 \ No newline at end of file diff --git a/static/multigraph.jpg b/static/multigraph.jpg new file mode 100644 index 0000000000000000000000000000000000000000..72465eecc57c9662ae6687a467395819521226fa GIT binary patch literal 107440 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

!B-##s8T~epzaA^A#LQNz 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

3eU7T5Ck(8wRpd=2iQ;YQsJ~ZR2P8 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 Date: Sat, 26 Mar 2022 17:45:32 +0800 Subject: [PATCH 24/85] feat: new --- ReadMe-CN.md | 219 +++++++++++++++++++++++++++++++++++++- static/alg.components.jpg | Bin 0 -> 35154 bytes test.js | 5 + 3 files changed, 223 insertions(+), 1 deletion(-) create mode 100644 static/alg.components.jpg create mode 100644 test.js diff --git a/ReadMe-CN.md b/ReadMe-CN.md index 04796308..84f60ebc 100644 --- a/ReadMe-CN.md +++ b/ReadMe-CN.md @@ -96,4 +96,221 @@ g.setEdge("a", "b", "my-label") g.edge({ v: "a", w: "b" }) ``` -# 复合图 \ No newline at end of file +# 复合图 +复合图就是一个节点可以是其他节点的父节点。子节点组成一个"子图"。 以下例子为构建一个复合图并与之交互: +```js +var g = new Graph({ compound: true }); + +g.setParent("a", "parent"); +g.setParent("b", "parent"); + +g.parent("a"); // returns "parent" +g.parent("b"); // returns "parent" + +g.parent("parent"); // returns undefined +``` + +# 默认标签 +当一个节点或边没有创建标签时,会被默认分配一个标签。详情请看这两个API: +- [setDefaultNodeLabel](https://github.com/dagrejs/graphlib/wiki/API-Reference#setDefaultNodeLabel) +- [setDefaultEdgeLabel](https://github.com/dagrejs/graphlib/wiki/API-Reference#setDefaultEdgeLabel) + +# Graph API + +## graph.isDirected() +如果图是有向图的话,会返回`true`。 +有向图会将在线段里的节点顺序是做有意义的,而无向图则会忽视。以下例子证明了不同: +```js +var directed = new Graph({ directed: true }); + +directed.setEdge("a", "b", "my-label"); +directed.edge("a", "b"); // returns my-label +directed.edge("b", "a"); // returns undefined + +var undirected = new Graph({ directed: false }); +undirected.setEdge("a", "b", "my-label"); +undirected.edge("a", "b"); // returns my-label +undirected.edge("b", "a"); // returns my-label +``` + +## graph.isMultigraph() +如果图是多重图,返回`true`。[Multigraph](https://github.com/dagrejs/graphlib/wiki/API-Reference#multigraphs) + +## graph.isCompound() +如果是复合图,返回`true`。[compound](https://github.com/dagrejs/graphlib/wiki/API-Reference#compound-graphs) + +## graph.graph() +返回为图形分配的标签。 如果没有指定标签,则返回`undefined`。 +```js +var g = new Graph(); + +g.graph(); // return undefined +g.setGraph("graph-label"); +g.graph(); // return "graph-label" +``` + +## graph.setGraph(label) +为图像设置标签。 + +## graph.nodeCount() +返回图像中节点的数量。 + +## graph.edgeCount() +返回节点中边线的数量。 + +## graph.setDefaultNodeLabel(val) +设置一个新的默认值,以便于在没有指定标签创建节点时,分配过去。 +如果`val`不是一个函数,将会作为标签分配。 +如果是一个函数, 正被创建的节点的id将会调用此函数。 + +## graph.setDefaultEdgeLabel(val) +为没有分配标签的线段指定一个新的默认标签。 +如果`val`不是函数,则作为标签。 +如果是函数,则会随着参数`(v, w, name)`而被调用。 + +## graph.nodes() +返回图像里的所有节点id。 +使用[node(v)](https://github.com/dagrejs/graphlib/wiki/API-Reference#node)获取每个节点的标签,花费`O(|v|)`的时间。 + +## graph.edges() +返回图中的每个边线的[edgeObj](https://github.com/dagrejs/graphlib/wiki/API-Reference#node-and-edge-representation)。 +使用[edge(edgeObj)](https://github.com/dagrejs/graphlib/wiki/API-Reference#edge)获取每个边线的标签。花费`O(|v|)`的时间。 + +## graph.sources() +返回图中没有入边的节点。 + +## graph.sinks() +返回途中没有出边的节点。 + +## graph.hasNode(v) +如果图里存在节点的id为`v`,则返回`true`。 + +## graph.node(v) +如果图中存在id为`v`的节点,则返回指定的标签,否则返回`undefined`。 + +## graph.setNode(v, [label]) +在图中创建或更新节点v的值。 如果提供了label,则更新掉。如果没有提供,在创建过程中会分配一个默认的标签。[default node label](https://github.com/dagrejs/graphlib/wiki/API-Reference#default-labels)。 + +返回图,允许图和其他的函数连接起来。 + +## graph.removeNode(v) +移除图中id为`v`的节点,如果不存在则不处理。如果节点被移除,也会移除所有边。 +返回图,允许图和其他的函数连接起来。 + +## graph.predecessors(v) +返回指定节点的所有前导节点,如果图中不存在此节点,则返回`undefined`. 如果是无向图,则会返回`undefined`,应该使用[neighbors](https://github.com/dagrejs/graphlib/wiki/API-Reference#neighbors)。 + +## graph.successors(v) +返回指定节点的所有后续节点。如果图中没有此节点,则返回`undefined`. 如果是无向图,则会返回`undefined`,应该使用[neighbors](https://github.com/dagrejs/graphlib/wiki/API-Reference#neighbors)。 + +## graph.neighbors(v) +返回指定节点的前导节点或者后续节点。如果图中没有此节点,则返回`undefined`。 + +## graph.inEdges(v, [u]) +返回所有指向节点(v)的边。 可以过滤出只来自于节点u的边。 +对无向图来说都是`undefined`,请使用[nodeEdges](https://github.com/dagrejs/graphlib/wiki/API-Reference#nodeEdges)。 +如果图中没有节点`v`,则返回`undefined`。 + + +## graph.outEdges(v, [w]) +返回所有指向节点的边。可以过滤出只指向节点w的边。 +对无向图来说都是`undefined`,请使用[nodeEdges](https://github.com/dagrejs/graphlib/wiki/API-Reference#nodeEdges)。 +如果图中没有节点`v`,则返回`undefined`。 + +## graph.nodeEdges(v, [w]) +返回所有与节点v有关的边,而不管方向。 +可以过滤出节点v和w之间的所有线段,无论方向。 +如果图中没有节点`v`,则返回`undefined`。 + +## graph.parent(v) +返回节点v的父节点。 +如果节点没有父节点或不在图中,则返回`undefined`。 +如果不是复合图的话,始终返回`undefined`。 + +## graph.children(v) +返回节点v的所有孩子节点。 +如果不在图中则返回`undefined`。 +如果不是复合图,始终返回`[]`。 + +## graph.setParent(v, parent) +如果`parent`有值,则设置为节点v的父节点; 如果没有值,则移除节点v的父节点。 +如果图不是复合图,则抛出异常。 +返回值为图本身,允许被连接到其他的函数内。 + +## graph.hasEdge(v, w, [name]) / graph.hasEdge(edgeObj) +如果图中的节点v和节点w之间存在一条边,名字为`name`,则返回`true`。 +[name]参数只适用于多重图。 +对于无向图来说,v和w可以互换位置。 + +## graph.edge(v, w, [name]) / graph.edge(edgeObj) +如果图中节点v和w之间存在线段,并带有可选名称,则返回线段(v,w)的标签。 +如果图中没有这条线,则返回`undefined`。 +参数[name]只适用于多重图。 +无向图中,v,w可以互换。 + +## graph.setEdge(v, w, [label], [name]) / graph.setEdge(edgeObj, [label]) +使用参数[name]去创建或更新(v,w)的边。 +如果提供了[label],则将其设置为边的值。而如果没有被提供,则将分配给默认的标签。 +参数[name]只适用于多重图。 +返回值为图本身,允许被连接到其他的函数内。 + +## graph.removeEdge(v, w, [name]) +如果图中的节点v,w之间有一条可选名[name]的边,则移除它。否则将无效。 +参数[name]只适用于多重图。 +无向图中,v,w可以互换。 + + +# 序列化 +## json.write(g) +创建可以用JSON序列化为字符串的图形的JSONrepresentation。稍后可以使用[json-read](https://github.com/dagrejs/graphlib/wiki/API-Reference#json-read)恢复图形。 + +```js +var g = new graphlib.Graph(); +g.setNode("a", { label: "node a" }); +g.setNode("b", { label: "node b" }); +g.setEdge("a", "b", { label: "edge a->b" }); +graphlib.json.write(g); +// Returns the object: +// +// { +// "options": { +// "directed": true, +// "multigraph": false, +// "compound": false +// }, +// "nodes": [ +// { "v": "a", "value": { "label": "node a" } }, +// { "v": "b", "value": { "label": "node b" } } +// ], +// "edges": [ +// { "v": "a", "w": "b", "value": { "label": "edge a->b" } } +// ] +// } +``` + +## json.read(json) +将输入的json转换为图像的展示类型。比如,我们使用`json-write`将图像序列化为`str`的字符串,我们可以使用以下的办法去恢复: +```js +var g2 = graphlib.json.read(JSON.parse(str)); +// or, in order to copy the graph +var g3 = graphlib.json.read(graphlib.json.write(g)) + +g2.nodes(); +// ['a', 'b'] +g2.edges() +// [ { v: 'a', w: 'b' } ] +``` + +# 算法 +## alg.components(graph) +找到图中所有的连接部分,并且将这些部分作为数组返回。 +每个组件本身就是一个数组,包含组件中节点id。 + +```js +graphlib.alg.components(g); +// => [ [ 'A', 'B', 'C', 'D' ], +// [ 'E', 'F', 'G' ], +// [ 'H', 'I' ] ] +``` + +## alg.dijkstra(graph, source, weightFn, edgeFn) diff --git a/static/alg.components.jpg b/static/alg.components.jpg new file mode 100644 index 0000000000000000000000000000000000000000..558d52ade16ac852dcabf41fbefc495b3da69b4b GIT binary patch literal 35154 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

%mVH=&^z;uL(76LQ$P*!fgpkQi|T=CSvhksap_G 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 Date: Sat, 26 Mar 2022 18:17:34 +0800 Subject: [PATCH 25/85] feat: new --- ReadMe-CN.md | 29 +++++++++++++++++++++++++++++ static/dijkstra-source.png | Bin 0 -> 22103 bytes 2 files changed, 29 insertions(+) create mode 100644 static/dijkstra-source.png diff --git a/ReadMe-CN.md b/ReadMe-CN.md index 84f60ebc..f5f6cd74 100644 --- a/ReadMe-CN.md +++ b/ReadMe-CN.md @@ -314,3 +314,32 @@ graphlib.alg.components(g); ``` ## alg.dijkstra(graph, source, weightFn, edgeFn) +此算法是[Dijkstra]算法的js版本. 旨在从g的源节点到其他任意节点的最短路径。 + +这个函数将会返回一个map结构: +`v -> { distance, predecessor }` + +distance属性会保存从source到v的最短路径权重之和。 +如果从source过来没有路径,则结果为正无穷大。 + +predecessor属性可以按照相反顺序遍历source到v的每个元素。 + +根据`weightFn(e)`来返回边e的权重。如果没有赋值,默认的每条边的权重是1. +如果任何遍历的边具有负边权重,则此函数将抛出错误。 + +edgeFn(v)会返回与节点v相关的所有边的ID,以便进行最短路径遍历。默认使用`g.outEdges`。 + +例子: + + +```js +function weight(e) { return g.edge(e); } + +graphlib.alg.dijkstra(g, "A", weight); +// => { A: { distance: 0 }, +// B: { distance: 6, predecessor: 'C' }, +// C: { distance: 4, predecessor: 'A' }, +// D: { distance: 2, predecessor: 'A' }, +// E: { distance: 8, predecessor: 'F' }, +// F: { distance: 4, predecessor: 'D' } } +``` \ No newline at end of file diff --git a/static/dijkstra-source.png b/static/dijkstra-source.png new file mode 100644 index 0000000000000000000000000000000000000000..4494dac5fcfcab273ef497bdaf2a4de604ffc821 GIT binary patch literal 22103 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 Date: Sat, 26 Mar 2022 18:18:01 +0800 Subject: [PATCH 26/85] feat: dijkstra --- test.js | 5 ----- 1 file changed, 5 deletions(-) delete mode 100644 test.js diff --git a/test.js b/test.js deleted file mode 100644 index fae69c6c..00000000 --- a/test.js +++ /dev/null @@ -1,5 +0,0 @@ -var g = new Graph(); - -g.graph(); // return undefined -g.setGraph("graph-label"); -g.graph(); // return "graph-label" \ No newline at end of file From 9def389e63065cc0f1be17447abc1c80d11305d6 Mon Sep 17 00:00:00 2001 From: Wenxuan Feng <279357596@qq.com> Date: Sun, 27 Mar 2022 18:40:15 +0800 Subject: [PATCH 27/85] feat: new --- ReadMe-CN.md | 172 ++++++++++++++++++++++++++++++- static/dijkstraAll.png | Bin 0 -> 22103 bytes static/minimum_spanning_tree.png | Bin 0 -> 16020 bytes static/postorder.png | Bin 0 -> 14805 bytes static/preorder.png | Bin 0 -> 14805 bytes static/prim-input.png | Bin 0 -> 25990 bytes static/tarjan.png | Bin 0 -> 30667 bytes static/topsort.png | Bin 0 -> 11142 bytes test.js | 0 9 files changed, 171 insertions(+), 1 deletion(-) create mode 100644 static/dijkstraAll.png create mode 100644 static/minimum_spanning_tree.png create mode 100644 static/postorder.png create mode 100644 static/preorder.png create mode 100644 static/prim-input.png create mode 100644 static/tarjan.png create mode 100644 static/topsort.png create mode 100644 test.js diff --git a/ReadMe-CN.md b/ReadMe-CN.md index f5f6cd74..1a9b321c 100644 --- a/ReadMe-CN.md +++ b/ReadMe-CN.md @@ -5,6 +5,12 @@ [TOC] +# 安装 +## npm Install +```shell +$ npm install @dagrejs/graphlib +``` + # 介绍 `Graphlib`是一个JavaScript Lib库,为无向和有向多变图提供数据结构,以及可以一起使用的算法。 @@ -342,4 +348,168 @@ graphlib.alg.dijkstra(g, "A", weight); // D: { distance: 2, predecessor: 'A' }, // E: { distance: 8, predecessor: 'F' }, // F: { distance: 4, predecessor: 'D' } } -``` \ No newline at end of file +``` + +## alg.dijkstraAll(graph, weightFn, edgeFn) +此函数用于查找从每个节点到其他每个可到达节点到最短距离。 +与`alg.dijkstra`类似,但返回的不是单个数组,而是返回一个map映射: `source -> alg.dijkstra(g, source, weightFn, edgeFn)` + +函数的`weightFn`返回边`e`的权重。如果没有指定,则默认为1。如果可遍历的边有负数,则会立即抛出错误。 + +函数的`edgeFn(u)`返回所有与节点`u`有关的边的id,以便于进行最短路径的遍历。默认使用`g.outEdges`。 + +例子: + + +```js +function weight(e) { return g.edge(e); } + +graphlib.alg.dijkstraAll(g, function(e) { return g.edge(e); }); + +// => { A: +// { A: { distance: 0 }, +// B: { distance: 6, predecessor: 'C' }, +// C: { distance: 4, predecessor: 'A' }, +// D: { distance: 2, predecessor: 'A' }, +// E: { distance: 8, predecessor: 'F' }, +// F: { distance: 4, predecessor: 'D' } }, +// B: +// { A: { distance: Infinity }, +// B: { distance: 0 }, +// C: { distance: Infinity }, +// D: { distance: Infinity }, +// E: { distance: 6, predecessor: 'B' }, +// F: { distance: Infinity } }, +// C: { ... }, +// D: { ... }, +// E: { ... }, +// F: { ... } } +``` + +## alg.findCycles(graph) +假定存在一个图`g`,此函数将会返回图中循环的部分。 + +由于图中不止有1个循环,所以该函数返回有循环体所构成的数组,而每个循环体由涉及的节点id构成。 + +如果要判断图是否有循环部分,请使用`g.isAcyclic`则更为高效。 + +```js +var g = new graphlib.Graph(); +g.setNode(1); +g.setNode(2); +g.setNode(3); +g.setEdge(1, 2); +g.setEdge(2, 3); + +graphlib.alg.findCycles(g); +// => [] + +g.setEdge(3, 1); +graphlib.alg.findCycles(g); +// => [ [ '3', '2', '1' ] ] + +g.setNode(4); +g.setNode(5); +g.setEdge(4, 5); +g.setEdge(5, 4); +graphlib.alg.findCycles(g); +// => [ [ '3', '2', '1' ], [ '5', '4' ] ] +``` + +## alg.isAcyclic(graph) +给定一个图`g`,如果该图有循环的部分,则返回`true`。否则,返回`false`。 + +该函数会返回检测到的第一个循环体。如果要获取全部内容,请使用`alg.findCycles`。 + +```js +var g = new graphlib.Graph(); +g.setNode(1); +g.setNode(2); +g.setNode(3); +g.setEdge(1, 2); +g.setEdge(2, 3); + +graphlib.alg.isAcyclic(g); +// => true + +g.setEdge(3, 1); +graphlib.alg.isAcyclic(g); +// => false +``` + +## alg.postorder(graph, vs) +该函数将会从图像g的节点vs开始,进行后序遍历。 + +对于访问的每个节点,假定节点名为`v`,将会调用`callback(v)`。 + +```js +graphlib.alg.postorder(g, "A"); +// => One of: +// [ "B", "D", "E", C", "A" ] +// [ "B", "E", "D", C", "A" ] +// [ "D", "E", "C", B", "A" ] +// [ "E", "D", "C", B", "A" ] +``` + +## alg.preorder(graph, vs) +该函数将会从图像g的节点vs开始,进行前序遍历。 +对于访问的每个节点,假定节点名为`v`,将会调用`callback(v)`。 + +```js +graphlib.alg.preorder(g, "A"); +// => One of: +// [ "A", "B", "C", "D", "E" ] +// [ "A", "B", "C", "E", "D" ] +// [ "A", "C", "D", "E", "B" ] +// [ "A", "C", "E", "D", "B" ] +``` + +## alg.prim(graph, weightFn) +Prim算法采用连通无向图,并生成最小生成树。 +[Prim's algorithm](https://en.wikipedia.org/wiki/Prim's_algorithm). + +该函数将会以无向图的形式返回最小生成树。这个算法取自《算法导论》。 + +weightFn(e)将会返回边的权重e,如果图没有被联通,则会抛出异常。 + + +```js +function weight(e) { return g(e); } +graphlib.alg.prim(g, weight); +``` + +返回的树,以图的形式展现: + + +## alg.tarjan(graph) +[Tarjan's algorithm](http://en.wikipedia.org/wiki/Tarjan's_strongly_connected_components_algorithm) + +该函数是Tarjan算法的一个实现,该算法在有向图g中找到所有[强连通分量](http://en.wikipedia.org/wiki/Strongly_connected_component) + +每个强连通分量由节点组成,这些节点可以通过定向边到达分量中的所有其他节点。 + +如果一个强连接的组件既不能到达图中的任何其他特定节点,也不能被该节点访问,则该组件可以由单个节点组成。多个节点的组件要保证至少有一个循环。 + +此函数将会返回一个组件数组。每个组件本身也是一个数组,并且包含了组件内所有节点的id。 + +```js +graphlib.alg.tarjan(g); +// => [ [ 'F', 'G' ], +// [ 'H', 'D', 'C' ], +// [ 'E', 'B', 'A' ] ] +``` + +## alg.topsort(graph) +[topological sorting](https://en.wikipedia.org/wiki/Topological_sorting) + +topological 排序算法的实现。 + +给定一个图`g`,该函数返回一个节点数组,使得每个边`u -> v`, u出现在v之前。 +如果图有循环,则不可能生成列表,并抛出异常。 + + +```js +graphlib.alg.topsort(g) +// [ '1', '2', '3', '4' ] or [ '1', '3', '2', '4' ] +``` + diff --git a/static/dijkstraAll.png b/static/dijkstraAll.png new file mode 100644 index 0000000000000000000000000000000000000000..4494dac5fcfcab273ef497bdaf2a4de604ffc821 GIT binary patch literal 22103 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 EKdr2fhX4Qo literal 0 HcmV?d00001 diff --git a/static/tarjan.png b/static/tarjan.png new file mode 100644 index 0000000000000000000000000000000000000000..4e5b3c724d74ee6a5ccc5cc9fcea22e3c3ce3cc0 GIT binary patch literal 30667 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 Date: Sun, 27 Mar 2022 18:41:33 +0800 Subject: [PATCH 28/85] feat: commit --- ReadMe-CN.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ReadMe-CN.md b/ReadMe-CN.md index 1a9b321c..f9bb7b93 100644 --- a/ReadMe-CN.md +++ b/ReadMe-CN.md @@ -1,5 +1,5 @@ # 进度 -- [ ] 翻译 [API](https://github.com/dagrejs/graphlib/wiki/API-Reference) - 2022/03/23 21:06 +- [x] 翻译 [API](https://github.com/dagrejs/graphlib/wiki/API-Reference) - 2022/03/23 21:06 > 中文 | [English](ReadMe.md) From 09c2f1f6ba351a68ef7979d9b960e4f3223c0ffe Mon Sep 17 00:00:00 2001 From: Wenxuan Feng <279357596@qq.com> Date: Sun, 27 Mar 2022 18:42:35 +0800 Subject: [PATCH 29/85] feat: new --- README-EN.md | 24 +++ README.md | 8 +- ReadMe-CN.md | 515 --------------------------------------------------- 3 files changed, 28 insertions(+), 519 deletions(-) create mode 100644 README-EN.md delete mode 100644 ReadMe-CN.md diff --git a/README-EN.md b/README-EN.md new file mode 100644 index 00000000..31fd3f9b --- /dev/null +++ b/README-EN.md @@ -0,0 +1,24 @@ +> English | [中文](ReadMe.md) + +# Important! + +**This project does not have a maintainer or active project members. There won’t be any support or attention to pull requests. Please do not contact previous maintainers unless you are qualified and have the resources to make a serious commitment to fully take over ownership of the project.** + + + +# Graphlib + +Graphlib is a JavaScript library that provides data structures for undirected +and directed multi-graphs along with algorithms that can be used with them. + +[![Build Status](https://secure.travis-ci.org/dagrejs/graphlib.svg)](http://travis-ci.org/dagrejs/graphlib) + +To learn more [see our Wiki](https://github.com/cpettitt/graphlib/wiki). + +# License + +Graphlib is licensed under the terms of the MIT License. See the +[LICENSE](LICENSE) file +for details. + +[npm package manager]: http://npmjs.org/ diff --git a/README.md b/README.md index 98192efe..8529929d 100644 --- a/README.md +++ b/README.md @@ -13,8 +13,8 @@ There are 2 versions on NPM, but only [the one in the DagreJs org](https://www.n # License -Graphlib is licensed under the terms of the MIT License. See the -[LICENSE](LICENSE) file -for details. +```js +graphlib.alg.topsort(g) +// [ '1', '2', '3', '4' ] or [ '1', '3', '2', '4' ] +``` -[npm package manager]: http://npmjs.org/ diff --git a/ReadMe-CN.md b/ReadMe-CN.md deleted file mode 100644 index f9bb7b93..00000000 --- a/ReadMe-CN.md +++ /dev/null @@ -1,515 +0,0 @@ -# 进度 -- [x] 翻译 [API](https://github.com/dagrejs/graphlib/wiki/API-Reference) - 2022/03/23 21:06 - -> 中文 | [English](ReadMe.md) - -[TOC] - -# 安装 -## npm Install -```shell -$ npm install @dagrejs/graphlib -``` - -# 介绍 -`Graphlib`是一个JavaScript Lib库,为无向和有向多变图提供数据结构,以及可以一起使用的算法。 - -[![Build Status](https://secure.travis-ci.org/dagrejs/graphlib.svg)](http://travis-ci.org/dagrejs/graphlib) - -更多学习内容, 查看[wiki](https://github.com/cpettitt/graphlib/wiki)。 - -# API 指南 -本部分主要阐述graphlib的概念并提供API指南。默认情况下,graphlib函数和对象暴露在graphlib的命名空间下。 - -# 图像概念 -Graphlib有一种图类型: Graph。 -创建一个新的实例: -```js -var g = new Graph(); -``` -默认情况下,将会创建一个不允许多边或者复合节点的有向图。以下则是参数选项: -- `directed`:设置为`true`时, 得到一个有向图。`false`时, 得到一个无向图。无向图不会把节点的顺序视为第一要务。换句话说, 对无向图来说`g.edge("a", "b") === g.edge("b", "a")`。默认为`true` -- `multigraph`: 设置为`true`时, 允许图像在同一对节点之间有多条边。默认: `false`。 -- `compound`: 设置为`true`时, 允许图像有复合节点。 可以是其他节点的父节点。 默认为`false`。 - -可以在constructor中通过对象配置属性。比如,创建一个有向复合多边图: -```js -var g = new Graph({ directed: true, compound: true, multigraph: true }); -``` - -# 展现节点和边线 -在graphlib中,节点由用户提供的字符串id表示。 所有节点相关的函数都使用此字符串id作为唯一标识节点的方式。以下为与节点交互的例子: -```js -var g = new Graph(); -g.setNode("my-id", "my-label"); - -g.node("my-id"); // return "my-label" -``` - -graphlib中的边由他们连接的节点标识。比如: -```js -var g = new Graph(); - -g.setEdge("source", "target", "my-label"); -g.edge("source", "target"); // return my-label -``` - -但是,为了进行各种类型的边缘查询,我们需要一种方法去唯一标识单个对象里的边。(比如:[outEdges](https://github.com/dagrejs/graphlib/wiki/API-Reference#outEdges))。我们使用`edgeObj`应对,而此主要由以下组成: -- `v`: 源id或者是边线上的尾节点。 -- `w`: 目标id或者是边线上的头节点。 -- `name`(可选): 唯一标识多边边线([multi-edge](https://github.com/dagrejs/graphlib/wiki/API-Reference#multigraphs))的名称。 - -任何采用了一个边线id的边缘函数也可以使用`edgeObj`: -```js -var g = new Graph(); - -g.setEdge("source", "target", "my-label") -g.edge({ v: "source", w: "target" }); // return my-label -``` - -# Multigraphs -multigraphs的数学概念: [multigraph](https://en.wikipedia.org/wiki/Multigraph) - - -多重图是一种在一对节点中可以拥有多条边的图。默认情况下, graphlib的图像不是多重图, 需要在构造体中设置多重图的属性为`true`: -```js -var g = new Graph({ multigraph: true }) -``` -在两个节点由多条边的情况下,我们需要相同的办法去识别每一条边。 我们称这样的属性为`name`。 这有关于相同节点之间的几条边的例子: -```js -var g = new Graph({ multigraph: true }) - -g.setEdge("a", "b", "edge1-label", "edge1") -g.setEdge("a", "b", "edge2-label", "edge2") - -g.edge("a", "b", "edge1") -g.edge("a", "b", "edge2") - -g.edges() -/** - * return [ - * { v: "a", w: "b", name: "edge1" }, - * { v: "a", w: "b", name: "edge2" } - * ] - */ -``` - -多重图也允许创建没有名字的一条边 -```js -var g = new Graph({ multigraph: true }) - -g.setEdge("a", "b", "my-label") -g.edge({ v: "a", w: "b" }) -``` - -# 复合图 -复合图就是一个节点可以是其他节点的父节点。子节点组成一个"子图"。 以下例子为构建一个复合图并与之交互: -```js -var g = new Graph({ compound: true }); - -g.setParent("a", "parent"); -g.setParent("b", "parent"); - -g.parent("a"); // returns "parent" -g.parent("b"); // returns "parent" - -g.parent("parent"); // returns undefined -``` - -# 默认标签 -当一个节点或边没有创建标签时,会被默认分配一个标签。详情请看这两个API: -- [setDefaultNodeLabel](https://github.com/dagrejs/graphlib/wiki/API-Reference#setDefaultNodeLabel) -- [setDefaultEdgeLabel](https://github.com/dagrejs/graphlib/wiki/API-Reference#setDefaultEdgeLabel) - -# Graph API - -## graph.isDirected() -如果图是有向图的话,会返回`true`。 -有向图会将在线段里的节点顺序是做有意义的,而无向图则会忽视。以下例子证明了不同: -```js -var directed = new Graph({ directed: true }); - -directed.setEdge("a", "b", "my-label"); -directed.edge("a", "b"); // returns my-label -directed.edge("b", "a"); // returns undefined - -var undirected = new Graph({ directed: false }); -undirected.setEdge("a", "b", "my-label"); -undirected.edge("a", "b"); // returns my-label -undirected.edge("b", "a"); // returns my-label -``` - -## graph.isMultigraph() -如果图是多重图,返回`true`。[Multigraph](https://github.com/dagrejs/graphlib/wiki/API-Reference#multigraphs) - -## graph.isCompound() -如果是复合图,返回`true`。[compound](https://github.com/dagrejs/graphlib/wiki/API-Reference#compound-graphs) - -## graph.graph() -返回为图形分配的标签。 如果没有指定标签,则返回`undefined`。 -```js -var g = new Graph(); - -g.graph(); // return undefined -g.setGraph("graph-label"); -g.graph(); // return "graph-label" -``` - -## graph.setGraph(label) -为图像设置标签。 - -## graph.nodeCount() -返回图像中节点的数量。 - -## graph.edgeCount() -返回节点中边线的数量。 - -## graph.setDefaultNodeLabel(val) -设置一个新的默认值,以便于在没有指定标签创建节点时,分配过去。 -如果`val`不是一个函数,将会作为标签分配。 -如果是一个函数, 正被创建的节点的id将会调用此函数。 - -## graph.setDefaultEdgeLabel(val) -为没有分配标签的线段指定一个新的默认标签。 -如果`val`不是函数,则作为标签。 -如果是函数,则会随着参数`(v, w, name)`而被调用。 - -## graph.nodes() -返回图像里的所有节点id。 -使用[node(v)](https://github.com/dagrejs/graphlib/wiki/API-Reference#node)获取每个节点的标签,花费`O(|v|)`的时间。 - -## graph.edges() -返回图中的每个边线的[edgeObj](https://github.com/dagrejs/graphlib/wiki/API-Reference#node-and-edge-representation)。 -使用[edge(edgeObj)](https://github.com/dagrejs/graphlib/wiki/API-Reference#edge)获取每个边线的标签。花费`O(|v|)`的时间。 - -## graph.sources() -返回图中没有入边的节点。 - -## graph.sinks() -返回途中没有出边的节点。 - -## graph.hasNode(v) -如果图里存在节点的id为`v`,则返回`true`。 - -## graph.node(v) -如果图中存在id为`v`的节点,则返回指定的标签,否则返回`undefined`。 - -## graph.setNode(v, [label]) -在图中创建或更新节点v的值。 如果提供了label,则更新掉。如果没有提供,在创建过程中会分配一个默认的标签。[default node label](https://github.com/dagrejs/graphlib/wiki/API-Reference#default-labels)。 - -返回图,允许图和其他的函数连接起来。 - -## graph.removeNode(v) -移除图中id为`v`的节点,如果不存在则不处理。如果节点被移除,也会移除所有边。 -返回图,允许图和其他的函数连接起来。 - -## graph.predecessors(v) -返回指定节点的所有前导节点,如果图中不存在此节点,则返回`undefined`. 如果是无向图,则会返回`undefined`,应该使用[neighbors](https://github.com/dagrejs/graphlib/wiki/API-Reference#neighbors)。 - -## graph.successors(v) -返回指定节点的所有后续节点。如果图中没有此节点,则返回`undefined`. 如果是无向图,则会返回`undefined`,应该使用[neighbors](https://github.com/dagrejs/graphlib/wiki/API-Reference#neighbors)。 - -## graph.neighbors(v) -返回指定节点的前导节点或者后续节点。如果图中没有此节点,则返回`undefined`。 - -## graph.inEdges(v, [u]) -返回所有指向节点(v)的边。 可以过滤出只来自于节点u的边。 -对无向图来说都是`undefined`,请使用[nodeEdges](https://github.com/dagrejs/graphlib/wiki/API-Reference#nodeEdges)。 -如果图中没有节点`v`,则返回`undefined`。 - - -## graph.outEdges(v, [w]) -返回所有指向节点的边。可以过滤出只指向节点w的边。 -对无向图来说都是`undefined`,请使用[nodeEdges](https://github.com/dagrejs/graphlib/wiki/API-Reference#nodeEdges)。 -如果图中没有节点`v`,则返回`undefined`。 - -## graph.nodeEdges(v, [w]) -返回所有与节点v有关的边,而不管方向。 -可以过滤出节点v和w之间的所有线段,无论方向。 -如果图中没有节点`v`,则返回`undefined`。 - -## graph.parent(v) -返回节点v的父节点。 -如果节点没有父节点或不在图中,则返回`undefined`。 -如果不是复合图的话,始终返回`undefined`。 - -## graph.children(v) -返回节点v的所有孩子节点。 -如果不在图中则返回`undefined`。 -如果不是复合图,始终返回`[]`。 - -## graph.setParent(v, parent) -如果`parent`有值,则设置为节点v的父节点; 如果没有值,则移除节点v的父节点。 -如果图不是复合图,则抛出异常。 -返回值为图本身,允许被连接到其他的函数内。 - -## graph.hasEdge(v, w, [name]) / graph.hasEdge(edgeObj) -如果图中的节点v和节点w之间存在一条边,名字为`name`,则返回`true`。 -[name]参数只适用于多重图。 -对于无向图来说,v和w可以互换位置。 - -## graph.edge(v, w, [name]) / graph.edge(edgeObj) -如果图中节点v和w之间存在线段,并带有可选名称,则返回线段(v,w)的标签。 -如果图中没有这条线,则返回`undefined`。 -参数[name]只适用于多重图。 -无向图中,v,w可以互换。 - -## graph.setEdge(v, w, [label], [name]) / graph.setEdge(edgeObj, [label]) -使用参数[name]去创建或更新(v,w)的边。 -如果提供了[label],则将其设置为边的值。而如果没有被提供,则将分配给默认的标签。 -参数[name]只适用于多重图。 -返回值为图本身,允许被连接到其他的函数内。 - -## graph.removeEdge(v, w, [name]) -如果图中的节点v,w之间有一条可选名[name]的边,则移除它。否则将无效。 -参数[name]只适用于多重图。 -无向图中,v,w可以互换。 - - -# 序列化 -## json.write(g) -创建可以用JSON序列化为字符串的图形的JSONrepresentation。稍后可以使用[json-read](https://github.com/dagrejs/graphlib/wiki/API-Reference#json-read)恢复图形。 - -```js -var g = new graphlib.Graph(); -g.setNode("a", { label: "node a" }); -g.setNode("b", { label: "node b" }); -g.setEdge("a", "b", { label: "edge a->b" }); -graphlib.json.write(g); -// Returns the object: -// -// { -// "options": { -// "directed": true, -// "multigraph": false, -// "compound": false -// }, -// "nodes": [ -// { "v": "a", "value": { "label": "node a" } }, -// { "v": "b", "value": { "label": "node b" } } -// ], -// "edges": [ -// { "v": "a", "w": "b", "value": { "label": "edge a->b" } } -// ] -// } -``` - -## json.read(json) -将输入的json转换为图像的展示类型。比如,我们使用`json-write`将图像序列化为`str`的字符串,我们可以使用以下的办法去恢复: -```js -var g2 = graphlib.json.read(JSON.parse(str)); -// or, in order to copy the graph -var g3 = graphlib.json.read(graphlib.json.write(g)) - -g2.nodes(); -// ['a', 'b'] -g2.edges() -// [ { v: 'a', w: 'b' } ] -``` - -# 算法 -## alg.components(graph) -找到图中所有的连接部分,并且将这些部分作为数组返回。 -每个组件本身就是一个数组,包含组件中节点id。 - -```js -graphlib.alg.components(g); -// => [ [ 'A', 'B', 'C', 'D' ], -// [ 'E', 'F', 'G' ], -// [ 'H', 'I' ] ] -``` - -## alg.dijkstra(graph, source, weightFn, edgeFn) -此算法是[Dijkstra]算法的js版本. 旨在从g的源节点到其他任意节点的最短路径。 - -这个函数将会返回一个map结构: -`v -> { distance, predecessor }` - -distance属性会保存从source到v的最短路径权重之和。 -如果从source过来没有路径,则结果为正无穷大。 - -predecessor属性可以按照相反顺序遍历source到v的每个元素。 - -根据`weightFn(e)`来返回边e的权重。如果没有赋值,默认的每条边的权重是1. -如果任何遍历的边具有负边权重,则此函数将抛出错误。 - -edgeFn(v)会返回与节点v相关的所有边的ID,以便进行最短路径遍历。默认使用`g.outEdges`。 - -例子: - - -```js -function weight(e) { return g.edge(e); } - -graphlib.alg.dijkstra(g, "A", weight); -// => { A: { distance: 0 }, -// B: { distance: 6, predecessor: 'C' }, -// C: { distance: 4, predecessor: 'A' }, -// D: { distance: 2, predecessor: 'A' }, -// E: { distance: 8, predecessor: 'F' }, -// F: { distance: 4, predecessor: 'D' } } -``` - -## alg.dijkstraAll(graph, weightFn, edgeFn) -此函数用于查找从每个节点到其他每个可到达节点到最短距离。 -与`alg.dijkstra`类似,但返回的不是单个数组,而是返回一个map映射: `source -> alg.dijkstra(g, source, weightFn, edgeFn)` - -函数的`weightFn`返回边`e`的权重。如果没有指定,则默认为1。如果可遍历的边有负数,则会立即抛出错误。 - -函数的`edgeFn(u)`返回所有与节点`u`有关的边的id,以便于进行最短路径的遍历。默认使用`g.outEdges`。 - -例子: - - -```js -function weight(e) { return g.edge(e); } - -graphlib.alg.dijkstraAll(g, function(e) { return g.edge(e); }); - -// => { A: -// { A: { distance: 0 }, -// B: { distance: 6, predecessor: 'C' }, -// C: { distance: 4, predecessor: 'A' }, -// D: { distance: 2, predecessor: 'A' }, -// E: { distance: 8, predecessor: 'F' }, -// F: { distance: 4, predecessor: 'D' } }, -// B: -// { A: { distance: Infinity }, -// B: { distance: 0 }, -// C: { distance: Infinity }, -// D: { distance: Infinity }, -// E: { distance: 6, predecessor: 'B' }, -// F: { distance: Infinity } }, -// C: { ... }, -// D: { ... }, -// E: { ... }, -// F: { ... } } -``` - -## alg.findCycles(graph) -假定存在一个图`g`,此函数将会返回图中循环的部分。 - -由于图中不止有1个循环,所以该函数返回有循环体所构成的数组,而每个循环体由涉及的节点id构成。 - -如果要判断图是否有循环部分,请使用`g.isAcyclic`则更为高效。 - -```js -var g = new graphlib.Graph(); -g.setNode(1); -g.setNode(2); -g.setNode(3); -g.setEdge(1, 2); -g.setEdge(2, 3); - -graphlib.alg.findCycles(g); -// => [] - -g.setEdge(3, 1); -graphlib.alg.findCycles(g); -// => [ [ '3', '2', '1' ] ] - -g.setNode(4); -g.setNode(5); -g.setEdge(4, 5); -g.setEdge(5, 4); -graphlib.alg.findCycles(g); -// => [ [ '3', '2', '1' ], [ '5', '4' ] ] -``` - -## alg.isAcyclic(graph) -给定一个图`g`,如果该图有循环的部分,则返回`true`。否则,返回`false`。 - -该函数会返回检测到的第一个循环体。如果要获取全部内容,请使用`alg.findCycles`。 - -```js -var g = new graphlib.Graph(); -g.setNode(1); -g.setNode(2); -g.setNode(3); -g.setEdge(1, 2); -g.setEdge(2, 3); - -graphlib.alg.isAcyclic(g); -// => true - -g.setEdge(3, 1); -graphlib.alg.isAcyclic(g); -// => false -``` - -## alg.postorder(graph, vs) -该函数将会从图像g的节点vs开始,进行后序遍历。 - -对于访问的每个节点,假定节点名为`v`,将会调用`callback(v)`。 - -```js -graphlib.alg.postorder(g, "A"); -// => One of: -// [ "B", "D", "E", C", "A" ] -// [ "B", "E", "D", C", "A" ] -// [ "D", "E", "C", B", "A" ] -// [ "E", "D", "C", B", "A" ] -``` - -## alg.preorder(graph, vs) -该函数将会从图像g的节点vs开始,进行前序遍历。 -对于访问的每个节点,假定节点名为`v`,将会调用`callback(v)`。 - -```js -graphlib.alg.preorder(g, "A"); -// => One of: -// [ "A", "B", "C", "D", "E" ] -// [ "A", "B", "C", "E", "D" ] -// [ "A", "C", "D", "E", "B" ] -// [ "A", "C", "E", "D", "B" ] -``` - -## alg.prim(graph, weightFn) -Prim算法采用连通无向图,并生成最小生成树。 -[Prim's algorithm](https://en.wikipedia.org/wiki/Prim's_algorithm). - -该函数将会以无向图的形式返回最小生成树。这个算法取自《算法导论》。 - -weightFn(e)将会返回边的权重e,如果图没有被联通,则会抛出异常。 - - -```js -function weight(e) { return g(e); } -graphlib.alg.prim(g, weight); -``` - -返回的树,以图的形式展现: - - -## alg.tarjan(graph) -[Tarjan's algorithm](http://en.wikipedia.org/wiki/Tarjan's_strongly_connected_components_algorithm) - -该函数是Tarjan算法的一个实现,该算法在有向图g中找到所有[强连通分量](http://en.wikipedia.org/wiki/Strongly_connected_component) - -每个强连通分量由节点组成,这些节点可以通过定向边到达分量中的所有其他节点。 - -如果一个强连接的组件既不能到达图中的任何其他特定节点,也不能被该节点访问,则该组件可以由单个节点组成。多个节点的组件要保证至少有一个循环。 - -此函数将会返回一个组件数组。每个组件本身也是一个数组,并且包含了组件内所有节点的id。 - -```js -graphlib.alg.tarjan(g); -// => [ [ 'F', 'G' ], -// [ 'H', 'D', 'C' ], -// [ 'E', 'B', 'A' ] ] -``` - -## alg.topsort(graph) -[topological sorting](https://en.wikipedia.org/wiki/Topological_sorting) - -topological 排序算法的实现。 - -给定一个图`g`,该函数返回一个节点数组,使得每个边`u -> v`, u出现在v之前。 -如果图有循环,则不可能生成列表,并抛出异常。 - - -```js -graphlib.alg.topsort(g) -// [ '1', '2', '3', '4' ] or [ '1', '3', '2', '4' ] -``` - From 800dc925d284e3be0da894aaa332d4814e35c31b Mon Sep 17 00:00:00 2001 From: moxi Date: Mon, 21 Aug 2023 02:27:19 +0800 Subject: [PATCH 30/85] feat: rename readme --- README-EN.md | 24 --- README_ZH.md | 515 +++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 515 insertions(+), 24 deletions(-) delete mode 100644 README-EN.md create mode 100644 README_ZH.md diff --git a/README-EN.md b/README-EN.md deleted file mode 100644 index 31fd3f9b..00000000 --- a/README-EN.md +++ /dev/null @@ -1,24 +0,0 @@ -> English | [中文](ReadMe.md) - -# Important! - -**This project does not have a maintainer or active project members. There won’t be any support or attention to pull requests. Please do not contact previous maintainers unless you are qualified and have the resources to make a serious commitment to fully take over ownership of the project.** - - - -# Graphlib - -Graphlib is a JavaScript library that provides data structures for undirected -and directed multi-graphs along with algorithms that can be used with them. - -[![Build Status](https://secure.travis-ci.org/dagrejs/graphlib.svg)](http://travis-ci.org/dagrejs/graphlib) - -To learn more [see our Wiki](https://github.com/cpettitt/graphlib/wiki). - -# License - -Graphlib is licensed under the terms of the MIT License. See the -[LICENSE](LICENSE) file -for details. - -[npm package manager]: http://npmjs.org/ diff --git a/README_ZH.md b/README_ZH.md new file mode 100644 index 00000000..fa18bc39 --- /dev/null +++ b/README_ZH.md @@ -0,0 +1,515 @@ +# 进度 +- [x] 翻译 [API](https://github.com/dagrejs/graphlib/wiki/API-Reference) - 2022/03/23 21:06 + +> 中文 | [English](ReadMe-EN.md) + +[TOC] + +# 安装 +## npm Install +```shell +$ npm install @dagrejs/graphlib +``` + +# 介绍 +`Graphlib`是一个JavaScript Lib库,为无向和有向多变图提供数据结构,以及可以一起使用的算法。 + +[![Build Status](https://secure.travis-ci.org/dagrejs/graphlib.svg)](http://travis-ci.org/dagrejs/graphlib) + +更多学习内容, 查看[wiki](https://github.com/cpettitt/graphlib/wiki)。 + +# API 指南 +本部分主要阐述graphlib的概念并提供API指南。默认情况下,graphlib函数和对象暴露在graphlib的命名空间下。 + +# 图像概念 +Graphlib有一种图类型: Graph。 +创建一个新的实例: +```js +var g = new Graph(); +``` +默认情况下,将会创建一个不允许多边或者复合节点的有向图。以下则是参数选项: +- `directed`:设置为`true`时, 得到一个有向图。`false`时, 得到一个无向图。无向图不会把节点的顺序视为第一要务。换句话说, 对无向图来说`g.edge("a", "b") === g.edge("b", "a")`。默认为`true` +- `multigraph`: 设置为`true`时, 允许图像在同一对节点之间有多条边。默认: `false`。 +- `compound`: 设置为`true`时, 允许图像有复合节点。 可以是其他节点的父节点。 默认为`false`。 + +可以在constructor中通过对象配置属性。比如,创建一个有向复合多边图: +```js +var g = new Graph({ directed: true, compound: true, multigraph: true }); +``` + +# 展现节点和边线 +在graphlib中,节点由用户提供的字符串id表示。 所有节点相关的函数都使用此字符串id作为唯一标识节点的方式。以下为与节点交互的例子: +```js +var g = new Graph(); +g.setNode("my-id", "my-label"); + +g.node("my-id"); // return "my-label" +``` + +graphlib中的边由他们连接的节点标识。比如: +```js +var g = new Graph(); + +g.setEdge("source", "target", "my-label"); +g.edge("source", "target"); // return my-label +``` + +但是,为了进行各种类型的边缘查询,我们需要一种方法去唯一标识单个对象里的边。(比如:[outEdges](https://github.com/dagrejs/graphlib/wiki/API-Reference#outEdges))。我们使用`edgeObj`应对,而此主要由以下组成: +- `v`: 源id或者是边线上的尾节点。 +- `w`: 目标id或者是边线上的头节点。 +- `name`(可选): 唯一标识多边边线([multi-edge](https://github.com/dagrejs/graphlib/wiki/API-Reference#multigraphs))的名称。 + +任何采用了一个边线id的边缘函数也可以使用`edgeObj`: +```js +var g = new Graph(); + +g.setEdge("source", "target", "my-label") +g.edge({ v: "source", w: "target" }); // return my-label +``` + +# Multigraphs +multigraphs的数学概念: [multigraph](https://en.wikipedia.org/wiki/Multigraph) + + +多重图是一种在一对节点中可以拥有多条边的图。默认情况下, graphlib的图像不是多重图, 需要在构造体中设置多重图的属性为`true`: +```js +var g = new Graph({ multigraph: true }) +``` +在两个节点由多条边的情况下,我们需要相同的办法去识别每一条边。 我们称这样的属性为`name`。 这有关于相同节点之间的几条边的例子: +```js +var g = new Graph({ multigraph: true }) + +g.setEdge("a", "b", "edge1-label", "edge1") +g.setEdge("a", "b", "edge2-label", "edge2") + +g.edge("a", "b", "edge1") +g.edge("a", "b", "edge2") + +g.edges() +/** + * return [ + * { v: "a", w: "b", name: "edge1" }, + * { v: "a", w: "b", name: "edge2" } + * ] + */ +``` + +多重图也允许创建没有名字的一条边 +```js +var g = new Graph({ multigraph: true }) + +g.setEdge("a", "b", "my-label") +g.edge({ v: "a", w: "b" }) +``` + +# 复合图 +复合图就是一个节点可以是其他节点的父节点。子节点组成一个"子图"。 以下例子为构建一个复合图并与之交互: +```js +var g = new Graph({ compound: true }); + +g.setParent("a", "parent"); +g.setParent("b", "parent"); + +g.parent("a"); // returns "parent" +g.parent("b"); // returns "parent" + +g.parent("parent"); // returns undefined +``` + +# 默认标签 +当一个节点或边没有创建标签时,会被默认分配一个标签。详情请看这两个API: +- [setDefaultNodeLabel](https://github.com/dagrejs/graphlib/wiki/API-Reference#setDefaultNodeLabel) +- [setDefaultEdgeLabel](https://github.com/dagrejs/graphlib/wiki/API-Reference#setDefaultEdgeLabel) + +# Graph API + +## graph.isDirected() +如果图是有向图的话,会返回`true`。 +有向图会将在线段里的节点顺序是做有意义的,而无向图则会忽视。以下例子证明了不同: +```js +var directed = new Graph({ directed: true }); + +directed.setEdge("a", "b", "my-label"); +directed.edge("a", "b"); // returns my-label +directed.edge("b", "a"); // returns undefined + +var undirected = new Graph({ directed: false }); +undirected.setEdge("a", "b", "my-label"); +undirected.edge("a", "b"); // returns my-label +undirected.edge("b", "a"); // returns my-label +``` + +## graph.isMultigraph() +如果图是多重图,返回`true`。[Multigraph](https://github.com/dagrejs/graphlib/wiki/API-Reference#multigraphs) + +## graph.isCompound() +如果是复合图,返回`true`。[compound](https://github.com/dagrejs/graphlib/wiki/API-Reference#compound-graphs) + +## graph.graph() +返回为图形分配的标签。 如果没有指定标签,则返回`undefined`。 +```js +var g = new Graph(); + +g.graph(); // return undefined +g.setGraph("graph-label"); +g.graph(); // return "graph-label" +``` + +## graph.setGraph(label) +为图像设置标签。 + +## graph.nodeCount() +返回图像中节点的数量。 + +## graph.edgeCount() +返回节点中边线的数量。 + +## graph.setDefaultNodeLabel(val) +设置一个新的默认值,以便于在没有指定标签创建节点时,分配过去。 +如果`val`不是一个函数,将会作为标签分配。 +如果是一个函数, 正被创建的节点的id将会调用此函数。 + +## graph.setDefaultEdgeLabel(val) +为没有分配标签的线段指定一个新的默认标签。 +如果`val`不是函数,则作为标签。 +如果是函数,则会随着参数`(v, w, name)`而被调用。 + +## graph.nodes() +返回图像里的所有节点id。 +使用[node(v)](https://github.com/dagrejs/graphlib/wiki/API-Reference#node)获取每个节点的标签,花费`O(|v|)`的时间。 + +## graph.edges() +返回图中的每个边线的[edgeObj](https://github.com/dagrejs/graphlib/wiki/API-Reference#node-and-edge-representation)。 +使用[edge(edgeObj)](https://github.com/dagrejs/graphlib/wiki/API-Reference#edge)获取每个边线的标签。花费`O(|v|)`的时间。 + +## graph.sources() +返回图中没有入边的节点。 + +## graph.sinks() +返回途中没有出边的节点。 + +## graph.hasNode(v) +如果图里存在节点的id为`v`,则返回`true`。 + +## graph.node(v) +如果图中存在id为`v`的节点,则返回指定的标签,否则返回`undefined`。 + +## graph.setNode(v, [label]) +在图中创建或更新节点v的值。 如果提供了label,则更新掉。如果没有提供,在创建过程中会分配一个默认的标签。[default node label](https://github.com/dagrejs/graphlib/wiki/API-Reference#default-labels)。 + +返回图,允许图和其他的函数连接起来。 + +## graph.removeNode(v) +移除图中id为`v`的节点,如果不存在则不处理。如果节点被移除,也会移除所有边。 +返回图,允许图和其他的函数连接起来。 + +## graph.predecessors(v) +返回指定节点的所有前导节点,如果图中不存在此节点,则返回`undefined`. 如果是无向图,则会返回`undefined`,应该使用[neighbors](https://github.com/dagrejs/graphlib/wiki/API-Reference#neighbors)。 + +## graph.successors(v) +返回指定节点的所有后续节点。如果图中没有此节点,则返回`undefined`. 如果是无向图,则会返回`undefined`,应该使用[neighbors](https://github.com/dagrejs/graphlib/wiki/API-Reference#neighbors)。 + +## graph.neighbors(v) +返回指定节点的前导节点或者后续节点。如果图中没有此节点,则返回`undefined`。 + +## graph.inEdges(v, [u]) +返回所有指向节点(v)的边。 可以过滤出只来自于节点u的边。 +对无向图来说都是`undefined`,请使用[nodeEdges](https://github.com/dagrejs/graphlib/wiki/API-Reference#nodeEdges)。 +如果图中没有节点`v`,则返回`undefined`。 + + +## graph.outEdges(v, [w]) +返回所有指向节点的边。可以过滤出只指向节点w的边。 +对无向图来说都是`undefined`,请使用[nodeEdges](https://github.com/dagrejs/graphlib/wiki/API-Reference#nodeEdges)。 +如果图中没有节点`v`,则返回`undefined`。 + +## graph.nodeEdges(v, [w]) +返回所有与节点v有关的边,而不管方向。 +可以过滤出节点v和w之间的所有线段,无论方向。 +如果图中没有节点`v`,则返回`undefined`。 + +## graph.parent(v) +返回节点v的父节点。 +如果节点没有父节点或不在图中,则返回`undefined`。 +如果不是复合图的话,始终返回`undefined`。 + +## graph.children(v) +返回节点v的所有孩子节点。 +如果不在图中则返回`undefined`。 +如果不是复合图,始终返回`[]`。 + +## graph.setParent(v, parent) +如果`parent`有值,则设置为节点v的父节点; 如果没有值,则移除节点v的父节点。 +如果图不是复合图,则抛出异常。 +返回值为图本身,允许被连接到其他的函数内。 + +## graph.hasEdge(v, w, [name]) / graph.hasEdge(edgeObj) +如果图中的节点v和节点w之间存在一条边,名字为`name`,则返回`true`。 +[name]参数只适用于多重图。 +对于无向图来说,v和w可以互换位置。 + +## graph.edge(v, w, [name]) / graph.edge(edgeObj) +如果图中节点v和w之间存在线段,并带有可选名称,则返回线段(v,w)的标签。 +如果图中没有这条线,则返回`undefined`。 +参数[name]只适用于多重图。 +无向图中,v,w可以互换。 + +## graph.setEdge(v, w, [label], [name]) / graph.setEdge(edgeObj, [label]) +使用参数[name]去创建或更新(v,w)的边。 +如果提供了[label],则将其设置为边的值。而如果没有被提供,则将分配给默认的标签。 +参数[name]只适用于多重图。 +返回值为图本身,允许被连接到其他的函数内。 + +## graph.removeEdge(v, w, [name]) +如果图中的节点v,w之间有一条可选名[name]的边,则移除它。否则将无效。 +参数[name]只适用于多重图。 +无向图中,v,w可以互换。 + + +# 序列化 +## json.write(g) +创建可以用JSON序列化为字符串的图形的JSONrepresentation。稍后可以使用[json-read](https://github.com/dagrejs/graphlib/wiki/API-Reference#json-read)恢复图形。 + +```js +var g = new graphlib.Graph(); +g.setNode("a", { label: "node a" }); +g.setNode("b", { label: "node b" }); +g.setEdge("a", "b", { label: "edge a->b" }); +graphlib.json.write(g); +// Returns the object: +// +// { +// "options": { +// "directed": true, +// "multigraph": false, +// "compound": false +// }, +// "nodes": [ +// { "v": "a", "value": { "label": "node a" } }, +// { "v": "b", "value": { "label": "node b" } } +// ], +// "edges": [ +// { "v": "a", "w": "b", "value": { "label": "edge a->b" } } +// ] +// } +``` + +## json.read(json) +将输入的json转换为图像的展示类型。比如,我们使用`json-write`将图像序列化为`str`的字符串,我们可以使用以下的办法去恢复: +```js +var g2 = graphlib.json.read(JSON.parse(str)); +// or, in order to copy the graph +var g3 = graphlib.json.read(graphlib.json.write(g)) + +g2.nodes(); +// ['a', 'b'] +g2.edges() +// [ { v: 'a', w: 'b' } ] +``` + +# 算法 +## alg.components(graph) +找到图中所有的连接部分,并且将这些部分作为数组返回。 +每个组件本身就是一个数组,包含组件中节点id。 + +```js +graphlib.alg.components(g); +// => [ [ 'A', 'B', 'C', 'D' ], +// [ 'E', 'F', 'G' ], +// [ 'H', 'I' ] ] +``` + +## alg.dijkstra(graph, source, weightFn, edgeFn) +此算法是[Dijkstra]算法的js版本. 旨在从g的源节点到其他任意节点的最短路径。 + +这个函数将会返回一个map结构: +`v -> { distance, predecessor }` + +distance属性会保存从source到v的最短路径权重之和。 +如果从source过来没有路径,则结果为正无穷大。 + +predecessor属性可以按照相反顺序遍历source到v的每个元素。 + +根据`weightFn(e)`来返回边e的权重。如果没有赋值,默认的每条边的权重是1. +如果任何遍历的边具有负边权重,则此函数将抛出错误。 + +edgeFn(v)会返回与节点v相关的所有边的ID,以便进行最短路径遍历。默认使用`g.outEdges`。 + +例子: + + +```js +function weight(e) { return g.edge(e); } + +graphlib.alg.dijkstra(g, "A", weight); +// => { A: { distance: 0 }, +// B: { distance: 6, predecessor: 'C' }, +// C: { distance: 4, predecessor: 'A' }, +// D: { distance: 2, predecessor: 'A' }, +// E: { distance: 8, predecessor: 'F' }, +// F: { distance: 4, predecessor: 'D' } } +``` + +## alg.dijkstraAll(graph, weightFn, edgeFn) +此函数用于查找从每个节点到其他每个可到达节点到最短距离。 +与`alg.dijkstra`类似,但返回的不是单个数组,而是返回一个map映射: `source -> alg.dijkstra(g, source, weightFn, edgeFn)` + +函数的`weightFn`返回边`e`的权重。如果没有指定,则默认为1。如果可遍历的边有负数,则会立即抛出错误。 + +函数的`edgeFn(u)`返回所有与节点`u`有关的边的id,以便于进行最短路径的遍历。默认使用`g.outEdges`。 + +例子: + + +```js +function weight(e) { return g.edge(e); } + +graphlib.alg.dijkstraAll(g, function(e) { return g.edge(e); }); + +// => { A: +// { A: { distance: 0 }, +// B: { distance: 6, predecessor: 'C' }, +// C: { distance: 4, predecessor: 'A' }, +// D: { distance: 2, predecessor: 'A' }, +// E: { distance: 8, predecessor: 'F' }, +// F: { distance: 4, predecessor: 'D' } }, +// B: +// { A: { distance: Infinity }, +// B: { distance: 0 }, +// C: { distance: Infinity }, +// D: { distance: Infinity }, +// E: { distance: 6, predecessor: 'B' }, +// F: { distance: Infinity } }, +// C: { ... }, +// D: { ... }, +// E: { ... }, +// F: { ... } } +``` + +## alg.findCycles(graph) +假定存在一个图`g`,此函数将会返回图中循环的部分。 + +由于图中不止有1个循环,所以该函数返回有循环体所构成的数组,而每个循环体由涉及的节点id构成。 + +如果要判断图是否有循环部分,请使用`g.isAcyclic`则更为高效。 + +```js +var g = new graphlib.Graph(); +g.setNode(1); +g.setNode(2); +g.setNode(3); +g.setEdge(1, 2); +g.setEdge(2, 3); + +graphlib.alg.findCycles(g); +// => [] + +g.setEdge(3, 1); +graphlib.alg.findCycles(g); +// => [ [ '3', '2', '1' ] ] + +g.setNode(4); +g.setNode(5); +g.setEdge(4, 5); +g.setEdge(5, 4); +graphlib.alg.findCycles(g); +// => [ [ '3', '2', '1' ], [ '5', '4' ] ] +``` + +## alg.isAcyclic(graph) +给定一个图`g`,如果该图有循环的部分,则返回`true`。否则,返回`false`。 + +该函数会返回检测到的第一个循环体。如果要获取全部内容,请使用`alg.findCycles`。 + +```js +var g = new graphlib.Graph(); +g.setNode(1); +g.setNode(2); +g.setNode(3); +g.setEdge(1, 2); +g.setEdge(2, 3); + +graphlib.alg.isAcyclic(g); +// => true + +g.setEdge(3, 1); +graphlib.alg.isAcyclic(g); +// => false +``` + +## alg.postorder(graph, vs) +该函数将会从图像g的节点vs开始,进行后序遍历。 + +对于访问的每个节点,假定节点名为`v`,将会调用`callback(v)`。 + +```js +graphlib.alg.postorder(g, "A"); +// => One of: +// [ "B", "D", "E", C", "A" ] +// [ "B", "E", "D", C", "A" ] +// [ "D", "E", "C", B", "A" ] +// [ "E", "D", "C", B", "A" ] +``` + +## alg.preorder(graph, vs) +该函数将会从图像g的节点vs开始,进行前序遍历。 +对于访问的每个节点,假定节点名为`v`,将会调用`callback(v)`。 + +```js +graphlib.alg.preorder(g, "A"); +// => One of: +// [ "A", "B", "C", "D", "E" ] +// [ "A", "B", "C", "E", "D" ] +// [ "A", "C", "D", "E", "B" ] +// [ "A", "C", "E", "D", "B" ] +``` + +## alg.prim(graph, weightFn) +Prim算法采用连通无向图,并生成最小生成树。 +[Prim's algorithm](https://en.wikipedia.org/wiki/Prim's_algorithm). + +该函数将会以无向图的形式返回最小生成树。这个算法取自《算法导论》。 + +weightFn(e)将会返回边的权重e,如果图没有被联通,则会抛出异常。 + + +```js +function weight(e) { return g(e); } +graphlib.alg.prim(g, weight); +``` + +返回的树,以图的形式展现: + + +## alg.tarjan(graph) +[Tarjan's algorithm](http://en.wikipedia.org/wiki/Tarjan's_strongly_connected_components_algorithm) + +该函数是Tarjan算法的一个实现,该算法在有向图g中找到所有[强连通分量](http://en.wikipedia.org/wiki/Strongly_connected_component) + +每个强连通分量由节点组成,这些节点可以通过定向边到达分量中的所有其他节点。 + +如果一个强连接的组件既不能到达图中的任何其他特定节点,也不能被该节点访问,则该组件可以由单个节点组成。多个节点的组件要保证至少有一个循环。 + +此函数将会返回一个组件数组。每个组件本身也是一个数组,并且包含了组件内所有节点的id。 + +```js +graphlib.alg.tarjan(g); +// => [ [ 'F', 'G' ], +// [ 'H', 'D', 'C' ], +// [ 'E', 'B', 'A' ] ] +``` + +## alg.topsort(graph) +[topological sorting](https://en.wikipedia.org/wiki/Topological_sorting) + +topological 排序算法的实现。 + +给定一个图`g`,该函数返回一个节点数组,使得每个边`u -> v`, u出现在v之前。 +如果图有循环,则不可能生成列表,并抛出异常。 + + +```js +graphlib.alg.topsort(g) +// [ '1', '2', '3', '4' ] or [ '1', '3', '2', '4' ] +``` + From 59805a1e15e123607bdfa1d8dab439450815112a Mon Sep 17 00:00:00 2001 From: wenxuan feng <279357596@qq.com> Date: Mon, 21 Aug 2023 19:35:15 +0800 Subject: [PATCH 31/85] Update README.md Keep License --- README.md | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 8529929d..e306cad5 100644 --- a/README.md +++ b/README.md @@ -11,10 +11,15 @@ To learn more [see our Wiki](https://github.com/cpettitt/graphlib/wiki). There are 2 versions on NPM, but only [the one in the DagreJs org](https://www.npmjs.com/package/@dagrejs/graphlib) is receiving updates right now. -# License - ```js graphlib.alg.topsort(g) // [ '1', '2', '3', '4' ] or [ '1', '3', '2', '4' ] ``` +# License + +Graphlib is licensed under the terms of the MIT License. See the +[LICENSE](LICENSE) file +for details. + +[npm package manager]: http://npmjs.org/ From 00d978d61108f45c8f722015d463d2b5fb56bb43 Mon Sep 17 00:00:00 2001 From: wenxuan feng <279357596@qq.com> Date: Mon, 21 Aug 2023 19:36:17 +0800 Subject: [PATCH 32/85] Update and rename README_ZH.md to README_CN.md - Change ReadMe_CN.md --- README_ZH.md => README_CN.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) rename README_ZH.md => README_CN.md (99%) diff --git a/README_ZH.md b/README_CN.md similarity index 99% rename from README_ZH.md rename to README_CN.md index fa18bc39..f9bb7b93 100644 --- a/README_ZH.md +++ b/README_CN.md @@ -1,7 +1,7 @@ # 进度 - [x] 翻译 [API](https://github.com/dagrejs/graphlib/wiki/API-Reference) - 2022/03/23 21:06 -> 中文 | [English](ReadMe-EN.md) +> 中文 | [English](ReadMe.md) [TOC] From 99b4511d10ad196cc769255a09bdac0bf70b9c71 Mon Sep 17 00:00:00 2001 From: wenxuan feng <279357596@qq.com> Date: Mon, 21 Aug 2023 19:36:41 +0800 Subject: [PATCH 33/85] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index e306cad5..9be67a29 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -> English | [中文](ReadMe-CN.md) +> English | [中文](ReadMe_CN.md) # Graphlib Graphlib is a JavaScript library that provides data structures for undirected From c60a15ed504702e1835a569bf59c936d255a35f2 Mon Sep 17 00:00:00 2001 From: wenxuan feng <279357596@qq.com> Date: Mon, 21 Aug 2023 19:37:42 +0800 Subject: [PATCH 34/85] Update README.md - Updated License --- README.md | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/README.md b/README.md index 9be67a29..7d3099c7 100644 --- a/README.md +++ b/README.md @@ -18,8 +18,6 @@ graphlib.alg.topsort(g) # License -Graphlib is licensed under the terms of the MIT License. See the -[LICENSE](LICENSE) file -for details. +Graphlib is licensed under the terms of the MIT License. See the [LICENSE](LICENSE) file for details. [npm package manager]: http://npmjs.org/ From b186e80f86129e73c9a55f02bef96666201d4c9f Mon Sep 17 00:00:00 2001 From: wenxuan feng <279357596@qq.com> Date: Mon, 21 Aug 2023 22:34:14 +0800 Subject: [PATCH 35/85] Update README_CN.md --- README_CN.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README_CN.md b/README_CN.md index f9bb7b93..d8320184 100644 --- a/README_CN.md +++ b/README_CN.md @@ -1,7 +1,7 @@ # 进度 - [x] 翻译 [API](https://github.com/dagrejs/graphlib/wiki/API-Reference) - 2022/03/23 21:06 -> 中文 | [English](ReadMe.md) +> 中文 | [English](README.md) [TOC] From 2e66fb09d898cdbaf8ae4c3959c44b7725634c9c Mon Sep 17 00:00:00 2001 From: moxi Date: Tue, 22 Aug 2023 00:40:14 +0800 Subject: [PATCH 36/85] fix: fix up link --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 7d3099c7..fb9232ee 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -> English | [中文](ReadMe_CN.md) +> English | [中文](README_CN.md) # Graphlib Graphlib is a JavaScript library that provides data structures for undirected From 0123775cfe6078d09c850bca3eacc8f6af33f084 Mon Sep 17 00:00:00 2001 From: David Newell Date: Wed, 23 Aug 2023 09:54:10 +0000 Subject: [PATCH 37/85] Bumping semver --- package.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index fea57832..43d5c942 100644 --- a/package.json +++ b/package.json @@ -40,7 +40,7 @@ "nyc": "^15.1.0", "requirejs": "2.3.6", "seedrandom": "3.0.5", - "semver": "7.3.2", + "semver": "7.5.4", "sprintf": "0.1.5", "uglify-js": "3.17.4" }, @@ -48,4 +48,4 @@ "type": "git", "url": "https://github.com/dagrejs/graphlib.git" } -} \ No newline at end of file +} From 9650a6d3b895d60bb43737db88e9de39fa8d5874 Mon Sep 17 00:00:00 2001 From: David Newell Date: Wed, 23 Aug 2023 09:56:07 +0000 Subject: [PATCH 38/85] Removing the odd code sample from the readme --- README.md | 5 ----- 1 file changed, 5 deletions(-) diff --git a/README.md b/README.md index fb9232ee..a41700b3 100644 --- a/README.md +++ b/README.md @@ -11,11 +11,6 @@ To learn more [see our Wiki](https://github.com/cpettitt/graphlib/wiki). There are 2 versions on NPM, but only [the one in the DagreJs org](https://www.npmjs.com/package/@dagrejs/graphlib) is receiving updates right now. -```js -graphlib.alg.topsort(g) -// [ '1', '2', '3', '4' ] or [ '1', '3', '2', '4' ] -``` - # License Graphlib is licensed under the terms of the MIT License. See the [LICENSE](LICENSE) file for details. From 97084aa9174525bf04f41d502e562cc5d52b71fd Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 18 Oct 2023 22:02:25 +0000 Subject: [PATCH 39/85] Bump @babel/traverse from 7.21.2 to 7.23.2 Bumps [@babel/traverse](https://github.com/babel/babel/tree/HEAD/packages/babel-traverse) from 7.21.2 to 7.23.2. - [Release notes](https://github.com/babel/babel/releases) - [Changelog](https://github.com/babel/babel/blob/main/CHANGELOG.md) - [Commits](https://github.com/babel/babel/commits/v7.23.2/packages/babel-traverse) --- updated-dependencies: - dependency-name: "@babel/traverse" dependency-type: indirect ... Signed-off-by: dependabot[bot] --- package-lock.json | 304 +++++++++++++++++++++++++++++++--------------- 1 file changed, 205 insertions(+), 99 deletions(-) diff --git a/package-lock.json b/package-lock.json index 7c7e5c8d..a94f2700 100644 --- a/package-lock.json +++ b/package-lock.json @@ -25,7 +25,7 @@ "nyc": "^15.1.0", "requirejs": "2.3.6", "seedrandom": "3.0.5", - "semver": "7.3.2", + "semver": "7.5.4", "sprintf": "0.1.5", "uglify-js": "3.17.4" }, @@ -46,11 +46,13 @@ } }, "node_modules/@babel/code-frame": { - "version": "7.18.6", + "version": "7.22.13", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.22.13.tgz", + "integrity": "sha512-XktuhWlJ5g+3TJXc5upd9Ks1HutSArik6jf2eAjYFyIOf4ej3RN+184cZbzDvbPnuTJIUhPKKJE3cIsYTiAT3w==", "dev": true, - "license": "MIT", "dependencies": { - "@babel/highlight": "^7.18.6" + "@babel/highlight": "^7.22.13", + "chalk": "^2.4.2" }, "engines": { "node": ">=6.9.0" @@ -107,11 +109,12 @@ } }, "node_modules/@babel/generator": { - "version": "7.21.1", + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.23.0.tgz", + "integrity": "sha512-lN85QRR+5IbYrMWM6Y4pE/noaQtg4pNiqeNGX60eqOfo6gtEj6uw/JagelB8vVztSd7R6M5n1+PQkDbHbBRU4g==", "dev": true, - "license": "MIT", "dependencies": { - "@babel/types": "^7.21.0", + "@babel/types": "^7.23.0", "@jridgewell/gen-mapping": "^0.3.2", "@jridgewell/trace-mapping": "^0.3.17", "jsesc": "^2.5.1" @@ -160,31 +163,34 @@ } }, "node_modules/@babel/helper-environment-visitor": { - "version": "7.18.9", + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.20.tgz", + "integrity": "sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA==", "dev": true, - "license": "MIT", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-function-name": { - "version": "7.21.0", + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.23.0.tgz", + "integrity": "sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw==", "dev": true, - "license": "MIT", "dependencies": { - "@babel/template": "^7.20.7", - "@babel/types": "^7.21.0" + "@babel/template": "^7.22.15", + "@babel/types": "^7.23.0" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-hoist-variables": { - "version": "7.18.6", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz", + "integrity": "sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==", "dev": true, - "license": "MIT", "dependencies": { - "@babel/types": "^7.18.6" + "@babel/types": "^7.22.5" }, "engines": { "node": ">=6.9.0" @@ -231,28 +237,31 @@ } }, "node_modules/@babel/helper-split-export-declaration": { - "version": "7.18.6", + "version": "7.22.6", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz", + "integrity": "sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==", "dev": true, - "license": "MIT", "dependencies": { - "@babel/types": "^7.18.6" + "@babel/types": "^7.22.5" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-string-parser": { - "version": "7.19.4", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.22.5.tgz", + "integrity": "sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw==", "dev": true, - "license": "MIT", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-validator-identifier": { - "version": "7.19.1", + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz", + "integrity": "sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==", "dev": true, - "license": "MIT", "engines": { "node": ">=6.9.0" } @@ -279,12 +288,13 @@ } }, "node_modules/@babel/highlight": { - "version": "7.18.6", + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.22.20.tgz", + "integrity": "sha512-dkdMCN3py0+ksCgYmGG8jKeGA/8Tk+gJwSYYlFGxG5lmhfKNoAy004YpLxpS1W2J8m/EK2Ew+yOs9pVRwO89mg==", "dev": true, - "license": "MIT", "dependencies": { - "@babel/helper-validator-identifier": "^7.18.6", - "chalk": "^2.0.0", + "@babel/helper-validator-identifier": "^7.22.20", + "chalk": "^2.4.2", "js-tokens": "^4.0.0" }, "engines": { @@ -292,9 +302,10 @@ } }, "node_modules/@babel/parser": { - "version": "7.21.2", + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.23.0.tgz", + "integrity": "sha512-vvPKKdMemU85V9WE/l5wZEmImpCtLqbnTvqDS2U1fJ96KrxoW7KrXhNsNCblQlg8Ck4b85yxdTyelsMUgFUXiw==", "dev": true, - "license": "MIT", "bin": { "parser": "bin/babel-parser.js" }, @@ -303,31 +314,33 @@ } }, "node_modules/@babel/template": { - "version": "7.20.7", + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.22.15.tgz", + "integrity": "sha512-QPErUVm4uyJa60rkI73qneDacvdvzxshT3kksGqlGWYdOTIUOwJ7RDUL8sGqslY1uXWSL6xMFKEXDS3ox2uF0w==", "dev": true, - "license": "MIT", "dependencies": { - "@babel/code-frame": "^7.18.6", - "@babel/parser": "^7.20.7", - "@babel/types": "^7.20.7" + "@babel/code-frame": "^7.22.13", + "@babel/parser": "^7.22.15", + "@babel/types": "^7.22.15" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/traverse": { - "version": "7.21.2", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/code-frame": "^7.18.6", - "@babel/generator": "^7.21.1", - "@babel/helper-environment-visitor": "^7.18.9", - "@babel/helper-function-name": "^7.21.0", - "@babel/helper-hoist-variables": "^7.18.6", - "@babel/helper-split-export-declaration": "^7.18.6", - "@babel/parser": "^7.21.2", - "@babel/types": "^7.21.2", + "version": "7.23.2", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.23.2.tgz", + "integrity": "sha512-azpe59SQ48qG6nu2CzcMLbxUudtN+dOM9kDbUqGq3HXUJRlo7i8fvPoxQUzYgLZ4cMVmuZgm8vvBpNeRhd6XSw==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.22.13", + "@babel/generator": "^7.23.0", + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-function-name": "^7.23.0", + "@babel/helper-hoist-variables": "^7.22.5", + "@babel/helper-split-export-declaration": "^7.22.6", + "@babel/parser": "^7.23.0", + "@babel/types": "^7.23.0", "debug": "^4.1.0", "globals": "^11.1.0" }, @@ -344,12 +357,13 @@ } }, "node_modules/@babel/types": { - "version": "7.21.2", + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.23.0.tgz", + "integrity": "sha512-0oIyUfKoI3mSqMvsxBdclDwxXKXAUA8v/apZbc+iSyARYou1o8ZGDxbUYyLFoW2arqS2jDGqJuZvv1d/io1axg==", "dev": true, - "license": "MIT", "dependencies": { - "@babel/helper-string-parser": "^7.19.4", - "@babel/helper-validator-identifier": "^7.19.1", + "@babel/helper-string-parser": "^7.22.5", + "@babel/helper-validator-identifier": "^7.22.20", "to-fast-properties": "^2.0.0" }, "engines": { @@ -732,8 +746,9 @@ }, "node_modules/ansi-styles": { "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", "dev": true, - "license": "MIT", "dependencies": { "color-convert": "^1.9.0" }, @@ -1254,8 +1269,9 @@ }, "node_modules/chalk": { "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", "dev": true, - "license": "MIT", "dependencies": { "ansi-styles": "^3.2.1", "escape-string-regexp": "^1.0.5", @@ -1340,16 +1356,18 @@ }, "node_modules/color-convert": { "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", "dev": true, - "license": "MIT", "dependencies": { "color-name": "1.1.3" } }, "node_modules/color-name": { "version": "1.1.3", - "dev": true, - "license": "MIT" + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "dev": true }, "node_modules/combine-source-map": { "version": "0.8.0", @@ -2607,8 +2625,9 @@ }, "node_modules/has-flag": { "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", "dev": true, - "license": "MIT", "engines": { "node": ">=4" } @@ -3148,8 +3167,9 @@ }, "node_modules/js-tokens": { "version": "4.0.0", - "dev": true, - "license": "MIT" + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "dev": true }, "node_modules/js-yaml": { "version": "3.13.1", @@ -4818,9 +4838,13 @@ "license": "MIT" }, "node_modules/semver": { - "version": "7.3.2", + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", "dev": true, - "license": "ISC", + "dependencies": { + "lru-cache": "^6.0.0" + }, "bin": { "semver": "bin/semver.js" }, @@ -4828,6 +4852,24 @@ "node": ">=10" } }, + "node_modules/semver/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/semver/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, "node_modules/serialize-javascript": { "version": "6.0.0", "dev": true, @@ -5181,8 +5223,9 @@ }, "node_modules/supports-color": { "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", "dev": true, - "license": "MIT", "dependencies": { "has-flag": "^3.0.0" }, @@ -5699,10 +5742,13 @@ } }, "@babel/code-frame": { - "version": "7.18.6", + "version": "7.22.13", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.22.13.tgz", + "integrity": "sha512-XktuhWlJ5g+3TJXc5upd9Ks1HutSArik6jf2eAjYFyIOf4ej3RN+184cZbzDvbPnuTJIUhPKKJE3cIsYTiAT3w==", "dev": true, "requires": { - "@babel/highlight": "^7.18.6" + "@babel/highlight": "^7.22.13", + "chalk": "^2.4.2" } }, "@babel/compat-data": { @@ -5741,10 +5787,12 @@ } }, "@babel/generator": { - "version": "7.21.1", + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.23.0.tgz", + "integrity": "sha512-lN85QRR+5IbYrMWM6Y4pE/noaQtg4pNiqeNGX60eqOfo6gtEj6uw/JagelB8vVztSd7R6M5n1+PQkDbHbBRU4g==", "dev": true, "requires": { - "@babel/types": "^7.21.0", + "@babel/types": "^7.23.0", "@jridgewell/gen-mapping": "^0.3.2", "@jridgewell/trace-mapping": "^0.3.17", "jsesc": "^2.5.1" @@ -5779,22 +5827,28 @@ } }, "@babel/helper-environment-visitor": { - "version": "7.18.9", + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.20.tgz", + "integrity": "sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA==", "dev": true }, "@babel/helper-function-name": { - "version": "7.21.0", + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.23.0.tgz", + "integrity": "sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw==", "dev": true, "requires": { - "@babel/template": "^7.20.7", - "@babel/types": "^7.21.0" + "@babel/template": "^7.22.15", + "@babel/types": "^7.23.0" } }, "@babel/helper-hoist-variables": { - "version": "7.18.6", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz", + "integrity": "sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==", "dev": true, "requires": { - "@babel/types": "^7.18.6" + "@babel/types": "^7.22.5" } }, "@babel/helper-module-imports": { @@ -5826,18 +5880,24 @@ } }, "@babel/helper-split-export-declaration": { - "version": "7.18.6", + "version": "7.22.6", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz", + "integrity": "sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==", "dev": true, "requires": { - "@babel/types": "^7.18.6" + "@babel/types": "^7.22.5" } }, "@babel/helper-string-parser": { - "version": "7.19.4", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.22.5.tgz", + "integrity": "sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw==", "dev": true }, "@babel/helper-validator-identifier": { - "version": "7.19.1", + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz", + "integrity": "sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==", "dev": true }, "@babel/helper-validator-option": { @@ -5854,39 +5914,47 @@ } }, "@babel/highlight": { - "version": "7.18.6", + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.22.20.tgz", + "integrity": "sha512-dkdMCN3py0+ksCgYmGG8jKeGA/8Tk+gJwSYYlFGxG5lmhfKNoAy004YpLxpS1W2J8m/EK2Ew+yOs9pVRwO89mg==", "dev": true, "requires": { - "@babel/helper-validator-identifier": "^7.18.6", - "chalk": "^2.0.0", + "@babel/helper-validator-identifier": "^7.22.20", + "chalk": "^2.4.2", "js-tokens": "^4.0.0" } }, "@babel/parser": { - "version": "7.21.2", + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.23.0.tgz", + "integrity": "sha512-vvPKKdMemU85V9WE/l5wZEmImpCtLqbnTvqDS2U1fJ96KrxoW7KrXhNsNCblQlg8Ck4b85yxdTyelsMUgFUXiw==", "dev": true }, "@babel/template": { - "version": "7.20.7", + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.22.15.tgz", + "integrity": "sha512-QPErUVm4uyJa60rkI73qneDacvdvzxshT3kksGqlGWYdOTIUOwJ7RDUL8sGqslY1uXWSL6xMFKEXDS3ox2uF0w==", "dev": true, "requires": { - "@babel/code-frame": "^7.18.6", - "@babel/parser": "^7.20.7", - "@babel/types": "^7.20.7" + "@babel/code-frame": "^7.22.13", + "@babel/parser": "^7.22.15", + "@babel/types": "^7.22.15" } }, "@babel/traverse": { - "version": "7.21.2", - "dev": true, - "requires": { - "@babel/code-frame": "^7.18.6", - "@babel/generator": "^7.21.1", - "@babel/helper-environment-visitor": "^7.18.9", - "@babel/helper-function-name": "^7.21.0", - "@babel/helper-hoist-variables": "^7.18.6", - "@babel/helper-split-export-declaration": "^7.18.6", - "@babel/parser": "^7.21.2", - "@babel/types": "^7.21.2", + "version": "7.23.2", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.23.2.tgz", + "integrity": "sha512-azpe59SQ48qG6nu2CzcMLbxUudtN+dOM9kDbUqGq3HXUJRlo7i8fvPoxQUzYgLZ4cMVmuZgm8vvBpNeRhd6XSw==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.22.13", + "@babel/generator": "^7.23.0", + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-function-name": "^7.23.0", + "@babel/helper-hoist-variables": "^7.22.5", + "@babel/helper-split-export-declaration": "^7.22.6", + "@babel/parser": "^7.23.0", + "@babel/types": "^7.23.0", "debug": "^4.1.0", "globals": "^11.1.0" }, @@ -5898,11 +5966,13 @@ } }, "@babel/types": { - "version": "7.21.2", + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.23.0.tgz", + "integrity": "sha512-0oIyUfKoI3mSqMvsxBdclDwxXKXAUA8v/apZbc+iSyARYou1o8ZGDxbUYyLFoW2arqS2jDGqJuZvv1d/io1axg==", "dev": true, "requires": { - "@babel/helper-string-parser": "^7.19.4", - "@babel/helper-validator-identifier": "^7.19.1", + "@babel/helper-string-parser": "^7.22.5", + "@babel/helper-validator-identifier": "^7.22.20", "to-fast-properties": "^2.0.0" } }, @@ -6150,6 +6220,8 @@ }, "ansi-styles": { "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", "dev": true, "requires": { "color-convert": "^1.9.0" @@ -6529,6 +6601,8 @@ }, "chalk": { "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", "dev": true, "requires": { "ansi-styles": "^3.2.1", @@ -6585,6 +6659,8 @@ }, "color-convert": { "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", "dev": true, "requires": { "color-name": "1.1.3" @@ -6592,6 +6668,8 @@ }, "color-name": { "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", "dev": true }, "combine-source-map": { @@ -7433,6 +7511,8 @@ }, "has-flag": { "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", "dev": true }, "has-symbols": { @@ -7777,6 +7857,8 @@ }, "js-tokens": { "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", "dev": true }, "js-yaml": { @@ -8868,8 +8950,30 @@ "dev": true }, "semver": { - "version": "7.3.2", - "dev": true + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", + "dev": true, + "requires": { + "lru-cache": "^6.0.0" + }, + "dependencies": { + "lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "requires": { + "yallist": "^4.0.0" + } + }, + "yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + } + } }, "serialize-javascript": { "version": "6.0.0", @@ -9124,6 +9228,8 @@ }, "supports-color": { "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", "dev": true, "requires": { "has-flag": "^3.0.0" From b051a312c09c4e1be4e39de142ea8582dac3e648 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 27 Oct 2023 11:22:42 +0000 Subject: [PATCH 40/85] Bump browserify-sign from 4.0.4 to 4.2.2 Bumps [browserify-sign](https://github.com/crypto-browserify/browserify-sign) from 4.0.4 to 4.2.2. - [Changelog](https://github.com/browserify/browserify-sign/blob/main/CHANGELOG.md) - [Commits](https://github.com/crypto-browserify/browserify-sign/compare/v4.0.4...v4.2.2) --- updated-dependencies: - dependency-name: browserify-sign dependency-type: indirect ... Signed-off-by: dependabot[bot] --- package-lock.json | 217 +++++++++++++++++++++++++++++++++++++--------- 1 file changed, 175 insertions(+), 42 deletions(-) diff --git a/package-lock.json b/package-lock.json index 7c7e5c8d..51b02996 100644 --- a/package-lock.json +++ b/package-lock.json @@ -25,7 +25,7 @@ "nyc": "^15.1.0", "requirejs": "2.3.6", "seedrandom": "3.0.5", - "semver": "7.3.2", + "semver": "7.5.4", "sprintf": "0.1.5", "uglify-js": "3.17.4" }, @@ -778,13 +778,15 @@ } }, "node_modules/asn1.js": { - "version": "4.10.1", + "version": "5.4.1", + "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-5.4.1.tgz", + "integrity": "sha512-+I//4cYPccV8LdmBLiX8CYvf9Sp3vQsrqu2QNXRcrbiWvcx/UdlFiqUJJzxRQxgsZmvhXhn4cSKeSmoFjVdupA==", "dev": true, - "license": "MIT", "dependencies": { "bn.js": "^4.0.0", "inherits": "^2.0.1", - "minimalistic-assert": "^1.0.0" + "minimalistic-assert": "^1.0.0", + "safer-buffer": "^2.1.0" } }, "node_modules/assert": { @@ -1081,26 +1083,59 @@ } }, "node_modules/browserify-rsa": { - "version": "4.0.1", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.1.0.tgz", + "integrity": "sha512-AdEER0Hkspgno2aR97SAf6vi0y0k8NuOpGnVH3O99rcA5Q6sh8QxcngtHuJ6uXwnfAXNM4Gn1Gb7/MV1+Ymbog==", "dev": true, - "license": "MIT", "dependencies": { - "bn.js": "^4.1.0", + "bn.js": "^5.0.0", "randombytes": "^2.0.1" } }, + "node_modules/browserify-rsa/node_modules/bn.js": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.1.tgz", + "integrity": "sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ==", + "dev": true + }, "node_modules/browserify-sign": { - "version": "4.0.4", + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.2.2.tgz", + "integrity": "sha512-1rudGyeYY42Dk6texmv7c4VcQ0EsvVbLwZkA+AQB7SxvXxmcD93jcHie8bzecJ+ChDlmAm2Qyu0+Ccg5uhZXCg==", "dev": true, - "license": "ISC", "dependencies": { - "bn.js": "^4.1.1", - "browserify-rsa": "^4.0.0", - "create-hash": "^1.1.0", - "create-hmac": "^1.1.2", - "elliptic": "^6.0.0", - "inherits": "^2.0.1", - "parse-asn1": "^5.0.0" + "bn.js": "^5.2.1", + "browserify-rsa": "^4.1.0", + "create-hash": "^1.2.0", + "create-hmac": "^1.1.7", + "elliptic": "^6.5.4", + "inherits": "^2.0.4", + "parse-asn1": "^5.1.6", + "readable-stream": "^3.6.2", + "safe-buffer": "^5.2.1" + }, + "engines": { + "node": ">= 4" + } + }, + "node_modules/browserify-sign/node_modules/bn.js": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.1.tgz", + "integrity": "sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ==", + "dev": true + }, + "node_modules/browserify-sign/node_modules/readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "dev": true, + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" } }, "node_modules/browserify-zlib": { @@ -4317,13 +4352,13 @@ } }, "node_modules/parse-asn1": { - "version": "5.1.5", + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.6.tgz", + "integrity": "sha512-RnZRo1EPU6JBnra2vGHj0yhp6ebyjBZpmUCLHWiFhxlzvBCCpAuZ7elsBp1PVAbQN0/04VD/19rfzlBSwLstMw==", "dev": true, - "license": "ISC", "dependencies": { - "asn1.js": "^4.0.0", + "asn1.js": "^5.2.0", "browserify-aes": "^1.0.0", - "create-hash": "^1.1.0", "evp_bytestokey": "^1.0.0", "pbkdf2": "^3.0.3", "safe-buffer": "^5.1.1" @@ -4803,9 +4838,24 @@ } }, "node_modules/safe-buffer": { - "version": "5.2.0", + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", "dev": true, - "license": "MIT" + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] }, "node_modules/safer-buffer": { "version": "2.1.2", @@ -4818,9 +4868,13 @@ "license": "MIT" }, "node_modules/semver": { - "version": "7.3.2", + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", "dev": true, - "license": "ISC", + "dependencies": { + "lru-cache": "^6.0.0" + }, "bin": { "semver": "bin/semver.js" }, @@ -4828,6 +4882,24 @@ "node": ">=10" } }, + "node_modules/semver/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/semver/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, "node_modules/serialize-javascript": { "version": "6.0.0", "dev": true, @@ -6182,12 +6254,15 @@ } }, "asn1.js": { - "version": "4.10.1", + "version": "5.4.1", + "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-5.4.1.tgz", + "integrity": "sha512-+I//4cYPccV8LdmBLiX8CYvf9Sp3vQsrqu2QNXRcrbiWvcx/UdlFiqUJJzxRQxgsZmvhXhn4cSKeSmoFjVdupA==", "dev": true, "requires": { "bn.js": "^4.0.0", "inherits": "^2.0.1", - "minimalistic-assert": "^1.0.0" + "minimalistic-assert": "^1.0.0", + "safer-buffer": "^2.1.0" } }, "assert": { @@ -6419,24 +6494,57 @@ } }, "browserify-rsa": { - "version": "4.0.1", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.1.0.tgz", + "integrity": "sha512-AdEER0Hkspgno2aR97SAf6vi0y0k8NuOpGnVH3O99rcA5Q6sh8QxcngtHuJ6uXwnfAXNM4Gn1Gb7/MV1+Ymbog==", "dev": true, "requires": { - "bn.js": "^4.1.0", + "bn.js": "^5.0.0", "randombytes": "^2.0.1" + }, + "dependencies": { + "bn.js": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.1.tgz", + "integrity": "sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ==", + "dev": true + } } }, "browserify-sign": { - "version": "4.0.4", + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.2.2.tgz", + "integrity": "sha512-1rudGyeYY42Dk6texmv7c4VcQ0EsvVbLwZkA+AQB7SxvXxmcD93jcHie8bzecJ+ChDlmAm2Qyu0+Ccg5uhZXCg==", "dev": true, "requires": { - "bn.js": "^4.1.1", - "browserify-rsa": "^4.0.0", - "create-hash": "^1.1.0", - "create-hmac": "^1.1.2", - "elliptic": "^6.0.0", - "inherits": "^2.0.1", - "parse-asn1": "^5.0.0" + "bn.js": "^5.2.1", + "browserify-rsa": "^4.1.0", + "create-hash": "^1.2.0", + "create-hmac": "^1.1.7", + "elliptic": "^6.5.4", + "inherits": "^2.0.4", + "parse-asn1": "^5.1.6", + "readable-stream": "^3.6.2", + "safe-buffer": "^5.2.1" + }, + "dependencies": { + "bn.js": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.1.tgz", + "integrity": "sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ==", + "dev": true + }, + "readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "dev": true, + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + } } }, "browserify-zlib": { @@ -8553,12 +8661,13 @@ } }, "parse-asn1": { - "version": "5.1.5", + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.6.tgz", + "integrity": "sha512-RnZRo1EPU6JBnra2vGHj0yhp6ebyjBZpmUCLHWiFhxlzvBCCpAuZ7elsBp1PVAbQN0/04VD/19rfzlBSwLstMw==", "dev": true, "requires": { - "asn1.js": "^4.0.0", + "asn1.js": "^5.2.0", "browserify-aes": "^1.0.0", - "create-hash": "^1.1.0", "evp_bytestokey": "^1.0.0", "pbkdf2": "^3.0.3", "safe-buffer": "^5.1.1" @@ -8856,7 +8965,9 @@ } }, "safe-buffer": { - "version": "5.2.0", + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", "dev": true }, "safer-buffer": { @@ -8868,8 +8979,30 @@ "dev": true }, "semver": { - "version": "7.3.2", - "dev": true + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", + "dev": true, + "requires": { + "lru-cache": "^6.0.0" + }, + "dependencies": { + "lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "requires": { + "yallist": "^4.0.0" + } + }, + "yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + } + } }, "serialize-javascript": { "version": "6.0.0", From 01c3ceda6c98579fa6891551848b93bd50342b80 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 10 Jan 2024 12:48:17 +0000 Subject: [PATCH 41/85] Bump follow-redirects from 1.15.2 to 1.15.4 Bumps [follow-redirects](https://github.com/follow-redirects/follow-redirects) from 1.15.2 to 1.15.4. - [Release notes](https://github.com/follow-redirects/follow-redirects/releases) - [Commits](https://github.com/follow-redirects/follow-redirects/compare/v1.15.2...v1.15.4) --- updated-dependencies: - dependency-name: follow-redirects dependency-type: indirect ... Signed-off-by: dependabot[bot] --- package-lock.json | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/package-lock.json b/package-lock.json index 70ab67ba..2d25e5b3 100644 --- a/package-lock.json +++ b/package-lock.json @@ -2440,7 +2440,9 @@ "license": "ISC" }, "node_modules/follow-redirects": { - "version": "1.15.2", + "version": "1.15.4", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.4.tgz", + "integrity": "sha512-Cr4D/5wlrb0z9dgERpUL3LrmPKVDsETIJhaCMeDfuFYcqa5bldGV6wBsAN6X/vxlXQtFBMrXdXxdL8CbDTGniw==", "dev": true, "funding": [ { @@ -2448,7 +2450,6 @@ "url": "https://github.com/sponsors/RubenVerborgh" } ], - "license": "MIT", "engines": { "node": ">=4.0" }, @@ -7475,7 +7476,9 @@ "dev": true }, "follow-redirects": { - "version": "1.15.2", + "version": "1.15.4", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.4.tgz", + "integrity": "sha512-Cr4D/5wlrb0z9dgERpUL3LrmPKVDsETIJhaCMeDfuFYcqa5bldGV6wBsAN6X/vxlXQtFBMrXdXxdL8CbDTGniw==", "dev": true }, "foreground-child": { From d16d3a4f24c9db94611db1da419acaac6aa4b677 Mon Sep 17 00:00:00 2001 From: Andrew Pikul Date: Tue, 30 Jan 2024 21:44:42 -0500 Subject: [PATCH 42/85] Convert lib to ESM --- .eslintrc.json | 4 +++- lib/alg/components.js | 4 +--- lib/alg/dfs.js | 4 +--- lib/alg/dijkstra-all.js | 5 ++--- lib/alg/dijkstra.js | 5 ++--- lib/alg/find-cycles.js | 6 ++---- lib/alg/floyd-warshall.js | 4 +--- lib/alg/index.js | 24 +++++++++++------------- lib/alg/is-acyclic.js | 6 ++---- lib/alg/postorder.js | 6 ++---- lib/alg/preorder.js | 6 ++---- lib/alg/prim.js | 8 +++----- lib/alg/tarjan.js | 4 +--- lib/alg/topsort.js | 3 +-- lib/data/priority-queue.js | 4 +--- lib/graph.js | 4 +--- lib/index.js | 6 ++---- lib/json.js | 11 +++-------- lib/version.js | 3 ++- 19 files changed, 43 insertions(+), 74 deletions(-) diff --git a/.eslintrc.json b/.eslintrc.json index 67a5caa7..971f9dc9 100644 --- a/.eslintrc.json +++ b/.eslintrc.json @@ -6,7 +6,9 @@ "mocha": true }, "parserOptions": { - "ecmaVersion": "latest" + "ecmaVersion": "latest", + "sourceType": "module", + "allowImportExportEverywhere": true }, "env": { "es6": true, diff --git a/lib/alg/components.js b/lib/alg/components.js index deeb85ed..766cdad6 100644 --- a/lib/alg/components.js +++ b/lib/alg/components.js @@ -1,6 +1,4 @@ -module.exports = components; - -function components(g) { +export default function components(g) { var visited = {}; var cmpts = []; var cmpt; diff --git a/lib/alg/dfs.js b/lib/alg/dfs.js index 34a323cb..d109bbf0 100644 --- a/lib/alg/dfs.js +++ b/lib/alg/dfs.js @@ -1,5 +1,3 @@ -module.exports = dfs; - /* * A helper that preforms a pre- or post-order traversal on the input graph * and returns the nodes in the order they were visited. If the graph is @@ -8,7 +6,7 @@ module.exports = dfs; * * If the order is not "post", it will be treated as "pre". */ -function dfs(g, vs, order) { +export default function dfs(g, vs, order) { if (!Array.isArray(vs)) { vs = [vs]; } diff --git a/lib/alg/dijkstra-all.js b/lib/alg/dijkstra-all.js index 6c5d4b3b..aa9d007c 100644 --- a/lib/alg/dijkstra-all.js +++ b/lib/alg/dijkstra-all.js @@ -1,8 +1,7 @@ -var dijkstra = require("./dijkstra"); +import default as dijkstra from "./dijkstra.js"; -module.exports = dijkstraAll; -function dijkstraAll(g, weightFunc, edgeFunc) { +export default function dijkstraAll(g, weightFunc, edgeFunc) { return g.nodes().reduce(function(acc, v) { acc[v] = dijkstra(g, v, weightFunc, edgeFunc); return acc; diff --git a/lib/alg/dijkstra.js b/lib/alg/dijkstra.js index 4b74a2dd..865f07ba 100644 --- a/lib/alg/dijkstra.js +++ b/lib/alg/dijkstra.js @@ -1,10 +1,9 @@ -var PriorityQueue = require("../data/priority-queue"); +import default as PriorityQueue from "../data/priority-queue.js"; -module.exports = dijkstra; var DEFAULT_WEIGHT_FUNC = () => 1; -function dijkstra(g, source, weightFn, edgeFn) { +export default function dijkstra(g, source, weightFn, edgeFn) { return runDijkstra(g, String(source), weightFn || DEFAULT_WEIGHT_FUNC, edgeFn || function(v) { return g.outEdges(v); }); diff --git a/lib/alg/find-cycles.js b/lib/alg/find-cycles.js index 95df84f6..b172714e 100644 --- a/lib/alg/find-cycles.js +++ b/lib/alg/find-cycles.js @@ -1,8 +1,6 @@ -var tarjan = require("./tarjan"); +import default as tarjan from "./targan.js"; -module.exports = findCycles; - -function findCycles(g) { +export default function findCycles(g) { return tarjan(g).filter(function(cmpt) { return cmpt.length > 1 || (cmpt.length === 1 && g.hasEdge(cmpt[0], cmpt[0])); }); diff --git a/lib/alg/floyd-warshall.js b/lib/alg/floyd-warshall.js index c2f3ae21..c014b0bf 100644 --- a/lib/alg/floyd-warshall.js +++ b/lib/alg/floyd-warshall.js @@ -1,8 +1,6 @@ -module.exports = floydWarshall; - var DEFAULT_WEIGHT_FUNC = () => 1; -function floydWarshall(g, weightFn, edgeFn) { +export default function floydWarshall(g, weightFn, edgeFn) { return runFloydWarshall(g, weightFn || DEFAULT_WEIGHT_FUNC, edgeFn || function(v) { return g.outEdges(v); }); diff --git a/lib/alg/index.js b/lib/alg/index.js index 2c3d76f2..e8c9abde 100644 --- a/lib/alg/index.js +++ b/lib/alg/index.js @@ -1,13 +1,11 @@ -module.exports = { - components: require("./components"), - dijkstra: require("./dijkstra"), - dijkstraAll: require("./dijkstra-all"), - findCycles: require("./find-cycles"), - floydWarshall: require("./floyd-warshall"), - isAcyclic: require("./is-acyclic"), - postorder: require("./postorder"), - preorder: require("./preorder"), - prim: require("./prim"), - tarjan: require("./tarjan"), - topsort: require("./topsort") -}; +export { default as components } from "./components.js"; +export { default as dijkstra } from "./dijkstra.js"; +export { default as dijkstraAll } from "./dijkstra-all.js"; +export { default as findCycles } from "./find-cycles.js"; +export { default as floydWarshall } from "./floyd-warshall.js"; +export { default as isAcyclic } from "./is-acyclic.js"; +export { default as postorder } from "./postorder.js"; +export { default as preorder } from "./preorder.js"; +export { default as prim } from "./prim.js"; +export { default as tarjan } from "./tarjan.js"; +export { default as topsort } from "./topsort.js"; diff --git a/lib/alg/is-acyclic.js b/lib/alg/is-acyclic.js index eff4ef0b..153a3a1b 100644 --- a/lib/alg/is-acyclic.js +++ b/lib/alg/is-acyclic.js @@ -1,8 +1,6 @@ -var topsort = require("./topsort"); +import default as topsort from "./topsort.js"; -module.exports = isAcyclic; - -function isAcyclic(g) { +export default function isAcyclic(g) { try { topsort(g); } catch (e) { diff --git a/lib/alg/postorder.js b/lib/alg/postorder.js index 1d82313f..fb110a3b 100644 --- a/lib/alg/postorder.js +++ b/lib/alg/postorder.js @@ -1,7 +1,5 @@ -var dfs = require("./dfs"); +import default as dfs from "./dfs.js"; -module.exports = postorder; - -function postorder(g, vs) { +export default function postorder(g, vs) { return dfs(g, vs, "post"); } diff --git a/lib/alg/preorder.js b/lib/alg/preorder.js index cf333cd8..1648a08f 100644 --- a/lib/alg/preorder.js +++ b/lib/alg/preorder.js @@ -1,7 +1,5 @@ -var dfs = require("./dfs"); +import default as dfs from "./dfs.js"; -module.exports = preorder; - -function preorder(g, vs) { +export default function preorder(g, vs) { return dfs(g, vs, "pre"); } diff --git a/lib/alg/prim.js b/lib/alg/prim.js index 72fcd841..064f6508 100644 --- a/lib/alg/prim.js +++ b/lib/alg/prim.js @@ -1,9 +1,7 @@ -var Graph = require("../graph"); -var PriorityQueue = require("../data/priority-queue"); +import default as Graph from "../graph.js"; +import default as PriorityQueue from "../data/priority-queue.js"; -module.exports = prim; - -function prim(g, weightFunc) { +export default function prim(g, weightFunc) { var result = new Graph(); var parents = {}; var pq = new PriorityQueue(); diff --git a/lib/alg/tarjan.js b/lib/alg/tarjan.js index c00eeba7..e38e1a34 100644 --- a/lib/alg/tarjan.js +++ b/lib/alg/tarjan.js @@ -1,6 +1,4 @@ -module.exports = tarjan; - -function tarjan(g) { +export default function tarjan(g) { var index = 0; var stack = []; var visited = {}; // node id -> { onStack, lowlink, index } diff --git a/lib/alg/topsort.js b/lib/alg/topsort.js index 5986ce02..cba234ec 100644 --- a/lib/alg/topsort.js +++ b/lib/alg/topsort.js @@ -1,4 +1,4 @@ -function topsort(g) { +export default function topsort(g) { var visited = {}; var stack = {}; var results = []; @@ -32,5 +32,4 @@ class CycleException extends Error { } } -module.exports = topsort; topsort.CycleException = CycleException; diff --git a/lib/data/priority-queue.js b/lib/data/priority-queue.js index 1a411fff..13b2b5f0 100644 --- a/lib/data/priority-queue.js +++ b/lib/data/priority-queue.js @@ -5,7 +5,7 @@ * the queue. Adding and removing elements takes O(log n) time. A key can * have its priority decreased in O(log n) time. */ -class PriorityQueue { +export default class PriorityQueue { #arr = []; #keyIndices = {}; @@ -146,5 +146,3 @@ class PriorityQueue { keyIndices[origArrI.key] = j; } } - -module.exports = PriorityQueue; diff --git a/lib/graph.js b/lib/graph.js index 0b466cd3..69cefc8b 100644 --- a/lib/graph.js +++ b/lib/graph.js @@ -14,7 +14,7 @@ var EDGE_KEY_DELIM = "\x01"; // edges up and, object properties, which have string keys, are the closest // we're going to get to a performant hashtable in JavaScript. -class Graph { +export default class Graph { #isDirected = true; #isMultigraph = false; #isCompound = false; @@ -692,5 +692,3 @@ function edgeArgsToObj(isDirected, v_, w_, name) { function edgeObjToId(isDirected, edgeObj) { return edgeArgsToId(isDirected, edgeObj.v, edgeObj.w, edgeObj.name); } - -module.exports = Graph; diff --git a/lib/index.js b/lib/index.js index 756e0ab6..3424d1fd 100644 --- a/lib/index.js +++ b/lib/index.js @@ -1,5 +1,3 @@ // Includes only the "core" of graphlib -module.exports = { - Graph: require("./graph"), - version: require("./version") -}; +export {default as Graph} from "./graph.js"; +export {default as version} from "./version.js"; diff --git a/lib/json.js b/lib/json.js index ac0c2417..a3760312 100644 --- a/lib/json.js +++ b/lib/json.js @@ -1,15 +1,10 @@ -var Graph = require("./graph"); - -module.exports = { - write: write, - read: read -}; +import default as Graph from "./graph.js"; /** * Creates a JSON representation of the graph that can be serialized to a string with * JSON.stringify. The graph can later be restored using json.read. */ -function write(g) { +export function write(g) { var json = { options: { directed: g.isDirected(), @@ -65,7 +60,7 @@ function writeEdges(g) { * g2.edges() * // [ { v: 'a', w: 'b' } ] */ -function read(json) { +export function read(json) { var g = new Graph(json.options).setGraph(json.value); json.nodes.forEach(function(entry) { g.setNode(entry.v, entry.value); diff --git a/lib/version.js b/lib/version.js index 02120ec0..41701180 100644 --- a/lib/version.js +++ b/lib/version.js @@ -1 +1,2 @@ -module.exports = '2.1.14-pre'; +const version = '2.1.14-pre'; +export { version as default }; From 809513e3ec48ebd6184d397f5371522dceba3b4c Mon Sep 17 00:00:00 2001 From: Andrew Pikul Date: Tue, 30 Jan 2024 22:16:27 -0500 Subject: [PATCH 43/85] Fix errors after testing in browser --- lib/alg/dijkstra-all.js | 2 +- lib/alg/dijkstra.js | 2 +- lib/alg/find-cycles.js | 2 +- lib/alg/is-acyclic.js | 2 +- lib/alg/postorder.js | 2 +- lib/alg/preorder.js | 2 +- lib/alg/prim.js | 4 +- lib/index.js | 2 + lib/json.js | 2 +- package-lock.json | 10120 ++++++++++++++++++++++++-------------- package.json | 4 + 11 files changed, 6577 insertions(+), 3567 deletions(-) diff --git a/lib/alg/dijkstra-all.js b/lib/alg/dijkstra-all.js index aa9d007c..ef827bce 100644 --- a/lib/alg/dijkstra-all.js +++ b/lib/alg/dijkstra-all.js @@ -1,4 +1,4 @@ -import default as dijkstra from "./dijkstra.js"; +import { default as dijkstra } from "./dijkstra.js"; export default function dijkstraAll(g, weightFunc, edgeFunc) { diff --git a/lib/alg/dijkstra.js b/lib/alg/dijkstra.js index 865f07ba..ec646c3f 100644 --- a/lib/alg/dijkstra.js +++ b/lib/alg/dijkstra.js @@ -1,4 +1,4 @@ -import default as PriorityQueue from "../data/priority-queue.js"; +import { default as PriorityQueue } from "../data/priority-queue.js"; var DEFAULT_WEIGHT_FUNC = () => 1; diff --git a/lib/alg/find-cycles.js b/lib/alg/find-cycles.js index b172714e..42a37d4b 100644 --- a/lib/alg/find-cycles.js +++ b/lib/alg/find-cycles.js @@ -1,4 +1,4 @@ -import default as tarjan from "./targan.js"; +import { default as tarjan } from "./tarjan.js"; export default function findCycles(g) { return tarjan(g).filter(function(cmpt) { diff --git a/lib/alg/is-acyclic.js b/lib/alg/is-acyclic.js index 153a3a1b..e3467560 100644 --- a/lib/alg/is-acyclic.js +++ b/lib/alg/is-acyclic.js @@ -1,4 +1,4 @@ -import default as topsort from "./topsort.js"; +import { default as topsort } from "./topsort.js"; export default function isAcyclic(g) { try { diff --git a/lib/alg/postorder.js b/lib/alg/postorder.js index fb110a3b..23830a43 100644 --- a/lib/alg/postorder.js +++ b/lib/alg/postorder.js @@ -1,4 +1,4 @@ -import default as dfs from "./dfs.js"; +import { default as dfs } from "./dfs.js"; export default function postorder(g, vs) { return dfs(g, vs, "post"); diff --git a/lib/alg/preorder.js b/lib/alg/preorder.js index 1648a08f..472ba468 100644 --- a/lib/alg/preorder.js +++ b/lib/alg/preorder.js @@ -1,4 +1,4 @@ -import default as dfs from "./dfs.js"; +import { default as dfs } from "./dfs.js"; export default function preorder(g, vs) { return dfs(g, vs, "pre"); diff --git a/lib/alg/prim.js b/lib/alg/prim.js index 064f6508..ce22020c 100644 --- a/lib/alg/prim.js +++ b/lib/alg/prim.js @@ -1,5 +1,5 @@ -import default as Graph from "../graph.js"; -import default as PriorityQueue from "../data/priority-queue.js"; +import { default as Graph } from "../graph.js"; +import { default as PriorityQueue } from "../data/priority-queue.js"; export default function prim(g, weightFunc) { var result = new Graph(); diff --git a/lib/index.js b/lib/index.js index 3424d1fd..b0f1da34 100644 --- a/lib/index.js +++ b/lib/index.js @@ -1,3 +1,5 @@ // Includes only the "core" of graphlib export {default as Graph} from "./graph.js"; export {default as version} from "./version.js"; +export * as json from "./json.js"; +export * as alg from "./alg/index.js"; diff --git a/lib/json.js b/lib/json.js index a3760312..92ae41f6 100644 --- a/lib/json.js +++ b/lib/json.js @@ -1,4 +1,4 @@ -import default as Graph from "./graph.js"; +import { default as Graph } from "./graph.js"; /** * Creates a JSON representation of the graph that can be serialized to a string with diff --git a/package-lock.json b/package-lock.json index 70ab67ba..2acea628 100644 --- a/package-lock.json +++ b/package-lock.json @@ -9,6 +9,10 @@ "version": "2.1.14-pre", "license": "MIT", "devDependencies": { + "@babel/cli": "^7.23.9", + "@babel/core": "^7.23.9", + "@babel/plugin-transform-modules-commonjs": "^7.23.3", + "@babel/preset-env": "^7.23.9", "benchmark": "2.1.4", "browserify": "16.5.1", "chai": "^4.3.6", @@ -45,13 +49,70 @@ "node": ">=6.0.0" } }, + "node_modules/@babel/cli": { + "version": "7.23.9", + "resolved": "https://registry.npmjs.org/@babel/cli/-/cli-7.23.9.tgz", + "integrity": "sha512-vB1UXmGDNEhcf1jNAHKT9IlYk1R+hehVTLFlCLHBi8gfuHQGP6uRjgXVYU0EVlI/qwAWpstqkBdf2aez3/z/5Q==", + "dev": true, + "dependencies": { + "@jridgewell/trace-mapping": "^0.3.17", + "commander": "^4.0.1", + "convert-source-map": "^2.0.0", + "fs-readdir-recursive": "^1.1.0", + "glob": "^7.2.0", + "make-dir": "^2.1.0", + "slash": "^2.0.0" + }, + "bin": { + "babel": "bin/babel.js", + "babel-external-helpers": "bin/babel-external-helpers.js" + }, + "engines": { + "node": ">=6.9.0" + }, + "optionalDependencies": { + "@nicolo-ribaudo/chokidar-2": "2.1.8-no-fsevents.3", + "chokidar": "^3.4.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/cli/node_modules/convert-source-map": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", + "dev": true + }, + "node_modules/@babel/cli/node_modules/make-dir": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz", + "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==", + "dev": true, + "dependencies": { + "pify": "^4.0.1", + "semver": "^5.6.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/@babel/cli/node_modules/semver": { + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", + "dev": true, + "bin": { + "semver": "bin/semver" + } + }, "node_modules/@babel/code-frame": { - "version": "7.22.13", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.22.13.tgz", - "integrity": "sha512-XktuhWlJ5g+3TJXc5upd9Ks1HutSArik6jf2eAjYFyIOf4ej3RN+184cZbzDvbPnuTJIUhPKKJE3cIsYTiAT3w==", + "version": "7.23.5", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.23.5.tgz", + "integrity": "sha512-CgH3s1a96LipHCmSUmYFPwY7MNx8C3avkq7i4Wl3cfa662ldtUe4VM1TPXX70pfmrlWTb6jLqTYrZyT2ZTJBgA==", "dev": true, "dependencies": { - "@babel/highlight": "^7.22.13", + "@babel/highlight": "^7.23.4", "chalk": "^2.4.2" }, "engines": { @@ -59,33 +120,35 @@ } }, "node_modules/@babel/compat-data": { - "version": "7.21.0", + "version": "7.23.5", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.23.5.tgz", + "integrity": "sha512-uU27kfDRlhfKl+w1U6vp16IuvSLtjAxdArVXPa9BvLkrr7CYIsxH5adpHObeAGY/41+syctUWOZ140a2Rvkgjw==", "dev": true, - "license": "MIT", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/core": { - "version": "7.21.0", + "version": "7.23.9", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.23.9.tgz", + "integrity": "sha512-5q0175NOjddqpvvzU+kDiSOAk4PfdO6FvwCWoQ6RO7rTzEe8vlo+4HVfcnAREhD4npMs0e9uZypjTwzZPCf/cw==", "dev": true, - "license": "MIT", "dependencies": { "@ampproject/remapping": "^2.2.0", - "@babel/code-frame": "^7.18.6", - "@babel/generator": "^7.21.0", - "@babel/helper-compilation-targets": "^7.20.7", - "@babel/helper-module-transforms": "^7.21.0", - "@babel/helpers": "^7.21.0", - "@babel/parser": "^7.21.0", - "@babel/template": "^7.20.7", - "@babel/traverse": "^7.21.0", - "@babel/types": "^7.21.0", - "convert-source-map": "^1.7.0", + "@babel/code-frame": "^7.23.5", + "@babel/generator": "^7.23.6", + "@babel/helper-compilation-targets": "^7.23.6", + "@babel/helper-module-transforms": "^7.23.3", + "@babel/helpers": "^7.23.9", + "@babel/parser": "^7.23.9", + "@babel/template": "^7.23.9", + "@babel/traverse": "^7.23.9", + "@babel/types": "^7.23.9", + "convert-source-map": "^2.0.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", - "json5": "^2.2.2", - "semver": "^6.3.0" + "json5": "^2.2.3", + "semver": "^6.3.1" }, "engines": { "node": ">=6.9.0" @@ -96,25 +159,27 @@ } }, "node_modules/@babel/core/node_modules/convert-source-map": { - "version": "1.9.0", - "dev": true, - "license": "MIT" + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", + "dev": true }, "node_modules/@babel/core/node_modules/semver": { - "version": "6.3.0", + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "dev": true, - "license": "ISC", "bin": { "semver": "bin/semver.js" } }, "node_modules/@babel/generator": { - "version": "7.23.0", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.23.0.tgz", - "integrity": "sha512-lN85QRR+5IbYrMWM6Y4pE/noaQtg4pNiqeNGX60eqOfo6gtEj6uw/JagelB8vVztSd7R6M5n1+PQkDbHbBRU4g==", + "version": "7.23.6", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.23.6.tgz", + "integrity": "sha512-qrSfCYxYQB5owCmGLbl8XRpX1ytXlpueOb0N0UmQwA073KZxejgQTzAmJezxvpwQD9uGtK2shHdi55QT+MbjIw==", "dev": true, "dependencies": { - "@babel/types": "^7.23.0", + "@babel/types": "^7.23.6", "@jridgewell/gen-mapping": "^0.3.2", "@jridgewell/trace-mapping": "^0.3.17", "jsesc": "^2.5.1" @@ -124,9 +189,10 @@ } }, "node_modules/@babel/generator/node_modules/@jridgewell/gen-mapping": { - "version": "0.3.2", + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz", + "integrity": "sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==", "dev": true, - "license": "MIT", "dependencies": { "@jridgewell/set-array": "^1.0.1", "@jridgewell/sourcemap-codec": "^1.4.10", @@ -136,16 +202,70 @@ "node": ">=6.0.0" } }, + "node_modules/@babel/helper-annotate-as-pure": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.22.5.tgz", + "integrity": "sha512-LvBTxu8bQSQkcyKOU+a1btnNFQ1dMAd0R6PyW3arXes06F6QLWLIrd681bxRPIXlrMGR3XYnW9JyML7dP3qgxg==", + "dev": true, + "dependencies": { + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-builder-binary-assignment-operator-visitor": { + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.22.15.tgz", + "integrity": "sha512-QkBXwGgaoC2GtGZRoma6kv7Szfv06khvhFav67ZExau2RaXzy8MpHSMO2PNoP2XtmQphJQRHFfg77Bq731Yizw==", + "dev": true, + "dependencies": { + "@babel/types": "^7.22.15" + }, + "engines": { + "node": ">=6.9.0" + } + }, "node_modules/@babel/helper-compilation-targets": { - "version": "7.20.7", + "version": "7.23.6", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.23.6.tgz", + "integrity": "sha512-9JB548GZoQVmzrFgp8o7KxdgkTGm6xs9DW0o/Pim72UDjzr5ObUQ6ZzYPqA+g9OTS2bBQoctLJrky0RDCAWRgQ==", "dev": true, - "license": "MIT", "dependencies": { - "@babel/compat-data": "^7.20.5", - "@babel/helper-validator-option": "^7.18.6", - "browserslist": "^4.21.3", + "@babel/compat-data": "^7.23.5", + "@babel/helper-validator-option": "^7.23.5", + "browserslist": "^4.22.2", "lru-cache": "^5.1.1", - "semver": "^6.3.0" + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/helper-create-class-features-plugin": { + "version": "7.23.9", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.23.9.tgz", + "integrity": "sha512-B2L9neXTIyPQoXDm+NtovPvG6VOLWnaXu3BIeVDWwdKFgG30oNa6CqVGiJPDWQwIAK49t9gnQI9c6K6RzabiKw==", + "dev": true, + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.22.5", + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-function-name": "^7.23.0", + "@babel/helper-member-expression-to-functions": "^7.23.0", + "@babel/helper-optimise-call-expression": "^7.22.5", + "@babel/helper-replace-supers": "^7.22.20", + "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5", + "@babel/helper-split-export-declaration": "^7.22.6", + "semver": "^6.3.1" }, "engines": { "node": ">=6.9.0" @@ -154,14 +274,57 @@ "@babel/core": "^7.0.0" } }, - "node_modules/@babel/helper-compilation-targets/node_modules/semver": { - "version": "6.3.0", + "node_modules/@babel/helper-create-class-features-plugin/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/helper-create-regexp-features-plugin": { + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.22.15.tgz", + "integrity": "sha512-29FkPLFjn4TPEa3RE7GpW+qbE8tlsu3jntNYNfcGsc49LphF1PQIiD+vMZ1z1xVOKt+93khA9tc2JBs3kBjA7w==", + "dev": true, + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.22.5", + "regexpu-core": "^5.3.1", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-create-regexp-features-plugin/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "dev": true, - "license": "ISC", "bin": { "semver": "bin/semver.js" } }, + "node_modules/@babel/helper-define-polyfill-provider": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.5.0.tgz", + "integrity": "sha512-NovQquuQLAQ5HuyjCz7WQP9MjRj7dx++yspwiyUiGl9ZyadHRSql1HZh5ogRd8W8w6YM6EQ/NTB8rgjLt5W65Q==", + "dev": true, + "dependencies": { + "@babel/helper-compilation-targets": "^7.22.6", + "@babel/helper-plugin-utils": "^7.22.5", + "debug": "^4.1.1", + "lodash.debounce": "^4.0.8", + "resolve": "^1.14.2" + }, + "peerDependencies": { + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" + } + }, "node_modules/@babel/helper-environment-visitor": { "version": "7.22.20", "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.20.tgz", @@ -196,41 +359,123 @@ "node": ">=6.9.0" } }, + "node_modules/@babel/helper-member-expression-to-functions": { + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.23.0.tgz", + "integrity": "sha512-6gfrPwh7OuT6gZyJZvd6WbTfrqAo7vm4xCzAXOusKqq/vWdKXphTpj5klHKNmRUU6/QRGlBsyU9mAIPaWHlqJA==", + "dev": true, + "dependencies": { + "@babel/types": "^7.23.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, "node_modules/@babel/helper-module-imports": { - "version": "7.18.6", + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.22.15.tgz", + "integrity": "sha512-0pYVBnDKZO2fnSPCrgM/6WMc7eS20Fbok+0r88fp+YtWVLZrp4CkafFGIp+W0VKw4a22sgebPT99y+FDNMdP4w==", "dev": true, - "license": "MIT", "dependencies": { - "@babel/types": "^7.18.6" + "@babel/types": "^7.22.15" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-module-transforms": { - "version": "7.21.2", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.23.3.tgz", + "integrity": "sha512-7bBs4ED9OmswdfDzpz4MpWgSrV7FXlc3zIagvLFjS5H+Mk7Snr21vQ6QwrsoCGMfNC4e4LQPdoULEt4ykz0SRQ==", + "dev": true, + "dependencies": { + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-module-imports": "^7.22.15", + "@babel/helper-simple-access": "^7.22.5", + "@babel/helper-split-export-declaration": "^7.22.6", + "@babel/helper-validator-identifier": "^7.22.20" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-optimise-call-expression": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.22.5.tgz", + "integrity": "sha512-HBwaojN0xFRx4yIvpwGqxiV2tUfl7401jlok564NgB9EHS1y6QT17FmKWm4ztqjeVdXLuC4fSvHc5ePpQjoTbw==", + "dev": true, + "dependencies": { + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-plugin-utils": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.22.5.tgz", + "integrity": "sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-remap-async-to-generator": { + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.22.20.tgz", + "integrity": "sha512-pBGyV4uBqOns+0UvhsTO8qgl8hO89PmiDYv+/COyp1aeMcmfrfruz+/nCMFiYyFF/Knn0yfrC85ZzNFjembFTw==", + "dev": true, + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.22.5", + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-wrap-function": "^7.22.20" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-replace-supers": { + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.22.20.tgz", + "integrity": "sha512-qsW0In3dbwQUbK8kejJ4R7IHVGwHJlV6lpG6UA7a9hSa2YEiAib+N1T2kr6PEeUT+Fl7najmSOS6SmAwCHK6Tw==", "dev": true, - "license": "MIT", "dependencies": { - "@babel/helper-environment-visitor": "^7.18.9", - "@babel/helper-module-imports": "^7.18.6", - "@babel/helper-simple-access": "^7.20.2", - "@babel/helper-split-export-declaration": "^7.18.6", - "@babel/helper-validator-identifier": "^7.19.1", - "@babel/template": "^7.20.7", - "@babel/traverse": "^7.21.2", - "@babel/types": "^7.21.2" + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-member-expression-to-functions": "^7.22.15", + "@babel/helper-optimise-call-expression": "^7.22.5" }, "engines": { "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" } }, "node_modules/@babel/helper-simple-access": { - "version": "7.20.2", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.22.5.tgz", + "integrity": "sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w==", + "dev": true, + "dependencies": { + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-skip-transparent-expression-wrappers": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.22.5.tgz", + "integrity": "sha512-tK14r66JZKiC43p8Ki33yLBVJKlQDFoA8GYN67lWCDCqoL6EMMSuM9b+Iff2jHaM/RRFYl7K+iiru7hbRqNx8Q==", "dev": true, - "license": "MIT", "dependencies": { - "@babel/types": "^7.20.2" + "@babel/types": "^7.22.5" }, "engines": { "node": ">=6.9.0" @@ -249,9 +494,9 @@ } }, "node_modules/@babel/helper-string-parser": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.22.5.tgz", - "integrity": "sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw==", + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.23.4.tgz", + "integrity": "sha512-803gmbQdqwdf4olxrX4AJyFBV/RTr3rSmOj0rKwesmzlfhYNDEs+/iOcznzpNWlJlIlTJC2QfPFcHB6DlzdVLQ==", "dev": true, "engines": { "node": ">=6.9.0" @@ -267,30 +512,46 @@ } }, "node_modules/@babel/helper-validator-option": { - "version": "7.21.0", + "version": "7.23.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.23.5.tgz", + "integrity": "sha512-85ttAOMLsr53VgXkTbkx8oA6YTfT4q7/HzXSLEYmjcSTJPMPQtvq1BD79Byep5xMUYbGRzEpDsjUf3dyp54IKw==", "dev": true, - "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-wrap-function": { + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.22.20.tgz", + "integrity": "sha512-pms/UwkOpnQe/PDAEdV/d7dVCoBbB+R4FvYoHGZz+4VPcg7RtYy2KP7S2lbuWM6FCSgob5wshfGESbC/hzNXZw==", + "dev": true, + "dependencies": { + "@babel/helper-function-name": "^7.22.5", + "@babel/template": "^7.22.15", + "@babel/types": "^7.22.19" + }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helpers": { - "version": "7.21.0", + "version": "7.23.9", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.23.9.tgz", + "integrity": "sha512-87ICKgU5t5SzOT7sBMfCOZQ2rHjRU+Pcb9BoILMYz600W6DkVRLFBPwQ18gwUVvggqXivaUakpnxWQGbpywbBQ==", "dev": true, - "license": "MIT", "dependencies": { - "@babel/template": "^7.20.7", - "@babel/traverse": "^7.21.0", - "@babel/types": "^7.21.0" + "@babel/template": "^7.23.9", + "@babel/traverse": "^7.23.9", + "@babel/types": "^7.23.9" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/highlight": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.22.20.tgz", - "integrity": "sha512-dkdMCN3py0+ksCgYmGG8jKeGA/8Tk+gJwSYYlFGxG5lmhfKNoAy004YpLxpS1W2J8m/EK2Ew+yOs9pVRwO89mg==", + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.23.4.tgz", + "integrity": "sha512-acGdbYSfp2WheJoJm/EBBBLh/ID8KDc64ISZ9DYtBmC8/Q204PZJLHyzeB5qMzJ5trcOkybd78M4x2KWsUq++A==", "dev": true, "dependencies": { "@babel/helper-validator-identifier": "^7.22.20", @@ -302,9 +563,9 @@ } }, "node_modules/@babel/parser": { - "version": "7.23.0", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.23.0.tgz", - "integrity": "sha512-vvPKKdMemU85V9WE/l5wZEmImpCtLqbnTvqDS2U1fJ96KrxoW7KrXhNsNCblQlg8Ck4b85yxdTyelsMUgFUXiw==", + "version": "7.23.9", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.23.9.tgz", + "integrity": "sha512-9tcKgqKbs3xGJ+NtKF2ndOBBLVwPjl1SHxPQkd36r3Dlirw3xWUeGaTbqr7uGZcTaxkVNwc+03SVP7aCdWrTlA==", "dev": true, "bin": { "parser": "bin/babel-parser.js" @@ -313,5715 +574,8235 @@ "node": ">=6.0.0" } }, - "node_modules/@babel/template": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.22.15.tgz", - "integrity": "sha512-QPErUVm4uyJa60rkI73qneDacvdvzxshT3kksGqlGWYdOTIUOwJ7RDUL8sGqslY1uXWSL6xMFKEXDS3ox2uF0w==", + "node_modules/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.23.3.tgz", + "integrity": "sha512-iRkKcCqb7iGnq9+3G6rZ+Ciz5VywC4XNRHe57lKM+jOeYAoR0lVqdeeDRfh0tQcTfw/+vBhHn926FmQhLtlFLQ==", "dev": true, "dependencies": { - "@babel/code-frame": "^7.22.13", - "@babel/parser": "^7.22.15", - "@babel/types": "^7.22.15" + "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" } }, - "node_modules/@babel/traverse": { - "version": "7.23.2", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.23.2.tgz", - "integrity": "sha512-azpe59SQ48qG6nu2CzcMLbxUudtN+dOM9kDbUqGq3HXUJRlo7i8fvPoxQUzYgLZ4cMVmuZgm8vvBpNeRhd6XSw==", + "node_modules/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.23.3.tgz", + "integrity": "sha512-WwlxbfMNdVEpQjZmK5mhm7oSwD3dS6eU+Iwsi4Knl9wAletWem7kaRsGOG+8UEbRyqxY4SS5zvtfXwX+jMxUwQ==", "dev": true, "dependencies": { - "@babel/code-frame": "^7.22.13", - "@babel/generator": "^7.23.0", - "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-function-name": "^7.23.0", - "@babel/helper-hoist-variables": "^7.22.5", - "@babel/helper-split-export-declaration": "^7.22.6", - "@babel/parser": "^7.23.0", - "@babel/types": "^7.23.0", - "debug": "^4.1.0", - "globals": "^11.1.0" + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5", + "@babel/plugin-transform-optional-chaining": "^7.23.3" }, "engines": { "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.13.0" } }, - "node_modules/@babel/traverse/node_modules/globals": { - "version": "11.12.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/types": { - "version": "7.23.0", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.23.0.tgz", - "integrity": "sha512-0oIyUfKoI3mSqMvsxBdclDwxXKXAUA8v/apZbc+iSyARYou1o8ZGDxbUYyLFoW2arqS2jDGqJuZvv1d/io1axg==", + "node_modules/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": { + "version": "7.23.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly/-/plugin-bugfix-v8-static-class-fields-redefine-readonly-7.23.7.tgz", + "integrity": "sha512-LlRT7HgaifEpQA1ZgLVOIJZZFVPWN5iReq/7/JixwBtwcoeVGDBD53ZV28rrsLYOZs1Y/EHhA8N/Z6aazHR8cw==", "dev": true, "dependencies": { - "@babel/helper-string-parser": "^7.22.5", - "@babel/helper-validator-identifier": "^7.22.20", - "to-fast-properties": "^2.0.0" + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" } }, - "node_modules/@colors/colors": { - "version": "1.5.0", + "node_modules/@babel/plugin-proposal-private-property-in-object": { + "version": "7.21.0-placeholder-for-preset-env.2", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.21.0-placeholder-for-preset-env.2.tgz", + "integrity": "sha512-SOSkfJDddaM7mak6cPEpswyTRnuRltl429hMraQEglW+OkovnCzsiszTmsrlY//qLFjCpQDFRvjdm2wA5pPm9w==", "dev": true, - "license": "MIT", "engines": { - "node": ">=0.1.90" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@eslint/eslintrc": { - "version": "2.0.0", + "node_modules/@babel/plugin-syntax-async-generators": { + "version": "7.8.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", + "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", "dev": true, - "license": "MIT", "dependencies": { - "ajv": "^6.12.4", - "debug": "^4.3.2", - "espree": "^9.4.0", - "globals": "^13.19.0", - "ignore": "^5.2.0", - "import-fresh": "^3.2.1", - "js-yaml": "^4.1.0", - "minimatch": "^3.1.2", - "strip-json-comments": "^3.1.1" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "@babel/helper-plugin-utils": "^7.8.0" }, - "funding": { - "url": "https://opencollective.com/eslint" + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@eslint/eslintrc/node_modules/argparse": { - "version": "2.0.1", - "dev": true, - "license": "Python-2.0" - }, - "node_modules/@eslint/eslintrc/node_modules/js-yaml": { - "version": "4.1.0", + "node_modules/@babel/plugin-syntax-class-properties": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz", + "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==", "dev": true, - "license": "MIT", "dependencies": { - "argparse": "^2.0.1" + "@babel/helper-plugin-utils": "^7.12.13" }, - "bin": { - "js-yaml": "bin/js-yaml.js" + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@eslint/eslintrc/node_modules/minimatch": { - "version": "3.1.2", + "node_modules/@babel/plugin-syntax-class-static-block": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz", + "integrity": "sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==", "dev": true, - "license": "ISC", "dependencies": { - "brace-expansion": "^1.1.7" + "@babel/helper-plugin-utils": "^7.14.5" }, "engines": { - "node": "*" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@eslint/js": { - "version": "8.35.0", + "node_modules/@babel/plugin-syntax-dynamic-import": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz", + "integrity": "sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==", "dev": true, - "license": "MIT", - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@humanwhocodes/config-array": { - "version": "0.11.8", + "node_modules/@babel/plugin-syntax-export-namespace-from": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-export-namespace-from/-/plugin-syntax-export-namespace-from-7.8.3.tgz", + "integrity": "sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q==", "dev": true, - "license": "Apache-2.0", "dependencies": { - "@humanwhocodes/object-schema": "^1.2.1", - "debug": "^4.1.1", - "minimatch": "^3.0.5" + "@babel/helper-plugin-utils": "^7.8.3" }, - "engines": { - "node": ">=10.10.0" + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@humanwhocodes/config-array/node_modules/minimatch": { - "version": "3.1.2", + "node_modules/@babel/plugin-syntax-import-assertions": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.23.3.tgz", + "integrity": "sha512-lPgDSU+SJLK3xmFDTV2ZRQAiM7UuUjGidwBywFavObCiZc1BeAAcMtHJKUya92hPHO+at63JJPLygilZard8jw==", "dev": true, - "license": "ISC", "dependencies": { - "brace-expansion": "^1.1.7" + "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { - "node": "*" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@humanwhocodes/module-importer": { - "version": "1.0.1", + "node_modules/@babel/plugin-syntax-import-attributes": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.23.3.tgz", + "integrity": "sha512-pawnE0P9g10xgoP7yKr6CK63K2FMsTE+FZidZO/1PwRdzmAPVs+HS1mAURUsgaoxammTJvULUdIkEK0gOcU2tA==", "dev": true, - "license": "Apache-2.0", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, "engines": { - "node": ">=12.22" + "node": ">=6.9.0" }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/nzakas" + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@humanwhocodes/object-schema": { - "version": "1.2.1", + "node_modules/@babel/plugin-syntax-import-meta": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz", + "integrity": "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==", "dev": true, - "license": "BSD-3-Clause" + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } }, - "node_modules/@istanbuljs/load-nyc-config": { - "version": "1.1.0", + "node_modules/@babel/plugin-syntax-json-strings": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", + "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", "dev": true, - "license": "ISC", "dependencies": { - "camelcase": "^5.3.1", - "find-up": "^4.1.0", - "get-package-type": "^0.1.0", - "js-yaml": "^3.13.1", - "resolve-from": "^5.0.0" + "@babel/helper-plugin-utils": "^7.8.0" }, - "engines": { - "node": ">=8" + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@istanbuljs/load-nyc-config/node_modules/camelcase": { - "version": "5.3.1", + "node_modules/@babel/plugin-syntax-logical-assignment-operators": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz", + "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@istanbuljs/load-nyc-config/node_modules/find-up": { - "version": "4.1.0", + "node_modules/@babel/plugin-syntax-nullish-coalescing-operator": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", + "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", "dev": true, - "license": "MIT", "dependencies": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" + "@babel/helper-plugin-utils": "^7.8.0" }, - "engines": { - "node": ">=8" + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@istanbuljs/load-nyc-config/node_modules/locate-path": { - "version": "5.0.0", + "node_modules/@babel/plugin-syntax-numeric-separator": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz", + "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", "dev": true, - "license": "MIT", "dependencies": { - "p-locate": "^4.1.0" + "@babel/helper-plugin-utils": "^7.10.4" }, - "engines": { - "node": ">=8" + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@istanbuljs/load-nyc-config/node_modules/p-limit": { - "version": "2.3.0", + "node_modules/@babel/plugin-syntax-object-rest-spread": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", + "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", "dev": true, - "license": "MIT", "dependencies": { - "p-try": "^2.0.0" + "@babel/helper-plugin-utils": "^7.8.0" }, - "engines": { - "node": ">=6" + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-optional-catch-binding": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", + "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@istanbuljs/load-nyc-config/node_modules/p-locate": { - "version": "4.1.0", + "node_modules/@babel/plugin-syntax-optional-chaining": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", + "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", "dev": true, - "license": "MIT", "dependencies": { - "p-limit": "^2.2.0" + "@babel/helper-plugin-utils": "^7.8.0" }, - "engines": { - "node": ">=8" + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@istanbuljs/load-nyc-config/node_modules/resolve-from": { - "version": "5.0.0", + "node_modules/@babel/plugin-syntax-private-property-in-object": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz", + "integrity": "sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==", "dev": true, - "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, "engines": { - "node": ">=8" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@istanbuljs/schema": { - "version": "0.1.3", + "node_modules/@babel/plugin-syntax-top-level-await": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz", + "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==", "dev": true, - "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, "engines": { - "node": ">=8" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@jridgewell/gen-mapping": { - "version": "0.1.1", + "node_modules/@babel/plugin-syntax-unicode-sets-regex": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-unicode-sets-regex/-/plugin-syntax-unicode-sets-regex-7.18.6.tgz", + "integrity": "sha512-727YkEAPwSIQTv5im8QHz3upqp92JTWhidIC81Tdx4VJYIte/VndKf1qKrfnnhPLiPghStWfvC/iFaMCQu7Nqg==", "dev": true, - "license": "MIT", "dependencies": { - "@jridgewell/set-array": "^1.0.0", - "@jridgewell/sourcemap-codec": "^1.4.10" + "@babel/helper-create-regexp-features-plugin": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" }, "engines": { - "node": ">=6.0.0" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" } }, - "node_modules/@jridgewell/resolve-uri": { - "version": "3.1.0", + "node_modules/@babel/plugin-transform-arrow-functions": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.23.3.tgz", + "integrity": "sha512-NzQcQrzaQPkaEwoTm4Mhyl8jI1huEL/WWIEvudjTCMJ9aBZNpsJbMASx7EQECtQQPS/DcnFpo0FIh3LvEO9cxQ==", "dev": true, - "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, "engines": { - "node": ">=6.0.0" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@jridgewell/set-array": { - "version": "1.1.2", + "node_modules/@babel/plugin-transform-async-generator-functions": { + "version": "7.23.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.23.9.tgz", + "integrity": "sha512-8Q3veQEDGe14dTYuwagbRtwxQDnytyg1JFu4/HwEMETeofocrB0U0ejBJIXoeG/t2oXZ8kzCyI0ZZfbT80VFNQ==", "dev": true, - "license": "MIT", + "dependencies": { + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-remap-async-to-generator": "^7.22.20", + "@babel/plugin-syntax-async-generators": "^7.8.4" + }, "engines": { - "node": ">=6.0.0" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@jridgewell/sourcemap-codec": { - "version": "1.4.14", + "node_modules/@babel/plugin-transform-async-to-generator": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.23.3.tgz", + "integrity": "sha512-A7LFsKi4U4fomjqXJlZg/u0ft/n8/7n7lpffUP/ZULx/DtV9SGlNKZolHH6PE8Xl1ngCc0M11OaeZptXVkfKSw==", "dev": true, - "license": "MIT" + "dependencies": { + "@babel/helper-module-imports": "^7.22.15", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-remap-async-to-generator": "^7.22.20" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } }, - "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.17", + "node_modules/@babel/plugin-transform-block-scoped-functions": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.23.3.tgz", + "integrity": "sha512-vI+0sIaPIO6CNuM9Kk5VmXcMVRiOpDh7w2zZt9GXzmE/9KD70CUEVhvPR/etAeNK/FAEkhxQtXOzVF3EuRL41A==", "dev": true, - "license": "MIT", "dependencies": { - "@jridgewell/resolve-uri": "3.1.0", - "@jridgewell/sourcemap-codec": "1.4.14" + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@nodelib/fs.scandir": { - "version": "2.1.5", + "node_modules/@babel/plugin-transform-block-scoping": { + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.23.4.tgz", + "integrity": "sha512-0QqbP6B6HOh7/8iNR4CQU2Th/bbRtBp4KS9vcaZd1fZ0wSh5Fyssg0UCIHwxh+ka+pNDREbVLQnHCMHKZfPwfw==", "dev": true, - "license": "MIT", "dependencies": { - "@nodelib/fs.stat": "2.0.5", - "run-parallel": "^1.1.9" + "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { - "node": ">= 8" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@nodelib/fs.stat": { - "version": "2.0.5", + "node_modules/@babel/plugin-transform-class-properties": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.23.3.tgz", + "integrity": "sha512-uM+AN8yCIjDPccsKGlw271xjJtGii+xQIF/uMPS8H15L12jZTsLfF4o5vNO7d/oUguOyfdikHGc/yi9ge4SGIg==", "dev": true, - "license": "MIT", + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.22.15", + "@babel/helper-plugin-utils": "^7.22.5" + }, "engines": { - "node": ">= 8" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@nodelib/fs.walk": { - "version": "1.2.8", + "node_modules/@babel/plugin-transform-class-static-block": { + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.23.4.tgz", + "integrity": "sha512-nsWu/1M+ggti1SOALj3hfx5FXzAY06fwPJsUZD4/A5e1bWi46VUIWtD+kOX6/IdhXGsXBWllLFDSnqSCdUNydQ==", "dev": true, - "license": "MIT", "dependencies": { - "@nodelib/fs.scandir": "2.1.5", - "fastq": "^1.6.0" + "@babel/helper-create-class-features-plugin": "^7.22.15", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-class-static-block": "^7.14.5" }, "engines": { - "node": ">= 8" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.12.0" } }, - "node_modules/@socket.io/component-emitter": { - "version": "3.1.0", + "node_modules/@babel/plugin-transform-classes": { + "version": "7.23.8", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.23.8.tgz", + "integrity": "sha512-yAYslGsY1bX6Knmg46RjiCiNSwJKv2IUC8qOdYKqMMr0491SXFhcHqOdRDeCRohOOIzwN/90C6mQ9qAKgrP7dg==", "dev": true, - "license": "MIT" + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.22.5", + "@babel/helper-compilation-targets": "^7.23.6", + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-function-name": "^7.23.0", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-replace-supers": "^7.22.20", + "@babel/helper-split-export-declaration": "^7.22.6", + "globals": "^11.1.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } }, - "node_modules/@types/cookie": { - "version": "0.4.1", + "node_modules/@babel/plugin-transform-classes/node_modules/globals": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", "dev": true, - "license": "MIT" + "engines": { + "node": ">=4" + } }, - "node_modules/@types/cors": { - "version": "2.8.13", + "node_modules/@babel/plugin-transform-computed-properties": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.23.3.tgz", + "integrity": "sha512-dTj83UVTLw/+nbiHqQSFdwO9CbTtwq1DsDqm3CUEtDrZNET5rT5E6bIdTlOftDTDLMYxvxHNEYO4B9SLl8SLZw==", "dev": true, - "license": "MIT", "dependencies": { - "@types/node": "*" + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/template": "^7.22.15" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@types/node": { - "version": "18.14.2", - "dev": true, - "license": "MIT" - }, - "node_modules/accepts": { - "version": "1.3.8", + "node_modules/@babel/plugin-transform-destructuring": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.23.3.tgz", + "integrity": "sha512-n225npDqjDIr967cMScVKHXJs7rout1q+tt50inyBCPkyZ8KxeI6d+GIbSBTT/w/9WdlWDOej3V9HE5Lgk57gw==", "dev": true, - "license": "MIT", "dependencies": { - "mime-types": "~2.1.34", - "negotiator": "0.6.3" + "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { - "node": ">= 0.6" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/acorn": { - "version": "7.4.1", + "node_modules/@babel/plugin-transform-dotall-regex": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.23.3.tgz", + "integrity": "sha512-vgnFYDHAKzFaTVp+mneDsIEbnJ2Np/9ng9iviHw3P/KVcgONxpNULEW/51Z/BaFojG2GI2GwwXck5uV1+1NOYQ==", "dev": true, - "license": "MIT", - "bin": { - "acorn": "bin/acorn" + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.22.15", + "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { - "node": ">=0.4.0" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/acorn-jsx": { - "version": "5.3.2", + "node_modules/@babel/plugin-transform-duplicate-keys": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.23.3.tgz", + "integrity": "sha512-RrqQ+BQmU3Oyav3J+7/myfvRCq7Tbz+kKLLshUmMwNlDHExbGL7ARhajvoBJEvc+fCguPPu887N+3RRXBVKZUA==", "dev": true, - "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, "peerDependencies": { - "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" + "@babel/core": "^7.0.0-0" } }, - "node_modules/acorn-node": { - "version": "1.8.2", + "node_modules/@babel/plugin-transform-dynamic-import": { + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.23.4.tgz", + "integrity": "sha512-V6jIbLhdJK86MaLh4Jpghi8ho5fGzt3imHOBu/x0jlBaPYqDoWz4RDXjmMOfnh+JWNaQleEAByZLV0QzBT4YQQ==", "dev": true, - "license": "Apache-2.0", "dependencies": { - "acorn": "^7.0.0", - "acorn-walk": "^7.0.0", - "xtend": "^4.0.2" + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-dynamic-import": "^7.8.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/acorn-walk": { - "version": "7.0.0", + "node_modules/@babel/plugin-transform-exponentiation-operator": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.23.3.tgz", + "integrity": "sha512-5fhCsl1odX96u7ILKHBj4/Y8vipoqwsJMh4csSA8qFfxrZDEA4Ssku2DyNvMJSmZNOEBT750LfFPbtrnTP90BQ==", "dev": true, - "license": "MIT", + "dependencies": { + "@babel/helper-builder-binary-assignment-operator-visitor": "^7.22.15", + "@babel/helper-plugin-utils": "^7.22.5" + }, "engines": { - "node": ">=0.4.0" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/aggregate-error": { - "version": "3.1.0", + "node_modules/@babel/plugin-transform-export-namespace-from": { + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.23.4.tgz", + "integrity": "sha512-GzuSBcKkx62dGzZI1WVgTWvkkz84FZO5TC5T8dl/Tht/rAla6Dg/Mz9Yhypg+ezVACf/rgDuQt3kbWEv7LdUDQ==", "dev": true, - "license": "MIT", "dependencies": { - "clean-stack": "^2.0.0", - "indent-string": "^4.0.0" + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-export-namespace-from": "^7.8.3" }, "engines": { - "node": ">=8" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/ajv": { - "version": "6.12.6", + "node_modules/@babel/plugin-transform-for-of": { + "version": "7.23.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.23.6.tgz", + "integrity": "sha512-aYH4ytZ0qSuBbpfhuofbg/e96oQ7U2w1Aw/UQmKT+1l39uEhUPoFS3fHevDc1G0OvewyDudfMKY1OulczHzWIw==", "dev": true, - "license": "MIT", "dependencies": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5" }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/ansi-regex": { - "version": "5.0.1", + "node_modules/@babel/plugin-transform-function-name": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.23.3.tgz", + "integrity": "sha512-I1QXp1LxIvt8yLaib49dRW5Okt7Q4oaxao6tFVKS/anCdEOMtYwWVKoiOA1p34GOWIZjUK0E+zCp7+l1pfQyiw==", "dev": true, - "license": "MIT", + "dependencies": { + "@babel/helper-compilation-targets": "^7.22.15", + "@babel/helper-function-name": "^7.23.0", + "@babel/helper-plugin-utils": "^7.22.5" + }, "engines": { - "node": ">=8" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "node_modules/@babel/plugin-transform-json-strings": { + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.23.4.tgz", + "integrity": "sha512-81nTOqM1dMwZ/aRXQ59zVubN9wHGqk6UtqRK+/q+ciXmRy8fSolhGVvG09HHRGo4l6fr/c4ZhXUQH0uFW7PZbg==", "dev": true, "dependencies": { - "color-convert": "^1.9.0" + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-json-strings": "^7.8.3" }, "engines": { - "node": ">=4" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/anymatch": { - "version": "3.1.3", + "node_modules/@babel/plugin-transform-literals": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.23.3.tgz", + "integrity": "sha512-wZ0PIXRxnwZvl9AYpqNUxpZ5BiTGrYt7kueGQ+N5FiQ7RCOD4cm8iShd6S6ggfVIWaJf2EMk8eRzAh52RfP4rQ==", "dev": true, - "license": "ISC", "dependencies": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" + "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { - "node": ">= 8" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/append-transform": { - "version": "2.0.0", + "node_modules/@babel/plugin-transform-logical-assignment-operators": { + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.23.4.tgz", + "integrity": "sha512-Mc/ALf1rmZTP4JKKEhUwiORU+vcfarFVLfcFiolKUo6sewoxSEgl36ak5t+4WamRsNr6nzjZXQjM35WsU+9vbg==", "dev": true, - "license": "MIT", "dependencies": { - "default-require-extensions": "^3.0.0" + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4" }, "engines": { - "node": ">=8" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/archy": { - "version": "1.0.0", - "dev": true, - "license": "MIT" - }, - "node_modules/argparse": { - "version": "1.0.10", + "node_modules/@babel/plugin-transform-member-expression-literals": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.23.3.tgz", + "integrity": "sha512-sC3LdDBDi5x96LA+Ytekz2ZPk8i/Ck+DEuDbRAll5rknJ5XRTSaPKEYwomLcs1AA8wg9b3KjIQRsnApj+q51Ag==", "dev": true, - "license": "MIT", "dependencies": { - "sprintf-js": "~1.0.2" + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/asn1.js": { - "version": "5.4.1", - "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-5.4.1.tgz", - "integrity": "sha512-+I//4cYPccV8LdmBLiX8CYvf9Sp3vQsrqu2QNXRcrbiWvcx/UdlFiqUJJzxRQxgsZmvhXhn4cSKeSmoFjVdupA==", + "node_modules/@babel/plugin-transform-modules-amd": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.23.3.tgz", + "integrity": "sha512-vJYQGxeKM4t8hYCKVBlZX/gtIY2I7mRGFNcm85sgXGMTBcoV3QdVtdpbcWEbzbfUIUZKwvgFT82mRvaQIebZzw==", "dev": true, "dependencies": { - "bn.js": "^4.0.0", - "inherits": "^2.0.1", - "minimalistic-assert": "^1.0.0", - "safer-buffer": "^2.1.0" + "@babel/helper-module-transforms": "^7.23.3", + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/assert": { - "version": "1.5.0", + "node_modules/@babel/plugin-transform-modules-commonjs": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.23.3.tgz", + "integrity": "sha512-aVS0F65LKsdNOtcz6FRCpE4OgsP2OFnW46qNxNIX9h3wuzaNcSQsJysuMwqSibC98HPrf2vCgtxKNwS0DAlgcA==", "dev": true, - "license": "MIT", "dependencies": { - "object-assign": "^4.1.1", - "util": "0.10.3" + "@babel/helper-module-transforms": "^7.23.3", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-simple-access": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/assert/node_modules/inherits": { - "version": "2.0.1", - "dev": true, - "license": "ISC" - }, - "node_modules/assert/node_modules/util": { - "version": "0.10.3", + "node_modules/@babel/plugin-transform-modules-systemjs": { + "version": "7.23.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.23.9.tgz", + "integrity": "sha512-KDlPRM6sLo4o1FkiSlXoAa8edLXFsKKIda779fbLrvmeuc3itnjCtaO6RrtoaANsIJANj+Vk1zqbZIMhkCAHVw==", "dev": true, - "license": "MIT", "dependencies": { - "inherits": "2.0.1" + "@babel/helper-hoist-variables": "^7.22.5", + "@babel/helper-module-transforms": "^7.23.3", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-validator-identifier": "^7.22.20" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/assertion-error": { - "version": "1.1.0", + "node_modules/@babel/plugin-transform-modules-umd": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.23.3.tgz", + "integrity": "sha512-zHsy9iXX2nIsCBFPud3jKn1IRPWg3Ing1qOZgeKV39m1ZgIdpJqvlWVeiHBZC6ITRG0MfskhYe9cLgntfSFPIg==", "dev": true, - "license": "MIT", + "dependencies": { + "@babel/helper-module-transforms": "^7.23.3", + "@babel/helper-plugin-utils": "^7.22.5" + }, "engines": { - "node": "*" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/balanced-match": { - "version": "1.0.0", - "dev": true, - "license": "MIT" - }, - "node_modules/base64-js": { - "version": "1.5.1", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT" - }, - "node_modules/base64id": { - "version": "2.0.0", + "node_modules/@babel/plugin-transform-named-capturing-groups-regex": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.22.5.tgz", + "integrity": "sha512-YgLLKmS3aUBhHaxp5hi1WJTgOUb/NCuDHzGT9z9WTt3YG+CPRhJs6nprbStx6DnWM4dh6gt7SU3sZodbZ08adQ==", "dev": true, - "license": "MIT", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5" + }, "engines": { - "node": "^4.5.0 || >= 5.9" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" } }, - "node_modules/beeper": { - "version": "1.1.1", + "node_modules/@babel/plugin-transform-new-target": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.23.3.tgz", + "integrity": "sha512-YJ3xKqtJMAT5/TIZnpAR3I+K+WaDowYbN3xyxI8zxx/Gsypwf9B9h0VB+1Nh6ACAAPRS5NSRje0uVv5i79HYGQ==", "dev": true, - "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, "engines": { - "node": ">=0.10.0" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/benchmark": { - "version": "2.1.4", + "node_modules/@babel/plugin-transform-nullish-coalescing-operator": { + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.23.4.tgz", + "integrity": "sha512-jHE9EVVqHKAQx+VePv5LLGHjmHSJR76vawFPTdlxR/LVJPfOEGxREQwQfjuZEOPTwG92X3LINSh3M40Rv4zpVA==", "dev": true, - "license": "MIT", "dependencies": { - "lodash": "^4.17.4", - "platform": "^1.3.3" + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/binary-extensions": { - "version": "2.2.0", + "node_modules/@babel/plugin-transform-numeric-separator": { + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.23.4.tgz", + "integrity": "sha512-mps6auzgwjRrwKEZA05cOwuDc9FAzoyFS4ZsG/8F43bTLf/TgkJg7QXOrPO1JO599iA3qgK9MXdMGOEC8O1h6Q==", "dev": true, - "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-numeric-separator": "^7.10.4" + }, "engines": { - "node": ">=8" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/bn.js": { - "version": "4.12.0", - "dev": true, - "license": "MIT" - }, - "node_modules/body-parser": { - "version": "1.20.2", + "node_modules/@babel/plugin-transform-object-rest-spread": { + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.23.4.tgz", + "integrity": "sha512-9x9K1YyeQVw0iOXJlIzwm8ltobIIv7j2iLyP2jIhEbqPRQ7ScNgwQufU2I0Gq11VjyG4gI4yMXt2VFags+1N3g==", "dev": true, - "license": "MIT", "dependencies": { - "bytes": "3.1.2", - "content-type": "~1.0.5", - "debug": "2.6.9", - "depd": "2.0.0", - "destroy": "1.2.0", - "http-errors": "2.0.0", - "iconv-lite": "0.4.24", - "on-finished": "2.4.1", - "qs": "6.11.0", - "raw-body": "2.5.2", - "type-is": "~1.6.18", - "unpipe": "1.0.0" + "@babel/compat-data": "^7.23.3", + "@babel/helper-compilation-targets": "^7.22.15", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-object-rest-spread": "^7.8.3", + "@babel/plugin-transform-parameters": "^7.23.3" }, "engines": { - "node": ">= 0.8", - "npm": "1.2.8000 || >= 1.4.16" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/body-parser/node_modules/debug": { - "version": "2.6.9", + "node_modules/@babel/plugin-transform-object-super": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.23.3.tgz", + "integrity": "sha512-BwQ8q0x2JG+3lxCVFohg+KbQM7plfpBwThdW9A6TMtWwLsbDA01Ek2Zb/AgDN39BiZsExm4qrXxjk+P1/fzGrA==", "dev": true, - "license": "MIT", "dependencies": { - "ms": "2.0.0" + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-replace-supers": "^7.22.20" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/body-parser/node_modules/ms": { - "version": "2.0.0", - "dev": true, - "license": "MIT" - }, - "node_modules/body-parser/node_modules/on-finished": { - "version": "2.4.1", + "node_modules/@babel/plugin-transform-optional-catch-binding": { + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.23.4.tgz", + "integrity": "sha512-XIq8t0rJPHf6Wvmbn9nFxU6ao4c7WhghTR5WyV8SrJfUFzyxhCm4nhC+iAp3HFhbAKLfYpgzhJ6t4XCtVwqO5A==", "dev": true, - "license": "MIT", "dependencies": { - "ee-first": "1.1.1" + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.3" }, "engines": { - "node": ">= 0.8" - } + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } }, - "node_modules/brace-expansion": { - "version": "1.1.11", + "node_modules/@babel/plugin-transform-optional-chaining": { + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.23.4.tgz", + "integrity": "sha512-ZU8y5zWOfjM5vZ+asjgAPwDaBjJzgufjES89Rs4Lpq63O300R/kOz30WCLo6BxxX6QVEilwSlpClnG5cZaikTA==", "dev": true, - "license": "MIT", "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5", + "@babel/plugin-syntax-optional-chaining": "^7.8.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/braces": { - "version": "3.0.2", + "node_modules/@babel/plugin-transform-parameters": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.23.3.tgz", + "integrity": "sha512-09lMt6UsUb3/34BbECKVbVwrT9bO6lILWln237z7sLaWnMsTi7Yc9fhX5DLpkJzAGfaReXI22wP41SZmnAA3Vw==", "dev": true, - "license": "MIT", "dependencies": { - "fill-range": "^7.0.1" + "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { - "node": ">=8" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/brorand": { - "version": "1.1.0", - "dev": true, - "license": "MIT" - }, - "node_modules/browser-pack": { - "version": "6.1.0", + "node_modules/@babel/plugin-transform-private-methods": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.23.3.tgz", + "integrity": "sha512-UzqRcRtWsDMTLrRWFvUBDwmw06tCQH9Rl1uAjfh6ijMSmGYQ+fpdB+cnqRC8EMh5tuuxSv0/TejGL+7vyj+50g==", "dev": true, - "license": "MIT", "dependencies": { - "combine-source-map": "~0.8.0", - "defined": "^1.0.0", - "JSONStream": "^1.0.3", - "safe-buffer": "^5.1.1", - "through2": "^2.0.0", - "umd": "^3.0.0" + "@babel/helper-create-class-features-plugin": "^7.22.15", + "@babel/helper-plugin-utils": "^7.22.5" }, - "bin": { - "browser-pack": "bin/cmd.js" + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/browser-resolve": { - "version": "1.11.3", + "node_modules/@babel/plugin-transform-private-property-in-object": { + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.23.4.tgz", + "integrity": "sha512-9G3K1YqTq3F4Vt88Djx1UZ79PDyj+yKRnUy7cZGSMe+a7jkwD259uKKuUzQlPkGam7R+8RJwh5z4xO27fA1o2A==", "dev": true, - "license": "MIT", "dependencies": { - "resolve": "1.1.7" + "@babel/helper-annotate-as-pure": "^7.22.5", + "@babel/helper-create-class-features-plugin": "^7.22.15", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-private-property-in-object": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/browser-resolve/node_modules/resolve": { - "version": "1.1.7", + "node_modules/@babel/plugin-transform-property-literals": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.23.3.tgz", + "integrity": "sha512-jR3Jn3y7cZp4oEWPFAlRsSWjxKe4PZILGBSd4nis1TsC5qeSpb+nrtihJuDhNI7QHiVbUaiXa0X2RZY3/TI6Nw==", "dev": true, - "license": "MIT" + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } }, - "node_modules/browser-stdout": { - "version": "1.3.1", + "node_modules/@babel/plugin-transform-regenerator": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.23.3.tgz", + "integrity": "sha512-KP+75h0KghBMcVpuKisx3XTu9Ncut8Q8TuvGO4IhY+9D5DFEckQefOuIsB/gQ2tG71lCke4NMrtIPS8pOj18BQ==", "dev": true, - "license": "ISC" + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5", + "regenerator-transform": "^0.15.2" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } }, - "node_modules/browserify": { - "version": "16.5.1", + "node_modules/@babel/plugin-transform-reserved-words": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.23.3.tgz", + "integrity": "sha512-QnNTazY54YqgGxwIexMZva9gqbPa15t/x9VS+0fsEFWplwVpXYZivtgl43Z1vMpc1bdPP2PP8siFeVcnFvA3Cg==", "dev": true, - "license": "MIT", "dependencies": { - "assert": "^1.4.0", - "browser-pack": "^6.0.1", - "browser-resolve": "^1.11.0", - "browserify-zlib": "~0.2.0", - "buffer": "~5.2.1", - "cached-path-relative": "^1.0.0", - "concat-stream": "^1.6.0", - "console-browserify": "^1.1.0", - "constants-browserify": "~1.0.0", - "crypto-browserify": "^3.0.0", - "defined": "^1.0.0", - "deps-sort": "^2.0.0", - "domain-browser": "^1.2.0", - "duplexer2": "~0.1.2", - "events": "^2.0.0", - "glob": "^7.1.0", - "has": "^1.0.0", - "htmlescape": "^1.1.0", - "https-browserify": "^1.0.0", - "inherits": "~2.0.1", - "insert-module-globals": "^7.0.0", - "JSONStream": "^1.0.3", - "labeled-stream-splicer": "^2.0.0", - "mkdirp-classic": "^0.5.2", - "module-deps": "^6.0.0", - "os-browserify": "~0.3.0", - "parents": "^1.0.1", - "path-browserify": "~0.0.0", - "process": "~0.11.0", - "punycode": "^1.3.2", - "querystring-es3": "~0.2.0", - "read-only-stream": "^2.0.0", - "readable-stream": "^2.0.2", - "resolve": "^1.1.4", - "shasum": "^1.0.0", - "shell-quote": "^1.6.1", - "stream-browserify": "^2.0.0", - "stream-http": "^3.0.0", - "string_decoder": "^1.1.1", - "subarg": "^1.0.0", - "syntax-error": "^1.1.1", - "through2": "^2.0.0", - "timers-browserify": "^1.0.1", - "tty-browserify": "0.0.1", - "url": "~0.11.0", - "util": "~0.10.1", - "vm-browserify": "^1.0.0", - "xtend": "^4.0.0" - }, - "bin": { - "browserify": "bin/cmd.js" + "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { - "node": ">= 0.8" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/browserify-aes": { - "version": "1.2.0", + "node_modules/@babel/plugin-transform-shorthand-properties": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.23.3.tgz", + "integrity": "sha512-ED2fgqZLmexWiN+YNFX26fx4gh5qHDhn1O2gvEhreLW2iI63Sqm4llRLCXALKrCnbN4Jy0VcMQZl/SAzqug/jg==", "dev": true, - "license": "MIT", "dependencies": { - "buffer-xor": "^1.0.3", - "cipher-base": "^1.0.0", - "create-hash": "^1.1.0", - "evp_bytestokey": "^1.0.3", - "inherits": "^2.0.1", - "safe-buffer": "^5.0.1" + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/browserify-cipher": { - "version": "1.0.1", + "node_modules/@babel/plugin-transform-spread": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.23.3.tgz", + "integrity": "sha512-VvfVYlrlBVu+77xVTOAoxQ6mZbnIq5FM0aGBSFEcIh03qHf+zNqA4DC/3XMUozTg7bZV3e3mZQ0i13VB6v5yUg==", "dev": true, - "license": "MIT", "dependencies": { - "browserify-aes": "^1.0.4", - "browserify-des": "^1.0.0", - "evp_bytestokey": "^1.0.0" + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/browserify-des": { - "version": "1.0.2", + "node_modules/@babel/plugin-transform-sticky-regex": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.23.3.tgz", + "integrity": "sha512-HZOyN9g+rtvnOU3Yh7kSxXrKbzgrm5X4GncPY1QOquu7epga5MxKHVpYu2hvQnry/H+JjckSYRb93iNfsioAGg==", "dev": true, - "license": "MIT", "dependencies": { - "cipher-base": "^1.0.1", - "des.js": "^1.0.0", - "inherits": "^2.0.1", - "safe-buffer": "^5.1.2" + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/browserify-rsa": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.1.0.tgz", - "integrity": "sha512-AdEER0Hkspgno2aR97SAf6vi0y0k8NuOpGnVH3O99rcA5Q6sh8QxcngtHuJ6uXwnfAXNM4Gn1Gb7/MV1+Ymbog==", + "node_modules/@babel/plugin-transform-template-literals": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.23.3.tgz", + "integrity": "sha512-Flok06AYNp7GV2oJPZZcP9vZdszev6vPBkHLwxwSpaIqx75wn6mUd3UFWsSsA0l8nXAKkyCmL/sR02m8RYGeHg==", "dev": true, "dependencies": { - "bn.js": "^5.0.0", - "randombytes": "^2.0.1" + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/browserify-rsa/node_modules/bn.js": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.1.tgz", - "integrity": "sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ==", - "dev": true - }, - "node_modules/browserify-sign": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.2.2.tgz", - "integrity": "sha512-1rudGyeYY42Dk6texmv7c4VcQ0EsvVbLwZkA+AQB7SxvXxmcD93jcHie8bzecJ+ChDlmAm2Qyu0+Ccg5uhZXCg==", + "node_modules/@babel/plugin-transform-typeof-symbol": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.23.3.tgz", + "integrity": "sha512-4t15ViVnaFdrPC74be1gXBSMzXk3B4Us9lP7uLRQHTFpV5Dvt33pn+2MyyNxmN3VTTm3oTrZVMUmuw3oBnQ2oQ==", "dev": true, "dependencies": { - "bn.js": "^5.2.1", - "browserify-rsa": "^4.1.0", - "create-hash": "^1.2.0", - "create-hmac": "^1.1.7", - "elliptic": "^6.5.4", - "inherits": "^2.0.4", - "parse-asn1": "^5.1.6", - "readable-stream": "^3.6.2", - "safe-buffer": "^5.2.1" + "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { - "node": ">= 4" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/browserify-sign/node_modules/bn.js": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.1.tgz", - "integrity": "sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ==", - "dev": true - }, - "node_modules/browserify-sign/node_modules/readable-stream": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", - "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "node_modules/@babel/plugin-transform-unicode-escapes": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.23.3.tgz", + "integrity": "sha512-OMCUx/bU6ChE3r4+ZdylEqAjaQgHAgipgW8nsCfu5pGqDcFytVd91AwRvUJSBZDz0exPGgnjoqhgRYLRjFZc9Q==", "dev": true, "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" + "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { - "node": ">= 6" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/browserify-zlib": { - "version": "0.2.0", + "node_modules/@babel/plugin-transform-unicode-property-regex": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.23.3.tgz", + "integrity": "sha512-KcLIm+pDZkWZQAFJ9pdfmh89EwVfmNovFBcXko8szpBeF8z68kWIPeKlmSOkT9BXJxs2C0uk+5LxoxIv62MROA==", "dev": true, - "license": "MIT", "dependencies": { - "pako": "~1.0.5" + "@babel/helper-create-regexp-features-plugin": "^7.22.15", + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/browserslist": { - "version": "4.21.5", + "node_modules/@babel/plugin-transform-unicode-regex": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.23.3.tgz", + "integrity": "sha512-wMHpNA4x2cIA32b/ci3AfwNgheiva2W0WUKWTK7vBHBhDKfPsc5cFGNWm69WBqpwd86u1qwZ9PWevKqm1A3yAw==", "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/browserslist" - } - ], - "license": "MIT", "dependencies": { - "caniuse-lite": "^1.0.30001449", - "electron-to-chromium": "^1.4.284", - "node-releases": "^2.0.8", - "update-browserslist-db": "^1.0.10" - }, - "bin": { - "browserslist": "cli.js" + "@babel/helper-create-regexp-features-plugin": "^7.22.15", + "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { - "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/buffer": { - "version": "5.2.1", + "node_modules/@babel/plugin-transform-unicode-sets-regex": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.23.3.tgz", + "integrity": "sha512-W7lliA/v9bNR83Qc3q1ip9CQMZ09CcHDbHfbLRDNuAhn1Mvkr1ZNF7hPmztMQvtTGVLJ9m8IZqWsTkXOml8dbw==", "dev": true, - "license": "MIT", "dependencies": { - "base64-js": "^1.0.2", - "ieee754": "^1.1.4" + "@babel/helper-create-regexp-features-plugin": "^7.22.15", + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" } }, - "node_modules/buffer-from": { - "version": "1.1.1", - "dev": true, - "license": "MIT" + "node_modules/@babel/preset-env": { + "version": "7.23.9", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.23.9.tgz", + "integrity": "sha512-3kBGTNBBk9DQiPoXYS0g0BYlwTQYUTifqgKTjxUwEUkduRT2QOa0FPGBJ+NROQhGyYO5BuTJwGvBnqKDykac6A==", + "dev": true, + "dependencies": { + "@babel/compat-data": "^7.23.5", + "@babel/helper-compilation-targets": "^7.23.6", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-validator-option": "^7.23.5", + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.23.3", + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.23.3", + "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": "^7.23.7", + "@babel/plugin-proposal-private-property-in-object": "7.21.0-placeholder-for-preset-env.2", + "@babel/plugin-syntax-async-generators": "^7.8.4", + "@babel/plugin-syntax-class-properties": "^7.12.13", + "@babel/plugin-syntax-class-static-block": "^7.14.5", + "@babel/plugin-syntax-dynamic-import": "^7.8.3", + "@babel/plugin-syntax-export-namespace-from": "^7.8.3", + "@babel/plugin-syntax-import-assertions": "^7.23.3", + "@babel/plugin-syntax-import-attributes": "^7.23.3", + "@babel/plugin-syntax-import-meta": "^7.10.4", + "@babel/plugin-syntax-json-strings": "^7.8.3", + "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", + "@babel/plugin-syntax-numeric-separator": "^7.10.4", + "@babel/plugin-syntax-object-rest-spread": "^7.8.3", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", + "@babel/plugin-syntax-optional-chaining": "^7.8.3", + "@babel/plugin-syntax-private-property-in-object": "^7.14.5", + "@babel/plugin-syntax-top-level-await": "^7.14.5", + "@babel/plugin-syntax-unicode-sets-regex": "^7.18.6", + "@babel/plugin-transform-arrow-functions": "^7.23.3", + "@babel/plugin-transform-async-generator-functions": "^7.23.9", + "@babel/plugin-transform-async-to-generator": "^7.23.3", + "@babel/plugin-transform-block-scoped-functions": "^7.23.3", + "@babel/plugin-transform-block-scoping": "^7.23.4", + "@babel/plugin-transform-class-properties": "^7.23.3", + "@babel/plugin-transform-class-static-block": "^7.23.4", + "@babel/plugin-transform-classes": "^7.23.8", + "@babel/plugin-transform-computed-properties": "^7.23.3", + "@babel/plugin-transform-destructuring": "^7.23.3", + "@babel/plugin-transform-dotall-regex": "^7.23.3", + "@babel/plugin-transform-duplicate-keys": "^7.23.3", + "@babel/plugin-transform-dynamic-import": "^7.23.4", + "@babel/plugin-transform-exponentiation-operator": "^7.23.3", + "@babel/plugin-transform-export-namespace-from": "^7.23.4", + "@babel/plugin-transform-for-of": "^7.23.6", + "@babel/plugin-transform-function-name": "^7.23.3", + "@babel/plugin-transform-json-strings": "^7.23.4", + "@babel/plugin-transform-literals": "^7.23.3", + "@babel/plugin-transform-logical-assignment-operators": "^7.23.4", + "@babel/plugin-transform-member-expression-literals": "^7.23.3", + "@babel/plugin-transform-modules-amd": "^7.23.3", + "@babel/plugin-transform-modules-commonjs": "^7.23.3", + "@babel/plugin-transform-modules-systemjs": "^7.23.9", + "@babel/plugin-transform-modules-umd": "^7.23.3", + "@babel/plugin-transform-named-capturing-groups-regex": "^7.22.5", + "@babel/plugin-transform-new-target": "^7.23.3", + "@babel/plugin-transform-nullish-coalescing-operator": "^7.23.4", + "@babel/plugin-transform-numeric-separator": "^7.23.4", + "@babel/plugin-transform-object-rest-spread": "^7.23.4", + "@babel/plugin-transform-object-super": "^7.23.3", + "@babel/plugin-transform-optional-catch-binding": "^7.23.4", + "@babel/plugin-transform-optional-chaining": "^7.23.4", + "@babel/plugin-transform-parameters": "^7.23.3", + "@babel/plugin-transform-private-methods": "^7.23.3", + "@babel/plugin-transform-private-property-in-object": "^7.23.4", + "@babel/plugin-transform-property-literals": "^7.23.3", + "@babel/plugin-transform-regenerator": "^7.23.3", + "@babel/plugin-transform-reserved-words": "^7.23.3", + "@babel/plugin-transform-shorthand-properties": "^7.23.3", + "@babel/plugin-transform-spread": "^7.23.3", + "@babel/plugin-transform-sticky-regex": "^7.23.3", + "@babel/plugin-transform-template-literals": "^7.23.3", + "@babel/plugin-transform-typeof-symbol": "^7.23.3", + "@babel/plugin-transform-unicode-escapes": "^7.23.3", + "@babel/plugin-transform-unicode-property-regex": "^7.23.3", + "@babel/plugin-transform-unicode-regex": "^7.23.3", + "@babel/plugin-transform-unicode-sets-regex": "^7.23.3", + "@babel/preset-modules": "0.1.6-no-external-plugins", + "babel-plugin-polyfill-corejs2": "^0.4.8", + "babel-plugin-polyfill-corejs3": "^0.9.0", + "babel-plugin-polyfill-regenerator": "^0.5.5", + "core-js-compat": "^3.31.0", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } }, - "node_modules/buffer-xor": { - "version": "1.0.3", + "node_modules/@babel/preset-env/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "dev": true, - "license": "MIT" + "bin": { + "semver": "bin/semver.js" + } }, - "node_modules/builtin-status-codes": { - "version": "3.0.0", + "node_modules/@babel/preset-modules": { + "version": "0.1.6-no-external-plugins", + "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.6-no-external-plugins.tgz", + "integrity": "sha512-HrcgcIESLm9aIR842yhJ5RWan/gebQUJ6E/E5+rf0y9o6oj7w0Br+sWuL6kEQ/o/AdfvR1Je9jG18/gnpwjEyA==", "dev": true, - "license": "MIT" + "dependencies": { + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/types": "^7.4.4", + "esutils": "^2.0.2" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0 || ^8.0.0-0 <8.0.0" + } }, - "node_modules/bytes": { - "version": "3.1.2", + "node_modules/@babel/regjsgen": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/@babel/regjsgen/-/regjsgen-0.8.0.tgz", + "integrity": "sha512-x/rqGMdzj+fWZvCOYForTghzbtqPDZ5gPwaoNGHdgDfF2QA/XZbCBp4Moo5scrkAMPhB7z26XM/AaHuIJdgauA==", + "dev": true + }, + "node_modules/@babel/runtime": { + "version": "7.23.9", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.23.9.tgz", + "integrity": "sha512-0CX6F+BI2s9dkUqr08KFrAIZgNFj75rdBU/DjCyYLIaV/quFjkk6T+EJ2LkZHyZTbEV4L5p97mNkUsHl2wLFAw==", "dev": true, - "license": "MIT", + "dependencies": { + "regenerator-runtime": "^0.14.0" + }, "engines": { - "node": ">= 0.8" + "node": ">=6.9.0" } }, - "node_modules/cached-path-relative": { - "version": "1.1.0", + "node_modules/@babel/template": { + "version": "7.23.9", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.23.9.tgz", + "integrity": "sha512-+xrD2BWLpvHKNmX2QbpdpsBaWnRxahMwJjO+KZk2JOElj5nSmKezyS1B4u+QbHMTX69t4ukm6hh9lsYQ7GHCKA==", "dev": true, - "license": "MIT" + "dependencies": { + "@babel/code-frame": "^7.23.5", + "@babel/parser": "^7.23.9", + "@babel/types": "^7.23.9" + }, + "engines": { + "node": ">=6.9.0" + } }, - "node_modules/caching-transform": { - "version": "4.0.0", + "node_modules/@babel/traverse": { + "version": "7.23.9", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.23.9.tgz", + "integrity": "sha512-I/4UJ9vs90OkBtY6iiiTORVMyIhJ4kAVmsKo9KFc8UOxMeUfi2hvtIBsET5u9GizXE6/GFSuKCTNfgCswuEjRg==", "dev": true, - "license": "MIT", "dependencies": { - "hasha": "^5.0.0", - "make-dir": "^3.0.0", - "package-hash": "^4.0.0", - "write-file-atomic": "^3.0.0" + "@babel/code-frame": "^7.23.5", + "@babel/generator": "^7.23.6", + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-function-name": "^7.23.0", + "@babel/helper-hoist-variables": "^7.22.5", + "@babel/helper-split-export-declaration": "^7.22.6", + "@babel/parser": "^7.23.9", + "@babel/types": "^7.23.9", + "debug": "^4.3.1", + "globals": "^11.1.0" }, "engines": { - "node": ">=8" + "node": ">=6.9.0" } }, - "node_modules/call-bind": { - "version": "1.0.2", + "node_modules/@babel/traverse/node_modules/globals": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/types": { + "version": "7.23.9", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.23.9.tgz", + "integrity": "sha512-dQjSq/7HaSjRM43FFGnv5keM2HsxpmyV1PfaSVm0nzzjwwTmjOe6J4bC8e3+pTEIgHaHj+1ZlLThRJ2auc/w1Q==", "dev": true, - "license": "MIT", "dependencies": { - "function-bind": "^1.1.1", - "get-intrinsic": "^1.0.2" + "@babel/helper-string-parser": "^7.23.4", + "@babel/helper-validator-identifier": "^7.22.20", + "to-fast-properties": "^2.0.0" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "engines": { + "node": ">=6.9.0" } }, - "node_modules/callsites": { - "version": "3.1.0", + "node_modules/@colors/colors": { + "version": "1.5.0", "dev": true, "license": "MIT", "engines": { - "node": ">=6" + "node": ">=0.1.90" } }, - "node_modules/camelcase": { - "version": "6.3.0", + "node_modules/@eslint/eslintrc": { + "version": "2.0.0", "dev": true, "license": "MIT", + "dependencies": { + "ajv": "^6.12.4", + "debug": "^4.3.2", + "espree": "^9.4.0", + "globals": "^13.19.0", + "ignore": "^5.2.0", + "import-fresh": "^3.2.1", + "js-yaml": "^4.1.0", + "minimatch": "^3.1.2", + "strip-json-comments": "^3.1.1" + }, "engines": { - "node": ">=10" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://opencollective.com/eslint" } }, - "node_modules/caniuse-lite": { - "version": "1.0.30001460", + "node_modules/@eslint/eslintrc/node_modules/argparse": { + "version": "2.0.1", "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/caniuse-lite" - } - ], - "license": "CC-BY-4.0" + "license": "Python-2.0" }, - "node_modules/chai": { - "version": "4.3.7", + "node_modules/@eslint/eslintrc/node_modules/js-yaml": { + "version": "4.1.0", "dev": true, "license": "MIT", "dependencies": { - "assertion-error": "^1.1.0", - "check-error": "^1.0.2", - "deep-eql": "^4.1.2", - "get-func-name": "^2.0.0", - "loupe": "^2.3.1", - "pathval": "^1.1.1", - "type-detect": "^4.0.5" + "argparse": "^2.0.1" }, - "engines": { - "node": ">=4" + "bin": { + "js-yaml": "bin/js-yaml.js" } }, - "node_modules/chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "node_modules/@eslint/eslintrc/node_modules/minimatch": { + "version": "3.1.2", "dev": true, + "license": "ISC", "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" + "brace-expansion": "^1.1.7" }, "engines": { - "node": ">=4" + "node": "*" } }, - "node_modules/check-error": { - "version": "1.0.2", + "node_modules/@eslint/js": { + "version": "8.35.0", "dev": true, "license": "MIT", "engines": { - "node": "*" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" } }, - "node_modules/chokidar": { - "version": "3.5.3", + "node_modules/@humanwhocodes/config-array": { + "version": "0.11.8", "dev": true, - "funding": [ - { - "type": "individual", - "url": "https://paulmillr.com/funding/" - } - ], - "license": "MIT", + "license": "Apache-2.0", "dependencies": { - "anymatch": "~3.1.2", - "braces": "~3.0.2", - "glob-parent": "~5.1.2", - "is-binary-path": "~2.1.0", - "is-glob": "~4.0.1", - "normalize-path": "~3.0.0", - "readdirp": "~3.6.0" + "@humanwhocodes/object-schema": "^1.2.1", + "debug": "^4.1.1", + "minimatch": "^3.0.5" }, "engines": { - "node": ">= 8.10.0" + "node": ">=10.10.0" + } + }, + "node_modules/@humanwhocodes/config-array/node_modules/minimatch": { + "version": "3.1.2", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" }, - "optionalDependencies": { - "fsevents": "~2.3.2" + "engines": { + "node": "*" } }, - "node_modules/cipher-base": { - "version": "1.0.4", + "node_modules/@humanwhocodes/module-importer": { + "version": "1.0.1", "dev": true, - "license": "MIT", + "license": "Apache-2.0", + "engines": { + "node": ">=12.22" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@humanwhocodes/object-schema": { + "version": "1.2.1", + "dev": true, + "license": "BSD-3-Clause" + }, + "node_modules/@istanbuljs/load-nyc-config": { + "version": "1.1.0", + "dev": true, + "license": "ISC", "dependencies": { - "inherits": "^2.0.1", - "safe-buffer": "^5.0.1" + "camelcase": "^5.3.1", + "find-up": "^4.1.0", + "get-package-type": "^0.1.0", + "js-yaml": "^3.13.1", + "resolve-from": "^5.0.0" + }, + "engines": { + "node": ">=8" } }, - "node_modules/clean-stack": { - "version": "2.2.0", + "node_modules/@istanbuljs/load-nyc-config/node_modules/camelcase": { + "version": "5.3.1", "dev": true, "license": "MIT", "engines": { "node": ">=6" } }, - "node_modules/cli": { - "version": "1.0.1", + "node_modules/@istanbuljs/load-nyc-config/node_modules/find-up": { + "version": "4.1.0", "dev": true, "license": "MIT", "dependencies": { - "exit": "0.1.2", - "glob": "^7.1.1" + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" }, "engines": { - "node": ">=0.2.5" + "node": ">=8" } }, - "node_modules/cliui": { - "version": "7.0.4", + "node_modules/@istanbuljs/load-nyc-config/node_modules/locate-path": { + "version": "5.0.0", "dev": true, - "license": "ISC", + "license": "MIT", "dependencies": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", - "wrap-ansi": "^7.0.0" + "p-locate": "^4.1.0" + }, + "engines": { + "node": ">=8" } }, - "node_modules/color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "node_modules/@istanbuljs/load-nyc-config/node_modules/p-limit": { + "version": "2.3.0", "dev": true, + "license": "MIT", "dependencies": { - "color-name": "1.1.3" - } - }, - "node_modules/color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", - "dev": true + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } }, - "node_modules/combine-source-map": { - "version": "0.8.0", + "node_modules/@istanbuljs/load-nyc-config/node_modules/p-locate": { + "version": "4.1.0", "dev": true, "license": "MIT", "dependencies": { - "convert-source-map": "~1.1.0", - "inline-source-map": "~0.6.0", - "lodash.memoize": "~3.0.3", - "source-map": "~0.5.3" + "p-limit": "^2.2.0" + }, + "engines": { + "node": ">=8" } }, - "node_modules/commondir": { - "version": "1.0.1", + "node_modules/@istanbuljs/load-nyc-config/node_modules/resolve-from": { + "version": "5.0.0", "dev": true, - "license": "MIT" + "license": "MIT", + "engines": { + "node": ">=8" + } }, - "node_modules/concat-map": { - "version": "0.0.1", + "node_modules/@istanbuljs/schema": { + "version": "0.1.3", "dev": true, - "license": "MIT" + "license": "MIT", + "engines": { + "node": ">=8" + } }, - "node_modules/concat-stream": { - "version": "1.6.2", + "node_modules/@jridgewell/gen-mapping": { + "version": "0.1.1", "dev": true, - "engines": [ - "node >= 0.8" - ], "license": "MIT", "dependencies": { - "buffer-from": "^1.0.0", - "inherits": "^2.0.3", - "readable-stream": "^2.2.2", - "typedarray": "^0.0.6" + "@jridgewell/set-array": "^1.0.0", + "@jridgewell/sourcemap-codec": "^1.4.10" + }, + "engines": { + "node": ">=6.0.0" } }, - "node_modules/connect": { - "version": "3.7.0", + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.0", "dev": true, "license": "MIT", - "dependencies": { - "debug": "2.6.9", - "finalhandler": "1.1.2", - "parseurl": "~1.3.3", - "utils-merge": "1.0.1" - }, "engines": { - "node": ">= 0.10.0" + "node": ">=6.0.0" } }, - "node_modules/connect/node_modules/debug": { - "version": "2.6.9", + "node_modules/@jridgewell/set-array": { + "version": "1.1.2", "dev": true, "license": "MIT", - "dependencies": { - "ms": "2.0.0" + "engines": { + "node": ">=6.0.0" } }, - "node_modules/connect/node_modules/ms": { - "version": "2.0.0", + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.4.14", "dev": true, "license": "MIT" }, - "node_modules/console-browserify": { - "version": "1.1.0", + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.17", "dev": true, + "license": "MIT", "dependencies": { - "date-now": "^0.1.4" + "@jridgewell/resolve-uri": "3.1.0", + "@jridgewell/sourcemap-codec": "1.4.14" } }, - "node_modules/constants-browserify": { - "version": "1.0.0", + "node_modules/@nicolo-ribaudo/chokidar-2": { + "version": "2.1.8-no-fsevents.3", + "resolved": "https://registry.npmjs.org/@nicolo-ribaudo/chokidar-2/-/chokidar-2-2.1.8-no-fsevents.3.tgz", + "integrity": "sha512-s88O1aVtXftvp5bCPB7WnmXc5IwOZZ7YPuwNPt+GtOOXpPvad1LfbmjYv+qII7zP6RU2QGnqve27dnLycEnyEQ==", "dev": true, - "license": "MIT" + "optional": true }, - "node_modules/content-type": { - "version": "1.0.5", + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", "dev": true, "license": "MIT", + "dependencies": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + }, "engines": { - "node": ">= 0.6" + "node": ">= 8" } }, - "node_modules/convert-source-map": { - "version": "1.1.3", - "dev": true, - "license": "MIT" - }, - "node_modules/cookie": { - "version": "0.4.2", + "node_modules/@nodelib/fs.stat": { + "version": "2.0.5", "dev": true, "license": "MIT", "engines": { - "node": ">= 0.6" + "node": ">= 8" } }, - "node_modules/core-util-is": { - "version": "1.0.2", - "dev": true, - "license": "MIT" - }, - "node_modules/cors": { - "version": "2.8.5", + "node_modules/@nodelib/fs.walk": { + "version": "1.2.8", "dev": true, "license": "MIT", "dependencies": { - "object-assign": "^4", - "vary": "^1" + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" }, "engines": { - "node": ">= 0.10" + "node": ">= 8" } }, - "node_modules/create-ecdh": { - "version": "4.0.3", + "node_modules/@socket.io/component-emitter": { + "version": "3.1.0", "dev": true, - "license": "MIT", - "dependencies": { - "bn.js": "^4.1.0", - "elliptic": "^6.0.0" - } + "license": "MIT" }, - "node_modules/create-hash": { - "version": "1.2.0", + "node_modules/@types/cookie": { + "version": "0.4.1", "dev": true, - "license": "MIT", - "dependencies": { - "cipher-base": "^1.0.1", - "inherits": "^2.0.1", - "md5.js": "^1.3.4", - "ripemd160": "^2.0.1", - "sha.js": "^2.4.0" - } + "license": "MIT" }, - "node_modules/create-hmac": { - "version": "1.1.7", + "node_modules/@types/cors": { + "version": "2.8.13", "dev": true, "license": "MIT", "dependencies": { - "cipher-base": "^1.0.3", - "create-hash": "^1.1.0", - "inherits": "^2.0.1", - "ripemd160": "^2.0.0", - "safe-buffer": "^5.0.1", - "sha.js": "^2.4.8" + "@types/node": "*" } }, - "node_modules/cross-spawn": { - "version": "7.0.3", + "node_modules/@types/node": { + "version": "18.14.2", + "dev": true, + "license": "MIT" + }, + "node_modules/accepts": { + "version": "1.3.8", "dev": true, "license": "MIT", "dependencies": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" + "mime-types": "~2.1.34", + "negotiator": "0.6.3" }, "engines": { - "node": ">= 8" + "node": ">= 0.6" } }, - "node_modules/cross-spawn/node_modules/which": { - "version": "2.0.2", + "node_modules/acorn": { + "version": "7.4.1", "dev": true, - "license": "ISC", - "dependencies": { - "isexe": "^2.0.0" - }, + "license": "MIT", "bin": { - "node-which": "bin/node-which" + "acorn": "bin/acorn" }, "engines": { - "node": ">= 8" + "node": ">=0.4.0" } }, - "node_modules/crypto-browserify": { - "version": "3.12.0", + "node_modules/acorn-jsx": { + "version": "5.3.2", "dev": true, "license": "MIT", - "dependencies": { - "browserify-cipher": "^1.0.0", - "browserify-sign": "^4.0.0", - "create-ecdh": "^4.0.0", - "create-hash": "^1.1.0", - "create-hmac": "^1.1.0", - "diffie-hellman": "^5.0.0", - "inherits": "^2.0.1", - "pbkdf2": "^3.0.3", - "public-encrypt": "^4.0.0", - "randombytes": "^2.0.0", - "randomfill": "^1.0.3" - }, - "engines": { - "node": "*" + "peerDependencies": { + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" } }, - "node_modules/custom-event": { - "version": "1.0.1", - "dev": true, - "license": "MIT" - }, - "node_modules/dash-ast": { - "version": "1.0.0", + "node_modules/acorn-node": { + "version": "1.8.2", "dev": true, - "license": "Apache-2.0" + "license": "Apache-2.0", + "dependencies": { + "acorn": "^7.0.0", + "acorn-walk": "^7.0.0", + "xtend": "^4.0.2" + } }, - "node_modules/date-format": { - "version": "4.0.14", + "node_modules/acorn-walk": { + "version": "7.0.0", "dev": true, "license": "MIT", "engines": { - "node": ">=4.0" + "node": ">=0.4.0" } }, - "node_modules/date-now": { - "version": "0.1.4", - "dev": true - }, - "node_modules/debug": { - "version": "4.3.4", + "node_modules/aggregate-error": { + "version": "3.1.0", "dev": true, "license": "MIT", "dependencies": { - "ms": "2.1.2" + "clean-stack": "^2.0.0", + "indent-string": "^4.0.0" }, "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } + "node": ">=8" } }, - "node_modules/decamelize": { - "version": "4.0.0", + "node_modules/ajv": { + "version": "6.12.6", "dev": true, "license": "MIT", - "engines": { - "node": ">=10" + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" } }, - "node_modules/deep-eql": { - "version": "4.1.3", + "node_modules/ansi-regex": { + "version": "5.0.1", "dev": true, "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, "dependencies": { - "type-detect": "^4.0.0" + "color-convert": "^1.9.0" }, "engines": { - "node": ">=6" + "node": ">=4" } }, - "node_modules/deep-is": { - "version": "0.1.3", + "node_modules/anymatch": { + "version": "3.1.3", "dev": true, - "license": "MIT" + "license": "ISC", + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } }, - "node_modules/default-require-extensions": { - "version": "3.0.1", + "node_modules/append-transform": { + "version": "2.0.0", "dev": true, "license": "MIT", "dependencies": { - "strip-bom": "^4.0.0" + "default-require-extensions": "^3.0.0" }, "engines": { "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/defined": { + "node_modules/archy": { "version": "1.0.0", "dev": true, "license": "MIT" }, - "node_modules/depd": { - "version": "2.0.0", + "node_modules/argparse": { + "version": "1.0.10", "dev": true, "license": "MIT", - "engines": { - "node": ">= 0.8" + "dependencies": { + "sprintf-js": "~1.0.2" } }, - "node_modules/deps-sort": { - "version": "2.0.0", + "node_modules/asn1.js": { + "version": "5.4.1", + "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-5.4.1.tgz", + "integrity": "sha512-+I//4cYPccV8LdmBLiX8CYvf9Sp3vQsrqu2QNXRcrbiWvcx/UdlFiqUJJzxRQxgsZmvhXhn4cSKeSmoFjVdupA==", "dev": true, - "license": "MIT", "dependencies": { - "JSONStream": "^1.0.3", - "shasum": "^1.0.0", - "subarg": "^1.0.0", - "through2": "^2.0.0" - }, - "bin": { - "deps-sort": "bin/cmd.js" + "bn.js": "^4.0.0", + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0", + "safer-buffer": "^2.1.0" } }, - "node_modules/des.js": { - "version": "1.0.0", + "node_modules/assert": { + "version": "1.5.0", "dev": true, "license": "MIT", "dependencies": { - "inherits": "^2.0.1", - "minimalistic-assert": "^1.0.0" + "object-assign": "^4.1.1", + "util": "0.10.3" } }, - "node_modules/destroy": { - "version": "1.2.0", + "node_modules/assert/node_modules/inherits": { + "version": "2.0.1", "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.8", - "npm": "1.2.8000 || >= 1.4.16" - } + "license": "ISC" }, - "node_modules/detective": { - "version": "5.2.0", + "node_modules/assert/node_modules/util": { + "version": "0.10.3", "dev": true, "license": "MIT", "dependencies": { - "acorn-node": "^1.6.1", - "defined": "^1.0.0", - "minimist": "^1.1.1" - }, - "bin": { - "detective": "bin/detective.js" - }, - "engines": { - "node": ">=0.8.0" + "inherits": "2.0.1" } }, - "node_modules/di": { - "version": "0.0.1", - "dev": true, - "license": "MIT" - }, - "node_modules/diff": { - "version": "5.0.0", + "node_modules/assertion-error": { + "version": "1.1.0", "dev": true, - "license": "BSD-3-Clause", + "license": "MIT", "engines": { - "node": ">=0.3.1" + "node": "*" } }, - "node_modules/diffie-hellman": { - "version": "5.0.3", + "node_modules/babel-plugin-polyfill-corejs2": { + "version": "0.4.8", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.8.tgz", + "integrity": "sha512-OtIuQfafSzpo/LhnJaykc0R/MMnuLSSVjVYy9mHArIZ9qTCSZ6TpWCuEKZYVoN//t8HqBNScHrOtCrIK5IaGLg==", "dev": true, - "license": "MIT", "dependencies": { - "bn.js": "^4.1.0", - "miller-rabin": "^4.0.0", - "randombytes": "^2.0.0" + "@babel/compat-data": "^7.22.6", + "@babel/helper-define-polyfill-provider": "^0.5.0", + "semver": "^6.3.1" + }, + "peerDependencies": { + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" } }, - "node_modules/doctrine": { - "version": "3.0.0", + "node_modules/babel-plugin-polyfill-corejs2/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "dev": true, - "license": "Apache-2.0", - "dependencies": { - "esutils": "^2.0.2" - }, - "engines": { - "node": ">=6.0.0" + "bin": { + "semver": "bin/semver.js" } }, - "node_modules/dom-serialize": { - "version": "2.2.1", + "node_modules/babel-plugin-polyfill-corejs3": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.9.0.tgz", + "integrity": "sha512-7nZPG1uzK2Ymhy/NbaOWTg3uibM2BmGASS4vHS4szRZAIR8R6GwA/xAujpdrXU5iyklrimWnLWU+BLF9suPTqg==", "dev": true, - "license": "MIT", "dependencies": { - "custom-event": "~1.0.0", - "ent": "~2.2.0", - "extend": "^3.0.0", - "void-elements": "^2.0.0" + "@babel/helper-define-polyfill-provider": "^0.5.0", + "core-js-compat": "^3.34.0" + }, + "peerDependencies": { + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" } }, - "node_modules/dom-serializer": { - "version": "0.2.1", + "node_modules/babel-plugin-polyfill-regenerator": { + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.5.5.tgz", + "integrity": "sha512-OJGYZlhLqBh2DDHeqAxWB1XIvr49CxiJ2gIt61/PU55CQK4Z58OzMqjDe1zwQdQk+rBYsRc+1rJmdajM3gimHg==", "dev": true, - "license": "MIT", "dependencies": { - "domelementtype": "^2.0.1", - "entities": "^2.0.0" + "@babel/helper-define-polyfill-provider": "^0.5.0" + }, + "peerDependencies": { + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" } }, - "node_modules/dom-serializer/node_modules/domelementtype": { - "version": "2.0.1", + "node_modules/balanced-match": { + "version": "1.0.0", "dev": true, - "license": "BSD-2-Clause" + "license": "MIT" }, - "node_modules/dom-serializer/node_modules/entities": { - "version": "2.0.0", + "node_modules/base64-js": { + "version": "1.5.1", "dev": true, - "license": "BSD-2-Clause" + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" }, - "node_modules/domain-browser": { - "version": "1.2.0", + "node_modules/base64id": { + "version": "2.0.0", "dev": true, "license": "MIT", "engines": { - "node": ">=0.4", - "npm": ">=1.2" + "node": "^4.5.0 || >= 5.9" } }, - "node_modules/domelementtype": { - "version": "1.3.1", - "dev": true, - "license": "BSD-2-Clause" - }, - "node_modules/domhandler": { - "version": "2.3.0", + "node_modules/beeper": { + "version": "1.1.1", "dev": true, - "dependencies": { - "domelementtype": "1" + "license": "MIT", + "engines": { + "node": ">=0.10.0" } }, - "node_modules/domutils": { - "version": "1.5.1", + "node_modules/benchmark": { + "version": "2.1.4", "dev": true, + "license": "MIT", "dependencies": { - "dom-serializer": "0", - "domelementtype": "1" + "lodash": "^4.17.4", + "platform": "^1.3.3" } }, - "node_modules/duplexer2": { - "version": "0.1.4", + "node_modules/binary-extensions": { + "version": "2.2.0", "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "readable-stream": "^2.0.2" + "license": "MIT", + "engines": { + "node": ">=8" } }, - "node_modules/ee-first": { - "version": "1.1.1", + "node_modules/bn.js": { + "version": "4.12.0", "dev": true, "license": "MIT" }, - "node_modules/electron-to-chromium": { - "version": "1.4.317", - "dev": true, - "license": "ISC" - }, - "node_modules/elliptic": { - "version": "6.5.4", + "node_modules/body-parser": { + "version": "1.20.2", "dev": true, "license": "MIT", "dependencies": { - "bn.js": "^4.11.9", - "brorand": "^1.1.0", - "hash.js": "^1.0.0", - "hmac-drbg": "^1.0.1", - "inherits": "^2.0.4", - "minimalistic-assert": "^1.0.1", - "minimalistic-crypto-utils": "^1.0.1" - } - }, - "node_modules/encodeurl": { - "version": "1.0.2", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/engine.io": { + "bytes": "3.1.2", + "content-type": "~1.0.5", + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "on-finished": "2.4.1", + "qs": "6.11.0", + "raw-body": "2.5.2", + "type-is": "~1.6.18", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "node_modules/body-parser/node_modules/debug": { + "version": "2.6.9", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/body-parser/node_modules/ms": { + "version": "2.0.0", + "dev": true, + "license": "MIT" + }, + "node_modules/body-parser/node_modules/on-finished": { + "version": "2.4.1", + "dev": true, + "license": "MIT", + "dependencies": { + "ee-first": "1.1.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/brace-expansion": { + "version": "1.1.11", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/braces": { + "version": "3.0.2", + "dev": true, + "license": "MIT", + "dependencies": { + "fill-range": "^7.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/brorand": { + "version": "1.1.0", + "dev": true, + "license": "MIT" + }, + "node_modules/browser-pack": { + "version": "6.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "combine-source-map": "~0.8.0", + "defined": "^1.0.0", + "JSONStream": "^1.0.3", + "safe-buffer": "^5.1.1", + "through2": "^2.0.0", + "umd": "^3.0.0" + }, + "bin": { + "browser-pack": "bin/cmd.js" + } + }, + "node_modules/browser-resolve": { + "version": "1.11.3", + "dev": true, + "license": "MIT", + "dependencies": { + "resolve": "1.1.7" + } + }, + "node_modules/browser-resolve/node_modules/resolve": { + "version": "1.1.7", + "dev": true, + "license": "MIT" + }, + "node_modules/browser-stdout": { + "version": "1.3.1", + "dev": true, + "license": "ISC" + }, + "node_modules/browserify": { + "version": "16.5.1", + "dev": true, + "license": "MIT", + "dependencies": { + "assert": "^1.4.0", + "browser-pack": "^6.0.1", + "browser-resolve": "^1.11.0", + "browserify-zlib": "~0.2.0", + "buffer": "~5.2.1", + "cached-path-relative": "^1.0.0", + "concat-stream": "^1.6.0", + "console-browserify": "^1.1.0", + "constants-browserify": "~1.0.0", + "crypto-browserify": "^3.0.0", + "defined": "^1.0.0", + "deps-sort": "^2.0.0", + "domain-browser": "^1.2.0", + "duplexer2": "~0.1.2", + "events": "^2.0.0", + "glob": "^7.1.0", + "has": "^1.0.0", + "htmlescape": "^1.1.0", + "https-browserify": "^1.0.0", + "inherits": "~2.0.1", + "insert-module-globals": "^7.0.0", + "JSONStream": "^1.0.3", + "labeled-stream-splicer": "^2.0.0", + "mkdirp-classic": "^0.5.2", + "module-deps": "^6.0.0", + "os-browserify": "~0.3.0", + "parents": "^1.0.1", + "path-browserify": "~0.0.0", + "process": "~0.11.0", + "punycode": "^1.3.2", + "querystring-es3": "~0.2.0", + "read-only-stream": "^2.0.0", + "readable-stream": "^2.0.2", + "resolve": "^1.1.4", + "shasum": "^1.0.0", + "shell-quote": "^1.6.1", + "stream-browserify": "^2.0.0", + "stream-http": "^3.0.0", + "string_decoder": "^1.1.1", + "subarg": "^1.0.0", + "syntax-error": "^1.1.1", + "through2": "^2.0.0", + "timers-browserify": "^1.0.1", + "tty-browserify": "0.0.1", + "url": "~0.11.0", + "util": "~0.10.1", + "vm-browserify": "^1.0.0", + "xtend": "^4.0.0" + }, + "bin": { + "browserify": "bin/cmd.js" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/browserify-aes": { + "version": "1.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "buffer-xor": "^1.0.3", + "cipher-base": "^1.0.0", + "create-hash": "^1.1.0", + "evp_bytestokey": "^1.0.3", + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "node_modules/browserify-cipher": { + "version": "1.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "browserify-aes": "^1.0.4", + "browserify-des": "^1.0.0", + "evp_bytestokey": "^1.0.0" + } + }, + "node_modules/browserify-des": { + "version": "1.0.2", + "dev": true, + "license": "MIT", + "dependencies": { + "cipher-base": "^1.0.1", + "des.js": "^1.0.0", + "inherits": "^2.0.1", + "safe-buffer": "^5.1.2" + } + }, + "node_modules/browserify-rsa": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.1.0.tgz", + "integrity": "sha512-AdEER0Hkspgno2aR97SAf6vi0y0k8NuOpGnVH3O99rcA5Q6sh8QxcngtHuJ6uXwnfAXNM4Gn1Gb7/MV1+Ymbog==", + "dev": true, + "dependencies": { + "bn.js": "^5.0.0", + "randombytes": "^2.0.1" + } + }, + "node_modules/browserify-rsa/node_modules/bn.js": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.1.tgz", + "integrity": "sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ==", + "dev": true + }, + "node_modules/browserify-sign": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.2.2.tgz", + "integrity": "sha512-1rudGyeYY42Dk6texmv7c4VcQ0EsvVbLwZkA+AQB7SxvXxmcD93jcHie8bzecJ+ChDlmAm2Qyu0+Ccg5uhZXCg==", + "dev": true, + "dependencies": { + "bn.js": "^5.2.1", + "browserify-rsa": "^4.1.0", + "create-hash": "^1.2.0", + "create-hmac": "^1.1.7", + "elliptic": "^6.5.4", + "inherits": "^2.0.4", + "parse-asn1": "^5.1.6", + "readable-stream": "^3.6.2", + "safe-buffer": "^5.2.1" + }, + "engines": { + "node": ">= 4" + } + }, + "node_modules/browserify-sign/node_modules/bn.js": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.1.tgz", + "integrity": "sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ==", + "dev": true + }, + "node_modules/browserify-sign/node_modules/readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "dev": true, + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/browserify-zlib": { + "version": "0.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "pako": "~1.0.5" + } + }, + "node_modules/browserslist": { + "version": "4.22.3", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.22.3.tgz", + "integrity": "sha512-UAp55yfwNv0klWNapjs/ktHoguxuQNGnOzxYmfnXIS+8AsRDZkSDxg7R1AX3GKzn078SBI5dzwzj/Yx0Or0e3A==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "caniuse-lite": "^1.0.30001580", + "electron-to-chromium": "^1.4.648", + "node-releases": "^2.0.14", + "update-browserslist-db": "^1.0.13" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, + "node_modules/buffer": { + "version": "5.2.1", + "dev": true, + "license": "MIT", + "dependencies": { + "base64-js": "^1.0.2", + "ieee754": "^1.1.4" + } + }, + "node_modules/buffer-from": { + "version": "1.1.1", + "dev": true, + "license": "MIT" + }, + "node_modules/buffer-xor": { + "version": "1.0.3", + "dev": true, + "license": "MIT" + }, + "node_modules/builtin-status-codes": { + "version": "3.0.0", + "dev": true, + "license": "MIT" + }, + "node_modules/bytes": { + "version": "3.1.2", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/cached-path-relative": { + "version": "1.1.0", + "dev": true, + "license": "MIT" + }, + "node_modules/caching-transform": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "hasha": "^5.0.0", + "make-dir": "^3.0.0", + "package-hash": "^4.0.0", + "write-file-atomic": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/call-bind": { + "version": "1.0.2", + "dev": true, + "license": "MIT", + "dependencies": { + "function-bind": "^1.1.1", + "get-intrinsic": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/callsites": { + "version": "3.1.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/camelcase": { + "version": "6.3.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001581", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001581.tgz", + "integrity": "sha512-whlTkwhqV2tUmP3oYhtNfaWGYHDdS3JYFQBKXxcUR9qqPWsRhFHhoISO2Xnl/g0xyKzht9mI1LZpiNWfMzHixQ==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ] + }, + "node_modules/chai": { + "version": "4.3.7", + "dev": true, + "license": "MIT", + "dependencies": { + "assertion-error": "^1.1.0", + "check-error": "^1.0.2", + "deep-eql": "^4.1.2", + "get-func-name": "^2.0.0", + "loupe": "^2.3.1", + "pathval": "^1.1.1", + "type-detect": "^4.0.5" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/check-error": { + "version": "1.0.2", + "dev": true, + "license": "MIT", + "engines": { + "node": "*" + } + }, + "node_modules/chokidar": { + "version": "3.5.3", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + ], + "license": "MIT", + "dependencies": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + }, + "engines": { + "node": ">= 8.10.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/cipher-base": { + "version": "1.0.4", + "dev": true, + "license": "MIT", + "dependencies": { + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "node_modules/clean-stack": { + "version": "2.2.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/cli": { + "version": "1.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "exit": "0.1.2", + "glob": "^7.1.1" + }, + "engines": { + "node": ">=0.2.5" + } + }, + "node_modules/cliui": { + "version": "7.0.4", + "dev": true, + "license": "ISC", + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^7.0.0" + } + }, + "node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "dev": true + }, + "node_modules/combine-source-map": { + "version": "0.8.0", + "dev": true, + "license": "MIT", + "dependencies": { + "convert-source-map": "~1.1.0", + "inline-source-map": "~0.6.0", + "lodash.memoize": "~3.0.3", + "source-map": "~0.5.3" + } + }, + "node_modules/commander": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz", + "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==", + "dev": true, + "engines": { + "node": ">= 6" + } + }, + "node_modules/commondir": { + "version": "1.0.1", + "dev": true, + "license": "MIT" + }, + "node_modules/concat-map": { + "version": "0.0.1", + "dev": true, + "license": "MIT" + }, + "node_modules/concat-stream": { + "version": "1.6.2", + "dev": true, + "engines": [ + "node >= 0.8" + ], + "license": "MIT", + "dependencies": { + "buffer-from": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^2.2.2", + "typedarray": "^0.0.6" + } + }, + "node_modules/connect": { + "version": "3.7.0", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "2.6.9", + "finalhandler": "1.1.2", + "parseurl": "~1.3.3", + "utils-merge": "1.0.1" + }, + "engines": { + "node": ">= 0.10.0" + } + }, + "node_modules/connect/node_modules/debug": { + "version": "2.6.9", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/connect/node_modules/ms": { + "version": "2.0.0", + "dev": true, + "license": "MIT" + }, + "node_modules/console-browserify": { + "version": "1.1.0", + "dev": true, + "dependencies": { + "date-now": "^0.1.4" + } + }, + "node_modules/constants-browserify": { + "version": "1.0.0", + "dev": true, + "license": "MIT" + }, + "node_modules/content-type": { + "version": "1.0.5", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/convert-source-map": { + "version": "1.1.3", + "dev": true, + "license": "MIT" + }, + "node_modules/cookie": { + "version": "0.4.2", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/core-js-compat": { + "version": "3.35.1", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.35.1.tgz", + "integrity": "sha512-sftHa5qUJY3rs9Zht1WEnmkvXputCyDBczPnr7QDgL8n3qrF3CMXY4VPSYtOLLiOUJcah2WNXREd48iOl6mQIw==", + "dev": true, + "dependencies": { + "browserslist": "^4.22.2" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/core-js" + } + }, + "node_modules/core-util-is": { + "version": "1.0.2", + "dev": true, + "license": "MIT" + }, + "node_modules/cors": { + "version": "2.8.5", + "dev": true, + "license": "MIT", + "dependencies": { + "object-assign": "^4", + "vary": "^1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/create-ecdh": { + "version": "4.0.3", + "dev": true, + "license": "MIT", + "dependencies": { + "bn.js": "^4.1.0", + "elliptic": "^6.0.0" + } + }, + "node_modules/create-hash": { + "version": "1.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "cipher-base": "^1.0.1", + "inherits": "^2.0.1", + "md5.js": "^1.3.4", + "ripemd160": "^2.0.1", + "sha.js": "^2.4.0" + } + }, + "node_modules/create-hmac": { + "version": "1.1.7", + "dev": true, + "license": "MIT", + "dependencies": { + "cipher-base": "^1.0.3", + "create-hash": "^1.1.0", + "inherits": "^2.0.1", + "ripemd160": "^2.0.0", + "safe-buffer": "^5.0.1", + "sha.js": "^2.4.8" + } + }, + "node_modules/cross-spawn": { + "version": "7.0.3", + "dev": true, + "license": "MIT", + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/cross-spawn/node_modules/which": { + "version": "2.0.2", + "dev": true, + "license": "ISC", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/crypto-browserify": { + "version": "3.12.0", + "dev": true, + "license": "MIT", + "dependencies": { + "browserify-cipher": "^1.0.0", + "browserify-sign": "^4.0.0", + "create-ecdh": "^4.0.0", + "create-hash": "^1.1.0", + "create-hmac": "^1.1.0", + "diffie-hellman": "^5.0.0", + "inherits": "^2.0.1", + "pbkdf2": "^3.0.3", + "public-encrypt": "^4.0.0", + "randombytes": "^2.0.0", + "randomfill": "^1.0.3" + }, + "engines": { + "node": "*" + } + }, + "node_modules/custom-event": { + "version": "1.0.1", + "dev": true, + "license": "MIT" + }, + "node_modules/dash-ast": { + "version": "1.0.0", + "dev": true, + "license": "Apache-2.0" + }, + "node_modules/date-format": { + "version": "4.0.14", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/date-now": { + "version": "0.1.4", + "dev": true + }, + "node_modules/debug": { + "version": "4.3.4", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/decamelize": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/deep-eql": { + "version": "4.1.3", + "dev": true, + "license": "MIT", + "dependencies": { + "type-detect": "^4.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/deep-is": { + "version": "0.1.3", + "dev": true, + "license": "MIT" + }, + "node_modules/default-require-extensions": { + "version": "3.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "strip-bom": "^4.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/defined": { + "version": "1.0.0", + "dev": true, + "license": "MIT" + }, + "node_modules/depd": { + "version": "2.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/deps-sort": { + "version": "2.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "JSONStream": "^1.0.3", + "shasum": "^1.0.0", + "subarg": "^1.0.0", + "through2": "^2.0.0" + }, + "bin": { + "deps-sort": "bin/cmd.js" + } + }, + "node_modules/des.js": { + "version": "1.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0" + } + }, + "node_modules/destroy": { + "version": "1.2.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "node_modules/detective": { + "version": "5.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "acorn-node": "^1.6.1", + "defined": "^1.0.0", + "minimist": "^1.1.1" + }, + "bin": { + "detective": "bin/detective.js" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/di": { + "version": "0.0.1", + "dev": true, + "license": "MIT" + }, + "node_modules/diff": { + "version": "5.0.0", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.3.1" + } + }, + "node_modules/diffie-hellman": { + "version": "5.0.3", + "dev": true, + "license": "MIT", + "dependencies": { + "bn.js": "^4.1.0", + "miller-rabin": "^4.0.0", + "randombytes": "^2.0.0" + } + }, + "node_modules/doctrine": { + "version": "3.0.0", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/dom-serialize": { + "version": "2.2.1", + "dev": true, + "license": "MIT", + "dependencies": { + "custom-event": "~1.0.0", + "ent": "~2.2.0", + "extend": "^3.0.0", + "void-elements": "^2.0.0" + } + }, + "node_modules/dom-serializer": { + "version": "0.2.1", + "dev": true, + "license": "MIT", + "dependencies": { + "domelementtype": "^2.0.1", + "entities": "^2.0.0" + } + }, + "node_modules/dom-serializer/node_modules/domelementtype": { + "version": "2.0.1", + "dev": true, + "license": "BSD-2-Clause" + }, + "node_modules/dom-serializer/node_modules/entities": { + "version": "2.0.0", + "dev": true, + "license": "BSD-2-Clause" + }, + "node_modules/domain-browser": { + "version": "1.2.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.4", + "npm": ">=1.2" + } + }, + "node_modules/domelementtype": { + "version": "1.3.1", + "dev": true, + "license": "BSD-2-Clause" + }, + "node_modules/domhandler": { + "version": "2.3.0", + "dev": true, + "dependencies": { + "domelementtype": "1" + } + }, + "node_modules/domutils": { + "version": "1.5.1", + "dev": true, + "dependencies": { + "dom-serializer": "0", + "domelementtype": "1" + } + }, + "node_modules/duplexer2": { + "version": "0.1.4", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "readable-stream": "^2.0.2" + } + }, + "node_modules/ee-first": { + "version": "1.1.1", + "dev": true, + "license": "MIT" + }, + "node_modules/electron-to-chromium": { + "version": "1.4.651", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.651.tgz", + "integrity": "sha512-jjks7Xx+4I7dslwsbaFocSwqBbGHQmuXBJUK9QBZTIrzPq3pzn6Uf2szFSP728FtLYE3ldiccmlkOM/zhGKCpA==", + "dev": true + }, + "node_modules/elliptic": { + "version": "6.5.4", + "dev": true, + "license": "MIT", + "dependencies": { + "bn.js": "^4.11.9", + "brorand": "^1.1.0", + "hash.js": "^1.0.0", + "hmac-drbg": "^1.0.1", + "inherits": "^2.0.4", + "minimalistic-assert": "^1.0.1", + "minimalistic-crypto-utils": "^1.0.1" + } + }, + "node_modules/encodeurl": { + "version": "1.0.2", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/engine.io": { "version": "6.4.2", "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-6.4.2.tgz", "integrity": "sha512-FKn/3oMiJjrOEOeUub2WCox6JhxBXq/Zn3fZOMCBxKnNYtsdKjxhl7yR3fZhM9PV+rdE75SU5SYMc+2PGzo+Tg==", "dev": true, "dependencies": { - "@types/cookie": "^0.4.1", - "@types/cors": "^2.8.12", - "@types/node": ">=10.0.0", - "accepts": "~1.3.4", - "base64id": "2.0.0", - "cookie": "~0.4.1", - "cors": "~2.8.5", - "debug": "~4.3.1", - "engine.io-parser": "~5.0.3", - "ws": "~8.11.0" + "@types/cookie": "^0.4.1", + "@types/cors": "^2.8.12", + "@types/node": ">=10.0.0", + "accepts": "~1.3.4", + "base64id": "2.0.0", + "cookie": "~0.4.1", + "cors": "~2.8.5", + "debug": "~4.3.1", + "engine.io-parser": "~5.0.3", + "ws": "~8.11.0" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/engine.io-parser": { + "version": "5.0.6", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/ent": { + "version": "2.2.0", + "dev": true, + "license": "MIT" + }, + "node_modules/entities": { + "version": "1.0.0", + "dev": true, + "license": "BSD-like" + }, + "node_modules/es6-error": { + "version": "4.1.1", + "dev": true, + "license": "MIT" + }, + "node_modules/escalade": { + "version": "3.1.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/escape-html": { + "version": "1.0.3", + "dev": true, + "license": "MIT" + }, + "node_modules/escape-string-regexp": { + "version": "1.0.5", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/eslint": { + "version": "8.35.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint/eslintrc": "^2.0.0", + "@eslint/js": "8.35.0", + "@humanwhocodes/config-array": "^0.11.8", + "@humanwhocodes/module-importer": "^1.0.1", + "@nodelib/fs.walk": "^1.2.8", + "ajv": "^6.10.0", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.2", + "debug": "^4.3.2", + "doctrine": "^3.0.0", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^7.1.1", + "eslint-utils": "^3.0.0", + "eslint-visitor-keys": "^3.3.0", + "espree": "^9.4.0", + "esquery": "^1.4.2", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^6.0.1", + "find-up": "^5.0.0", + "glob-parent": "^6.0.2", + "globals": "^13.19.0", + "grapheme-splitter": "^1.0.4", + "ignore": "^5.2.0", + "import-fresh": "^3.0.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "is-path-inside": "^3.0.3", + "js-sdsl": "^4.1.4", + "js-yaml": "^4.1.0", + "json-stable-stringify-without-jsonify": "^1.0.1", + "levn": "^0.4.1", + "lodash.merge": "^4.6.2", + "minimatch": "^3.1.2", + "natural-compare": "^1.4.0", + "optionator": "^0.9.1", + "regexpp": "^3.2.0", + "strip-ansi": "^6.0.1", + "strip-json-comments": "^3.1.0", + "text-table": "^0.2.0" + }, + "bin": { + "eslint": "bin/eslint.js" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-scope": { + "version": "7.1.1", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, + "node_modules/eslint-utils": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "eslint-visitor-keys": "^2.0.0" + }, + "engines": { + "node": "^10.0.0 || ^12.0.0 || >= 14.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/mysticatea" + }, + "peerDependencies": { + "eslint": ">=5" + } + }, + "node_modules/eslint-utils/node_modules/eslint-visitor-keys": { + "version": "2.1.0", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=10" + } + }, + "node_modules/eslint-visitor-keys": { + "version": "3.3.0", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, + "node_modules/eslint/node_modules/ansi-styles": { + "version": "4.3.0", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/eslint/node_modules/argparse": { + "version": "2.0.1", + "dev": true, + "license": "Python-2.0" + }, + "node_modules/eslint/node_modules/chalk": { + "version": "4.1.2", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/eslint/node_modules/color-convert": { + "version": "2.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/eslint/node_modules/color-name": { + "version": "1.1.4", + "dev": true, + "license": "MIT" + }, + "node_modules/eslint/node_modules/escape-string-regexp": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint/node_modules/glob-parent": { + "version": "6.0.2", + "dev": true, + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/eslint/node_modules/has-flag": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/eslint/node_modules/js-yaml": { + "version": "4.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/eslint/node_modules/levn": { + "version": "0.4.1", + "dev": true, + "license": "MIT", + "dependencies": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/eslint/node_modules/minimatch": { + "version": "3.1.2", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/eslint/node_modules/optionator": { + "version": "0.9.1", + "dev": true, + "license": "MIT", + "dependencies": { + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0", + "word-wrap": "^1.2.3" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/eslint/node_modules/prelude-ls": { + "version": "1.2.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/eslint/node_modules/supports-color": { + "version": "7.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/eslint/node_modules/type-check": { + "version": "0.4.0", + "dev": true, + "license": "MIT", + "dependencies": { + "prelude-ls": "^1.2.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/espree": { + "version": "9.4.1", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "acorn": "^8.8.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^3.3.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/espree/node_modules/acorn": { + "version": "8.8.2", + "dev": true, + "license": "MIT", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/esprima": { + "version": "4.0.1", + "dev": true, + "license": "BSD-2-Clause", + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/esquery": { + "version": "1.4.2", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "estraverse": "^5.1.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/esrecurse": { + "version": "4.3.0", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "estraverse": "^5.2.0" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estraverse": { + "version": "5.3.0", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esutils": { + "version": "2.0.3", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/eventemitter3": { + "version": "4.0.0", + "dev": true, + "license": "MIT" + }, + "node_modules/events": { + "version": "2.1.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.4.x" + } + }, + "node_modules/evp_bytestokey": { + "version": "1.0.3", + "dev": true, + "license": "MIT", + "dependencies": { + "md5.js": "^1.3.4", + "safe-buffer": "^5.1.1" + } + }, + "node_modules/exit": { + "version": "0.1.2", + "dev": true, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/extend": { + "version": "3.0.2", + "dev": true, + "license": "MIT" + }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "dev": true, + "license": "MIT" + }, + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "dev": true, + "license": "MIT" + }, + "node_modules/fast-levenshtein": { + "version": "2.0.6", + "dev": true, + "license": "MIT" + }, + "node_modules/fastq": { + "version": "1.15.0", + "dev": true, + "license": "ISC", + "dependencies": { + "reusify": "^1.0.4" + } + }, + "node_modules/file-entry-cache": { + "version": "6.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "flat-cache": "^3.0.4" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/fill-range": { + "version": "7.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/finalhandler": { + "version": "1.1.2", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "2.6.9", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "on-finished": "~2.3.0", + "parseurl": "~1.3.3", + "statuses": "~1.5.0", + "unpipe": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/finalhandler/node_modules/debug": { + "version": "2.6.9", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/finalhandler/node_modules/ms": { + "version": "2.0.0", + "dev": true, + "license": "MIT" + }, + "node_modules/find-cache-dir": { + "version": "3.3.2", + "dev": true, + "license": "MIT", + "dependencies": { + "commondir": "^1.0.1", + "make-dir": "^3.0.2", + "pkg-dir": "^4.1.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/avajs/find-cache-dir?sponsor=1" + } + }, + "node_modules/find-up": { + "version": "5.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/flat": { + "version": "5.0.2", + "dev": true, + "license": "BSD-3-Clause", + "bin": { + "flat": "cli.js" + } + }, + "node_modules/flat-cache": { + "version": "3.0.4", + "dev": true, + "license": "MIT", + "dependencies": { + "flatted": "^3.1.0", + "rimraf": "^3.0.2" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/flatted": { + "version": "3.2.7", + "dev": true, + "license": "ISC" + }, + "node_modules/follow-redirects": { + "version": "1.15.2", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/RubenVerborgh" + } + ], + "license": "MIT", + "engines": { + "node": ">=4.0" + }, + "peerDependenciesMeta": { + "debug": { + "optional": true + } + } + }, + "node_modules/foreground-child": { + "version": "2.0.0", + "dev": true, + "license": "ISC", + "dependencies": { + "cross-spawn": "^7.0.0", + "signal-exit": "^3.0.2" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/fromentries": { + "version": "1.3.2", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/fs-extra": { + "version": "8.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" }, "engines": { - "node": ">=10.0.0" + "node": ">=6 <7 || >=8" } }, - "node_modules/engine.io-parser": { - "version": "5.0.6", + "node_modules/fs-readdir-recursive": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/fs-readdir-recursive/-/fs-readdir-recursive-1.1.0.tgz", + "integrity": "sha512-GNanXlVr2pf02+sPN40XN8HG+ePaNcvM0q5mZBd668Obwb0yD5GiUbZOFgwn8kGMY6I3mdyDJzieUy3PTYyTRA==", + "dev": true + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "dev": true, + "license": "ISC" + }, + "node_modules/fsevents": { + "version": "2.3.2", "dev": true, "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], "engines": { - "node": ">=10.0.0" + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" } }, - "node_modules/ent": { - "version": "2.2.0", + "node_modules/function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", "dev": true, - "license": "MIT" + "funding": { + "url": "https://github.com/sponsors/ljharb" + } }, - "node_modules/entities": { - "version": "1.0.0", + "node_modules/gensync": { + "version": "1.0.0-beta.2", "dev": true, - "license": "BSD-like" + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } }, - "node_modules/es6-error": { - "version": "4.1.1", + "node_modules/get-assigned-identifiers": { + "version": "1.2.0", "dev": true, - "license": "MIT" + "license": "Apache-2.0" }, - "node_modules/escalade": { - "version": "3.1.1", + "node_modules/get-caller-file": { + "version": "2.0.5", "dev": true, - "license": "MIT", + "license": "ISC", "engines": { - "node": ">=6" + "node": "6.* || 8.* || >= 10.*" } }, - "node_modules/escape-html": { - "version": "1.0.3", - "dev": true, - "license": "MIT" - }, - "node_modules/escape-string-regexp": { - "version": "1.0.5", + "node_modules/get-func-name": { + "version": "2.0.0", "dev": true, "license": "MIT", "engines": { - "node": ">=0.8.0" + "node": "*" } }, - "node_modules/eslint": { - "version": "8.35.0", + "node_modules/get-intrinsic": { + "version": "1.2.0", "dev": true, "license": "MIT", "dependencies": { - "@eslint/eslintrc": "^2.0.0", - "@eslint/js": "8.35.0", - "@humanwhocodes/config-array": "^0.11.8", - "@humanwhocodes/module-importer": "^1.0.1", - "@nodelib/fs.walk": "^1.2.8", - "ajv": "^6.10.0", - "chalk": "^4.0.0", - "cross-spawn": "^7.0.2", - "debug": "^4.3.2", - "doctrine": "^3.0.0", - "escape-string-regexp": "^4.0.0", - "eslint-scope": "^7.1.1", - "eslint-utils": "^3.0.0", - "eslint-visitor-keys": "^3.3.0", - "espree": "^9.4.0", - "esquery": "^1.4.2", - "esutils": "^2.0.2", - "fast-deep-equal": "^3.1.3", - "file-entry-cache": "^6.0.1", - "find-up": "^5.0.0", - "glob-parent": "^6.0.2", - "globals": "^13.19.0", - "grapheme-splitter": "^1.0.4", - "ignore": "^5.2.0", - "import-fresh": "^3.0.0", - "imurmurhash": "^0.1.4", - "is-glob": "^4.0.0", - "is-path-inside": "^3.0.3", - "js-sdsl": "^4.1.4", - "js-yaml": "^4.1.0", - "json-stable-stringify-without-jsonify": "^1.0.1", - "levn": "^0.4.1", - "lodash.merge": "^4.6.2", - "minimatch": "^3.1.2", - "natural-compare": "^1.4.0", - "optionator": "^0.9.1", - "regexpp": "^3.2.0", - "strip-ansi": "^6.0.1", - "strip-json-comments": "^3.1.0", - "text-table": "^0.2.0" - }, - "bin": { - "eslint": "bin/eslint.js" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.3" }, "funding": { - "url": "https://opencollective.com/eslint" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/eslint-scope": { - "version": "7.1.1", + "node_modules/get-package-type": { + "version": "0.1.0", "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "esrecurse": "^4.3.0", - "estraverse": "^5.2.0" - }, + "license": "MIT", "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": ">=8.0.0" } }, - "node_modules/eslint-utils": { - "version": "3.0.0", + "node_modules/glob": { + "version": "7.2.0", "dev": true, - "license": "MIT", + "license": "ISC", "dependencies": { - "eslint-visitor-keys": "^2.0.0" + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" }, "engines": { - "node": "^10.0.0 || ^12.0.0 || >= 14.0.0" + "node": "*" }, "funding": { - "url": "https://github.com/sponsors/mysticatea" - }, - "peerDependencies": { - "eslint": ">=5" - } - }, - "node_modules/eslint-utils/node_modules/eslint-visitor-keys": { - "version": "2.1.0", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": ">=10" + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/eslint-visitor-keys": { - "version": "3.3.0", + "node_modules/glob-parent": { + "version": "5.1.2", "dev": true, - "license": "Apache-2.0", + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.1" + }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": ">= 6" } }, - "node_modules/eslint/node_modules/ansi-styles": { - "version": "4.3.0", + "node_modules/globals": { + "version": "13.20.0", "dev": true, "license": "MIT", "dependencies": { - "color-convert": "^2.0.1" + "type-fest": "^0.20.2" }, "engines": { "node": ">=8" }, "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/eslint/node_modules/argparse": { - "version": "2.0.1", + "node_modules/graceful-fs": { + "version": "4.2.10", "dev": true, - "license": "Python-2.0" + "license": "ISC" }, - "node_modules/eslint/node_modules/chalk": { - "version": "4.1.2", + "node_modules/grapheme-splitter": { + "version": "1.0.4", + "dev": true, + "license": "MIT" + }, + "node_modules/has": { + "version": "1.0.3", "dev": true, "license": "MIT", "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" + "function-bind": "^1.1.1" }, "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" + "node": ">= 0.4.0" } }, - "node_modules/eslint/node_modules/color-convert": { - "version": "2.0.1", + "node_modules/has-ansi": { + "version": "2.0.0", "dev": true, "license": "MIT", "dependencies": { - "color-name": "~1.1.4" + "ansi-regex": "^2.0.0" }, "engines": { - "node": ">=7.0.0" + "node": ">=0.10.0" } }, - "node_modules/eslint/node_modules/color-name": { - "version": "1.1.4", + "node_modules/has-ansi/node_modules/ansi-regex": { + "version": "2.1.1", "dev": true, - "license": "MIT" + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } }, - "node_modules/eslint/node_modules/escape-string-regexp": { - "version": "4.0.0", + "node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", "dev": true, - "license": "MIT", "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=4" } }, - "node_modules/eslint/node_modules/glob-parent": { - "version": "6.0.2", + "node_modules/has-symbols": { + "version": "1.0.3", "dev": true, - "license": "ISC", - "dependencies": { - "is-glob": "^4.0.3" - }, + "license": "MIT", "engines": { - "node": ">=10.13.0" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/eslint/node_modules/has-flag": { - "version": "4.0.0", + "node_modules/hash-base": { + "version": "3.0.4", "dev": true, "license": "MIT", + "dependencies": { + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + }, "engines": { - "node": ">=8" + "node": ">=4" } }, - "node_modules/eslint/node_modules/js-yaml": { - "version": "4.1.0", + "node_modules/hash.js": { + "version": "1.1.7", "dev": true, "license": "MIT", "dependencies": { - "argparse": "^2.0.1" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" + "inherits": "^2.0.3", + "minimalistic-assert": "^1.0.1" } }, - "node_modules/eslint/node_modules/levn": { - "version": "0.4.1", + "node_modules/hasha": { + "version": "5.2.2", "dev": true, "license": "MIT", "dependencies": { - "prelude-ls": "^1.2.1", - "type-check": "~0.4.0" + "is-stream": "^2.0.0", + "type-fest": "^0.8.0" }, "engines": { - "node": ">= 0.8.0" + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/eslint/node_modules/minimatch": { - "version": "3.1.2", + "node_modules/hasha/node_modules/type-fest": { + "version": "0.8.1", "dev": true, - "license": "ISC", - "dependencies": { - "brace-expansion": "^1.1.7" - }, + "license": "(MIT OR CC0-1.0)", "engines": { - "node": "*" + "node": ">=8" } }, - "node_modules/eslint/node_modules/optionator": { - "version": "0.9.1", + "node_modules/hasown": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.0.tgz", + "integrity": "sha512-vUptKVTpIJhcczKBbgnS+RtcuYMB8+oNzPK2/Hp3hanz8JmpATdmmgLgSaadVREkDm+e2giHwY3ZRkyjSIDDFA==", "dev": true, - "license": "MIT", "dependencies": { - "deep-is": "^0.1.3", - "fast-levenshtein": "^2.0.6", - "levn": "^0.4.1", - "prelude-ls": "^1.2.1", - "type-check": "^0.4.0", - "word-wrap": "^1.2.3" + "function-bind": "^1.1.2" }, "engines": { - "node": ">= 0.8.0" + "node": ">= 0.4" } }, - "node_modules/eslint/node_modules/prelude-ls": { - "version": "1.2.1", + "node_modules/he": { + "version": "1.2.0", "dev": true, "license": "MIT", - "engines": { - "node": ">= 0.8.0" + "bin": { + "he": "bin/he" } }, - "node_modules/eslint/node_modules/supports-color": { - "version": "7.2.0", + "node_modules/hmac-drbg": { + "version": "1.0.1", "dev": true, "license": "MIT", "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" + "hash.js": "^1.0.3", + "minimalistic-assert": "^1.0.0", + "minimalistic-crypto-utils": "^1.0.1" } }, - "node_modules/eslint/node_modules/type-check": { - "version": "0.4.0", + "node_modules/html-escaper": { + "version": "2.0.2", + "dev": true, + "license": "MIT" + }, + "node_modules/htmlescape": { + "version": "1.1.1", "dev": true, "license": "MIT", - "dependencies": { - "prelude-ls": "^1.2.1" - }, "engines": { - "node": ">= 0.8.0" + "node": ">=0.10" } }, - "node_modules/espree": { - "version": "9.4.1", + "node_modules/htmlparser2": { + "version": "3.8.3", "dev": true, - "license": "BSD-2-Clause", + "license": "MIT", "dependencies": { - "acorn": "^8.8.0", - "acorn-jsx": "^5.3.2", - "eslint-visitor-keys": "^3.3.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" + "domelementtype": "1", + "domhandler": "2.3", + "domutils": "1.5", + "entities": "1.0", + "readable-stream": "1.1" } }, - "node_modules/espree/node_modules/acorn": { - "version": "8.8.2", + "node_modules/htmlparser2/node_modules/isarray": { + "version": "0.0.1", + "dev": true, + "license": "MIT" + }, + "node_modules/htmlparser2/node_modules/readable-stream": { + "version": "1.1.14", "dev": true, "license": "MIT", - "bin": { - "acorn": "bin/acorn" - }, - "engines": { - "node": ">=0.4.0" + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", + "isarray": "0.0.1", + "string_decoder": "~0.10.x" } }, - "node_modules/esprima": { - "version": "4.0.1", + "node_modules/htmlparser2/node_modules/string_decoder": { + "version": "0.10.31", "dev": true, - "license": "BSD-2-Clause", - "bin": { - "esparse": "bin/esparse.js", - "esvalidate": "bin/esvalidate.js" + "license": "MIT" + }, + "node_modules/http-errors": { + "version": "2.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "depd": "2.0.0", + "inherits": "2.0.4", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "toidentifier": "1.0.1" }, "engines": { - "node": ">=4" + "node": ">= 0.8" } }, - "node_modules/esquery": { - "version": "1.4.2", + "node_modules/http-errors/node_modules/statuses": { + "version": "2.0.1", "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "estraverse": "^5.1.0" - }, + "license": "MIT", "engines": { - "node": ">=0.10" + "node": ">= 0.8" } }, - "node_modules/esrecurse": { - "version": "4.3.0", + "node_modules/http-proxy": { + "version": "1.18.1", "dev": true, - "license": "BSD-2-Clause", + "license": "MIT", "dependencies": { - "estraverse": "^5.2.0" + "eventemitter3": "^4.0.0", + "follow-redirects": "^1.0.0", + "requires-port": "^1.0.0" }, "engines": { - "node": ">=4.0" + "node": ">=8.0.0" } }, - "node_modules/estraverse": { - "version": "5.3.0", + "node_modules/https-browserify": { + "version": "1.0.0", "dev": true, - "license": "BSD-2-Clause", - "engines": { - "node": ">=4.0" - } + "license": "MIT" }, - "node_modules/esutils": { - "version": "2.0.3", + "node_modules/iconv-lite": { + "version": "0.4.24", "dev": true, - "license": "BSD-2-Clause", + "license": "MIT", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3" + }, "engines": { "node": ">=0.10.0" } }, - "node_modules/eventemitter3": { - "version": "4.0.0", + "node_modules/ieee754": { + "version": "1.2.1", "dev": true, - "license": "MIT" + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "BSD-3-Clause" }, - "node_modules/events": { - "version": "2.1.0", + "node_modules/ignore": { + "version": "5.2.4", "dev": true, "license": "MIT", "engines": { - "node": ">=0.4.x" + "node": ">= 4" } }, - "node_modules/evp_bytestokey": { - "version": "1.0.3", + "node_modules/import-fresh": { + "version": "3.3.0", "dev": true, "license": "MIT", "dependencies": { - "md5.js": "^1.3.4", - "safe-buffer": "^5.1.1" - } - }, - "node_modules/exit": { - "version": "0.1.2", - "dev": true, + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, "engines": { - "node": ">= 0.8.0" + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/extend": { - "version": "3.0.2", - "dev": true, - "license": "MIT" - }, - "node_modules/fast-deep-equal": { - "version": "3.1.3", - "dev": true, - "license": "MIT" - }, - "node_modules/fast-json-stable-stringify": { - "version": "2.1.0", + "node_modules/imurmurhash": { + "version": "0.1.4", "dev": true, - "license": "MIT" + "license": "MIT", + "engines": { + "node": ">=0.8.19" + } }, - "node_modules/fast-levenshtein": { - "version": "2.0.6", + "node_modules/indent-string": { + "version": "4.0.0", "dev": true, - "license": "MIT" + "license": "MIT", + "engines": { + "node": ">=8" + } }, - "node_modules/fastq": { - "version": "1.15.0", + "node_modules/inflight": { + "version": "1.0.6", "dev": true, "license": "ISC", "dependencies": { - "reusify": "^1.0.4" + "once": "^1.3.0", + "wrappy": "1" } }, - "node_modules/file-entry-cache": { - "version": "6.0.1", + "node_modules/inherits": { + "version": "2.0.4", + "dev": true, + "license": "ISC" + }, + "node_modules/inline-source-map": { + "version": "0.6.2", "dev": true, "license": "MIT", "dependencies": { - "flat-cache": "^3.0.4" - }, - "engines": { - "node": "^10.12.0 || >=12.0.0" + "source-map": "~0.5.3" } }, - "node_modules/fill-range": { - "version": "7.0.1", + "node_modules/insert-module-globals": { + "version": "7.2.0", "dev": true, "license": "MIT", "dependencies": { - "to-regex-range": "^5.0.1" + "acorn-node": "^1.5.2", + "combine-source-map": "^0.8.0", + "concat-stream": "^1.6.1", + "is-buffer": "^1.1.0", + "JSONStream": "^1.0.3", + "path-is-absolute": "^1.0.1", + "process": "~0.11.0", + "through2": "^2.0.0", + "undeclared-identifiers": "^1.1.2", + "xtend": "^4.0.0" }, - "engines": { - "node": ">=8" + "bin": { + "insert-module-globals": "bin/cmd.js" } }, - "node_modules/finalhandler": { - "version": "1.1.2", + "node_modules/irregular-plurals": { + "version": "1.4.0", "dev": true, "license": "MIT", - "dependencies": { - "debug": "2.6.9", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "on-finished": "~2.3.0", - "parseurl": "~1.3.3", - "statuses": "~1.5.0", - "unpipe": "~1.0.0" - }, "engines": { - "node": ">= 0.8" + "node": ">=0.10.0" } }, - "node_modules/finalhandler/node_modules/debug": { - "version": "2.6.9", + "node_modules/is-binary-path": { + "version": "2.1.0", "dev": true, "license": "MIT", "dependencies": { - "ms": "2.0.0" + "binary-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" } }, - "node_modules/finalhandler/node_modules/ms": { - "version": "2.0.0", + "node_modules/is-buffer": { + "version": "1.1.6", "dev": true, "license": "MIT" }, - "node_modules/find-cache-dir": { - "version": "3.3.2", + "node_modules/is-core-module": { + "version": "2.13.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.1.tgz", + "integrity": "sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==", "dev": true, - "license": "MIT", "dependencies": { - "commondir": "^1.0.1", - "make-dir": "^3.0.2", - "pkg-dir": "^4.1.0" - }, - "engines": { - "node": ">=8" + "hasown": "^2.0.0" }, "funding": { - "url": "https://github.com/avajs/find-cache-dir?sponsor=1" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/find-up": { - "version": "5.0.0", + "node_modules/is-extglob": { + "version": "2.1.1", "dev": true, "license": "MIT", - "dependencies": { - "locate-path": "^6.0.0", - "path-exists": "^4.0.0" - }, "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=0.10.0" } }, - "node_modules/flat": { - "version": "5.0.2", + "node_modules/is-glob": { + "version": "4.0.3", "dev": true, - "license": "BSD-3-Clause", - "bin": { - "flat": "cli.js" + "license": "MIT", + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" } }, - "node_modules/flat-cache": { - "version": "3.0.4", + "node_modules/is-number": { + "version": "7.0.0", "dev": true, "license": "MIT", - "dependencies": { - "flatted": "^3.1.0", - "rimraf": "^3.0.2" - }, "engines": { - "node": "^10.12.0 || >=12.0.0" + "node": ">=0.12.0" } }, - "node_modules/flatted": { - "version": "3.2.7", + "node_modules/is-path-inside": { + "version": "3.0.3", "dev": true, - "license": "ISC" + "license": "MIT", + "engines": { + "node": ">=8" + } }, - "node_modules/follow-redirects": { - "version": "1.15.2", + "node_modules/is-plain-obj": { + "version": "2.1.0", "dev": true, - "funding": [ - { - "type": "individual", - "url": "https://github.com/sponsors/RubenVerborgh" - } - ], "license": "MIT", "engines": { - "node": ">=4.0" - }, - "peerDependenciesMeta": { - "debug": { - "optional": true - } + "node": ">=8" } }, - "node_modules/foreground-child": { - "version": "2.0.0", + "node_modules/is-stream": { + "version": "2.0.1", "dev": true, - "license": "ISC", - "dependencies": { - "cross-spawn": "^7.0.0", - "signal-exit": "^3.0.2" - }, + "license": "MIT", "engines": { - "node": ">=8.0.0" + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/fromentries": { - "version": "1.3.2", + "node_modules/is-typedarray": { + "version": "1.0.0", "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], "license": "MIT" }, - "node_modules/fs-extra": { - "version": "8.1.0", + "node_modules/is-unicode-supported": { + "version": "0.1.0", "dev": true, "license": "MIT", - "dependencies": { - "graceful-fs": "^4.2.0", - "jsonfile": "^4.0.0", - "universalify": "^0.1.0" - }, "engines": { - "node": ">=6 <7 || >=8" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/fs.realpath": { - "version": "1.0.0", + "node_modules/is-windows": { + "version": "1.0.2", "dev": true, - "license": "ISC" + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } }, - "node_modules/fsevents": { - "version": "2.3.2", + "node_modules/is-wsl": { + "version": "2.1.0", "dev": true, "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], "engines": { - "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + "node": ">=8" } }, - "node_modules/function-bind": { - "version": "1.1.1", + "node_modules/isarray": { + "version": "1.0.0", "dev": true, "license": "MIT" }, - "node_modules/gensync": { - "version": "1.0.0-beta.2", + "node_modules/isbinaryfile": { + "version": "4.0.10", "dev": true, "license": "MIT", "engines": { - "node": ">=6.9.0" + "node": ">= 8.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/gjtorikian/" } }, - "node_modules/get-assigned-identifiers": { - "version": "1.2.0", + "node_modules/isexe": { + "version": "2.0.0", "dev": true, - "license": "Apache-2.0" + "license": "ISC" }, - "node_modules/get-caller-file": { - "version": "2.0.5", + "node_modules/istanbul-lib-coverage": { + "version": "3.2.0", "dev": true, - "license": "ISC", + "license": "BSD-3-Clause", "engines": { - "node": "6.* || 8.* || >= 10.*" + "node": ">=8" } }, - "node_modules/get-func-name": { - "version": "2.0.0", + "node_modules/istanbul-lib-hook": { + "version": "3.0.0", "dev": true, - "license": "MIT", + "license": "BSD-3-Clause", + "dependencies": { + "append-transform": "^2.0.0" + }, "engines": { - "node": "*" + "node": ">=8" } }, - "node_modules/get-intrinsic": { - "version": "1.2.0", + "node_modules/istanbul-lib-instrument": { + "version": "4.0.3", "dev": true, - "license": "MIT", + "license": "BSD-3-Clause", "dependencies": { - "function-bind": "^1.1.1", - "has": "^1.0.3", - "has-symbols": "^1.0.3" + "@babel/core": "^7.7.5", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-coverage": "^3.0.0", + "semver": "^6.3.0" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "engines": { + "node": ">=8" } }, - "node_modules/get-package-type": { - "version": "0.1.0", + "node_modules/istanbul-lib-instrument/node_modules/semver": { + "version": "6.3.0", "dev": true, - "license": "MIT", - "engines": { - "node": ">=8.0.0" + "license": "ISC", + "bin": { + "semver": "bin/semver.js" } }, - "node_modules/glob": { - "version": "7.2.0", + "node_modules/istanbul-lib-processinfo": { + "version": "2.0.3", "dev": true, "license": "ISC", "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" + "archy": "^1.0.0", + "cross-spawn": "^7.0.3", + "istanbul-lib-coverage": "^3.2.0", + "p-map": "^3.0.0", + "rimraf": "^3.0.0", + "uuid": "^8.3.2" }, "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" + "node": ">=8" } }, - "node_modules/glob-parent": { - "version": "5.1.2", + "node_modules/istanbul-lib-report": { + "version": "3.0.0", "dev": true, - "license": "ISC", + "license": "BSD-3-Clause", "dependencies": { - "is-glob": "^4.0.1" + "istanbul-lib-coverage": "^3.0.0", + "make-dir": "^3.0.0", + "supports-color": "^7.1.0" }, "engines": { - "node": ">= 6" + "node": ">=8" } }, - "node_modules/globals": { - "version": "13.20.0", + "node_modules/istanbul-lib-report/node_modules/has-flag": { + "version": "4.0.0", "dev": true, "license": "MIT", - "dependencies": { - "type-fest": "^0.20.2" - }, "engines": { "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/graceful-fs": { - "version": "4.2.10", - "dev": true, - "license": "ISC" - }, - "node_modules/grapheme-splitter": { - "version": "1.0.4", - "dev": true, - "license": "MIT" - }, - "node_modules/has": { - "version": "1.0.3", + "node_modules/istanbul-lib-report/node_modules/supports-color": { + "version": "7.2.0", "dev": true, "license": "MIT", "dependencies": { - "function-bind": "^1.1.1" + "has-flag": "^4.0.0" }, "engines": { - "node": ">= 0.4.0" + "node": ">=8" } }, - "node_modules/has-ansi": { - "version": "2.0.0", + "node_modules/istanbul-lib-source-maps": { + "version": "4.0.1", "dev": true, - "license": "MIT", + "license": "BSD-3-Clause", "dependencies": { - "ansi-regex": "^2.0.0" + "debug": "^4.1.1", + "istanbul-lib-coverage": "^3.0.0", + "source-map": "^0.6.1" }, "engines": { - "node": ">=0.10.0" + "node": ">=10" } }, - "node_modules/has-ansi/node_modules/ansi-regex": { - "version": "2.1.1", + "node_modules/istanbul-lib-source-maps/node_modules/source-map": { + "version": "0.6.1", "dev": true, - "license": "MIT", + "license": "BSD-3-Clause", "engines": { "node": ">=0.10.0" } }, - "node_modules/has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "node_modules/istanbul-reports": { + "version": "3.1.5", "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "html-escaper": "^2.0.0", + "istanbul-lib-report": "^3.0.0" + }, "engines": { - "node": ">=4" + "node": ">=8" } }, - "node_modules/has-symbols": { - "version": "1.0.3", + "node_modules/js-sdsl": { + "version": "4.3.0", "dev": true, "license": "MIT", - "engines": { - "node": ">= 0.4" - }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "type": "opencollective", + "url": "https://opencollective.com/js-sdsl" } }, - "node_modules/hash-base": { - "version": "3.0.4", + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "dev": true + }, + "node_modules/js-yaml": { + "version": "3.13.1", "dev": true, "license": "MIT", "dependencies": { - "inherits": "^2.0.1", - "safe-buffer": "^5.0.1" + "argparse": "^1.0.7", + "esprima": "^4.0.0" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/jsesc": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", + "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", + "dev": true, + "bin": { + "jsesc": "bin/jsesc" }, "engines": { "node": ">=4" } }, - "node_modules/hash.js": { - "version": "1.1.7", + "node_modules/jshint": { + "version": "2.13.5", "dev": true, "license": "MIT", "dependencies": { - "inherits": "^2.0.3", - "minimalistic-assert": "^1.0.1" + "cli": "~1.0.0", + "console-browserify": "1.1.x", + "exit": "0.1.x", + "htmlparser2": "3.8.x", + "lodash": "~4.17.21", + "minimatch": "~3.0.2", + "strip-json-comments": "1.0.x" + }, + "bin": { + "jshint": "bin/jshint" } }, - "node_modules/hasha": { - "version": "5.2.2", + "node_modules/jshint-stylish": { + "version": "2.2.1", "dev": true, "license": "MIT", "dependencies": { - "is-stream": "^2.0.0", - "type-fest": "^0.8.0" + "beeper": "^1.1.0", + "chalk": "^1.0.0", + "log-symbols": "^1.0.0", + "plur": "^2.1.0", + "string-length": "^1.0.0", + "text-table": "^0.2.0" }, "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=0.10.0" } }, - "node_modules/hasha/node_modules/type-fest": { - "version": "0.8.1", + "node_modules/jshint-stylish/node_modules/ansi-regex": { + "version": "2.1.1", "dev": true, - "license": "(MIT OR CC0-1.0)", + "license": "MIT", "engines": { - "node": ">=8" + "node": ">=0.10.0" } }, - "node_modules/he": { - "version": "1.2.0", + "node_modules/jshint-stylish/node_modules/ansi-styles": { + "version": "2.2.1", "dev": true, "license": "MIT", - "bin": { - "he": "bin/he" + "engines": { + "node": ">=0.10.0" } }, - "node_modules/hmac-drbg": { - "version": "1.0.1", + "node_modules/jshint-stylish/node_modules/chalk": { + "version": "1.1.3", "dev": true, "license": "MIT", "dependencies": { - "hash.js": "^1.0.3", - "minimalistic-assert": "^1.0.0", - "minimalistic-crypto-utils": "^1.0.1" + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" } }, - "node_modules/html-escaper": { - "version": "2.0.2", + "node_modules/jshint-stylish/node_modules/strip-ansi": { + "version": "3.0.1", "dev": true, - "license": "MIT" + "license": "MIT", + "dependencies": { + "ansi-regex": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } }, - "node_modules/htmlescape": { - "version": "1.1.1", + "node_modules/jshint-stylish/node_modules/supports-color": { + "version": "2.0.0", "dev": true, "license": "MIT", "engines": { - "node": ">=0.10" + "node": ">=0.8.0" } }, - "node_modules/htmlparser2": { - "version": "3.8.3", + "node_modules/jshint/node_modules/strip-json-comments": { + "version": "1.0.4", "dev": true, "license": "MIT", - "dependencies": { - "domelementtype": "1", - "domhandler": "2.3", - "domutils": "1.5", - "entities": "1.0", - "readable-stream": "1.1" + "bin": { + "strip-json-comments": "cli.js" + }, + "engines": { + "node": ">=0.8.0" } }, - "node_modules/htmlparser2/node_modules/isarray": { - "version": "0.0.1", + "node_modules/json-schema-traverse": { + "version": "0.4.1", "dev": true, "license": "MIT" }, - "node_modules/htmlparser2/node_modules/readable-stream": { - "version": "1.1.14", + "node_modules/json-stable-stringify": { + "version": "0.0.1", "dev": true, "license": "MIT", "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.1", - "isarray": "0.0.1", - "string_decoder": "~0.10.x" + "jsonify": "~0.0.0" } }, - "node_modules/htmlparser2/node_modules/string_decoder": { - "version": "0.10.31", + "node_modules/json-stable-stringify-without-jsonify": { + "version": "1.0.1", "dev": true, "license": "MIT" }, - "node_modules/http-errors": { - "version": "2.0.0", + "node_modules/json5": { + "version": "2.2.3", "dev": true, "license": "MIT", - "dependencies": { - "depd": "2.0.0", - "inherits": "2.0.4", - "setprototypeof": "1.2.0", - "statuses": "2.0.1", - "toidentifier": "1.0.1" + "bin": { + "json5": "lib/cli.js" }, "engines": { - "node": ">= 0.8" + "node": ">=6" } }, - "node_modules/http-errors/node_modules/statuses": { - "version": "2.0.1", + "node_modules/jsonfile": { + "version": "4.0.0", "dev": true, "license": "MIT", - "engines": { - "node": ">= 0.8" + "optionalDependencies": { + "graceful-fs": "^4.1.6" } }, - "node_modules/http-proxy": { - "version": "1.18.1", + "node_modules/jsonify": { + "version": "0.0.0", "dev": true, - "license": "MIT", + "license": "Public Domain" + }, + "node_modules/jsonparse": { + "version": "1.3.1", + "dev": true, + "engines": [ + "node >= 0.2.0" + ], + "license": "MIT" + }, + "node_modules/JSONStream": { + "version": "1.3.5", + "dev": true, + "license": "(MIT OR Apache-2.0)", "dependencies": { - "eventemitter3": "^4.0.0", - "follow-redirects": "^1.0.0", - "requires-port": "^1.0.0" + "jsonparse": "^1.2.0", + "through": ">=2.2.7 <3" + }, + "bin": { + "JSONStream": "bin.js" }, "engines": { - "node": ">=8.0.0" + "node": "*" } }, - "node_modules/https-browserify": { - "version": "1.0.0", - "dev": true, - "license": "MIT" - }, - "node_modules/iconv-lite": { - "version": "0.4.24", + "node_modules/karma": { + "version": "6.4.1", "dev": true, "license": "MIT", "dependencies": { - "safer-buffer": ">= 2.1.2 < 3" + "@colors/colors": "1.5.0", + "body-parser": "^1.19.0", + "braces": "^3.0.2", + "chokidar": "^3.5.1", + "connect": "^3.7.0", + "di": "^0.0.1", + "dom-serialize": "^2.2.1", + "glob": "^7.1.7", + "graceful-fs": "^4.2.6", + "http-proxy": "^1.18.1", + "isbinaryfile": "^4.0.8", + "lodash": "^4.17.21", + "log4js": "^6.4.1", + "mime": "^2.5.2", + "minimatch": "^3.0.4", + "mkdirp": "^0.5.5", + "qjobs": "^1.2.0", + "range-parser": "^1.2.1", + "rimraf": "^3.0.2", + "socket.io": "^4.4.1", + "source-map": "^0.6.1", + "tmp": "^0.2.1", + "ua-parser-js": "^0.7.30", + "yargs": "^16.1.1" + }, + "bin": { + "karma": "bin/karma" }, "engines": { - "node": ">=0.10.0" + "node": ">= 10" } }, - "node_modules/ieee754": { - "version": "1.2.1", + "node_modules/karma-chrome-launcher": { + "version": "3.1.0", "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "BSD-3-Clause" + "license": "MIT", + "dependencies": { + "which": "^1.2.1" + } }, - "node_modules/ignore": { - "version": "5.2.4", + "node_modules/karma-firefox-launcher": { + "version": "1.3.0", "dev": true, "license": "MIT", - "engines": { - "node": ">= 4" + "dependencies": { + "is-wsl": "^2.1.0" } }, - "node_modules/import-fresh": { - "version": "3.3.0", + "node_modules/karma-mocha": { + "version": "2.0.1", "dev": true, "license": "MIT", "dependencies": { - "parent-module": "^1.0.0", - "resolve-from": "^4.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "minimist": "^1.2.3" } }, - "node_modules/imurmurhash": { - "version": "0.1.4", + "node_modules/karma-requirejs": { + "version": "1.1.0", "dev": true, "license": "MIT", - "engines": { - "node": ">=0.8.19" + "peerDependencies": { + "karma": ">=0.9", + "requirejs": "^2.1.0" } }, - "node_modules/indent-string": { - "version": "4.0.0", + "node_modules/karma-safari-launcher": { + "version": "1.0.0", "dev": true, "license": "MIT", - "engines": { - "node": ">=8" + "peerDependencies": { + "karma": ">=0.9" } }, - "node_modules/inflight": { - "version": "1.0.6", + "node_modules/karma/node_modules/glob": { + "version": "7.2.3", "dev": true, "license": "ISC", "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", "once": "^1.3.0", - "wrappy": "1" + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/inherits": { - "version": "2.0.4", + "node_modules/karma/node_modules/minimatch": { + "version": "3.1.2", "dev": true, - "license": "ISC" + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } }, - "node_modules/inline-source-map": { - "version": "0.6.2", + "node_modules/karma/node_modules/source-map": { + "version": "0.6.1", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/labeled-stream-splicer": { + "version": "2.0.2", "dev": true, "license": "MIT", "dependencies": { - "source-map": "~0.5.3" + "inherits": "^2.0.1", + "stream-splicer": "^2.0.0" } }, - "node_modules/insert-module-globals": { - "version": "7.2.0", + "node_modules/locate-path": { + "version": "6.0.0", "dev": true, "license": "MIT", "dependencies": { - "acorn-node": "^1.5.2", - "combine-source-map": "^0.8.0", - "concat-stream": "^1.6.1", - "is-buffer": "^1.1.0", - "JSONStream": "^1.0.3", - "path-is-absolute": "^1.0.1", - "process": "~0.11.0", - "through2": "^2.0.0", - "undeclared-identifiers": "^1.1.2", - "xtend": "^4.0.0" + "p-locate": "^5.0.0" }, - "bin": { - "insert-module-globals": "bin/cmd.js" + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/irregular-plurals": { - "version": "1.4.0", + "node_modules/lodash": { + "version": "4.17.21", + "dev": true, + "license": "MIT" + }, + "node_modules/lodash.debounce": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", + "integrity": "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==", + "dev": true + }, + "node_modules/lodash.flattendeep": { + "version": "4.4.0", + "dev": true, + "license": "MIT" + }, + "node_modules/lodash.memoize": { + "version": "3.0.4", + "dev": true, + "license": "MIT" + }, + "node_modules/lodash.merge": { + "version": "4.6.2", + "dev": true, + "license": "MIT" + }, + "node_modules/log-symbols": { + "version": "1.0.2", "dev": true, "license": "MIT", + "dependencies": { + "chalk": "^1.0.0" + }, "engines": { "node": ">=0.10.0" } }, - "node_modules/is-binary-path": { - "version": "2.1.0", + "node_modules/log-symbols/node_modules/ansi-regex": { + "version": "2.1.1", "dev": true, "license": "MIT", - "dependencies": { - "binary-extensions": "^2.0.0" - }, "engines": { - "node": ">=8" + "node": ">=0.10.0" } }, - "node_modules/is-buffer": { - "version": "1.1.6", - "dev": true, - "license": "MIT" - }, - "node_modules/is-extglob": { - "version": "2.1.1", + "node_modules/log-symbols/node_modules/ansi-styles": { + "version": "2.2.1", "dev": true, "license": "MIT", "engines": { "node": ">=0.10.0" } }, - "node_modules/is-glob": { - "version": "4.0.3", + "node_modules/log-symbols/node_modules/chalk": { + "version": "1.1.3", "dev": true, "license": "MIT", "dependencies": { - "is-extglob": "^2.1.1" + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" }, "engines": { "node": ">=0.10.0" } }, - "node_modules/is-number": { - "version": "7.0.0", + "node_modules/log-symbols/node_modules/strip-ansi": { + "version": "3.0.1", "dev": true, "license": "MIT", + "dependencies": { + "ansi-regex": "^2.0.0" + }, "engines": { - "node": ">=0.12.0" + "node": ">=0.10.0" } }, - "node_modules/is-path-inside": { - "version": "3.0.3", + "node_modules/log-symbols/node_modules/supports-color": { + "version": "2.0.0", "dev": true, "license": "MIT", "engines": { - "node": ">=8" + "node": ">=0.8.0" } }, - "node_modules/is-plain-obj": { - "version": "2.1.0", + "node_modules/log4js": { + "version": "6.8.0", "dev": true, - "license": "MIT", + "license": "Apache-2.0", + "dependencies": { + "date-format": "^4.0.14", + "debug": "^4.3.4", + "flatted": "^3.2.7", + "rfdc": "^1.3.0", + "streamroller": "^3.1.5" + }, "engines": { - "node": ">=8" + "node": ">=8.0" } }, - "node_modules/is-stream": { - "version": "2.0.1", + "node_modules/loupe": { + "version": "2.3.6", "dev": true, "license": "MIT", - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "dependencies": { + "get-func-name": "^2.0.0" } }, - "node_modules/is-typedarray": { - "version": "1.0.0", + "node_modules/lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", "dev": true, - "license": "MIT" + "dependencies": { + "yallist": "^3.0.2" + } }, - "node_modules/is-unicode-supported": { - "version": "0.1.0", + "node_modules/make-dir": { + "version": "3.1.0", "dev": true, "license": "MIT", + "dependencies": { + "semver": "^6.0.0" + }, "engines": { - "node": ">=10" + "node": ">=8" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/is-windows": { - "version": "1.0.2", + "node_modules/make-dir/node_modules/semver": { + "version": "6.3.0", "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" + "license": "ISC", + "bin": { + "semver": "bin/semver.js" } }, - "node_modules/is-wsl": { - "version": "2.1.0", + "node_modules/md5.js": { + "version": "1.3.5", "dev": true, "license": "MIT", - "engines": { - "node": ">=8" + "dependencies": { + "hash-base": "^3.0.0", + "inherits": "^2.0.1", + "safe-buffer": "^5.1.2" } }, - "node_modules/isarray": { - "version": "1.0.0", + "node_modules/media-typer": { + "version": "0.3.0", "dev": true, - "license": "MIT" + "license": "MIT", + "engines": { + "node": ">= 0.6" + } }, - "node_modules/isbinaryfile": { - "version": "4.0.10", + "node_modules/miller-rabin": { + "version": "4.0.1", "dev": true, "license": "MIT", - "engines": { - "node": ">= 8.0.0" + "dependencies": { + "bn.js": "^4.0.0", + "brorand": "^1.0.1" }, - "funding": { - "url": "https://github.com/sponsors/gjtorikian/" + "bin": { + "miller-rabin": "bin/miller-rabin" } }, - "node_modules/isexe": { - "version": "2.0.0", + "node_modules/mime": { + "version": "2.6.0", "dev": true, - "license": "ISC" + "license": "MIT", + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4.0.0" + } }, - "node_modules/istanbul-lib-coverage": { - "version": "3.2.0", + "node_modules/mime-db": { + "version": "1.52.0", "dev": true, - "license": "BSD-3-Clause", + "license": "MIT", "engines": { - "node": ">=8" + "node": ">= 0.6" } }, - "node_modules/istanbul-lib-hook": { - "version": "3.0.0", + "node_modules/mime-types": { + "version": "2.1.35", "dev": true, - "license": "BSD-3-Clause", + "license": "MIT", "dependencies": { - "append-transform": "^2.0.0" + "mime-db": "1.52.0" }, "engines": { - "node": ">=8" + "node": ">= 0.6" } }, - "node_modules/istanbul-lib-instrument": { - "version": "4.0.3", + "node_modules/minimalistic-assert": { + "version": "1.0.1", "dev": true, - "license": "BSD-3-Clause", + "license": "ISC" + }, + "node_modules/minimalistic-crypto-utils": { + "version": "1.0.1", + "dev": true, + "license": "MIT" + }, + "node_modules/minimatch": { + "version": "3.0.8", + "dev": true, + "license": "ISC", "dependencies": { - "@babel/core": "^7.7.5", - "@istanbuljs/schema": "^0.1.2", - "istanbul-lib-coverage": "^3.0.0", - "semver": "^6.3.0" + "brace-expansion": "^1.1.7" }, "engines": { - "node": ">=8" + "node": "*" } }, - "node_modules/istanbul-lib-instrument/node_modules/semver": { - "version": "6.3.0", + "node_modules/minimist": { + "version": "1.2.8", "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/istanbul-lib-processinfo": { - "version": "2.0.3", + "node_modules/mkdirp": { + "version": "0.5.6", "dev": true, - "license": "ISC", + "license": "MIT", "dependencies": { - "archy": "^1.0.0", - "cross-spawn": "^7.0.3", - "istanbul-lib-coverage": "^3.2.0", - "p-map": "^3.0.0", - "rimraf": "^3.0.0", - "uuid": "^8.3.2" + "minimist": "^1.2.6" }, - "engines": { - "node": ">=8" + "bin": { + "mkdirp": "bin/cmd.js" } }, - "node_modules/istanbul-lib-report": { - "version": "3.0.0", + "node_modules/mkdirp-classic": { + "version": "0.5.3", "dev": true, - "license": "BSD-3-Clause", + "license": "MIT" + }, + "node_modules/mocha": { + "version": "10.1.0", + "dev": true, + "license": "MIT", "dependencies": { - "istanbul-lib-coverage": "^3.0.0", - "make-dir": "^3.0.0", - "supports-color": "^7.1.0" + "ansi-colors": "4.1.1", + "browser-stdout": "1.3.1", + "chokidar": "3.5.3", + "debug": "4.3.4", + "diff": "5.0.0", + "escape-string-regexp": "4.0.0", + "find-up": "5.0.0", + "glob": "7.2.0", + "he": "1.2.0", + "js-yaml": "4.1.0", + "log-symbols": "4.1.0", + "minimatch": "5.0.1", + "ms": "2.1.3", + "nanoid": "3.3.3", + "serialize-javascript": "6.0.0", + "strip-json-comments": "3.1.1", + "supports-color": "8.1.1", + "workerpool": "6.2.1", + "yargs": "16.2.0", + "yargs-parser": "20.2.4", + "yargs-unparser": "2.0.0" + }, + "bin": { + "_mocha": "bin/_mocha", + "mocha": "bin/mocha.js" }, "engines": { - "node": ">=8" + "node": ">= 14.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mochajs" } }, - "node_modules/istanbul-lib-report/node_modules/has-flag": { - "version": "4.0.0", + "node_modules/mocha/node_modules/ansi-colors": { + "version": "4.1.1", "dev": true, "license": "MIT", "engines": { - "node": ">=8" + "node": ">=6" } }, - "node_modules/istanbul-lib-report/node_modules/supports-color": { - "version": "7.2.0", + "node_modules/mocha/node_modules/ansi-styles": { + "version": "4.3.0", "dev": true, "license": "MIT", "dependencies": { - "has-flag": "^4.0.0" + "color-convert": "^2.0.1" }, "engines": { "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/istanbul-lib-source-maps": { - "version": "4.0.1", + "node_modules/mocha/node_modules/argparse": { + "version": "2.0.1", "dev": true, - "license": "BSD-3-Clause", + "license": "Python-2.0" + }, + "node_modules/mocha/node_modules/brace-expansion": { + "version": "2.0.1", + "dev": true, + "license": "MIT", "dependencies": { - "debug": "^4.1.1", - "istanbul-lib-coverage": "^3.0.0", - "source-map": "^0.6.1" - }, - "engines": { - "node": ">=10" + "balanced-match": "^1.0.0" } }, - "node_modules/istanbul-lib-source-maps/node_modules/source-map": { - "version": "0.6.1", + "node_modules/mocha/node_modules/chalk": { + "version": "4.1.2", "dev": true, - "license": "BSD-3-Clause", + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, "engines": { - "node": ">=0.10.0" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/istanbul-reports": { - "version": "3.1.5", + "node_modules/mocha/node_modules/chalk/node_modules/supports-color": { + "version": "7.2.0", "dev": true, - "license": "BSD-3-Clause", + "license": "MIT", "dependencies": { - "html-escaper": "^2.0.0", - "istanbul-lib-report": "^3.0.0" + "has-flag": "^4.0.0" }, "engines": { "node": ">=8" } }, - "node_modules/js-sdsl": { - "version": "4.3.0", + "node_modules/mocha/node_modules/color-convert": { + "version": "2.0.1", "dev": true, "license": "MIT", - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/js-sdsl" + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" } }, - "node_modules/js-tokens": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", - "dev": true + "node_modules/mocha/node_modules/color-name": { + "version": "1.1.4", + "dev": true, + "license": "MIT" }, - "node_modules/js-yaml": { - "version": "3.13.1", + "node_modules/mocha/node_modules/escape-string-regexp": { + "version": "4.0.0", "dev": true, "license": "MIT", - "dependencies": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" + "engines": { + "node": ">=10" }, - "bin": { - "js-yaml": "bin/js-yaml.js" + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/jsesc": { - "version": "2.5.2", + "node_modules/mocha/node_modules/has-flag": { + "version": "4.0.0", "dev": true, "license": "MIT", - "bin": { - "jsesc": "bin/jsesc" - }, "engines": { - "node": ">=4" + "node": ">=8" } }, - "node_modules/jshint": { - "version": "2.13.5", + "node_modules/mocha/node_modules/js-yaml": { + "version": "4.1.0", "dev": true, "license": "MIT", "dependencies": { - "cli": "~1.0.0", - "console-browserify": "1.1.x", - "exit": "0.1.x", - "htmlparser2": "3.8.x", - "lodash": "~4.17.21", - "minimatch": "~3.0.2", - "strip-json-comments": "1.0.x" + "argparse": "^2.0.1" }, "bin": { - "jshint": "bin/jshint" + "js-yaml": "bin/js-yaml.js" } }, - "node_modules/jshint-stylish": { - "version": "2.2.1", + "node_modules/mocha/node_modules/log-symbols": { + "version": "4.1.0", "dev": true, "license": "MIT", "dependencies": { - "beeper": "^1.1.0", - "chalk": "^1.0.0", - "log-symbols": "^1.0.0", - "plur": "^2.1.0", - "string-length": "^1.0.0", - "text-table": "^0.2.0" + "chalk": "^4.1.0", + "is-unicode-supported": "^0.1.0" }, "engines": { - "node": ">=0.10.0" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/jshint-stylish/node_modules/ansi-regex": { - "version": "2.1.1", + "node_modules/mocha/node_modules/minimatch": { + "version": "5.0.1", "dev": true, - "license": "MIT", + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, "engines": { - "node": ">=0.10.0" + "node": ">=10" } }, - "node_modules/jshint-stylish/node_modules/ansi-styles": { - "version": "2.2.1", + "node_modules/mocha/node_modules/ms": { + "version": "2.1.3", "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } + "license": "MIT" }, - "node_modules/jshint-stylish/node_modules/chalk": { - "version": "1.1.3", + "node_modules/mocha/node_modules/supports-color": { + "version": "8.1.1", "dev": true, "license": "MIT", "dependencies": { - "ansi-styles": "^2.2.1", - "escape-string-regexp": "^1.0.2", - "has-ansi": "^2.0.0", - "strip-ansi": "^3.0.0", - "supports-color": "^2.0.0" + "has-flag": "^4.0.0" }, "engines": { - "node": ">=0.10.0" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" } }, - "node_modules/jshint-stylish/node_modules/strip-ansi": { - "version": "3.0.1", + "node_modules/module-deps": { + "version": "6.2.1", "dev": true, "license": "MIT", "dependencies": { - "ansi-regex": "^2.0.0" + "browser-resolve": "^1.7.0", + "cached-path-relative": "^1.0.2", + "concat-stream": "~1.6.0", + "defined": "^1.0.0", + "detective": "^5.0.2", + "duplexer2": "^0.1.2", + "inherits": "^2.0.1", + "JSONStream": "^1.0.3", + "parents": "^1.0.0", + "readable-stream": "^2.0.2", + "resolve": "^1.4.0", + "stream-combiner2": "^1.1.1", + "subarg": "^1.0.0", + "through2": "^2.0.0", + "xtend": "^4.0.0" + }, + "bin": { + "module-deps": "bin/cmd.js" }, "engines": { - "node": ">=0.10.0" + "node": ">= 0.8.0" } }, - "node_modules/jshint-stylish/node_modules/supports-color": { - "version": "2.0.0", + "node_modules/ms": { + "version": "2.1.2", "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.8.0" - } + "license": "MIT" }, - "node_modules/jshint/node_modules/strip-json-comments": { - "version": "1.0.4", + "node_modules/nanoid": { + "version": "3.3.3", "dev": true, "license": "MIT", "bin": { - "strip-json-comments": "cli.js" + "nanoid": "bin/nanoid.cjs" }, "engines": { - "node": ">=0.8.0" + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" } }, - "node_modules/json-schema-traverse": { - "version": "0.4.1", + "node_modules/natural-compare": { + "version": "1.4.0", "dev": true, "license": "MIT" }, - "node_modules/json-stable-stringify": { - "version": "0.0.1", + "node_modules/negotiator": { + "version": "0.6.3", "dev": true, "license": "MIT", - "dependencies": { - "jsonify": "~0.0.0" + "engines": { + "node": ">= 0.6" } }, - "node_modules/json-stable-stringify-without-jsonify": { - "version": "1.0.1", - "dev": true, - "license": "MIT" - }, - "node_modules/json5": { - "version": "2.2.3", + "node_modules/node-preload": { + "version": "0.2.1", "dev": true, "license": "MIT", - "bin": { - "json5": "lib/cli.js" + "dependencies": { + "process-on-spawn": "^1.0.0" }, "engines": { - "node": ">=6" - } - }, - "node_modules/jsonfile": { - "version": "4.0.0", - "dev": true, - "license": "MIT", - "optionalDependencies": { - "graceful-fs": "^4.1.6" + "node": ">=8" } }, - "node_modules/jsonify": { - "version": "0.0.0", - "dev": true, - "license": "Public Domain" + "node_modules/node-releases": { + "version": "2.0.14", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.14.tgz", + "integrity": "sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==", + "dev": true }, - "node_modules/jsonparse": { - "version": "1.3.1", - "dev": true, - "engines": [ - "node >= 0.2.0" - ], - "license": "MIT" + "node_modules/normalize-path": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } }, - "node_modules/JSONStream": { - "version": "1.3.5", + "node_modules/nyc": { + "version": "15.1.0", "dev": true, - "license": "(MIT OR Apache-2.0)", + "license": "ISC", "dependencies": { - "jsonparse": "^1.2.0", - "through": ">=2.2.7 <3" + "@istanbuljs/load-nyc-config": "^1.0.0", + "@istanbuljs/schema": "^0.1.2", + "caching-transform": "^4.0.0", + "convert-source-map": "^1.7.0", + "decamelize": "^1.2.0", + "find-cache-dir": "^3.2.0", + "find-up": "^4.1.0", + "foreground-child": "^2.0.0", + "get-package-type": "^0.1.0", + "glob": "^7.1.6", + "istanbul-lib-coverage": "^3.0.0", + "istanbul-lib-hook": "^3.0.0", + "istanbul-lib-instrument": "^4.0.0", + "istanbul-lib-processinfo": "^2.0.2", + "istanbul-lib-report": "^3.0.0", + "istanbul-lib-source-maps": "^4.0.0", + "istanbul-reports": "^3.0.2", + "make-dir": "^3.0.0", + "node-preload": "^0.2.1", + "p-map": "^3.0.0", + "process-on-spawn": "^1.0.0", + "resolve-from": "^5.0.0", + "rimraf": "^3.0.0", + "signal-exit": "^3.0.2", + "spawn-wrap": "^2.0.0", + "test-exclude": "^6.0.0", + "yargs": "^15.0.2" }, "bin": { - "JSONStream": "bin.js" + "nyc": "bin/nyc.js" }, "engines": { - "node": "*" + "node": ">=8.9" } }, - "node_modules/karma": { - "version": "6.4.1", + "node_modules/nyc/node_modules/ansi-styles": { + "version": "4.3.0", "dev": true, "license": "MIT", "dependencies": { - "@colors/colors": "1.5.0", - "body-parser": "^1.19.0", - "braces": "^3.0.2", - "chokidar": "^3.5.1", - "connect": "^3.7.0", - "di": "^0.0.1", - "dom-serialize": "^2.2.1", - "glob": "^7.1.7", - "graceful-fs": "^4.2.6", - "http-proxy": "^1.18.1", - "isbinaryfile": "^4.0.8", - "lodash": "^4.17.21", - "log4js": "^6.4.1", - "mime": "^2.5.2", - "minimatch": "^3.0.4", - "mkdirp": "^0.5.5", - "qjobs": "^1.2.0", - "range-parser": "^1.2.1", - "rimraf": "^3.0.2", - "socket.io": "^4.4.1", - "source-map": "^0.6.1", - "tmp": "^0.2.1", - "ua-parser-js": "^0.7.30", - "yargs": "^16.1.1" - }, - "bin": { - "karma": "bin/karma" + "color-convert": "^2.0.1" }, "engines": { - "node": ">= 10" + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/karma-chrome-launcher": { - "version": "3.1.0", + "node_modules/nyc/node_modules/camelcase": { + "version": "5.3.1", "dev": true, "license": "MIT", - "dependencies": { - "which": "^1.2.1" + "engines": { + "node": ">=6" } }, - "node_modules/karma-firefox-launcher": { - "version": "1.3.0", + "node_modules/nyc/node_modules/cliui": { + "version": "6.0.0", "dev": true, - "license": "MIT", + "license": "ISC", "dependencies": { - "is-wsl": "^2.1.0" + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^6.2.0" } }, - "node_modules/karma-mocha": { + "node_modules/nyc/node_modules/color-convert": { "version": "2.0.1", "dev": true, "license": "MIT", "dependencies": { - "minimist": "^1.2.3" + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" } }, - "node_modules/karma-requirejs": { - "version": "1.1.0", + "node_modules/nyc/node_modules/color-name": { + "version": "1.1.4", + "dev": true, + "license": "MIT" + }, + "node_modules/nyc/node_modules/convert-source-map": { + "version": "1.9.0", + "dev": true, + "license": "MIT" + }, + "node_modules/nyc/node_modules/decamelize": { + "version": "1.2.0", "dev": true, "license": "MIT", - "peerDependencies": { - "karma": ">=0.9", - "requirejs": "^2.1.0" + "engines": { + "node": ">=0.10.0" } }, - "node_modules/karma-safari-launcher": { - "version": "1.0.0", + "node_modules/nyc/node_modules/find-up": { + "version": "4.1.0", "dev": true, "license": "MIT", - "peerDependencies": { - "karma": ">=0.9" + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8" } }, - "node_modules/karma/node_modules/glob": { - "version": "7.2.3", + "node_modules/nyc/node_modules/locate-path": { + "version": "5.0.0", "dev": true, - "license": "ISC", + "license": "MIT", "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" + "p-locate": "^4.1.0" }, "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" + "node": ">=8" } }, - "node_modules/karma/node_modules/minimatch": { - "version": "3.1.2", + "node_modules/nyc/node_modules/p-limit": { + "version": "2.3.0", "dev": true, - "license": "ISC", + "license": "MIT", "dependencies": { - "brace-expansion": "^1.1.7" + "p-try": "^2.0.0" }, "engines": { - "node": "*" + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/karma/node_modules/source-map": { - "version": "0.6.1", + "node_modules/nyc/node_modules/p-locate": { + "version": "4.1.0", "dev": true, - "license": "BSD-3-Clause", + "license": "MIT", + "dependencies": { + "p-limit": "^2.2.0" + }, "engines": { - "node": ">=0.10.0" + "node": ">=8" } }, - "node_modules/labeled-stream-splicer": { - "version": "2.0.2", + "node_modules/nyc/node_modules/resolve-from": { + "version": "5.0.0", "dev": true, "license": "MIT", - "dependencies": { - "inherits": "^2.0.1", - "stream-splicer": "^2.0.0" + "engines": { + "node": ">=8" } }, - "node_modules/locate-path": { - "version": "6.0.0", + "node_modules/nyc/node_modules/wrap-ansi": { + "version": "6.2.0", "dev": true, "license": "MIT", "dependencies": { - "p-locate": "^5.0.0" + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" }, "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=8" } }, - "node_modules/lodash": { - "version": "4.17.21", - "dev": true, - "license": "MIT" - }, - "node_modules/lodash.flattendeep": { - "version": "4.4.0", - "dev": true, - "license": "MIT" - }, - "node_modules/lodash.memoize": { - "version": "3.0.4", + "node_modules/nyc/node_modules/y18n": { + "version": "4.0.3", "dev": true, - "license": "MIT" + "license": "ISC" }, - "node_modules/lodash.merge": { - "version": "4.6.2", + "node_modules/nyc/node_modules/yargs": { + "version": "15.4.1", "dev": true, - "license": "MIT" + "license": "MIT", + "dependencies": { + "cliui": "^6.0.0", + "decamelize": "^1.2.0", + "find-up": "^4.1.0", + "get-caller-file": "^2.0.1", + "require-directory": "^2.1.1", + "require-main-filename": "^2.0.0", + "set-blocking": "^2.0.0", + "string-width": "^4.2.0", + "which-module": "^2.0.0", + "y18n": "^4.0.0", + "yargs-parser": "^18.1.2" + }, + "engines": { + "node": ">=8" + } }, - "node_modules/log-symbols": { - "version": "1.0.2", + "node_modules/nyc/node_modules/yargs-parser": { + "version": "18.1.3", "dev": true, - "license": "MIT", + "license": "ISC", "dependencies": { - "chalk": "^1.0.0" + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" }, "engines": { - "node": ">=0.10.0" + "node": ">=6" } }, - "node_modules/log-symbols/node_modules/ansi-regex": { - "version": "2.1.1", + "node_modules/object-assign": { + "version": "4.1.1", "dev": true, "license": "MIT", "engines": { "node": ">=0.10.0" } }, - "node_modules/log-symbols/node_modules/ansi-styles": { - "version": "2.2.1", + "node_modules/object-inspect": { + "version": "1.12.3", "dev": true, "license": "MIT", - "engines": { - "node": ">=0.10.0" + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/log-symbols/node_modules/chalk": { - "version": "1.1.3", + "node_modules/on-finished": { + "version": "2.3.0", "dev": true, "license": "MIT", "dependencies": { - "ansi-styles": "^2.2.1", - "escape-string-regexp": "^1.0.2", - "has-ansi": "^2.0.0", - "strip-ansi": "^3.0.0", - "supports-color": "^2.0.0" + "ee-first": "1.1.1" }, "engines": { - "node": ">=0.10.0" + "node": ">= 0.8" } }, - "node_modules/log-symbols/node_modules/strip-ansi": { - "version": "3.0.1", + "node_modules/once": { + "version": "1.4.0", + "dev": true, + "license": "ISC", + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/os-browserify": { + "version": "0.3.0", + "dev": true, + "license": "MIT" + }, + "node_modules/p-limit": { + "version": "3.1.0", "dev": true, "license": "MIT", "dependencies": { - "ansi-regex": "^2.0.0" + "yocto-queue": "^0.1.0" }, "engines": { - "node": ">=0.10.0" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/log-symbols/node_modules/supports-color": { - "version": "2.0.0", + "node_modules/p-locate": { + "version": "5.0.0", "dev": true, "license": "MIT", + "dependencies": { + "p-limit": "^3.0.2" + }, "engines": { - "node": ">=0.8.0" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/log4js": { - "version": "6.8.0", + "node_modules/p-map": { + "version": "3.0.0", "dev": true, - "license": "Apache-2.0", + "license": "MIT", "dependencies": { - "date-format": "^4.0.14", - "debug": "^4.3.4", - "flatted": "^3.2.7", - "rfdc": "^1.3.0", - "streamroller": "^3.1.5" + "aggregate-error": "^3.0.0" }, "engines": { - "node": ">=8.0" + "node": ">=8" } }, - "node_modules/loupe": { - "version": "2.3.6", + "node_modules/p-try": { + "version": "2.2.0", "dev": true, "license": "MIT", - "dependencies": { - "get-func-name": "^2.0.0" + "engines": { + "node": ">=6" } }, - "node_modules/lru-cache": { - "version": "5.1.1", + "node_modules/package-hash": { + "version": "4.0.0", "dev": true, "license": "ISC", "dependencies": { - "yallist": "^3.0.2" + "graceful-fs": "^4.1.15", + "hasha": "^5.0.0", + "lodash.flattendeep": "^4.4.0", + "release-zalgo": "^1.0.0" + }, + "engines": { + "node": ">=8" } }, - "node_modules/make-dir": { - "version": "3.1.0", + "node_modules/pako": { + "version": "1.0.10", + "dev": true, + "license": "(MIT AND Zlib)" + }, + "node_modules/parent-module": { + "version": "1.0.1", "dev": true, "license": "MIT", "dependencies": { - "semver": "^6.0.0" + "callsites": "^3.0.0" }, "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=6" } }, - "node_modules/make-dir/node_modules/semver": { - "version": "6.3.0", + "node_modules/parents": { + "version": "1.0.1", "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" + "license": "MIT", + "dependencies": { + "path-platform": "~0.11.15" } }, - "node_modules/md5.js": { - "version": "1.3.5", + "node_modules/parse-asn1": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.6.tgz", + "integrity": "sha512-RnZRo1EPU6JBnra2vGHj0yhp6ebyjBZpmUCLHWiFhxlzvBCCpAuZ7elsBp1PVAbQN0/04VD/19rfzlBSwLstMw==", "dev": true, - "license": "MIT", "dependencies": { - "hash-base": "^3.0.0", - "inherits": "^2.0.1", - "safe-buffer": "^5.1.2" + "asn1.js": "^5.2.0", + "browserify-aes": "^1.0.0", + "evp_bytestokey": "^1.0.0", + "pbkdf2": "^3.0.3", + "safe-buffer": "^5.1.1" } }, - "node_modules/media-typer": { - "version": "0.3.0", + "node_modules/parseurl": { + "version": "1.3.3", "dev": true, "license": "MIT", "engines": { - "node": ">= 0.6" + "node": ">= 0.8" } }, - "node_modules/miller-rabin": { - "version": "4.0.1", + "node_modules/path-browserify": { + "version": "0.0.1", "dev": true, - "license": "MIT", - "dependencies": { - "bn.js": "^4.0.0", - "brorand": "^1.0.1" - }, - "bin": { - "miller-rabin": "bin/miller-rabin" - } + "license": "MIT" }, - "node_modules/mime": { - "version": "2.6.0", + "node_modules/path-exists": { + "version": "4.0.0", "dev": true, "license": "MIT", - "bin": { - "mime": "cli.js" - }, "engines": { - "node": ">=4.0.0" + "node": ">=8" } }, - "node_modules/mime-db": { - "version": "1.52.0", + "node_modules/path-is-absolute": { + "version": "1.0.1", "dev": true, "license": "MIT", "engines": { - "node": ">= 0.6" + "node": ">=0.10.0" } }, - "node_modules/mime-types": { - "version": "2.1.35", + "node_modules/path-key": { + "version": "3.1.1", "dev": true, "license": "MIT", - "dependencies": { - "mime-db": "1.52.0" - }, "engines": { - "node": ">= 0.6" + "node": ">=8" } }, - "node_modules/minimalistic-assert": { - "version": "1.0.1", - "dev": true, - "license": "ISC" - }, - "node_modules/minimalistic-crypto-utils": { - "version": "1.0.1", + "node_modules/path-parse": { + "version": "1.0.7", "dev": true, "license": "MIT" }, - "node_modules/minimatch": { - "version": "3.0.8", + "node_modules/path-platform": { + "version": "0.11.15", "dev": true, - "license": "ISC", - "dependencies": { - "brace-expansion": "^1.1.7" - }, + "license": "MIT", "engines": { - "node": "*" + "node": ">= 0.8.0" } }, - "node_modules/minimist": { - "version": "1.2.8", + "node_modules/pathval": { + "version": "1.1.1", "dev": true, "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/ljharb" + "engines": { + "node": "*" } }, - "node_modules/mkdirp": { - "version": "0.5.6", + "node_modules/pbkdf2": { + "version": "3.0.17", "dev": true, "license": "MIT", "dependencies": { - "minimist": "^1.2.6" + "create-hash": "^1.1.2", + "create-hmac": "^1.1.4", + "ripemd160": "^2.0.1", + "safe-buffer": "^5.0.1", + "sha.js": "^2.4.8" }, - "bin": { - "mkdirp": "bin/cmd.js" + "engines": { + "node": ">=0.12" } }, - "node_modules/mkdirp-classic": { - "version": "0.5.3", - "dev": true, - "license": "MIT" + "node_modules/picocolors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", + "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", + "dev": true }, - "node_modules/mocha": { - "version": "10.1.0", + "node_modules/picomatch": { + "version": "2.3.1", "dev": true, "license": "MIT", - "dependencies": { - "ansi-colors": "4.1.1", - "browser-stdout": "1.3.1", - "chokidar": "3.5.3", - "debug": "4.3.4", - "diff": "5.0.0", - "escape-string-regexp": "4.0.0", - "find-up": "5.0.0", - "glob": "7.2.0", - "he": "1.2.0", - "js-yaml": "4.1.0", - "log-symbols": "4.1.0", - "minimatch": "5.0.1", - "ms": "2.1.3", - "nanoid": "3.3.3", - "serialize-javascript": "6.0.0", - "strip-json-comments": "3.1.1", - "supports-color": "8.1.1", - "workerpool": "6.2.1", - "yargs": "16.2.0", - "yargs-parser": "20.2.4", - "yargs-unparser": "2.0.0" - }, - "bin": { - "_mocha": "bin/_mocha", - "mocha": "bin/mocha.js" - }, "engines": { - "node": ">= 14.0.0" + "node": ">=8.6" }, "funding": { - "type": "opencollective", - "url": "https://opencollective.com/mochajs" + "url": "https://github.com/sponsors/jonschlinkert" } }, - "node_modules/mocha/node_modules/ansi-colors": { - "version": "4.1.1", + "node_modules/pify": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", + "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", "dev": true, - "license": "MIT", "engines": { "node": ">=6" } }, - "node_modules/mocha/node_modules/ansi-styles": { - "version": "4.3.0", + "node_modules/pkg-dir": { + "version": "4.2.0", "dev": true, "license": "MIT", "dependencies": { - "color-convert": "^2.0.1" + "find-up": "^4.0.0" }, "engines": { "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/mocha/node_modules/argparse": { - "version": "2.0.1", + "node_modules/pkg-dir/node_modules/find-up": { + "version": "4.1.0", "dev": true, - "license": "Python-2.0" + "license": "MIT", + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8" + } }, - "node_modules/mocha/node_modules/brace-expansion": { - "version": "2.0.1", + "node_modules/pkg-dir/node_modules/locate-path": { + "version": "5.0.0", "dev": true, "license": "MIT", "dependencies": { - "balanced-match": "^1.0.0" + "p-locate": "^4.1.0" + }, + "engines": { + "node": ">=8" } }, - "node_modules/mocha/node_modules/chalk": { - "version": "4.1.2", + "node_modules/pkg-dir/node_modules/p-limit": { + "version": "2.3.0", "dev": true, "license": "MIT", "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" + "p-try": "^2.0.0" }, "engines": { - "node": ">=10" + "node": ">=6" }, "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/mocha/node_modules/chalk/node_modules/supports-color": { - "version": "7.2.0", + "node_modules/pkg-dir/node_modules/p-locate": { + "version": "4.1.0", "dev": true, "license": "MIT", "dependencies": { - "has-flag": "^4.0.0" + "p-limit": "^2.2.0" }, "engines": { "node": ">=8" } }, - "node_modules/mocha/node_modules/color-convert": { - "version": "2.0.1", + "node_modules/platform": { + "version": "1.3.5", + "dev": true, + "license": "MIT" + }, + "node_modules/plur": { + "version": "2.1.2", "dev": true, "license": "MIT", "dependencies": { - "color-name": "~1.1.4" + "irregular-plurals": "^1.0.0" }, "engines": { - "node": ">=7.0.0" + "node": ">=0.10.0" } }, - "node_modules/mocha/node_modules/color-name": { - "version": "1.1.4", - "dev": true, - "license": "MIT" - }, - "node_modules/mocha/node_modules/escape-string-regexp": { - "version": "4.0.0", + "node_modules/process": { + "version": "0.11.10", "dev": true, "license": "MIT", "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">= 0.6.0" } }, - "node_modules/mocha/node_modules/has-flag": { - "version": "4.0.0", + "node_modules/process-nextick-args": { + "version": "2.0.1", + "dev": true, + "license": "MIT" + }, + "node_modules/process-on-spawn": { + "version": "1.0.0", "dev": true, "license": "MIT", + "dependencies": { + "fromentries": "^1.2.0" + }, "engines": { "node": ">=8" } }, - "node_modules/mocha/node_modules/js-yaml": { - "version": "4.1.0", + "node_modules/public-encrypt": { + "version": "4.0.3", "dev": true, "license": "MIT", "dependencies": { - "argparse": "^2.0.1" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" + "bn.js": "^4.1.0", + "browserify-rsa": "^4.0.0", + "create-hash": "^1.1.0", + "parse-asn1": "^5.0.0", + "randombytes": "^2.0.1", + "safe-buffer": "^5.1.2" } }, - "node_modules/mocha/node_modules/log-symbols": { - "version": "4.1.0", + "node_modules/punycode": { + "version": "1.4.1", + "dev": true, + "license": "MIT" + }, + "node_modules/qjobs": { + "version": "1.2.0", "dev": true, "license": "MIT", + "engines": { + "node": ">=0.9" + } + }, + "node_modules/qs": { + "version": "6.11.0", + "dev": true, + "license": "BSD-3-Clause", "dependencies": { - "chalk": "^4.1.0", - "is-unicode-supported": "^0.1.0" + "side-channel": "^1.0.4" }, "engines": { - "node": ">=10" + "node": ">=0.6" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/mocha/node_modules/minimatch": { - "version": "5.0.1", + "node_modules/querystring": { + "version": "0.2.0", "dev": true, - "license": "ISC", - "dependencies": { - "brace-expansion": "^2.0.1" - }, "engines": { - "node": ">=10" + "node": ">=0.4.x" } }, - "node_modules/mocha/node_modules/ms": { - "version": "2.1.3", + "node_modules/querystring-es3": { + "version": "0.2.1", + "dev": true, + "engines": { + "node": ">=0.4.x" + } + }, + "node_modules/queue-microtask": { + "version": "1.2.3", "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], "license": "MIT" }, - "node_modules/mocha/node_modules/supports-color": { - "version": "8.1.1", + "node_modules/randombytes": { + "version": "2.1.0", "dev": true, "license": "MIT", "dependencies": { - "has-flag": "^4.0.0" - }, + "safe-buffer": "^5.1.0" + } + }, + "node_modules/randomfill": { + "version": "1.0.4", + "dev": true, + "license": "MIT", + "dependencies": { + "randombytes": "^2.0.5", + "safe-buffer": "^5.1.0" + } + }, + "node_modules/range-parser": { + "version": "1.2.1", + "dev": true, + "license": "MIT", "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/supports-color?sponsor=1" + "node": ">= 0.6" } }, - "node_modules/module-deps": { - "version": "6.2.1", + "node_modules/raw-body": { + "version": "2.5.2", "dev": true, "license": "MIT", "dependencies": { - "browser-resolve": "^1.7.0", - "cached-path-relative": "^1.0.2", - "concat-stream": "~1.6.0", - "defined": "^1.0.0", - "detective": "^5.0.2", - "duplexer2": "^0.1.2", - "inherits": "^2.0.1", - "JSONStream": "^1.0.3", - "parents": "^1.0.0", - "readable-stream": "^2.0.2", - "resolve": "^1.4.0", - "stream-combiner2": "^1.1.1", - "subarg": "^1.0.0", - "through2": "^2.0.0", - "xtend": "^4.0.0" + "bytes": "3.1.2", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "unpipe": "1.0.0" }, - "bin": { - "module-deps": "bin/cmd.js" + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/read-only-stream": { + "version": "2.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "readable-stream": "^2.0.2" + } + }, + "node_modules/readable-stream": { + "version": "2.3.6", + "dev": true, + "license": "MIT", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/readable-stream/node_modules/safe-buffer": { + "version": "5.1.2", + "dev": true, + "license": "MIT" + }, + "node_modules/readable-stream/node_modules/string_decoder": { + "version": "1.1.1", + "dev": true, + "license": "MIT", + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/readdirp": { + "version": "3.6.0", + "dev": true, + "license": "MIT", + "dependencies": { + "picomatch": "^2.2.1" }, "engines": { - "node": ">= 0.8.0" + "node": ">=8.10.0" } }, - "node_modules/ms": { - "version": "2.1.2", - "dev": true, - "license": "MIT" + "node_modules/regenerate": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz", + "integrity": "sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==", + "dev": true }, - "node_modules/nanoid": { - "version": "3.3.3", + "node_modules/regenerate-unicode-properties": { + "version": "10.1.1", + "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-10.1.1.tgz", + "integrity": "sha512-X007RyZLsCJVVrjgEFVpLUTZwyOZk3oiL75ZcuYjlIWd6rNJtOjkBwQc5AsRrpbKVkxN6sklw/k/9m2jJYOf8Q==", "dev": true, - "license": "MIT", - "bin": { - "nanoid": "bin/nanoid.cjs" + "dependencies": { + "regenerate": "^1.4.2" }, "engines": { - "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + "node": ">=4" } }, - "node_modules/natural-compare": { - "version": "1.4.0", + "node_modules/regenerator-runtime": { + "version": "0.14.1", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz", + "integrity": "sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==", + "dev": true + }, + "node_modules/regenerator-transform": { + "version": "0.15.2", + "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.15.2.tgz", + "integrity": "sha512-hfMp2BoF0qOk3uc5V20ALGDS2ddjQaLrdl7xrGXvAIow7qeWRM2VA2HuCHkUKk9slq3VwEwLNK3DFBqDfPGYtg==", "dev": true, - "license": "MIT" + "dependencies": { + "@babel/runtime": "^7.8.4" + } }, - "node_modules/negotiator": { - "version": "0.6.3", + "node_modules/regexpp": { + "version": "3.2.0", "dev": true, "license": "MIT", "engines": { - "node": ">= 0.6" + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/mysticatea" } }, - "node_modules/node-preload": { - "version": "0.2.1", + "node_modules/regexpu-core": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-5.3.2.tgz", + "integrity": "sha512-RAM5FlZz+Lhmo7db9L298p2vHP5ZywrVXmVXpmAD9GuL5MPH6t9ROw1iA/wfHkQ76Qe7AaPF0nGuim96/IrQMQ==", "dev": true, - "license": "MIT", "dependencies": { - "process-on-spawn": "^1.0.0" + "@babel/regjsgen": "^0.8.0", + "regenerate": "^1.4.2", + "regenerate-unicode-properties": "^10.1.0", + "regjsparser": "^0.9.1", + "unicode-match-property-ecmascript": "^2.0.0", + "unicode-match-property-value-ecmascript": "^2.1.0" }, "engines": { - "node": ">=8" + "node": ">=4" } }, - "node_modules/node-releases": { - "version": "2.0.10", + "node_modules/regjsparser": { + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.9.1.tgz", + "integrity": "sha512-dQUtn90WanSNl+7mQKcXAgZxvUe7Z0SqXlgzv0za4LwiUhyzBC58yQO3liFoUgu8GiJVInAhJjkj1N0EtQ5nkQ==", "dev": true, - "license": "MIT" + "dependencies": { + "jsesc": "~0.5.0" + }, + "bin": { + "regjsparser": "bin/parser" + } }, - "node_modules/normalize-path": { - "version": "3.0.0", + "node_modules/regjsparser/node_modules/jsesc": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", + "integrity": "sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA==", "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" + "bin": { + "jsesc": "bin/jsesc" } }, - "node_modules/nyc": { - "version": "15.1.0", + "node_modules/release-zalgo": { + "version": "1.0.0", "dev": true, "license": "ISC", "dependencies": { - "@istanbuljs/load-nyc-config": "^1.0.0", - "@istanbuljs/schema": "^0.1.2", - "caching-transform": "^4.0.0", - "convert-source-map": "^1.7.0", - "decamelize": "^1.2.0", - "find-cache-dir": "^3.2.0", - "find-up": "^4.1.0", - "foreground-child": "^2.0.0", - "get-package-type": "^0.1.0", - "glob": "^7.1.6", - "istanbul-lib-coverage": "^3.0.0", - "istanbul-lib-hook": "^3.0.0", - "istanbul-lib-instrument": "^4.0.0", - "istanbul-lib-processinfo": "^2.0.2", - "istanbul-lib-report": "^3.0.0", - "istanbul-lib-source-maps": "^4.0.0", - "istanbul-reports": "^3.0.2", - "make-dir": "^3.0.0", - "node-preload": "^0.2.1", - "p-map": "^3.0.0", - "process-on-spawn": "^1.0.0", - "resolve-from": "^5.0.0", - "rimraf": "^3.0.0", - "signal-exit": "^3.0.2", - "spawn-wrap": "^2.0.0", - "test-exclude": "^6.0.0", - "yargs": "^15.0.2" - }, - "bin": { - "nyc": "bin/nyc.js" + "es6-error": "^4.0.1" }, "engines": { - "node": ">=8.9" + "node": ">=4" } }, - "node_modules/nyc/node_modules/ansi-styles": { - "version": "4.3.0", + "node_modules/require-directory": { + "version": "2.1.1", "dev": true, "license": "MIT", - "dependencies": { - "color-convert": "^2.0.1" - }, "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" + "node": ">=0.10.0" } }, - "node_modules/nyc/node_modules/camelcase": { - "version": "5.3.1", + "node_modules/require-main-filename": { + "version": "2.0.0", + "dev": true, + "license": "ISC" + }, + "node_modules/requirejs": { + "version": "2.3.6", "dev": true, "license": "MIT", + "bin": { + "r_js": "bin/r.js", + "r.js": "bin/r.js" + }, "engines": { - "node": ">=6" + "node": ">=0.4.0" } }, - "node_modules/nyc/node_modules/cliui": { - "version": "6.0.0", + "node_modules/requires-port": { + "version": "1.0.0", + "dev": true, + "license": "MIT" + }, + "node_modules/resolve": { + "version": "1.22.8", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", + "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==", "dev": true, - "license": "ISC", "dependencies": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", - "wrap-ansi": "^6.2.0" + "is-core-module": "^2.13.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/nyc/node_modules/color-convert": { - "version": "2.0.1", + "node_modules/resolve-from": { + "version": "4.0.0", "dev": true, "license": "MIT", - "dependencies": { - "color-name": "~1.1.4" - }, "engines": { - "node": ">=7.0.0" + "node": ">=4" } }, - "node_modules/nyc/node_modules/color-name": { - "version": "1.1.4", + "node_modules/reusify": { + "version": "1.0.4", "dev": true, - "license": "MIT" + "license": "MIT", + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } }, - "node_modules/nyc/node_modules/convert-source-map": { - "version": "1.9.0", + "node_modules/rfdc": { + "version": "1.3.0", "dev": true, "license": "MIT" }, - "node_modules/nyc/node_modules/decamelize": { - "version": "1.2.0", + "node_modules/rimraf": { + "version": "3.0.2", "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" + "license": "ISC", + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/nyc/node_modules/find-up": { - "version": "4.1.0", + "node_modules/ripemd160": { + "version": "2.0.2", "dev": true, "license": "MIT", "dependencies": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=8" + "hash-base": "^3.0.0", + "inherits": "^2.0.1" } }, - "node_modules/nyc/node_modules/locate-path": { - "version": "5.0.0", + "node_modules/run-parallel": { + "version": "1.2.0", "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], "license": "MIT", "dependencies": { - "p-locate": "^4.1.0" - }, - "engines": { - "node": ">=8" + "queue-microtask": "^1.2.2" } }, - "node_modules/nyc/node_modules/p-limit": { - "version": "2.3.0", + "node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "dev": true, + "license": "MIT" + }, + "node_modules/seedrandom": { + "version": "3.0.5", + "dev": true, + "license": "MIT" + }, + "node_modules/semver": { + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", "dev": true, - "license": "MIT", "dependencies": { - "p-try": "^2.0.0" + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" }, "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=10" } }, - "node_modules/nyc/node_modules/p-locate": { - "version": "4.1.0", + "node_modules/semver/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", "dev": true, - "license": "MIT", "dependencies": { - "p-limit": "^2.2.0" + "yallist": "^4.0.0" }, "engines": { - "node": ">=8" + "node": ">=10" } }, - "node_modules/nyc/node_modules/resolve-from": { - "version": "5.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } + "node_modules/semver/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true }, - "node_modules/nyc/node_modules/wrap-ansi": { - "version": "6.2.0", + "node_modules/serialize-javascript": { + "version": "6.0.0", "dev": true, - "license": "MIT", + "license": "BSD-3-Clause", "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=8" + "randombytes": "^2.1.0" } }, - "node_modules/nyc/node_modules/y18n": { - "version": "4.0.3", + "node_modules/set-blocking": { + "version": "2.0.0", "dev": true, "license": "ISC" }, - "node_modules/nyc/node_modules/yargs": { - "version": "15.4.1", + "node_modules/setprototypeof": { + "version": "1.2.0", "dev": true, - "license": "MIT", + "license": "ISC" + }, + "node_modules/sha.js": { + "version": "2.4.11", + "dev": true, + "license": "(MIT AND BSD-3-Clause)", "dependencies": { - "cliui": "^6.0.0", - "decamelize": "^1.2.0", - "find-up": "^4.1.0", - "get-caller-file": "^2.0.1", - "require-directory": "^2.1.1", - "require-main-filename": "^2.0.0", - "set-blocking": "^2.0.0", - "string-width": "^4.2.0", - "which-module": "^2.0.0", - "y18n": "^4.0.0", - "yargs-parser": "^18.1.2" + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" }, - "engines": { - "node": ">=8" + "bin": { + "sha.js": "bin.js" } }, - "node_modules/nyc/node_modules/yargs-parser": { - "version": "18.1.3", + "node_modules/shasum": { + "version": "1.0.2", "dev": true, - "license": "ISC", + "license": "MIT", "dependencies": { - "camelcase": "^5.0.0", - "decamelize": "^1.2.0" + "json-stable-stringify": "~0.0.0", + "sha.js": "~2.4.4" + } + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "shebang-regex": "^3.0.0" }, "engines": { - "node": ">=6" + "node": ">=8" } }, - "node_modules/object-assign": { - "version": "4.1.1", + "node_modules/shebang-regex": { + "version": "3.0.0", "dev": true, "license": "MIT", "engines": { - "node": ">=0.10.0" + "node": ">=8" } }, - "node_modules/object-inspect": { - "version": "1.12.3", + "node_modules/shell-quote": { + "version": "1.8.0", "dev": true, "license": "MIT", "funding": { "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/on-finished": { - "version": "2.3.0", + "node_modules/side-channel": { + "version": "1.0.4", "dev": true, "license": "MIT", "dependencies": { - "ee-first": "1.1.1" + "call-bind": "^1.0.0", + "get-intrinsic": "^1.0.2", + "object-inspect": "^1.9.0" }, - "engines": { - "node": ">= 0.8" + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/once": { - "version": "1.4.0", + "node_modules/signal-exit": { + "version": "3.0.7", "dev": true, - "license": "ISC", - "dependencies": { - "wrappy": "1" - } + "license": "ISC" }, - "node_modules/os-browserify": { - "version": "0.3.0", + "node_modules/simple-concat": { + "version": "1.0.0", "dev": true, "license": "MIT" }, - "node_modules/p-limit": { - "version": "3.1.0", + "node_modules/slash": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-2.0.0.tgz", + "integrity": "sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A==", "dev": true, - "license": "MIT", - "dependencies": { - "yocto-queue": "^0.1.0" - }, "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=6" } }, - "node_modules/p-locate": { - "version": "5.0.0", + "node_modules/socket.io": { + "version": "4.6.1", "dev": true, "license": "MIT", "dependencies": { - "p-limit": "^3.0.2" + "accepts": "~1.3.4", + "base64id": "~2.0.0", + "debug": "~4.3.2", + "engine.io": "~6.4.1", + "socket.io-adapter": "~2.5.2", + "socket.io-parser": "~4.2.1" }, "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=10.0.0" } }, - "node_modules/p-map": { - "version": "3.0.0", + "node_modules/socket.io-adapter": { + "version": "2.5.2", "dev": true, "license": "MIT", "dependencies": { - "aggregate-error": "^3.0.0" + "ws": "~8.11.0" + } + }, + "node_modules/socket.io-parser": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-4.2.3.tgz", + "integrity": "sha512-JMafRntWVO2DCJimKsRTh/wnqVvO4hrfwOqtO7f+uzwsQMuxO6VwImtYxaQ+ieoyshWOTJyV0fA21lccEXRPpQ==", + "dev": true, + "dependencies": { + "@socket.io/component-emitter": "~3.1.0", + "debug": "~4.3.1" }, "engines": { - "node": ">=8" + "node": ">=10.0.0" } }, - "node_modules/p-try": { - "version": "2.2.0", + "node_modules/source-map": { + "version": "0.5.7", "dev": true, - "license": "MIT", + "license": "BSD-3-Clause", "engines": { - "node": ">=6" + "node": ">=0.10.0" } }, - "node_modules/package-hash": { - "version": "4.0.0", + "node_modules/spawn-wrap": { + "version": "2.0.0", "dev": true, "license": "ISC", "dependencies": { - "graceful-fs": "^4.1.15", - "hasha": "^5.0.0", - "lodash.flattendeep": "^4.4.0", - "release-zalgo": "^1.0.0" + "foreground-child": "^2.0.0", + "is-windows": "^1.0.2", + "make-dir": "^3.0.0", + "rimraf": "^3.0.0", + "signal-exit": "^3.0.2", + "which": "^2.0.1" }, "engines": { "node": ">=8" } }, - "node_modules/pako": { - "version": "1.0.10", - "dev": true, - "license": "(MIT AND Zlib)" - }, - "node_modules/parent-module": { - "version": "1.0.1", + "node_modules/spawn-wrap/node_modules/which": { + "version": "2.0.2", "dev": true, - "license": "MIT", + "license": "ISC", "dependencies": { - "callsites": "^3.0.0" + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" }, "engines": { - "node": ">=6" - } - }, - "node_modules/parents": { - "version": "1.0.1", - "dev": true, - "license": "MIT", - "dependencies": { - "path-platform": "~0.11.15" - } - }, - "node_modules/parse-asn1": { - "version": "5.1.6", - "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.6.tgz", - "integrity": "sha512-RnZRo1EPU6JBnra2vGHj0yhp6ebyjBZpmUCLHWiFhxlzvBCCpAuZ7elsBp1PVAbQN0/04VD/19rfzlBSwLstMw==", - "dev": true, - "dependencies": { - "asn1.js": "^5.2.0", - "browserify-aes": "^1.0.0", - "evp_bytestokey": "^1.0.0", - "pbkdf2": "^3.0.3", - "safe-buffer": "^5.1.1" - } - }, - "node_modules/parseurl": { - "version": "1.3.3", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/path-browserify": { - "version": "0.0.1", - "dev": true, - "license": "MIT" - }, - "node_modules/path-exists": { - "version": "4.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" + "node": ">= 8" } }, - "node_modules/path-is-absolute": { - "version": "1.0.1", + "node_modules/sprintf": { + "version": "0.1.5", "dev": true, - "license": "MIT", + "license": "BSD-3-Clause", "engines": { - "node": ">=0.10.0" + "node": ">=0.2.4" } }, - "node_modules/path-key": { - "version": "3.1.1", + "node_modules/sprintf-js": { + "version": "1.0.3", + "dev": true, + "license": "BSD-3-Clause" + }, + "node_modules/statuses": { + "version": "1.5.0", "dev": true, "license": "MIT", "engines": { - "node": ">=8" + "node": ">= 0.6" } }, - "node_modules/path-parse": { - "version": "1.0.7", + "node_modules/stream-browserify": { + "version": "2.0.2", "dev": true, - "license": "MIT" + "license": "MIT", + "dependencies": { + "inherits": "~2.0.1", + "readable-stream": "^2.0.2" + } }, - "node_modules/path-platform": { - "version": "0.11.15", + "node_modules/stream-combiner2": { + "version": "1.1.1", "dev": true, "license": "MIT", - "engines": { - "node": ">= 0.8.0" + "dependencies": { + "duplexer2": "~0.1.0", + "readable-stream": "^2.0.2" } }, - "node_modules/pathval": { - "version": "1.1.1", + "node_modules/stream-http": { + "version": "3.1.0", "dev": true, "license": "MIT", - "engines": { - "node": "*" + "dependencies": { + "builtin-status-codes": "^3.0.0", + "inherits": "^2.0.1", + "readable-stream": "^3.0.6", + "xtend": "^4.0.0" } }, - "node_modules/pbkdf2": { - "version": "3.0.17", + "node_modules/stream-http/node_modules/readable-stream": { + "version": "3.4.0", "dev": true, "license": "MIT", "dependencies": { - "create-hash": "^1.1.2", - "create-hmac": "^1.1.4", - "ripemd160": "^2.0.1", - "safe-buffer": "^5.0.1", - "sha.js": "^2.4.8" + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" }, "engines": { - "node": ">=0.12" + "node": ">= 6" } }, - "node_modules/picocolors": { - "version": "1.0.0", + "node_modules/stream-splicer": { + "version": "2.0.1", "dev": true, - "license": "ISC" + "license": "MIT", + "dependencies": { + "inherits": "^2.0.1", + "readable-stream": "^2.0.2" + } }, - "node_modules/picomatch": { - "version": "2.3.1", + "node_modules/streamroller": { + "version": "3.1.5", "dev": true, "license": "MIT", - "engines": { - "node": ">=8.6" + "dependencies": { + "date-format": "^4.0.14", + "debug": "^4.3.4", + "fs-extra": "^8.1.0" }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" + "engines": { + "node": ">=8.0" } }, - "node_modules/pkg-dir": { - "version": "4.2.0", + "node_modules/string_decoder": { + "version": "1.3.0", "dev": true, "license": "MIT", "dependencies": { - "find-up": "^4.0.0" - }, - "engines": { - "node": ">=8" + "safe-buffer": "~5.2.0" } }, - "node_modules/pkg-dir/node_modules/find-up": { - "version": "4.1.0", + "node_modules/string-length": { + "version": "1.0.1", "dev": true, "license": "MIT", "dependencies": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" + "strip-ansi": "^3.0.0" }, "engines": { - "node": ">=8" + "node": ">=0.10.0" } }, - "node_modules/pkg-dir/node_modules/locate-path": { - "version": "5.0.0", + "node_modules/string-length/node_modules/ansi-regex": { + "version": "2.1.1", "dev": true, "license": "MIT", - "dependencies": { - "p-locate": "^4.1.0" - }, "engines": { - "node": ">=8" + "node": ">=0.10.0" } }, - "node_modules/pkg-dir/node_modules/p-limit": { - "version": "2.3.0", + "node_modules/string-length/node_modules/strip-ansi": { + "version": "3.0.1", "dev": true, "license": "MIT", "dependencies": { - "p-try": "^2.0.0" + "ansi-regex": "^2.0.0" }, "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=0.10.0" } }, - "node_modules/pkg-dir/node_modules/p-locate": { - "version": "4.1.0", + "node_modules/string-width": { + "version": "4.2.3", "dev": true, "license": "MIT", "dependencies": { - "p-limit": "^2.2.0" + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" }, "engines": { "node": ">=8" } }, - "node_modules/platform": { - "version": "1.3.5", + "node_modules/string-width/node_modules/emoji-regex": { + "version": "8.0.0", "dev": true, "license": "MIT" }, - "node_modules/plur": { - "version": "2.1.2", + "node_modules/string-width/node_modules/is-fullwidth-code-point": { + "version": "3.0.0", "dev": true, "license": "MIT", - "dependencies": { - "irregular-plurals": "^1.0.0" - }, "engines": { - "node": ">=0.10.0" + "node": ">=8" } }, - "node_modules/process": { - "version": "0.11.10", + "node_modules/strip-ansi": { + "version": "6.0.1", "dev": true, "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, "engines": { - "node": ">= 0.6.0" + "node": ">=8" } }, - "node_modules/process-nextick-args": { - "version": "2.0.1", + "node_modules/strip-bom": { + "version": "4.0.0", "dev": true, - "license": "MIT" + "license": "MIT", + "engines": { + "node": ">=8" + } }, - "node_modules/process-on-spawn": { - "version": "1.0.0", + "node_modules/strip-json-comments": { + "version": "3.1.1", "dev": true, "license": "MIT", - "dependencies": { - "fromentries": "^1.2.0" - }, "engines": { "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/public-encrypt": { - "version": "4.0.3", + "node_modules/subarg": { + "version": "1.0.0", "dev": true, "license": "MIT", "dependencies": { - "bn.js": "^4.1.0", - "browserify-rsa": "^4.0.0", - "create-hash": "^1.1.0", - "parse-asn1": "^5.0.0", - "randombytes": "^2.0.1", - "safe-buffer": "^5.1.2" + "minimist": "^1.1.0" } }, - "node_modules/punycode": { - "version": "1.4.1", - "dev": true, - "license": "MIT" - }, - "node_modules/qjobs": { - "version": "1.2.0", + "node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", "dev": true, - "license": "MIT", + "dependencies": { + "has-flag": "^3.0.0" + }, "engines": { - "node": ">=0.9" + "node": ">=4" } }, - "node_modules/qs": { - "version": "6.11.0", + "node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "side-channel": "^1.0.4" - }, "engines": { - "node": ">=0.6" + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/querystring": { - "version": "0.2.0", + "node_modules/syntax-error": { + "version": "1.4.0", "dev": true, - "engines": { - "node": ">=0.4.x" + "license": "MIT", + "dependencies": { + "acorn-node": "^1.2.0" } }, - "node_modules/querystring-es3": { - "version": "0.2.1", + "node_modules/test-exclude": { + "version": "6.0.0", "dev": true, + "license": "ISC", + "dependencies": { + "@istanbuljs/schema": "^0.1.2", + "glob": "^7.1.4", + "minimatch": "^3.0.4" + }, "engines": { - "node": ">=0.4.x" + "node": ">=8" } }, - "node_modules/queue-microtask": { - "version": "1.2.3", + "node_modules/text-table": { + "version": "0.2.0", + "dev": true, + "license": "MIT" + }, + "node_modules/through": { + "version": "2.3.8", "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], "license": "MIT" }, - "node_modules/randombytes": { - "version": "2.1.0", + "node_modules/through2": { + "version": "2.0.5", "dev": true, "license": "MIT", "dependencies": { - "safe-buffer": "^5.1.0" + "readable-stream": "~2.3.6", + "xtend": "~4.0.1" } }, - "node_modules/randomfill": { - "version": "1.0.4", + "node_modules/timers-browserify": { + "version": "1.4.2", "dev": true, - "license": "MIT", "dependencies": { - "randombytes": "^2.0.5", - "safe-buffer": "^5.1.0" - } - }, - "node_modules/range-parser": { - "version": "1.2.1", - "dev": true, - "license": "MIT", + "process": "~0.11.0" + }, "engines": { - "node": ">= 0.6" + "node": ">=0.6.0" } }, - "node_modules/raw-body": { - "version": "2.5.2", + "node_modules/tmp": { + "version": "0.2.1", "dev": true, "license": "MIT", "dependencies": { - "bytes": "3.1.2", - "http-errors": "2.0.0", - "iconv-lite": "0.4.24", - "unpipe": "1.0.0" + "rimraf": "^3.0.0" }, "engines": { - "node": ">= 0.8" + "node": ">=8.17.0" } }, - "node_modules/read-only-stream": { + "node_modules/to-fast-properties": { "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==", "dev": true, - "license": "MIT", - "dependencies": { - "readable-stream": "^2.0.2" + "engines": { + "node": ">=4" } }, - "node_modules/readable-stream": { - "version": "2.3.6", + "node_modules/to-regex-range": { + "version": "5.0.1", "dev": true, "license": "MIT", "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" } }, - "node_modules/readable-stream/node_modules/safe-buffer": { - "version": "5.1.2", - "dev": true, - "license": "MIT" - }, - "node_modules/readable-stream/node_modules/string_decoder": { - "version": "1.1.1", + "node_modules/toidentifier": { + "version": "1.0.1", "dev": true, "license": "MIT", - "dependencies": { - "safe-buffer": "~5.1.0" + "engines": { + "node": ">=0.6" } }, - "node_modules/readdirp": { - "version": "3.6.0", + "node_modules/tty-browserify": { + "version": "0.0.1", + "dev": true, + "license": "MIT" + }, + "node_modules/type-detect": { + "version": "4.0.8", "dev": true, "license": "MIT", - "dependencies": { - "picomatch": "^2.2.1" - }, "engines": { - "node": ">=8.10.0" + "node": ">=4" } }, - "node_modules/regexpp": { - "version": "3.2.0", + "node_modules/type-fest": { + "version": "0.20.2", "dev": true, - "license": "MIT", + "license": "(MIT OR CC0-1.0)", "engines": { - "node": ">=8" + "node": ">=10" }, "funding": { - "url": "https://github.com/sponsors/mysticatea" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/release-zalgo": { - "version": "1.0.0", + "node_modules/type-is": { + "version": "1.6.18", "dev": true, - "license": "ISC", + "license": "MIT", "dependencies": { - "es6-error": "^4.0.1" + "media-typer": "0.3.0", + "mime-types": "~2.1.24" }, "engines": { - "node": ">=4" + "node": ">= 0.6" } }, - "node_modules/require-directory": { - "version": "2.1.1", + "node_modules/typedarray": { + "version": "0.0.6", + "dev": true, + "license": "MIT" + }, + "node_modules/typedarray-to-buffer": { + "version": "3.1.5", "dev": true, "license": "MIT", - "engines": { - "node": ">=0.10.0" + "dependencies": { + "is-typedarray": "^1.0.0" } }, - "node_modules/require-main-filename": { - "version": "2.0.0", + "node_modules/ua-parser-js": { + "version": "0.7.33", "dev": true, - "license": "ISC" + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/ua-parser-js" + }, + { + "type": "paypal", + "url": "https://paypal.me/faisalman" + } + ], + "license": "MIT", + "engines": { + "node": "*" + } }, - "node_modules/requirejs": { - "version": "2.3.6", + "node_modules/uglify-js": { + "version": "3.17.4", "dev": true, - "license": "MIT", + "license": "BSD-2-Clause", "bin": { - "r_js": "bin/r.js", - "r.js": "bin/r.js" + "uglifyjs": "bin/uglifyjs" }, "engines": { - "node": ">=0.4.0" + "node": ">=0.8.0" } }, - "node_modules/requires-port": { - "version": "1.0.0", + "node_modules/umd": { + "version": "3.0.3", "dev": true, - "license": "MIT" + "license": "MIT", + "bin": { + "umd": "bin/cli.js" + } }, - "node_modules/resolve": { - "version": "1.12.0", + "node_modules/undeclared-identifiers": { + "version": "1.1.3", "dev": true, - "license": "MIT", + "license": "Apache-2.0", "dependencies": { - "path-parse": "^1.0.6" + "acorn-node": "^1.3.0", + "dash-ast": "^1.0.0", + "get-assigned-identifiers": "^1.2.0", + "simple-concat": "^1.0.0", + "xtend": "^4.0.1" + }, + "bin": { + "undeclared-identifiers": "bin.js" } }, - "node_modules/resolve-from": { - "version": "4.0.0", + "node_modules/unicode-canonical-property-names-ecmascript": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.0.tgz", + "integrity": "sha512-yY5PpDlfVIU5+y/BSCxAJRBIS1Zc2dDG3Ujq+sR0U+JjUevW2JhocOF+soROYDSaAezOzOKuyyixhD6mBknSmQ==", "dev": true, - "license": "MIT", "engines": { "node": ">=4" } }, - "node_modules/reusify": { - "version": "1.0.4", + "node_modules/unicode-match-property-ecmascript": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-2.0.0.tgz", + "integrity": "sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==", "dev": true, - "license": "MIT", + "dependencies": { + "unicode-canonical-property-names-ecmascript": "^2.0.0", + "unicode-property-aliases-ecmascript": "^2.0.0" + }, "engines": { - "iojs": ">=1.0.0", - "node": ">=0.10.0" + "node": ">=4" } }, - "node_modules/rfdc": { - "version": "1.3.0", + "node_modules/unicode-match-property-value-ecmascript": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.1.0.tgz", + "integrity": "sha512-qxkjQt6qjg/mYscYMC0XKRn3Rh0wFPlfxB0xkt9CfyTvpX1Ra0+rAmdX2QyAobptSEvuy4RtpPRui6XkV+8wjA==", "dev": true, - "license": "MIT" + "engines": { + "node": ">=4" + } }, - "node_modules/rimraf": { - "version": "3.0.2", + "node_modules/unicode-property-aliases-ecmascript": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.1.0.tgz", + "integrity": "sha512-6t3foTQI9qne+OZoVQB/8x8rk2k1eVy1gRXhV3oFQ5T6R1dqQ1xtin3XqSlx3+ATBkliTaR/hHyJBm+LVPNM8w==", "dev": true, - "license": "ISC", - "dependencies": { - "glob": "^7.1.3" - }, - "bin": { - "rimraf": "bin.js" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" + "engines": { + "node": ">=4" } }, - "node_modules/ripemd160": { - "version": "2.0.2", + "node_modules/universalify": { + "version": "0.1.2", "dev": true, "license": "MIT", - "dependencies": { - "hash-base": "^3.0.0", - "inherits": "^2.0.1" + "engines": { + "node": ">= 4.0.0" } }, - "node_modules/run-parallel": { - "version": "1.2.0", + "node_modules/unpipe": { + "version": "1.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/update-browserslist-db": { + "version": "1.0.13", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.13.tgz", + "integrity": "sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==", "dev": true, "funding": [ { - "type": "github", - "url": "https://github.com/sponsors/feross" + "type": "opencollective", + "url": "https://opencollective.com/browserslist" }, { - "type": "patreon", - "url": "https://www.patreon.com/feross" + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" }, { - "type": "consulting", - "url": "https://feross.org/support" + "type": "github", + "url": "https://github.com/sponsors/ai" } ], + "dependencies": { + "escalade": "^3.1.1", + "picocolors": "^1.0.0" + }, + "bin": { + "update-browserslist-db": "cli.js" + }, + "peerDependencies": { + "browserslist": ">= 4.21.0" + } + }, + "node_modules/uri-js": { + "version": "4.4.1", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/uri-js/node_modules/punycode": { + "version": "2.3.0", + "dev": true, "license": "MIT", - "dependencies": { - "queue-microtask": "^1.2.2" + "engines": { + "node": ">=6" } }, - "node_modules/safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "node_modules/url": { + "version": "0.11.0", "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] + "license": "MIT", + "dependencies": { + "punycode": "1.3.2", + "querystring": "0.2.0" + } }, - "node_modules/safer-buffer": { - "version": "2.1.2", + "node_modules/url/node_modules/punycode": { + "version": "1.3.2", "dev": true, "license": "MIT" }, - "node_modules/seedrandom": { - "version": "3.0.5", + "node_modules/util": { + "version": "0.10.4", + "dev": true, + "license": "MIT", + "dependencies": { + "inherits": "2.0.3" + } + }, + "node_modules/util-deprecate": { + "version": "1.0.2", "dev": true, "license": "MIT" }, - "node_modules/semver": { - "version": "7.5.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", - "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", + "node_modules/util/node_modules/inherits": { + "version": "2.0.3", "dev": true, - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } + "license": "ISC" }, - "node_modules/semver/node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "node_modules/utils-merge": { + "version": "1.0.1", "dev": true, - "dependencies": { - "yallist": "^4.0.0" - }, + "license": "MIT", "engines": { - "node": ">=10" + "node": ">= 0.4.0" } }, - "node_modules/semver/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true + "node_modules/uuid": { + "version": "8.3.2", + "dev": true, + "license": "MIT", + "bin": { + "uuid": "dist/bin/uuid" + } }, - "node_modules/serialize-javascript": { - "version": "6.0.0", + "node_modules/vary": { + "version": "1.1.2", "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "randombytes": "^2.1.0" + "license": "MIT", + "engines": { + "node": ">= 0.8" } }, - "node_modules/set-blocking": { - "version": "2.0.0", + "node_modules/vm-browserify": { + "version": "1.1.0", "dev": true, - "license": "ISC" + "license": "MIT" }, - "node_modules/setprototypeof": { - "version": "1.2.0", + "node_modules/void-elements": { + "version": "2.0.1", "dev": true, - "license": "ISC" + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } }, - "node_modules/sha.js": { - "version": "2.4.11", + "node_modules/which": { + "version": "1.3.1", "dev": true, - "license": "(MIT AND BSD-3-Clause)", + "license": "ISC", "dependencies": { - "inherits": "^2.0.1", - "safe-buffer": "^5.0.1" + "isexe": "^2.0.0" }, "bin": { - "sha.js": "bin.js" + "which": "bin/which" } }, - "node_modules/shasum": { - "version": "1.0.2", + "node_modules/which-module": { + "version": "2.0.0", "dev": true, - "license": "MIT", - "dependencies": { - "json-stable-stringify": "~0.0.0", - "sha.js": "~2.4.4" + "license": "ISC" + }, + "node_modules/word-wrap": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.4.tgz", + "integrity": "sha512-2V81OA4ugVo5pRo46hAoD2ivUJx8jXmWXfUkY4KFNw0hEptvN0QfH3K4nHiwzGeKl5rFKedV48QVoqYavy4YpA==", + "dev": true, + "engines": { + "node": ">=0.10.0" } }, - "node_modules/shebang-command": { - "version": "2.0.0", + "node_modules/workerpool": { + "version": "6.2.1", + "dev": true, + "license": "Apache-2.0" + }, + "node_modules/wrap-ansi": { + "version": "7.0.0", "dev": true, "license": "MIT", "dependencies": { - "shebang-regex": "^3.0.0" + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" }, "engines": { - "node": ">=8" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" } }, - "node_modules/shebang-regex": { - "version": "3.0.0", + "node_modules/wrap-ansi/node_modules/ansi-styles": { + "version": "4.3.0", "dev": true, "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, "engines": { "node": ">=8" - } - }, - "node_modules/shell-quote": { - "version": "1.8.0", - "dev": true, - "license": "MIT", + }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/side-channel": { - "version": "1.0.4", + "node_modules/wrap-ansi/node_modules/color-convert": { + "version": "2.0.1", "dev": true, "license": "MIT", "dependencies": { - "call-bind": "^1.0.0", - "get-intrinsic": "^1.0.2", - "object-inspect": "^1.9.0" + "color-name": "~1.1.4" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "engines": { + "node": ">=7.0.0" } }, - "node_modules/signal-exit": { - "version": "3.0.7", + "node_modules/wrap-ansi/node_modules/color-name": { + "version": "1.1.4", + "dev": true, + "license": "MIT" + }, + "node_modules/wrappy": { + "version": "1.0.2", "dev": true, "license": "ISC" }, - "node_modules/simple-concat": { - "version": "1.0.0", + "node_modules/write-file-atomic": { + "version": "3.0.3", "dev": true, - "license": "MIT" + "license": "ISC", + "dependencies": { + "imurmurhash": "^0.1.4", + "is-typedarray": "^1.0.0", + "signal-exit": "^3.0.2", + "typedarray-to-buffer": "^3.1.5" + } }, - "node_modules/socket.io": { - "version": "4.6.1", + "node_modules/ws": { + "version": "8.11.0", "dev": true, "license": "MIT", - "dependencies": { - "accepts": "~1.3.4", - "base64id": "~2.0.0", - "debug": "~4.3.2", - "engine.io": "~6.4.1", - "socket.io-adapter": "~2.5.2", - "socket.io-parser": "~4.2.1" - }, "engines": { "node": ">=10.0.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": "^5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } } }, - "node_modules/socket.io-adapter": { - "version": "2.5.2", + "node_modules/xtend": { + "version": "4.0.2", "dev": true, "license": "MIT", - "dependencies": { - "ws": "~8.11.0" + "engines": { + "node": ">=0.4" } }, - "node_modules/socket.io-parser": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-4.2.3.tgz", - "integrity": "sha512-JMafRntWVO2DCJimKsRTh/wnqVvO4hrfwOqtO7f+uzwsQMuxO6VwImtYxaQ+ieoyshWOTJyV0fA21lccEXRPpQ==", + "node_modules/y18n": { + "version": "5.0.8", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=10" + } + }, + "node_modules/yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "dev": true + }, + "node_modules/yargs": { + "version": "16.2.0", "dev": true, + "license": "MIT", "dependencies": { - "@socket.io/component-emitter": "~3.1.0", - "debug": "~4.3.1" + "cliui": "^7.0.2", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.0", + "y18n": "^5.0.5", + "yargs-parser": "^20.2.2" }, "engines": { - "node": ">=10.0.0" + "node": ">=10" } }, - "node_modules/source-map": { - "version": "0.5.7", + "node_modules/yargs-parser": { + "version": "20.2.4", "dev": true, - "license": "BSD-3-Clause", + "license": "ISC", "engines": { - "node": ">=0.10.0" + "node": ">=10" } }, - "node_modules/spawn-wrap": { + "node_modules/yargs-unparser": { "version": "2.0.0", "dev": true, - "license": "ISC", + "license": "MIT", "dependencies": { - "foreground-child": "^2.0.0", - "is-windows": "^1.0.2", - "make-dir": "^3.0.0", - "rimraf": "^3.0.0", - "signal-exit": "^3.0.2", - "which": "^2.0.1" + "camelcase": "^6.0.0", + "decamelize": "^4.0.0", + "flat": "^5.0.2", + "is-plain-obj": "^2.1.0" }, "engines": { - "node": ">=8" + "node": ">=10" } }, - "node_modules/spawn-wrap/node_modules/which": { - "version": "2.0.2", + "node_modules/yocto-queue": { + "version": "0.1.0", "dev": true, - "license": "ISC", - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "node-which": "bin/node-which" - }, + "license": "MIT", "engines": { - "node": ">= 8" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } - }, - "node_modules/sprintf": { - "version": "0.1.5", + } + }, + "dependencies": { + "@ampproject/remapping": { + "version": "2.2.0", "dev": true, - "license": "BSD-3-Clause", - "engines": { - "node": ">=0.2.4" + "requires": { + "@jridgewell/gen-mapping": "^0.1.0", + "@jridgewell/trace-mapping": "^0.3.9" } }, - "node_modules/sprintf-js": { - "version": "1.0.3", + "@babel/cli": { + "version": "7.23.9", + "resolved": "https://registry.npmjs.org/@babel/cli/-/cli-7.23.9.tgz", + "integrity": "sha512-vB1UXmGDNEhcf1jNAHKT9IlYk1R+hehVTLFlCLHBi8gfuHQGP6uRjgXVYU0EVlI/qwAWpstqkBdf2aez3/z/5Q==", "dev": true, - "license": "BSD-3-Clause" + "requires": { + "@jridgewell/trace-mapping": "^0.3.17", + "@nicolo-ribaudo/chokidar-2": "2.1.8-no-fsevents.3", + "chokidar": "^3.4.0", + "commander": "^4.0.1", + "convert-source-map": "^2.0.0", + "fs-readdir-recursive": "^1.1.0", + "glob": "^7.2.0", + "make-dir": "^2.1.0", + "slash": "^2.0.0" + }, + "dependencies": { + "convert-source-map": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", + "dev": true + }, + "make-dir": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz", + "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==", + "dev": true, + "requires": { + "pify": "^4.0.1", + "semver": "^5.6.0" + } + }, + "semver": { + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", + "dev": true + } + } }, - "node_modules/statuses": { - "version": "1.5.0", + "@babel/code-frame": { + "version": "7.23.5", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.23.5.tgz", + "integrity": "sha512-CgH3s1a96LipHCmSUmYFPwY7MNx8C3avkq7i4Wl3cfa662ldtUe4VM1TPXX70pfmrlWTb6jLqTYrZyT2ZTJBgA==", "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.6" + "requires": { + "@babel/highlight": "^7.23.4", + "chalk": "^2.4.2" } }, - "node_modules/stream-browserify": { - "version": "2.0.2", + "@babel/compat-data": { + "version": "7.23.5", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.23.5.tgz", + "integrity": "sha512-uU27kfDRlhfKl+w1U6vp16IuvSLtjAxdArVXPa9BvLkrr7CYIsxH5adpHObeAGY/41+syctUWOZ140a2Rvkgjw==", + "dev": true + }, + "@babel/core": { + "version": "7.23.9", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.23.9.tgz", + "integrity": "sha512-5q0175NOjddqpvvzU+kDiSOAk4PfdO6FvwCWoQ6RO7rTzEe8vlo+4HVfcnAREhD4npMs0e9uZypjTwzZPCf/cw==", "dev": true, - "license": "MIT", + "requires": { + "@ampproject/remapping": "^2.2.0", + "@babel/code-frame": "^7.23.5", + "@babel/generator": "^7.23.6", + "@babel/helper-compilation-targets": "^7.23.6", + "@babel/helper-module-transforms": "^7.23.3", + "@babel/helpers": "^7.23.9", + "@babel/parser": "^7.23.9", + "@babel/template": "^7.23.9", + "@babel/traverse": "^7.23.9", + "@babel/types": "^7.23.9", + "convert-source-map": "^2.0.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.3", + "semver": "^6.3.1" + }, "dependencies": { - "inherits": "~2.0.1", - "readable-stream": "^2.0.2" + "convert-source-map": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", + "dev": true + }, + "semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true + } } }, - "node_modules/stream-combiner2": { - "version": "1.1.1", + "@babel/generator": { + "version": "7.23.6", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.23.6.tgz", + "integrity": "sha512-qrSfCYxYQB5owCmGLbl8XRpX1ytXlpueOb0N0UmQwA073KZxejgQTzAmJezxvpwQD9uGtK2shHdi55QT+MbjIw==", "dev": true, - "license": "MIT", + "requires": { + "@babel/types": "^7.23.6", + "@jridgewell/gen-mapping": "^0.3.2", + "@jridgewell/trace-mapping": "^0.3.17", + "jsesc": "^2.5.1" + }, "dependencies": { - "duplexer2": "~0.1.0", - "readable-stream": "^2.0.2" + "@jridgewell/gen-mapping": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz", + "integrity": "sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==", + "dev": true, + "requires": { + "@jridgewell/set-array": "^1.0.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.9" + } + } } }, - "node_modules/stream-http": { - "version": "3.1.0", + "@babel/helper-annotate-as-pure": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.22.5.tgz", + "integrity": "sha512-LvBTxu8bQSQkcyKOU+a1btnNFQ1dMAd0R6PyW3arXes06F6QLWLIrd681bxRPIXlrMGR3XYnW9JyML7dP3qgxg==", "dev": true, - "license": "MIT", - "dependencies": { - "builtin-status-codes": "^3.0.0", - "inherits": "^2.0.1", - "readable-stream": "^3.0.6", - "xtend": "^4.0.0" + "requires": { + "@babel/types": "^7.22.5" } }, - "node_modules/stream-http/node_modules/readable-stream": { - "version": "3.4.0", + "@babel/helper-builder-binary-assignment-operator-visitor": { + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.22.15.tgz", + "integrity": "sha512-QkBXwGgaoC2GtGZRoma6kv7Szfv06khvhFav67ZExau2RaXzy8MpHSMO2PNoP2XtmQphJQRHFfg77Bq731Yizw==", "dev": true, - "license": "MIT", - "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - }, - "engines": { - "node": ">= 6" + "requires": { + "@babel/types": "^7.22.15" } }, - "node_modules/stream-splicer": { - "version": "2.0.1", + "@babel/helper-compilation-targets": { + "version": "7.23.6", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.23.6.tgz", + "integrity": "sha512-9JB548GZoQVmzrFgp8o7KxdgkTGm6xs9DW0o/Pim72UDjzr5ObUQ6ZzYPqA+g9OTS2bBQoctLJrky0RDCAWRgQ==", "dev": true, - "license": "MIT", + "requires": { + "@babel/compat-data": "^7.23.5", + "@babel/helper-validator-option": "^7.23.5", + "browserslist": "^4.22.2", + "lru-cache": "^5.1.1", + "semver": "^6.3.1" + }, "dependencies": { - "inherits": "^2.0.1", - "readable-stream": "^2.0.2" + "semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true + } } }, - "node_modules/streamroller": { - "version": "3.1.5", + "@babel/helper-create-class-features-plugin": { + "version": "7.23.9", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.23.9.tgz", + "integrity": "sha512-B2L9neXTIyPQoXDm+NtovPvG6VOLWnaXu3BIeVDWwdKFgG30oNa6CqVGiJPDWQwIAK49t9gnQI9c6K6RzabiKw==", "dev": true, - "license": "MIT", - "dependencies": { - "date-format": "^4.0.14", - "debug": "^4.3.4", - "fs-extra": "^8.1.0" + "requires": { + "@babel/helper-annotate-as-pure": "^7.22.5", + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-function-name": "^7.23.0", + "@babel/helper-member-expression-to-functions": "^7.23.0", + "@babel/helper-optimise-call-expression": "^7.22.5", + "@babel/helper-replace-supers": "^7.22.20", + "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5", + "@babel/helper-split-export-declaration": "^7.22.6", + "semver": "^6.3.1" }, - "engines": { - "node": ">=8.0" + "dependencies": { + "semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true + } } }, - "node_modules/string_decoder": { - "version": "1.3.0", + "@babel/helper-create-regexp-features-plugin": { + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.22.15.tgz", + "integrity": "sha512-29FkPLFjn4TPEa3RE7GpW+qbE8tlsu3jntNYNfcGsc49LphF1PQIiD+vMZ1z1xVOKt+93khA9tc2JBs3kBjA7w==", "dev": true, - "license": "MIT", + "requires": { + "@babel/helper-annotate-as-pure": "^7.22.5", + "regexpu-core": "^5.3.1", + "semver": "^6.3.1" + }, "dependencies": { - "safe-buffer": "~5.2.0" + "semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true + } } }, - "node_modules/string-length": { - "version": "1.0.1", + "@babel/helper-define-polyfill-provider": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.5.0.tgz", + "integrity": "sha512-NovQquuQLAQ5HuyjCz7WQP9MjRj7dx++yspwiyUiGl9ZyadHRSql1HZh5ogRd8W8w6YM6EQ/NTB8rgjLt5W65Q==", "dev": true, - "license": "MIT", - "dependencies": { - "strip-ansi": "^3.0.0" - }, - "engines": { - "node": ">=0.10.0" + "requires": { + "@babel/helper-compilation-targets": "^7.22.6", + "@babel/helper-plugin-utils": "^7.22.5", + "debug": "^4.1.1", + "lodash.debounce": "^4.0.8", + "resolve": "^1.14.2" } }, - "node_modules/string-length/node_modules/ansi-regex": { - "version": "2.1.1", + "@babel/helper-environment-visitor": { + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.20.tgz", + "integrity": "sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA==", + "dev": true + }, + "@babel/helper-function-name": { + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.23.0.tgz", + "integrity": "sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw==", "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" + "requires": { + "@babel/template": "^7.22.15", + "@babel/types": "^7.23.0" } }, - "node_modules/string-length/node_modules/strip-ansi": { - "version": "3.0.1", + "@babel/helper-hoist-variables": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz", + "integrity": "sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==", "dev": true, - "license": "MIT", - "dependencies": { - "ansi-regex": "^2.0.0" - }, - "engines": { - "node": ">=0.10.0" + "requires": { + "@babel/types": "^7.22.5" } }, - "node_modules/string-width": { - "version": "4.2.3", + "@babel/helper-member-expression-to-functions": { + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.23.0.tgz", + "integrity": "sha512-6gfrPwh7OuT6gZyJZvd6WbTfrqAo7vm4xCzAXOusKqq/vWdKXphTpj5klHKNmRUU6/QRGlBsyU9mAIPaWHlqJA==", "dev": true, - "license": "MIT", - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" + "requires": { + "@babel/types": "^7.23.0" + } + }, + "@babel/helper-module-imports": { + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.22.15.tgz", + "integrity": "sha512-0pYVBnDKZO2fnSPCrgM/6WMc7eS20Fbok+0r88fp+YtWVLZrp4CkafFGIp+W0VKw4a22sgebPT99y+FDNMdP4w==", + "dev": true, + "requires": { + "@babel/types": "^7.22.15" } }, - "node_modules/string-width/node_modules/emoji-regex": { - "version": "8.0.0", + "@babel/helper-module-transforms": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.23.3.tgz", + "integrity": "sha512-7bBs4ED9OmswdfDzpz4MpWgSrV7FXlc3zIagvLFjS5H+Mk7Snr21vQ6QwrsoCGMfNC4e4LQPdoULEt4ykz0SRQ==", "dev": true, - "license": "MIT" + "requires": { + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-module-imports": "^7.22.15", + "@babel/helper-simple-access": "^7.22.5", + "@babel/helper-split-export-declaration": "^7.22.6", + "@babel/helper-validator-identifier": "^7.22.20" + } }, - "node_modules/string-width/node_modules/is-fullwidth-code-point": { - "version": "3.0.0", + "@babel/helper-optimise-call-expression": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.22.5.tgz", + "integrity": "sha512-HBwaojN0xFRx4yIvpwGqxiV2tUfl7401jlok564NgB9EHS1y6QT17FmKWm4ztqjeVdXLuC4fSvHc5ePpQjoTbw==", "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" + "requires": { + "@babel/types": "^7.22.5" } }, - "node_modules/strip-ansi": { - "version": "6.0.1", + "@babel/helper-plugin-utils": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.22.5.tgz", + "integrity": "sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg==", + "dev": true + }, + "@babel/helper-remap-async-to-generator": { + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.22.20.tgz", + "integrity": "sha512-pBGyV4uBqOns+0UvhsTO8qgl8hO89PmiDYv+/COyp1aeMcmfrfruz+/nCMFiYyFF/Knn0yfrC85ZzNFjembFTw==", "dev": true, - "license": "MIT", - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" + "requires": { + "@babel/helper-annotate-as-pure": "^7.22.5", + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-wrap-function": "^7.22.20" } }, - "node_modules/strip-bom": { - "version": "4.0.0", + "@babel/helper-replace-supers": { + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.22.20.tgz", + "integrity": "sha512-qsW0In3dbwQUbK8kejJ4R7IHVGwHJlV6lpG6UA7a9hSa2YEiAib+N1T2kr6PEeUT+Fl7najmSOS6SmAwCHK6Tw==", "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" + "requires": { + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-member-expression-to-functions": "^7.22.15", + "@babel/helper-optimise-call-expression": "^7.22.5" } }, - "node_modules/strip-json-comments": { - "version": "3.1.1", + "@babel/helper-simple-access": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.22.5.tgz", + "integrity": "sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w==", "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "requires": { + "@babel/types": "^7.22.5" } }, - "node_modules/subarg": { - "version": "1.0.0", + "@babel/helper-skip-transparent-expression-wrappers": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.22.5.tgz", + "integrity": "sha512-tK14r66JZKiC43p8Ki33yLBVJKlQDFoA8GYN67lWCDCqoL6EMMSuM9b+Iff2jHaM/RRFYl7K+iiru7hbRqNx8Q==", "dev": true, - "license": "MIT", - "dependencies": { - "minimist": "^1.1.0" + "requires": { + "@babel/types": "^7.22.5" } }, - "node_modules/supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "@babel/helper-split-export-declaration": { + "version": "7.22.6", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz", + "integrity": "sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==", "dev": true, - "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=4" + "requires": { + "@babel/types": "^7.22.5" } }, - "node_modules/syntax-error": { - "version": "1.4.0", + "@babel/helper-string-parser": { + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.23.4.tgz", + "integrity": "sha512-803gmbQdqwdf4olxrX4AJyFBV/RTr3rSmOj0rKwesmzlfhYNDEs+/iOcznzpNWlJlIlTJC2QfPFcHB6DlzdVLQ==", + "dev": true + }, + "@babel/helper-validator-identifier": { + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz", + "integrity": "sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==", + "dev": true + }, + "@babel/helper-validator-option": { + "version": "7.23.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.23.5.tgz", + "integrity": "sha512-85ttAOMLsr53VgXkTbkx8oA6YTfT4q7/HzXSLEYmjcSTJPMPQtvq1BD79Byep5xMUYbGRzEpDsjUf3dyp54IKw==", + "dev": true + }, + "@babel/helper-wrap-function": { + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.22.20.tgz", + "integrity": "sha512-pms/UwkOpnQe/PDAEdV/d7dVCoBbB+R4FvYoHGZz+4VPcg7RtYy2KP7S2lbuWM6FCSgob5wshfGESbC/hzNXZw==", "dev": true, - "license": "MIT", - "dependencies": { - "acorn-node": "^1.2.0" + "requires": { + "@babel/helper-function-name": "^7.22.5", + "@babel/template": "^7.22.15", + "@babel/types": "^7.22.19" } }, - "node_modules/test-exclude": { - "version": "6.0.0", + "@babel/helpers": { + "version": "7.23.9", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.23.9.tgz", + "integrity": "sha512-87ICKgU5t5SzOT7sBMfCOZQ2rHjRU+Pcb9BoILMYz600W6DkVRLFBPwQ18gwUVvggqXivaUakpnxWQGbpywbBQ==", "dev": true, - "license": "ISC", - "dependencies": { - "@istanbuljs/schema": "^0.1.2", - "glob": "^7.1.4", - "minimatch": "^3.0.4" - }, - "engines": { - "node": ">=8" + "requires": { + "@babel/template": "^7.23.9", + "@babel/traverse": "^7.23.9", + "@babel/types": "^7.23.9" } }, - "node_modules/text-table": { - "version": "0.2.0", + "@babel/highlight": { + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.23.4.tgz", + "integrity": "sha512-acGdbYSfp2WheJoJm/EBBBLh/ID8KDc64ISZ9DYtBmC8/Q204PZJLHyzeB5qMzJ5trcOkybd78M4x2KWsUq++A==", "dev": true, - "license": "MIT" + "requires": { + "@babel/helper-validator-identifier": "^7.22.20", + "chalk": "^2.4.2", + "js-tokens": "^4.0.0" + } }, - "node_modules/through": { - "version": "2.3.8", - "dev": true, - "license": "MIT" + "@babel/parser": { + "version": "7.23.9", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.23.9.tgz", + "integrity": "sha512-9tcKgqKbs3xGJ+NtKF2ndOBBLVwPjl1SHxPQkd36r3Dlirw3xWUeGaTbqr7uGZcTaxkVNwc+03SVP7aCdWrTlA==", + "dev": true }, - "node_modules/through2": { - "version": "2.0.5", + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.23.3.tgz", + "integrity": "sha512-iRkKcCqb7iGnq9+3G6rZ+Ciz5VywC4XNRHe57lKM+jOeYAoR0lVqdeeDRfh0tQcTfw/+vBhHn926FmQhLtlFLQ==", "dev": true, - "license": "MIT", - "dependencies": { - "readable-stream": "~2.3.6", - "xtend": "~4.0.1" + "requires": { + "@babel/helper-plugin-utils": "^7.22.5" } }, - "node_modules/timers-browserify": { - "version": "1.4.2", + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.23.3.tgz", + "integrity": "sha512-WwlxbfMNdVEpQjZmK5mhm7oSwD3dS6eU+Iwsi4Knl9wAletWem7kaRsGOG+8UEbRyqxY4SS5zvtfXwX+jMxUwQ==", "dev": true, - "dependencies": { - "process": "~0.11.0" - }, - "engines": { - "node": ">=0.6.0" + "requires": { + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5", + "@babel/plugin-transform-optional-chaining": "^7.23.3" } }, - "node_modules/tmp": { - "version": "0.2.1", + "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": { + "version": "7.23.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly/-/plugin-bugfix-v8-static-class-fields-redefine-readonly-7.23.7.tgz", + "integrity": "sha512-LlRT7HgaifEpQA1ZgLVOIJZZFVPWN5iReq/7/JixwBtwcoeVGDBD53ZV28rrsLYOZs1Y/EHhA8N/Z6aazHR8cw==", "dev": true, - "license": "MIT", - "dependencies": { - "rimraf": "^3.0.0" - }, - "engines": { - "node": ">=8.17.0" + "requires": { + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-plugin-utils": "^7.22.5" } }, - "node_modules/to-fast-properties": { - "version": "2.0.0", + "@babel/plugin-proposal-private-property-in-object": { + "version": "7.21.0-placeholder-for-preset-env.2", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.21.0-placeholder-for-preset-env.2.tgz", + "integrity": "sha512-SOSkfJDddaM7mak6cPEpswyTRnuRltl429hMraQEglW+OkovnCzsiszTmsrlY//qLFjCpQDFRvjdm2wA5pPm9w==", "dev": true, - "license": "MIT", - "engines": { - "node": ">=4" + "requires": {} + }, + "@babel/plugin-syntax-async-generators": { + "version": "7.8.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", + "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" } }, - "node_modules/to-regex-range": { - "version": "5.0.1", + "@babel/plugin-syntax-class-properties": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz", + "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==", "dev": true, - "license": "MIT", - "dependencies": { - "is-number": "^7.0.0" - }, - "engines": { - "node": ">=8.0" + "requires": { + "@babel/helper-plugin-utils": "^7.12.13" } }, - "node_modules/toidentifier": { - "version": "1.0.1", + "@babel/plugin-syntax-class-static-block": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz", + "integrity": "sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==", "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.6" + "requires": { + "@babel/helper-plugin-utils": "^7.14.5" } }, - "node_modules/tty-browserify": { - "version": "0.0.1", + "@babel/plugin-syntax-dynamic-import": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz", + "integrity": "sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==", "dev": true, - "license": "MIT" + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } }, - "node_modules/type-detect": { - "version": "4.0.8", + "@babel/plugin-syntax-export-namespace-from": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-export-namespace-from/-/plugin-syntax-export-namespace-from-7.8.3.tgz", + "integrity": "sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q==", "dev": true, - "license": "MIT", - "engines": { - "node": ">=4" + "requires": { + "@babel/helper-plugin-utils": "^7.8.3" } }, - "node_modules/type-fest": { - "version": "0.20.2", + "@babel/plugin-syntax-import-assertions": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.23.3.tgz", + "integrity": "sha512-lPgDSU+SJLK3xmFDTV2ZRQAiM7UuUjGidwBywFavObCiZc1BeAAcMtHJKUya92hPHO+at63JJPLygilZard8jw==", "dev": true, - "license": "(MIT OR CC0-1.0)", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "requires": { + "@babel/helper-plugin-utils": "^7.22.5" } }, - "node_modules/type-is": { - "version": "1.6.18", + "@babel/plugin-syntax-import-attributes": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.23.3.tgz", + "integrity": "sha512-pawnE0P9g10xgoP7yKr6CK63K2FMsTE+FZidZO/1PwRdzmAPVs+HS1mAURUsgaoxammTJvULUdIkEK0gOcU2tA==", "dev": true, - "license": "MIT", - "dependencies": { - "media-typer": "0.3.0", - "mime-types": "~2.1.24" - }, - "engines": { - "node": ">= 0.6" + "requires": { + "@babel/helper-plugin-utils": "^7.22.5" } }, - "node_modules/typedarray": { - "version": "0.0.6", + "@babel/plugin-syntax-import-meta": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz", + "integrity": "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==", "dev": true, - "license": "MIT" + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } }, - "node_modules/typedarray-to-buffer": { - "version": "3.1.5", + "@babel/plugin-syntax-json-strings": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", + "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", "dev": true, - "license": "MIT", - "dependencies": { - "is-typedarray": "^1.0.0" + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" } }, - "node_modules/ua-parser-js": { - "version": "0.7.33", + "@babel/plugin-syntax-logical-assignment-operators": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz", + "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/ua-parser-js" - }, - { - "type": "paypal", - "url": "https://paypal.me/faisalman" - } - ], - "license": "MIT", - "engines": { - "node": "*" + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" } }, - "node_modules/uglify-js": { - "version": "3.17.4", + "@babel/plugin-syntax-nullish-coalescing-operator": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", + "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", "dev": true, - "license": "BSD-2-Clause", - "bin": { - "uglifyjs": "bin/uglifyjs" - }, - "engines": { - "node": ">=0.8.0" + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" } }, - "node_modules/umd": { - "version": "3.0.3", + "@babel/plugin-syntax-numeric-separator": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz", + "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", "dev": true, - "license": "MIT", - "bin": { - "umd": "bin/cli.js" + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" } }, - "node_modules/undeclared-identifiers": { - "version": "1.1.3", + "@babel/plugin-syntax-object-rest-spread": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", + "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", "dev": true, - "license": "Apache-2.0", - "dependencies": { - "acorn-node": "^1.3.0", - "dash-ast": "^1.0.0", - "get-assigned-identifiers": "^1.2.0", - "simple-concat": "^1.0.0", - "xtend": "^4.0.1" - }, - "bin": { - "undeclared-identifiers": "bin.js" + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" } }, - "node_modules/universalify": { - "version": "0.1.2", + "@babel/plugin-syntax-optional-catch-binding": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", + "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", "dev": true, - "license": "MIT", - "engines": { - "node": ">= 4.0.0" + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" } }, - "node_modules/unpipe": { - "version": "1.0.0", + "@babel/plugin-syntax-optional-chaining": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", + "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.8" + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" } }, - "node_modules/update-browserslist-db": { - "version": "1.0.10", + "@babel/plugin-syntax-private-property-in-object": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz", + "integrity": "sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==", "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/browserslist" - } - ], - "license": "MIT", - "dependencies": { - "escalade": "^3.1.1", - "picocolors": "^1.0.0" - }, - "bin": { - "browserslist-lint": "cli.js" - }, - "peerDependencies": { - "browserslist": ">= 4.21.0" + "requires": { + "@babel/helper-plugin-utils": "^7.14.5" } }, - "node_modules/uri-js": { - "version": "4.4.1", + "@babel/plugin-syntax-top-level-await": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz", + "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==", "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "punycode": "^2.1.0" + "requires": { + "@babel/helper-plugin-utils": "^7.14.5" } }, - "node_modules/uri-js/node_modules/punycode": { - "version": "2.3.0", + "@babel/plugin-syntax-unicode-sets-regex": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-unicode-sets-regex/-/plugin-syntax-unicode-sets-regex-7.18.6.tgz", + "integrity": "sha512-727YkEAPwSIQTv5im8QHz3upqp92JTWhidIC81Tdx4VJYIte/VndKf1qKrfnnhPLiPghStWfvC/iFaMCQu7Nqg==", "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" + "requires": { + "@babel/helper-create-regexp-features-plugin": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" } }, - "node_modules/url": { - "version": "0.11.0", + "@babel/plugin-transform-arrow-functions": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.23.3.tgz", + "integrity": "sha512-NzQcQrzaQPkaEwoTm4Mhyl8jI1huEL/WWIEvudjTCMJ9aBZNpsJbMASx7EQECtQQPS/DcnFpo0FIh3LvEO9cxQ==", "dev": true, - "license": "MIT", - "dependencies": { - "punycode": "1.3.2", - "querystring": "0.2.0" + "requires": { + "@babel/helper-plugin-utils": "^7.22.5" } }, - "node_modules/url/node_modules/punycode": { - "version": "1.3.2", + "@babel/plugin-transform-async-generator-functions": { + "version": "7.23.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.23.9.tgz", + "integrity": "sha512-8Q3veQEDGe14dTYuwagbRtwxQDnytyg1JFu4/HwEMETeofocrB0U0ejBJIXoeG/t2oXZ8kzCyI0ZZfbT80VFNQ==", "dev": true, - "license": "MIT" + "requires": { + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-remap-async-to-generator": "^7.22.20", + "@babel/plugin-syntax-async-generators": "^7.8.4" + } }, - "node_modules/util": { - "version": "0.10.4", + "@babel/plugin-transform-async-to-generator": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.23.3.tgz", + "integrity": "sha512-A7LFsKi4U4fomjqXJlZg/u0ft/n8/7n7lpffUP/ZULx/DtV9SGlNKZolHH6PE8Xl1ngCc0M11OaeZptXVkfKSw==", "dev": true, - "license": "MIT", - "dependencies": { - "inherits": "2.0.3" + "requires": { + "@babel/helper-module-imports": "^7.22.15", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-remap-async-to-generator": "^7.22.20" } }, - "node_modules/util-deprecate": { - "version": "1.0.2", + "@babel/plugin-transform-block-scoped-functions": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.23.3.tgz", + "integrity": "sha512-vI+0sIaPIO6CNuM9Kk5VmXcMVRiOpDh7w2zZt9GXzmE/9KD70CUEVhvPR/etAeNK/FAEkhxQtXOzVF3EuRL41A==", "dev": true, - "license": "MIT" + "requires": { + "@babel/helper-plugin-utils": "^7.22.5" + } }, - "node_modules/util/node_modules/inherits": { - "version": "2.0.3", + "@babel/plugin-transform-block-scoping": { + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.23.4.tgz", + "integrity": "sha512-0QqbP6B6HOh7/8iNR4CQU2Th/bbRtBp4KS9vcaZd1fZ0wSh5Fyssg0UCIHwxh+ka+pNDREbVLQnHCMHKZfPwfw==", "dev": true, - "license": "ISC" + "requires": { + "@babel/helper-plugin-utils": "^7.22.5" + } }, - "node_modules/utils-merge": { - "version": "1.0.1", + "@babel/plugin-transform-class-properties": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.23.3.tgz", + "integrity": "sha512-uM+AN8yCIjDPccsKGlw271xjJtGii+xQIF/uMPS8H15L12jZTsLfF4o5vNO7d/oUguOyfdikHGc/yi9ge4SGIg==", "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.4.0" + "requires": { + "@babel/helper-create-class-features-plugin": "^7.22.15", + "@babel/helper-plugin-utils": "^7.22.5" } }, - "node_modules/uuid": { - "version": "8.3.2", + "@babel/plugin-transform-class-static-block": { + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.23.4.tgz", + "integrity": "sha512-nsWu/1M+ggti1SOALj3hfx5FXzAY06fwPJsUZD4/A5e1bWi46VUIWtD+kOX6/IdhXGsXBWllLFDSnqSCdUNydQ==", "dev": true, - "license": "MIT", - "bin": { - "uuid": "dist/bin/uuid" + "requires": { + "@babel/helper-create-class-features-plugin": "^7.22.15", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-class-static-block": "^7.14.5" } }, - "node_modules/vary": { - "version": "1.1.2", + "@babel/plugin-transform-classes": { + "version": "7.23.8", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.23.8.tgz", + "integrity": "sha512-yAYslGsY1bX6Knmg46RjiCiNSwJKv2IUC8qOdYKqMMr0491SXFhcHqOdRDeCRohOOIzwN/90C6mQ9qAKgrP7dg==", "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.8" + "requires": { + "@babel/helper-annotate-as-pure": "^7.22.5", + "@babel/helper-compilation-targets": "^7.23.6", + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-function-name": "^7.23.0", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-replace-supers": "^7.22.20", + "@babel/helper-split-export-declaration": "^7.22.6", + "globals": "^11.1.0" + }, + "dependencies": { + "globals": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "dev": true + } } }, - "node_modules/vm-browserify": { - "version": "1.1.0", + "@babel/plugin-transform-computed-properties": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.23.3.tgz", + "integrity": "sha512-dTj83UVTLw/+nbiHqQSFdwO9CbTtwq1DsDqm3CUEtDrZNET5rT5E6bIdTlOftDTDLMYxvxHNEYO4B9SLl8SLZw==", "dev": true, - "license": "MIT" + "requires": { + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/template": "^7.22.15" + } }, - "node_modules/void-elements": { - "version": "2.0.1", + "@babel/plugin-transform-destructuring": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.23.3.tgz", + "integrity": "sha512-n225npDqjDIr967cMScVKHXJs7rout1q+tt50inyBCPkyZ8KxeI6d+GIbSBTT/w/9WdlWDOej3V9HE5Lgk57gw==", "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" + "requires": { + "@babel/helper-plugin-utils": "^7.22.5" } }, - "node_modules/which": { - "version": "1.3.1", + "@babel/plugin-transform-dotall-regex": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.23.3.tgz", + "integrity": "sha512-vgnFYDHAKzFaTVp+mneDsIEbnJ2Np/9ng9iviHw3P/KVcgONxpNULEW/51Z/BaFojG2GI2GwwXck5uV1+1NOYQ==", "dev": true, - "license": "ISC", - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "which": "bin/which" + "requires": { + "@babel/helper-create-regexp-features-plugin": "^7.22.15", + "@babel/helper-plugin-utils": "^7.22.5" } }, - "node_modules/which-module": { - "version": "2.0.0", + "@babel/plugin-transform-duplicate-keys": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.23.3.tgz", + "integrity": "sha512-RrqQ+BQmU3Oyav3J+7/myfvRCq7Tbz+kKLLshUmMwNlDHExbGL7ARhajvoBJEvc+fCguPPu887N+3RRXBVKZUA==", "dev": true, - "license": "ISC" + "requires": { + "@babel/helper-plugin-utils": "^7.22.5" + } }, - "node_modules/word-wrap": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.4.tgz", - "integrity": "sha512-2V81OA4ugVo5pRo46hAoD2ivUJx8jXmWXfUkY4KFNw0hEptvN0QfH3K4nHiwzGeKl5rFKedV48QVoqYavy4YpA==", + "@babel/plugin-transform-dynamic-import": { + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.23.4.tgz", + "integrity": "sha512-V6jIbLhdJK86MaLh4Jpghi8ho5fGzt3imHOBu/x0jlBaPYqDoWz4RDXjmMOfnh+JWNaQleEAByZLV0QzBT4YQQ==", "dev": true, - "engines": { - "node": ">=0.10.0" + "requires": { + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-dynamic-import": "^7.8.3" } }, - "node_modules/workerpool": { - "version": "6.2.1", + "@babel/plugin-transform-exponentiation-operator": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.23.3.tgz", + "integrity": "sha512-5fhCsl1odX96u7ILKHBj4/Y8vipoqwsJMh4csSA8qFfxrZDEA4Ssku2DyNvMJSmZNOEBT750LfFPbtrnTP90BQ==", "dev": true, - "license": "Apache-2.0" + "requires": { + "@babel/helper-builder-binary-assignment-operator-visitor": "^7.22.15", + "@babel/helper-plugin-utils": "^7.22.5" + } }, - "node_modules/wrap-ansi": { - "version": "7.0.0", + "@babel/plugin-transform-export-namespace-from": { + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.23.4.tgz", + "integrity": "sha512-GzuSBcKkx62dGzZI1WVgTWvkkz84FZO5TC5T8dl/Tht/rAla6Dg/Mz9Yhypg+ezVACf/rgDuQt3kbWEv7LdUDQ==", "dev": true, - "license": "MIT", - "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + "requires": { + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-export-namespace-from": "^7.8.3" } }, - "node_modules/wrap-ansi/node_modules/ansi-styles": { - "version": "4.3.0", + "@babel/plugin-transform-for-of": { + "version": "7.23.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.23.6.tgz", + "integrity": "sha512-aYH4ytZ0qSuBbpfhuofbg/e96oQ7U2w1Aw/UQmKT+1l39uEhUPoFS3fHevDc1G0OvewyDudfMKY1OulczHzWIw==", "dev": true, - "license": "MIT", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" + "requires": { + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5" } }, - "node_modules/wrap-ansi/node_modules/color-convert": { - "version": "2.0.1", + "@babel/plugin-transform-function-name": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.23.3.tgz", + "integrity": "sha512-I1QXp1LxIvt8yLaib49dRW5Okt7Q4oaxao6tFVKS/anCdEOMtYwWVKoiOA1p34GOWIZjUK0E+zCp7+l1pfQyiw==", "dev": true, - "license": "MIT", - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" + "requires": { + "@babel/helper-compilation-targets": "^7.22.15", + "@babel/helper-function-name": "^7.23.0", + "@babel/helper-plugin-utils": "^7.22.5" } }, - "node_modules/wrap-ansi/node_modules/color-name": { - "version": "1.1.4", + "@babel/plugin-transform-json-strings": { + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.23.4.tgz", + "integrity": "sha512-81nTOqM1dMwZ/aRXQ59zVubN9wHGqk6UtqRK+/q+ciXmRy8fSolhGVvG09HHRGo4l6fr/c4ZhXUQH0uFW7PZbg==", "dev": true, - "license": "MIT" + "requires": { + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-json-strings": "^7.8.3" + } }, - "node_modules/wrappy": { - "version": "1.0.2", + "@babel/plugin-transform-literals": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.23.3.tgz", + "integrity": "sha512-wZ0PIXRxnwZvl9AYpqNUxpZ5BiTGrYt7kueGQ+N5FiQ7RCOD4cm8iShd6S6ggfVIWaJf2EMk8eRzAh52RfP4rQ==", "dev": true, - "license": "ISC" + "requires": { + "@babel/helper-plugin-utils": "^7.22.5" + } }, - "node_modules/write-file-atomic": { - "version": "3.0.3", + "@babel/plugin-transform-logical-assignment-operators": { + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.23.4.tgz", + "integrity": "sha512-Mc/ALf1rmZTP4JKKEhUwiORU+vcfarFVLfcFiolKUo6sewoxSEgl36ak5t+4WamRsNr6nzjZXQjM35WsU+9vbg==", "dev": true, - "license": "ISC", - "dependencies": { - "imurmurhash": "^0.1.4", - "is-typedarray": "^1.0.0", - "signal-exit": "^3.0.2", - "typedarray-to-buffer": "^3.1.5" + "requires": { + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4" } }, - "node_modules/ws": { - "version": "8.11.0", + "@babel/plugin-transform-member-expression-literals": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.23.3.tgz", + "integrity": "sha512-sC3LdDBDi5x96LA+Ytekz2ZPk8i/Ck+DEuDbRAll5rknJ5XRTSaPKEYwomLcs1AA8wg9b3KjIQRsnApj+q51Ag==", "dev": true, - "license": "MIT", - "engines": { - "node": ">=10.0.0" - }, - "peerDependencies": { - "bufferutil": "^4.0.1", - "utf-8-validate": "^5.0.2" - }, - "peerDependenciesMeta": { - "bufferutil": { - "optional": true - }, - "utf-8-validate": { - "optional": true - } + "requires": { + "@babel/helper-plugin-utils": "^7.22.5" } }, - "node_modules/xtend": { - "version": "4.0.2", + "@babel/plugin-transform-modules-amd": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.23.3.tgz", + "integrity": "sha512-vJYQGxeKM4t8hYCKVBlZX/gtIY2I7mRGFNcm85sgXGMTBcoV3QdVtdpbcWEbzbfUIUZKwvgFT82mRvaQIebZzw==", "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.4" + "requires": { + "@babel/helper-module-transforms": "^7.23.3", + "@babel/helper-plugin-utils": "^7.22.5" } }, - "node_modules/y18n": { - "version": "5.0.8", + "@babel/plugin-transform-modules-commonjs": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.23.3.tgz", + "integrity": "sha512-aVS0F65LKsdNOtcz6FRCpE4OgsP2OFnW46qNxNIX9h3wuzaNcSQsJysuMwqSibC98HPrf2vCgtxKNwS0DAlgcA==", "dev": true, - "license": "ISC", - "engines": { - "node": ">=10" + "requires": { + "@babel/helper-module-transforms": "^7.23.3", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-simple-access": "^7.22.5" } }, - "node_modules/yallist": { - "version": "3.1.1", + "@babel/plugin-transform-modules-systemjs": { + "version": "7.23.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.23.9.tgz", + "integrity": "sha512-KDlPRM6sLo4o1FkiSlXoAa8edLXFsKKIda779fbLrvmeuc3itnjCtaO6RrtoaANsIJANj+Vk1zqbZIMhkCAHVw==", "dev": true, - "license": "ISC" + "requires": { + "@babel/helper-hoist-variables": "^7.22.5", + "@babel/helper-module-transforms": "^7.23.3", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-validator-identifier": "^7.22.20" + } }, - "node_modules/yargs": { - "version": "16.2.0", + "@babel/plugin-transform-modules-umd": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.23.3.tgz", + "integrity": "sha512-zHsy9iXX2nIsCBFPud3jKn1IRPWg3Ing1qOZgeKV39m1ZgIdpJqvlWVeiHBZC6ITRG0MfskhYe9cLgntfSFPIg==", "dev": true, - "license": "MIT", - "dependencies": { - "cliui": "^7.0.2", - "escalade": "^3.1.1", - "get-caller-file": "^2.0.5", - "require-directory": "^2.1.1", - "string-width": "^4.2.0", - "y18n": "^5.0.5", - "yargs-parser": "^20.2.2" - }, - "engines": { - "node": ">=10" + "requires": { + "@babel/helper-module-transforms": "^7.23.3", + "@babel/helper-plugin-utils": "^7.22.5" + } + }, + "@babel/plugin-transform-named-capturing-groups-regex": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.22.5.tgz", + "integrity": "sha512-YgLLKmS3aUBhHaxp5hi1WJTgOUb/NCuDHzGT9z9WTt3YG+CPRhJs6nprbStx6DnWM4dh6gt7SU3sZodbZ08adQ==", + "dev": true, + "requires": { + "@babel/helper-create-regexp-features-plugin": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5" + } + }, + "@babel/plugin-transform-new-target": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.23.3.tgz", + "integrity": "sha512-YJ3xKqtJMAT5/TIZnpAR3I+K+WaDowYbN3xyxI8zxx/Gsypwf9B9h0VB+1Nh6ACAAPRS5NSRje0uVv5i79HYGQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.22.5" } }, - "node_modules/yargs-parser": { - "version": "20.2.4", + "@babel/plugin-transform-nullish-coalescing-operator": { + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.23.4.tgz", + "integrity": "sha512-jHE9EVVqHKAQx+VePv5LLGHjmHSJR76vawFPTdlxR/LVJPfOEGxREQwQfjuZEOPTwG92X3LINSh3M40Rv4zpVA==", "dev": true, - "license": "ISC", - "engines": { - "node": ">=10" + "requires": { + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3" } }, - "node_modules/yargs-unparser": { - "version": "2.0.0", + "@babel/plugin-transform-numeric-separator": { + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.23.4.tgz", + "integrity": "sha512-mps6auzgwjRrwKEZA05cOwuDc9FAzoyFS4ZsG/8F43bTLf/TgkJg7QXOrPO1JO599iA3qgK9MXdMGOEC8O1h6Q==", "dev": true, - "license": "MIT", - "dependencies": { - "camelcase": "^6.0.0", - "decamelize": "^4.0.0", - "flat": "^5.0.2", - "is-plain-obj": "^2.1.0" - }, - "engines": { - "node": ">=10" + "requires": { + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-numeric-separator": "^7.10.4" } }, - "node_modules/yocto-queue": { - "version": "0.1.0", + "@babel/plugin-transform-object-rest-spread": { + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.23.4.tgz", + "integrity": "sha512-9x9K1YyeQVw0iOXJlIzwm8ltobIIv7j2iLyP2jIhEbqPRQ7ScNgwQufU2I0Gq11VjyG4gI4yMXt2VFags+1N3g==", "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "requires": { + "@babel/compat-data": "^7.23.3", + "@babel/helper-compilation-targets": "^7.22.15", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-object-rest-spread": "^7.8.3", + "@babel/plugin-transform-parameters": "^7.23.3" } - } - }, - "dependencies": { - "@ampproject/remapping": { - "version": "2.2.0", + }, + "@babel/plugin-transform-object-super": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.23.3.tgz", + "integrity": "sha512-BwQ8q0x2JG+3lxCVFohg+KbQM7plfpBwThdW9A6TMtWwLsbDA01Ek2Zb/AgDN39BiZsExm4qrXxjk+P1/fzGrA==", "dev": true, "requires": { - "@jridgewell/gen-mapping": "^0.1.0", - "@jridgewell/trace-mapping": "^0.3.9" + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-replace-supers": "^7.22.20" } }, - "@babel/code-frame": { - "version": "7.22.13", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.22.13.tgz", - "integrity": "sha512-XktuhWlJ5g+3TJXc5upd9Ks1HutSArik6jf2eAjYFyIOf4ej3RN+184cZbzDvbPnuTJIUhPKKJE3cIsYTiAT3w==", + "@babel/plugin-transform-optional-catch-binding": { + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.23.4.tgz", + "integrity": "sha512-XIq8t0rJPHf6Wvmbn9nFxU6ao4c7WhghTR5WyV8SrJfUFzyxhCm4nhC+iAp3HFhbAKLfYpgzhJ6t4XCtVwqO5A==", "dev": true, "requires": { - "@babel/highlight": "^7.22.13", - "chalk": "^2.4.2" + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.3" } }, - "@babel/compat-data": { - "version": "7.21.0", - "dev": true + "@babel/plugin-transform-optional-chaining": { + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.23.4.tgz", + "integrity": "sha512-ZU8y5zWOfjM5vZ+asjgAPwDaBjJzgufjES89Rs4Lpq63O300R/kOz30WCLo6BxxX6QVEilwSlpClnG5cZaikTA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5", + "@babel/plugin-syntax-optional-chaining": "^7.8.3" + } }, - "@babel/core": { - "version": "7.21.0", + "@babel/plugin-transform-parameters": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.23.3.tgz", + "integrity": "sha512-09lMt6UsUb3/34BbECKVbVwrT9bO6lILWln237z7sLaWnMsTi7Yc9fhX5DLpkJzAGfaReXI22wP41SZmnAA3Vw==", "dev": true, "requires": { - "@ampproject/remapping": "^2.2.0", - "@babel/code-frame": "^7.18.6", - "@babel/generator": "^7.21.0", - "@babel/helper-compilation-targets": "^7.20.7", - "@babel/helper-module-transforms": "^7.21.0", - "@babel/helpers": "^7.21.0", - "@babel/parser": "^7.21.0", - "@babel/template": "^7.20.7", - "@babel/traverse": "^7.21.0", - "@babel/types": "^7.21.0", - "convert-source-map": "^1.7.0", - "debug": "^4.1.0", - "gensync": "^1.0.0-beta.2", - "json5": "^2.2.2", - "semver": "^6.3.0" - }, - "dependencies": { - "convert-source-map": { - "version": "1.9.0", - "dev": true - }, - "semver": { - "version": "6.3.0", - "dev": true - } + "@babel/helper-plugin-utils": "^7.22.5" } }, - "@babel/generator": { - "version": "7.23.0", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.23.0.tgz", - "integrity": "sha512-lN85QRR+5IbYrMWM6Y4pE/noaQtg4pNiqeNGX60eqOfo6gtEj6uw/JagelB8vVztSd7R6M5n1+PQkDbHbBRU4g==", + "@babel/plugin-transform-private-methods": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.23.3.tgz", + "integrity": "sha512-UzqRcRtWsDMTLrRWFvUBDwmw06tCQH9Rl1uAjfh6ijMSmGYQ+fpdB+cnqRC8EMh5tuuxSv0/TejGL+7vyj+50g==", "dev": true, "requires": { - "@babel/types": "^7.23.0", - "@jridgewell/gen-mapping": "^0.3.2", - "@jridgewell/trace-mapping": "^0.3.17", - "jsesc": "^2.5.1" - }, - "dependencies": { - "@jridgewell/gen-mapping": { - "version": "0.3.2", - "dev": true, - "requires": { - "@jridgewell/set-array": "^1.0.1", - "@jridgewell/sourcemap-codec": "^1.4.10", - "@jridgewell/trace-mapping": "^0.3.9" - } - } + "@babel/helper-create-class-features-plugin": "^7.22.15", + "@babel/helper-plugin-utils": "^7.22.5" } }, - "@babel/helper-compilation-targets": { - "version": "7.20.7", + "@babel/plugin-transform-private-property-in-object": { + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.23.4.tgz", + "integrity": "sha512-9G3K1YqTq3F4Vt88Djx1UZ79PDyj+yKRnUy7cZGSMe+a7jkwD259uKKuUzQlPkGam7R+8RJwh5z4xO27fA1o2A==", "dev": true, "requires": { - "@babel/compat-data": "^7.20.5", - "@babel/helper-validator-option": "^7.18.6", - "browserslist": "^4.21.3", - "lru-cache": "^5.1.1", - "semver": "^6.3.0" - }, - "dependencies": { - "semver": { - "version": "6.3.0", - "dev": true - } + "@babel/helper-annotate-as-pure": "^7.22.5", + "@babel/helper-create-class-features-plugin": "^7.22.15", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-private-property-in-object": "^7.14.5" } }, - "@babel/helper-environment-visitor": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.20.tgz", - "integrity": "sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA==", - "dev": true + "@babel/plugin-transform-property-literals": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.23.3.tgz", + "integrity": "sha512-jR3Jn3y7cZp4oEWPFAlRsSWjxKe4PZILGBSd4nis1TsC5qeSpb+nrtihJuDhNI7QHiVbUaiXa0X2RZY3/TI6Nw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.22.5" + } }, - "@babel/helper-function-name": { - "version": "7.23.0", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.23.0.tgz", - "integrity": "sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw==", + "@babel/plugin-transform-regenerator": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.23.3.tgz", + "integrity": "sha512-KP+75h0KghBMcVpuKisx3XTu9Ncut8Q8TuvGO4IhY+9D5DFEckQefOuIsB/gQ2tG71lCke4NMrtIPS8pOj18BQ==", "dev": true, "requires": { - "@babel/template": "^7.22.15", - "@babel/types": "^7.23.0" + "@babel/helper-plugin-utils": "^7.22.5", + "regenerator-transform": "^0.15.2" } }, - "@babel/helper-hoist-variables": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz", - "integrity": "sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==", + "@babel/plugin-transform-reserved-words": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.23.3.tgz", + "integrity": "sha512-QnNTazY54YqgGxwIexMZva9gqbPa15t/x9VS+0fsEFWplwVpXYZivtgl43Z1vMpc1bdPP2PP8siFeVcnFvA3Cg==", "dev": true, "requires": { - "@babel/types": "^7.22.5" + "@babel/helper-plugin-utils": "^7.22.5" } }, - "@babel/helper-module-imports": { - "version": "7.18.6", + "@babel/plugin-transform-shorthand-properties": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.23.3.tgz", + "integrity": "sha512-ED2fgqZLmexWiN+YNFX26fx4gh5qHDhn1O2gvEhreLW2iI63Sqm4llRLCXALKrCnbN4Jy0VcMQZl/SAzqug/jg==", "dev": true, "requires": { - "@babel/types": "^7.18.6" + "@babel/helper-plugin-utils": "^7.22.5" } }, - "@babel/helper-module-transforms": { - "version": "7.21.2", + "@babel/plugin-transform-spread": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.23.3.tgz", + "integrity": "sha512-VvfVYlrlBVu+77xVTOAoxQ6mZbnIq5FM0aGBSFEcIh03qHf+zNqA4DC/3XMUozTg7bZV3e3mZQ0i13VB6v5yUg==", "dev": true, "requires": { - "@babel/helper-environment-visitor": "^7.18.9", - "@babel/helper-module-imports": "^7.18.6", - "@babel/helper-simple-access": "^7.20.2", - "@babel/helper-split-export-declaration": "^7.18.6", - "@babel/helper-validator-identifier": "^7.19.1", - "@babel/template": "^7.20.7", - "@babel/traverse": "^7.21.2", - "@babel/types": "^7.21.2" + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5" } }, - "@babel/helper-simple-access": { - "version": "7.20.2", + "@babel/plugin-transform-sticky-regex": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.23.3.tgz", + "integrity": "sha512-HZOyN9g+rtvnOU3Yh7kSxXrKbzgrm5X4GncPY1QOquu7epga5MxKHVpYu2hvQnry/H+JjckSYRb93iNfsioAGg==", "dev": true, "requires": { - "@babel/types": "^7.20.2" + "@babel/helper-plugin-utils": "^7.22.5" } }, - "@babel/helper-split-export-declaration": { - "version": "7.22.6", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz", - "integrity": "sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==", + "@babel/plugin-transform-template-literals": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.23.3.tgz", + "integrity": "sha512-Flok06AYNp7GV2oJPZZcP9vZdszev6vPBkHLwxwSpaIqx75wn6mUd3UFWsSsA0l8nXAKkyCmL/sR02m8RYGeHg==", "dev": true, "requires": { - "@babel/types": "^7.22.5" + "@babel/helper-plugin-utils": "^7.22.5" } }, - "@babel/helper-string-parser": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.22.5.tgz", - "integrity": "sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw==", - "dev": true + "@babel/plugin-transform-typeof-symbol": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.23.3.tgz", + "integrity": "sha512-4t15ViVnaFdrPC74be1gXBSMzXk3B4Us9lP7uLRQHTFpV5Dvt33pn+2MyyNxmN3VTTm3oTrZVMUmuw3oBnQ2oQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.22.5" + } }, - "@babel/helper-validator-identifier": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz", - "integrity": "sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==", - "dev": true + "@babel/plugin-transform-unicode-escapes": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.23.3.tgz", + "integrity": "sha512-OMCUx/bU6ChE3r4+ZdylEqAjaQgHAgipgW8nsCfu5pGqDcFytVd91AwRvUJSBZDz0exPGgnjoqhgRYLRjFZc9Q==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.22.5" + } }, - "@babel/helper-validator-option": { - "version": "7.21.0", - "dev": true + "@babel/plugin-transform-unicode-property-regex": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.23.3.tgz", + "integrity": "sha512-KcLIm+pDZkWZQAFJ9pdfmh89EwVfmNovFBcXko8szpBeF8z68kWIPeKlmSOkT9BXJxs2C0uk+5LxoxIv62MROA==", + "dev": true, + "requires": { + "@babel/helper-create-regexp-features-plugin": "^7.22.15", + "@babel/helper-plugin-utils": "^7.22.5" + } }, - "@babel/helpers": { - "version": "7.21.0", + "@babel/plugin-transform-unicode-regex": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.23.3.tgz", + "integrity": "sha512-wMHpNA4x2cIA32b/ci3AfwNgheiva2W0WUKWTK7vBHBhDKfPsc5cFGNWm69WBqpwd86u1qwZ9PWevKqm1A3yAw==", "dev": true, "requires": { - "@babel/template": "^7.20.7", - "@babel/traverse": "^7.21.0", - "@babel/types": "^7.21.0" + "@babel/helper-create-regexp-features-plugin": "^7.22.15", + "@babel/helper-plugin-utils": "^7.22.5" } }, - "@babel/highlight": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.22.20.tgz", - "integrity": "sha512-dkdMCN3py0+ksCgYmGG8jKeGA/8Tk+gJwSYYlFGxG5lmhfKNoAy004YpLxpS1W2J8m/EK2Ew+yOs9pVRwO89mg==", + "@babel/plugin-transform-unicode-sets-regex": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.23.3.tgz", + "integrity": "sha512-W7lliA/v9bNR83Qc3q1ip9CQMZ09CcHDbHfbLRDNuAhn1Mvkr1ZNF7hPmztMQvtTGVLJ9m8IZqWsTkXOml8dbw==", "dev": true, "requires": { - "@babel/helper-validator-identifier": "^7.22.20", - "chalk": "^2.4.2", - "js-tokens": "^4.0.0" + "@babel/helper-create-regexp-features-plugin": "^7.22.15", + "@babel/helper-plugin-utils": "^7.22.5" } }, - "@babel/parser": { - "version": "7.23.0", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.23.0.tgz", - "integrity": "sha512-vvPKKdMemU85V9WE/l5wZEmImpCtLqbnTvqDS2U1fJ96KrxoW7KrXhNsNCblQlg8Ck4b85yxdTyelsMUgFUXiw==", + "@babel/preset-env": { + "version": "7.23.9", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.23.9.tgz", + "integrity": "sha512-3kBGTNBBk9DQiPoXYS0g0BYlwTQYUTifqgKTjxUwEUkduRT2QOa0FPGBJ+NROQhGyYO5BuTJwGvBnqKDykac6A==", + "dev": true, + "requires": { + "@babel/compat-data": "^7.23.5", + "@babel/helper-compilation-targets": "^7.23.6", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-validator-option": "^7.23.5", + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.23.3", + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.23.3", + "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": "^7.23.7", + "@babel/plugin-proposal-private-property-in-object": "7.21.0-placeholder-for-preset-env.2", + "@babel/plugin-syntax-async-generators": "^7.8.4", + "@babel/plugin-syntax-class-properties": "^7.12.13", + "@babel/plugin-syntax-class-static-block": "^7.14.5", + "@babel/plugin-syntax-dynamic-import": "^7.8.3", + "@babel/plugin-syntax-export-namespace-from": "^7.8.3", + "@babel/plugin-syntax-import-assertions": "^7.23.3", + "@babel/plugin-syntax-import-attributes": "^7.23.3", + "@babel/plugin-syntax-import-meta": "^7.10.4", + "@babel/plugin-syntax-json-strings": "^7.8.3", + "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", + "@babel/plugin-syntax-numeric-separator": "^7.10.4", + "@babel/plugin-syntax-object-rest-spread": "^7.8.3", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", + "@babel/plugin-syntax-optional-chaining": "^7.8.3", + "@babel/plugin-syntax-private-property-in-object": "^7.14.5", + "@babel/plugin-syntax-top-level-await": "^7.14.5", + "@babel/plugin-syntax-unicode-sets-regex": "^7.18.6", + "@babel/plugin-transform-arrow-functions": "^7.23.3", + "@babel/plugin-transform-async-generator-functions": "^7.23.9", + "@babel/plugin-transform-async-to-generator": "^7.23.3", + "@babel/plugin-transform-block-scoped-functions": "^7.23.3", + "@babel/plugin-transform-block-scoping": "^7.23.4", + "@babel/plugin-transform-class-properties": "^7.23.3", + "@babel/plugin-transform-class-static-block": "^7.23.4", + "@babel/plugin-transform-classes": "^7.23.8", + "@babel/plugin-transform-computed-properties": "^7.23.3", + "@babel/plugin-transform-destructuring": "^7.23.3", + "@babel/plugin-transform-dotall-regex": "^7.23.3", + "@babel/plugin-transform-duplicate-keys": "^7.23.3", + "@babel/plugin-transform-dynamic-import": "^7.23.4", + "@babel/plugin-transform-exponentiation-operator": "^7.23.3", + "@babel/plugin-transform-export-namespace-from": "^7.23.4", + "@babel/plugin-transform-for-of": "^7.23.6", + "@babel/plugin-transform-function-name": "^7.23.3", + "@babel/plugin-transform-json-strings": "^7.23.4", + "@babel/plugin-transform-literals": "^7.23.3", + "@babel/plugin-transform-logical-assignment-operators": "^7.23.4", + "@babel/plugin-transform-member-expression-literals": "^7.23.3", + "@babel/plugin-transform-modules-amd": "^7.23.3", + "@babel/plugin-transform-modules-commonjs": "^7.23.3", + "@babel/plugin-transform-modules-systemjs": "^7.23.9", + "@babel/plugin-transform-modules-umd": "^7.23.3", + "@babel/plugin-transform-named-capturing-groups-regex": "^7.22.5", + "@babel/plugin-transform-new-target": "^7.23.3", + "@babel/plugin-transform-nullish-coalescing-operator": "^7.23.4", + "@babel/plugin-transform-numeric-separator": "^7.23.4", + "@babel/plugin-transform-object-rest-spread": "^7.23.4", + "@babel/plugin-transform-object-super": "^7.23.3", + "@babel/plugin-transform-optional-catch-binding": "^7.23.4", + "@babel/plugin-transform-optional-chaining": "^7.23.4", + "@babel/plugin-transform-parameters": "^7.23.3", + "@babel/plugin-transform-private-methods": "^7.23.3", + "@babel/plugin-transform-private-property-in-object": "^7.23.4", + "@babel/plugin-transform-property-literals": "^7.23.3", + "@babel/plugin-transform-regenerator": "^7.23.3", + "@babel/plugin-transform-reserved-words": "^7.23.3", + "@babel/plugin-transform-shorthand-properties": "^7.23.3", + "@babel/plugin-transform-spread": "^7.23.3", + "@babel/plugin-transform-sticky-regex": "^7.23.3", + "@babel/plugin-transform-template-literals": "^7.23.3", + "@babel/plugin-transform-typeof-symbol": "^7.23.3", + "@babel/plugin-transform-unicode-escapes": "^7.23.3", + "@babel/plugin-transform-unicode-property-regex": "^7.23.3", + "@babel/plugin-transform-unicode-regex": "^7.23.3", + "@babel/plugin-transform-unicode-sets-regex": "^7.23.3", + "@babel/preset-modules": "0.1.6-no-external-plugins", + "babel-plugin-polyfill-corejs2": "^0.4.8", + "babel-plugin-polyfill-corejs3": "^0.9.0", + "babel-plugin-polyfill-regenerator": "^0.5.5", + "core-js-compat": "^3.31.0", + "semver": "^6.3.1" + }, + "dependencies": { + "semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true + } + } + }, + "@babel/preset-modules": { + "version": "0.1.6-no-external-plugins", + "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.6-no-external-plugins.tgz", + "integrity": "sha512-HrcgcIESLm9aIR842yhJ5RWan/gebQUJ6E/E5+rf0y9o6oj7w0Br+sWuL6kEQ/o/AdfvR1Je9jG18/gnpwjEyA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/types": "^7.4.4", + "esutils": "^2.0.2" + } + }, + "@babel/regjsgen": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/@babel/regjsgen/-/regjsgen-0.8.0.tgz", + "integrity": "sha512-x/rqGMdzj+fWZvCOYForTghzbtqPDZ5gPwaoNGHdgDfF2QA/XZbCBp4Moo5scrkAMPhB7z26XM/AaHuIJdgauA==", "dev": true }, + "@babel/runtime": { + "version": "7.23.9", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.23.9.tgz", + "integrity": "sha512-0CX6F+BI2s9dkUqr08KFrAIZgNFj75rdBU/DjCyYLIaV/quFjkk6T+EJ2LkZHyZTbEV4L5p97mNkUsHl2wLFAw==", + "dev": true, + "requires": { + "regenerator-runtime": "^0.14.0" + } + }, "@babel/template": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.22.15.tgz", - "integrity": "sha512-QPErUVm4uyJa60rkI73qneDacvdvzxshT3kksGqlGWYdOTIUOwJ7RDUL8sGqslY1uXWSL6xMFKEXDS3ox2uF0w==", + "version": "7.23.9", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.23.9.tgz", + "integrity": "sha512-+xrD2BWLpvHKNmX2QbpdpsBaWnRxahMwJjO+KZk2JOElj5nSmKezyS1B4u+QbHMTX69t4ukm6hh9lsYQ7GHCKA==", "dev": true, "requires": { - "@babel/code-frame": "^7.22.13", - "@babel/parser": "^7.22.15", - "@babel/types": "^7.22.15" + "@babel/code-frame": "^7.23.5", + "@babel/parser": "^7.23.9", + "@babel/types": "^7.23.9" } }, "@babel/traverse": { - "version": "7.23.2", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.23.2.tgz", - "integrity": "sha512-azpe59SQ48qG6nu2CzcMLbxUudtN+dOM9kDbUqGq3HXUJRlo7i8fvPoxQUzYgLZ4cMVmuZgm8vvBpNeRhd6XSw==", + "version": "7.23.9", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.23.9.tgz", + "integrity": "sha512-I/4UJ9vs90OkBtY6iiiTORVMyIhJ4kAVmsKo9KFc8UOxMeUfi2hvtIBsET5u9GizXE6/GFSuKCTNfgCswuEjRg==", "dev": true, "requires": { - "@babel/code-frame": "^7.22.13", - "@babel/generator": "^7.23.0", + "@babel/code-frame": "^7.23.5", + "@babel/generator": "^7.23.6", "@babel/helper-environment-visitor": "^7.22.20", "@babel/helper-function-name": "^7.23.0", "@babel/helper-hoist-variables": "^7.22.5", "@babel/helper-split-export-declaration": "^7.22.6", - "@babel/parser": "^7.23.0", - "@babel/types": "^7.23.0", - "debug": "^4.1.0", + "@babel/parser": "^7.23.9", + "@babel/types": "^7.23.9", + "debug": "^4.3.1", "globals": "^11.1.0" }, "dependencies": { "globals": { "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", "dev": true } } }, "@babel/types": { - "version": "7.23.0", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.23.0.tgz", - "integrity": "sha512-0oIyUfKoI3mSqMvsxBdclDwxXKXAUA8v/apZbc+iSyARYou1o8ZGDxbUYyLFoW2arqS2jDGqJuZvv1d/io1axg==", + "version": "7.23.9", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.23.9.tgz", + "integrity": "sha512-dQjSq/7HaSjRM43FFGnv5keM2HsxpmyV1PfaSVm0nzzjwwTmjOe6J4bC8e3+pTEIgHaHj+1ZlLThRJ2auc/w1Q==", "dev": true, "requires": { - "@babel/helper-string-parser": "^7.22.5", + "@babel/helper-string-parser": "^7.23.4", "@babel/helper-validator-identifier": "^7.22.20", "to-fast-properties": "^2.0.0" } @@ -6177,6 +8958,13 @@ "@jridgewell/sourcemap-codec": "1.4.14" } }, + "@nicolo-ribaudo/chokidar-2": { + "version": "2.1.8-no-fsevents.3", + "resolved": "https://registry.npmjs.org/@nicolo-ribaudo/chokidar-2/-/chokidar-2-2.1.8-no-fsevents.3.tgz", + "integrity": "sha512-s88O1aVtXftvp5bCPB7WnmXc5IwOZZ7YPuwNPt+GtOOXpPvad1LfbmjYv+qII7zP6RU2QGnqve27dnLycEnyEQ==", + "dev": true, + "optional": true + }, "@nodelib/fs.scandir": { "version": "2.1.5", "dev": true, @@ -6340,6 +9128,44 @@ "version": "1.1.0", "dev": true }, + "babel-plugin-polyfill-corejs2": { + "version": "0.4.8", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.8.tgz", + "integrity": "sha512-OtIuQfafSzpo/LhnJaykc0R/MMnuLSSVjVYy9mHArIZ9qTCSZ6TpWCuEKZYVoN//t8HqBNScHrOtCrIK5IaGLg==", + "dev": true, + "requires": { + "@babel/compat-data": "^7.22.6", + "@babel/helper-define-polyfill-provider": "^0.5.0", + "semver": "^6.3.1" + }, + "dependencies": { + "semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true + } + } + }, + "babel-plugin-polyfill-corejs3": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.9.0.tgz", + "integrity": "sha512-7nZPG1uzK2Ymhy/NbaOWTg3uibM2BmGASS4vHS4szRZAIR8R6GwA/xAujpdrXU5iyklrimWnLWU+BLF9suPTqg==", + "dev": true, + "requires": { + "@babel/helper-define-polyfill-provider": "^0.5.0", + "core-js-compat": "^3.34.0" + } + }, + "babel-plugin-polyfill-regenerator": { + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.5.5.tgz", + "integrity": "sha512-OJGYZlhLqBh2DDHeqAxWB1XIvr49CxiJ2gIt61/PU55CQK4Z58OzMqjDe1zwQdQk+rBYsRc+1rJmdajM3gimHg==", + "dev": true, + "requires": { + "@babel/helper-define-polyfill-provider": "^0.5.0" + } + }, "balanced-match": { "version": "1.0.0", "dev": true @@ -6605,13 +9431,15 @@ } }, "browserslist": { - "version": "4.21.5", + "version": "4.22.3", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.22.3.tgz", + "integrity": "sha512-UAp55yfwNv0klWNapjs/ktHoguxuQNGnOzxYmfnXIS+8AsRDZkSDxg7R1AX3GKzn078SBI5dzwzj/Yx0Or0e3A==", "dev": true, "requires": { - "caniuse-lite": "^1.0.30001449", - "electron-to-chromium": "^1.4.284", - "node-releases": "^2.0.8", - "update-browserslist-db": "^1.0.10" + "caniuse-lite": "^1.0.30001580", + "electron-to-chromium": "^1.4.648", + "node-releases": "^2.0.14", + "update-browserslist-db": "^1.0.13" } }, "buffer": { @@ -6669,7 +9497,9 @@ "dev": true }, "caniuse-lite": { - "version": "1.0.30001460", + "version": "1.0.30001581", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001581.tgz", + "integrity": "sha512-whlTkwhqV2tUmP3oYhtNfaWGYHDdS3JYFQBKXxcUR9qqPWsRhFHhoISO2Xnl/g0xyKzht9mI1LZpiNWfMzHixQ==", "dev": true }, "chai": { @@ -6768,6 +9598,12 @@ "source-map": "~0.5.3" } }, + "commander": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz", + "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==", + "dev": true + }, "commondir": { "version": "1.0.1", "dev": true @@ -6832,6 +9668,15 @@ "version": "0.4.2", "dev": true }, + "core-js-compat": { + "version": "3.35.1", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.35.1.tgz", + "integrity": "sha512-sftHa5qUJY3rs9Zht1WEnmkvXputCyDBczPnr7QDgL8n3qrF3CMXY4VPSYtOLLiOUJcah2WNXREd48iOl6mQIw==", + "dev": true, + "requires": { + "browserslist": "^4.22.2" + } + }, "core-util-is": { "version": "1.0.2", "dev": true @@ -7081,7 +9926,9 @@ "dev": true }, "electron-to-chromium": { - "version": "1.4.317", + "version": "1.4.651", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.651.tgz", + "integrity": "sha512-jjks7Xx+4I7dslwsbaFocSwqBbGHQmuXBJUK9QBZTIrzPq3pzn6Uf2szFSP728FtLYE3ldiccmlkOM/zhGKCpA==", "dev": true }, "elliptic": { @@ -7499,6 +10346,12 @@ "universalify": "^0.1.0" } }, + "fs-readdir-recursive": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/fs-readdir-recursive/-/fs-readdir-recursive-1.1.0.tgz", + "integrity": "sha512-GNanXlVr2pf02+sPN40XN8HG+ePaNcvM0q5mZBd668Obwb0yD5GiUbZOFgwn8kGMY6I3mdyDJzieUy3PTYyTRA==", + "dev": true + }, "fs.realpath": { "version": "1.0.0", "dev": true @@ -7509,7 +10362,9 @@ "optional": true }, "function-bind": { - "version": "1.1.1", + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", "dev": true }, "gensync": { @@ -7635,6 +10490,15 @@ } } }, + "hasown": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.0.tgz", + "integrity": "sha512-vUptKVTpIJhcczKBbgnS+RtcuYMB8+oNzPK2/Hp3hanz8JmpATdmmgLgSaadVREkDm+e2giHwY3ZRkyjSIDDFA==", + "dev": true, + "requires": { + "function-bind": "^1.1.2" + } + }, "he": { "version": "1.2.0", "dev": true @@ -7798,6 +10662,15 @@ "version": "1.1.6", "dev": true }, + "is-core-module": { + "version": "2.13.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.1.tgz", + "integrity": "sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==", + "dev": true, + "requires": { + "hasown": "^2.0.0" + } + }, "is-extglob": { "version": "2.1.1", "dev": true @@ -7957,6 +10830,8 @@ }, "jsesc": { "version": "2.5.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", + "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", "dev": true }, "jshint": { @@ -8169,6 +11044,12 @@ "version": "4.17.21", "dev": true }, + "lodash.debounce": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", + "integrity": "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==", + "dev": true + }, "lodash.flattendeep": { "version": "4.4.0", "dev": true @@ -8240,6 +11121,8 @@ }, "lru-cache": { "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", "dev": true, "requires": { "yallist": "^3.0.2" @@ -8489,7 +11372,9 @@ } }, "node-releases": { - "version": "2.0.10", + "version": "2.0.14", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.14.tgz", + "integrity": "sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==", "dev": true }, "normalize-path": { @@ -8778,12 +11663,20 @@ }, "picocolors": { "version": "1.0.0", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", + "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", "dev": true }, "picomatch": { "version": "2.3.1", "dev": true }, + "pify": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", + "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", + "dev": true + }, "pkg-dir": { "version": "4.2.0", "dev": true, @@ -8956,10 +11849,71 @@ "picomatch": "^2.2.1" } }, + "regenerate": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz", + "integrity": "sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==", + "dev": true + }, + "regenerate-unicode-properties": { + "version": "10.1.1", + "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-10.1.1.tgz", + "integrity": "sha512-X007RyZLsCJVVrjgEFVpLUTZwyOZk3oiL75ZcuYjlIWd6rNJtOjkBwQc5AsRrpbKVkxN6sklw/k/9m2jJYOf8Q==", + "dev": true, + "requires": { + "regenerate": "^1.4.2" + } + }, + "regenerator-runtime": { + "version": "0.14.1", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz", + "integrity": "sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==", + "dev": true + }, + "regenerator-transform": { + "version": "0.15.2", + "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.15.2.tgz", + "integrity": "sha512-hfMp2BoF0qOk3uc5V20ALGDS2ddjQaLrdl7xrGXvAIow7qeWRM2VA2HuCHkUKk9slq3VwEwLNK3DFBqDfPGYtg==", + "dev": true, + "requires": { + "@babel/runtime": "^7.8.4" + } + }, "regexpp": { "version": "3.2.0", "dev": true }, + "regexpu-core": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-5.3.2.tgz", + "integrity": "sha512-RAM5FlZz+Lhmo7db9L298p2vHP5ZywrVXmVXpmAD9GuL5MPH6t9ROw1iA/wfHkQ76Qe7AaPF0nGuim96/IrQMQ==", + "dev": true, + "requires": { + "@babel/regjsgen": "^0.8.0", + "regenerate": "^1.4.2", + "regenerate-unicode-properties": "^10.1.0", + "regjsparser": "^0.9.1", + "unicode-match-property-ecmascript": "^2.0.0", + "unicode-match-property-value-ecmascript": "^2.1.0" + } + }, + "regjsparser": { + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.9.1.tgz", + "integrity": "sha512-dQUtn90WanSNl+7mQKcXAgZxvUe7Z0SqXlgzv0za4LwiUhyzBC58yQO3liFoUgu8GiJVInAhJjkj1N0EtQ5nkQ==", + "dev": true, + "requires": { + "jsesc": "~0.5.0" + }, + "dependencies": { + "jsesc": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", + "integrity": "sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA==", + "dev": true + } + } + }, "release-zalgo": { "version": "1.0.0", "dev": true, @@ -8984,10 +11938,14 @@ "dev": true }, "resolve": { - "version": "1.12.0", + "version": "1.22.8", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", + "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==", "dev": true, "requires": { - "path-parse": "^1.0.6" + "is-core-module": "^2.13.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" } }, "resolve-from": { @@ -9127,6 +12085,12 @@ "version": "1.0.0", "dev": true }, + "slash": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-2.0.0.tgz", + "integrity": "sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A==", + "dev": true + }, "socket.io": { "version": "4.6.1", "dev": true, @@ -9324,6 +12288,12 @@ "has-flag": "^3.0.0" } }, + "supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "dev": true + }, "syntax-error": { "version": "1.4.0", "dev": true, @@ -9372,6 +12342,8 @@ }, "to-fast-properties": { "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==", "dev": true }, "to-regex-range": { @@ -9439,6 +12411,34 @@ "xtend": "^4.0.1" } }, + "unicode-canonical-property-names-ecmascript": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.0.tgz", + "integrity": "sha512-yY5PpDlfVIU5+y/BSCxAJRBIS1Zc2dDG3Ujq+sR0U+JjUevW2JhocOF+soROYDSaAezOzOKuyyixhD6mBknSmQ==", + "dev": true + }, + "unicode-match-property-ecmascript": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-2.0.0.tgz", + "integrity": "sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==", + "dev": true, + "requires": { + "unicode-canonical-property-names-ecmascript": "^2.0.0", + "unicode-property-aliases-ecmascript": "^2.0.0" + } + }, + "unicode-match-property-value-ecmascript": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.1.0.tgz", + "integrity": "sha512-qxkjQt6qjg/mYscYMC0XKRn3Rh0wFPlfxB0xkt9CfyTvpX1Ra0+rAmdX2QyAobptSEvuy4RtpPRui6XkV+8wjA==", + "dev": true + }, + "unicode-property-aliases-ecmascript": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.1.0.tgz", + "integrity": "sha512-6t3foTQI9qne+OZoVQB/8x8rk2k1eVy1gRXhV3oFQ5T6R1dqQ1xtin3XqSlx3+ATBkliTaR/hHyJBm+LVPNM8w==", + "dev": true + }, "universalify": { "version": "0.1.2", "dev": true @@ -9448,7 +12448,9 @@ "dev": true }, "update-browserslist-db": { - "version": "1.0.10", + "version": "1.0.13", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.13.tgz", + "integrity": "sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==", "dev": true, "requires": { "escalade": "^3.1.1", @@ -9598,6 +12600,8 @@ }, "yallist": { "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", "dev": true }, "yargs": { diff --git a/package.json b/package.json index 43d5c942..54cd072e 100644 --- a/package.json +++ b/package.json @@ -24,6 +24,10 @@ "algorithms" ], "devDependencies": { + "@babel/cli": "^7.23.9", + "@babel/core": "^7.23.9", + "@babel/plugin-transform-modules-commonjs": "^7.23.3", + "@babel/preset-env": "^7.23.9", "benchmark": "2.1.4", "browserify": "16.5.1", "chai": "^4.3.6", From 2b52bf24250dcec98131f7f7dd99d384c3b87c3f Mon Sep 17 00:00:00 2001 From: Andrew Pikul Date: Wed, 31 Jan 2024 08:32:03 -0500 Subject: [PATCH 44/85] Modify Makefile so all tests always run: There are instances where this wouldn't be desired. Should probably adopt a test runner. --- Makefile | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Makefile b/Makefile index 7b3bded5..7d5fc1a4 100644 --- a/Makefile +++ b/Makefile @@ -40,11 +40,11 @@ $(DIRS): test: unit-test browser-test unit-test: $(SRC_FILES) $(TEST_FILES) node_modules | $(BUILD_DIR) - $(NYC) $(MOCHA) --dir $(COVERAGE_DIR) -- $(MOCHA_OPTS) $(TEST_FILES) || $(MOCHA) $(MOCHA_OPTS) $(TEST_FILES) + -$(NYC) $(MOCHA) --dir $(COVERAGE_DIR) -- $(MOCHA_OPTS) $(TEST_FILES) || $(MOCHA) $(MOCHA_OPTS) $(TEST_FILES) browser-test: $(BUILD_DIR)/$(MOD).js $(BUILD_DIR)/$(MOD).core.js - $(KARMA) start --single-run $(KARMA_OPTS) - $(KARMA) start karma.core.conf.js --single-run $(KARMA_OPTS) + -$(KARMA) start --single-run $(KARMA_OPTS) + -$(KARMA) start karma.core.conf.js --single-run $(KARMA_OPTS) bower.json: package.json src/release/make-bower.json.js @src/release/make-bower.json.js > $@ From b4535fc9e65e1a95f9a8bb251e19bc936cf2e165 Mon Sep 17 00:00:00 2001 From: Andrew Pikul Date: Wed, 31 Jan 2024 08:44:08 -0500 Subject: [PATCH 45/85] Transpile new ESM for first time --- .babelrc | 4 + Makefile | 10 +- lib/alg/components.js | 13 +- lib/alg/dfs.js | 32 +- lib/alg/dijkstra-all.js | 15 +- lib/alg/dijkstra.js | 45 +- lib/alg/find-cycles.js | 14 +- lib/alg/floyd-warshall.js | 46 +- lib/alg/index.js | 94 ++- lib/alg/is-acyclic.js | 14 +- lib/alg/postorder.js | 12 +- lib/alg/preorder.js | 12 +- lib/alg/prim.js | 26 +- lib/alg/tarjan.js | 17 +- lib/alg/topsort.js | 42 +- lib/data/priority-queue.js | 301 +++++--- lib/graph.js | 1277 ++++++++++++++++++-------------- lib/index.js | 33 +- lib/json.js | 41 +- lib/version.js | 9 +- mjs-lib/alg/components.js | 23 + mjs-lib/alg/dfs.js | 65 ++ mjs-lib/alg/dijkstra-all.js | 9 + mjs-lib/alg/dijkstra.js | 52 ++ mjs-lib/alg/find-cycles.js | 7 + mjs-lib/alg/floyd-warshall.js | 46 ++ mjs-lib/alg/index.js | 11 + mjs-lib/alg/is-acyclic.js | 13 + mjs-lib/alg/postorder.js | 5 + mjs-lib/alg/preorder.js | 5 + mjs-lib/alg/prim.js | 49 ++ mjs-lib/alg/tarjan.js | 43 ++ mjs-lib/alg/topsort.js | 35 + mjs-lib/data/priority-queue.js | 148 ++++ mjs-lib/graph.js | 694 +++++++++++++++++ mjs-lib/index.js | 5 + mjs-lib/json.js | 75 ++ mjs-lib/version.js | 2 + old-lib/alg/components.js | 25 + old-lib/alg/dfs.js | 67 ++ old-lib/alg/dijkstra-all.js | 10 + old-lib/alg/dijkstra.js | 53 ++ old-lib/alg/find-cycles.js | 9 + old-lib/alg/floyd-warshall.js | 48 ++ old-lib/alg/index.js | 13 + old-lib/alg/is-acyclic.js | 15 + old-lib/alg/postorder.js | 7 + old-lib/alg/preorder.js | 7 + old-lib/alg/prim.js | 51 ++ old-lib/alg/tarjan.js | 45 ++ old-lib/alg/topsort.js | 36 + old-lib/data/priority-queue.js | 150 ++++ old-lib/graph.js | 696 +++++++++++++++++ old-lib/index.js | 5 + old-lib/json.js | 80 ++ old-lib/version.js | 1 + 56 files changed, 3835 insertions(+), 827 deletions(-) create mode 100644 .babelrc create mode 100644 mjs-lib/alg/components.js create mode 100644 mjs-lib/alg/dfs.js create mode 100644 mjs-lib/alg/dijkstra-all.js create mode 100644 mjs-lib/alg/dijkstra.js create mode 100644 mjs-lib/alg/find-cycles.js create mode 100644 mjs-lib/alg/floyd-warshall.js create mode 100644 mjs-lib/alg/index.js create mode 100644 mjs-lib/alg/is-acyclic.js create mode 100644 mjs-lib/alg/postorder.js create mode 100644 mjs-lib/alg/preorder.js create mode 100644 mjs-lib/alg/prim.js create mode 100644 mjs-lib/alg/tarjan.js create mode 100644 mjs-lib/alg/topsort.js create mode 100644 mjs-lib/data/priority-queue.js create mode 100644 mjs-lib/graph.js create mode 100644 mjs-lib/index.js create mode 100644 mjs-lib/json.js create mode 100644 mjs-lib/version.js create mode 100644 old-lib/alg/components.js create mode 100644 old-lib/alg/dfs.js create mode 100644 old-lib/alg/dijkstra-all.js create mode 100644 old-lib/alg/dijkstra.js create mode 100644 old-lib/alg/find-cycles.js create mode 100644 old-lib/alg/floyd-warshall.js create mode 100644 old-lib/alg/index.js create mode 100644 old-lib/alg/is-acyclic.js create mode 100644 old-lib/alg/postorder.js create mode 100644 old-lib/alg/preorder.js create mode 100644 old-lib/alg/prim.js create mode 100644 old-lib/alg/tarjan.js create mode 100644 old-lib/alg/topsort.js create mode 100644 old-lib/data/priority-queue.js create mode 100644 old-lib/graph.js create mode 100644 old-lib/index.js create mode 100644 old-lib/json.js create mode 100644 old-lib/version.js diff --git a/.babelrc b/.babelrc new file mode 100644 index 00000000..d6047238 --- /dev/null +++ b/.babelrc @@ -0,0 +1,4 @@ +{ + "presets": ["@babel/preset-env"], + "plugins": ["@babel/plugin-transform-modules-commonjs"] +} diff --git a/Makefile b/Makefile index 7d5fc1a4..9d41c7c7 100644 --- a/Makefile +++ b/Makefile @@ -16,7 +16,8 @@ BUILD_DIR = build COVERAGE_DIR = ./.nyc_output DIST_DIR = dist -SRC_FILES = index.js lib/version.js $(shell find lib -type f -name '*.js') +# Why is this doubled up? +SRC_FILES = lib/index.js lib/version.js $(shell find lib -type f -name '*.js') TEST_FILES = $(shell find test -type f -name '*.js' | grep -v 'bundle-test.js' | grep -v 'test-main.js') BUILD_FILES = $(addprefix $(BUILD_DIR)/, \ $(MOD).js $(MOD).min.js \ @@ -24,7 +25,7 @@ BUILD_FILES = $(addprefix $(BUILD_DIR)/, \ DIRS = $(BUILD_DIR) -.PHONY: all bench clean browser-test unit-test test dist +.PHONY: all bench clean browser-test unit-test test dist convert all: unit-test lint @@ -82,3 +83,8 @@ clean: node_modules: package.json @$(NPM) install @touch $@ + +convert: mjs-lib/*.js mjs-lib/**/*.js + rm -rf lib; mkdir lib + for f in mjs-lib/**/*.js mjs-lib/*.js; do echo "$${f} > lib$${f/mjs-lib/}"; npx babel "$${f}" -o "lib$${f/mjs-lib/}"; done + diff --git a/lib/alg/components.js b/lib/alg/components.js index 766cdad6..7d8225ed 100644 --- a/lib/alg/components.js +++ b/lib/alg/components.js @@ -1,8 +1,13 @@ -export default function components(g) { +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports["default"] = components; +function components(g) { var visited = {}; var cmpts = []; var cmpt; - function dfs(v) { if (visited.hasOwnProperty(v)) return; visited[v] = true; @@ -10,14 +15,12 @@ export default function components(g) { g.successors(v).forEach(dfs); g.predecessors(v).forEach(dfs); } - - g.nodes().forEach(function(v) { + g.nodes().forEach(function (v) { cmpt = []; dfs(v); if (cmpt.length) { cmpts.push(cmpt); } }); - return cmpts; } diff --git a/lib/alg/dfs.js b/lib/alg/dfs.js index d109bbf0..59100b95 100644 --- a/lib/alg/dfs.js +++ b/lib/alg/dfs.js @@ -1,3 +1,9 @@ +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports["default"] = dfs; /* * A helper that preforms a pre- or post-order traversal on the input graph * and returns the nodes in the order they were visited. If the graph is @@ -6,27 +12,26 @@ * * If the order is not "post", it will be treated as "pre". */ -export default function dfs(g, vs, order) { +function dfs(g, vs, order) { if (!Array.isArray(vs)) { vs = [vs]; } - - var navigation = g.isDirected() ? v => g.successors(v) : v => g.neighbors(v); + var navigation = g.isDirected() ? function (v) { + return g.successors(v); + } : function (v) { + return g.neighbors(v); + }; var orderFunc = order === "post" ? postOrderDfs : preOrderDfs; - var acc = []; var visited = {}; - vs.forEach(v => { + vs.forEach(function (v) { if (!g.hasNode(v)) { throw new Error("Graph does not have node: " + v); } - orderFunc(v, navigation, visited, acc); }); - return acc; } - function postOrderDfs(v, navigation, visited, acc) { var stack = [[v, false]]; while (stack.length > 0) { @@ -37,12 +42,13 @@ function postOrderDfs(v, navigation, visited, acc) { if (!visited.hasOwnProperty(curr[0])) { visited[curr[0]] = true; stack.push([curr[0], true]); - forEachRight(navigation(curr[0]), w => stack.push([w, false])); + forEachRight(navigation(curr[0]), function (w) { + return stack.push([w, false]); + }); } } } } - function preOrderDfs(v, navigation, visited, acc) { var stack = [v]; while (stack.length > 0) { @@ -50,16 +56,16 @@ function preOrderDfs(v, navigation, visited, acc) { if (!visited.hasOwnProperty(curr)) { visited[curr] = true; acc.push(curr); - forEachRight(navigation(curr), w => stack.push(w)); + forEachRight(navigation(curr), function (w) { + return stack.push(w); + }); } } } - function forEachRight(array, iteratee) { var length = array.length; while (length--) { iteratee(array[length], length, array); } - return array; } diff --git a/lib/alg/dijkstra-all.js b/lib/alg/dijkstra-all.js index ef827bce..de272384 100644 --- a/lib/alg/dijkstra-all.js +++ b/lib/alg/dijkstra-all.js @@ -1,9 +1,14 @@ -import { default as dijkstra } from "./dijkstra.js"; +"use strict"; - -export default function dijkstraAll(g, weightFunc, edgeFunc) { - return g.nodes().reduce(function(acc, v) { - acc[v] = dijkstra(g, v, weightFunc, edgeFunc); +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports["default"] = dijkstraAll; +var _dijkstra = _interopRequireDefault(require("./dijkstra.js")); +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; } +function dijkstraAll(g, weightFunc, edgeFunc) { + return g.nodes().reduce(function (acc, v) { + acc[v] = (0, _dijkstra["default"])(g, v, weightFunc, edgeFunc); return acc; }, {}); } diff --git a/lib/alg/dijkstra.js b/lib/alg/dijkstra.js index ec646c3f..f347aab0 100644 --- a/lib/alg/dijkstra.js +++ b/lib/alg/dijkstra.js @@ -1,52 +1,51 @@ -import { default as PriorityQueue } from "../data/priority-queue.js"; - - -var DEFAULT_WEIGHT_FUNC = () => 1; - -export default function dijkstra(g, source, weightFn, edgeFn) { - return runDijkstra(g, String(source), - weightFn || DEFAULT_WEIGHT_FUNC, - edgeFn || function(v) { return g.outEdges(v); }); +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports["default"] = dijkstra; +var _priorityQueue = _interopRequireDefault(require("../data/priority-queue.js")); +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; } +var DEFAULT_WEIGHT_FUNC = function DEFAULT_WEIGHT_FUNC() { + return 1; +}; +function dijkstra(g, source, weightFn, edgeFn) { + return runDijkstra(g, String(source), weightFn || DEFAULT_WEIGHT_FUNC, edgeFn || function (v) { + return g.outEdges(v); + }); } - function runDijkstra(g, source, weightFn, edgeFn) { var results = {}; - var pq = new PriorityQueue(); + var pq = new _priorityQueue["default"](); var v, vEntry; - - var updateNeighbors = function(edge) { + var updateNeighbors = function updateNeighbors(edge) { var w = edge.v !== v ? edge.v : edge.w; var wEntry = results[w]; var weight = weightFn(edge); var distance = vEntry.distance + weight; - if (weight < 0) { - throw new Error("dijkstra does not allow negative edge weights. " + - "Bad edge: " + edge + " Weight: " + weight); + throw new Error("dijkstra does not allow negative edge weights. " + "Bad edge: " + edge + " Weight: " + weight); } - if (distance < wEntry.distance) { wEntry.distance = distance; wEntry.predecessor = v; pq.decrease(w, distance); } }; - - g.nodes().forEach(function(v) { + g.nodes().forEach(function (v) { var distance = v === source ? 0 : Number.POSITIVE_INFINITY; - results[v] = { distance: distance }; + results[v] = { + distance: distance + }; pq.add(v, distance); }); - while (pq.size() > 0) { v = pq.removeMin(); vEntry = results[v]; if (vEntry.distance === Number.POSITIVE_INFINITY) { break; } - edgeFn(v).forEach(updateNeighbors); } - return results; } diff --git a/lib/alg/find-cycles.js b/lib/alg/find-cycles.js index 42a37d4b..8655129c 100644 --- a/lib/alg/find-cycles.js +++ b/lib/alg/find-cycles.js @@ -1,7 +1,13 @@ -import { default as tarjan } from "./tarjan.js"; +"use strict"; -export default function findCycles(g) { - return tarjan(g).filter(function(cmpt) { - return cmpt.length > 1 || (cmpt.length === 1 && g.hasEdge(cmpt[0], cmpt[0])); +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports["default"] = findCycles; +var _tarjan = _interopRequireDefault(require("./tarjan.js")); +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; } +function findCycles(g) { + return (0, _tarjan["default"])(g).filter(function (cmpt) { + return cmpt.length > 1 || cmpt.length === 1 && g.hasEdge(cmpt[0], cmpt[0]); }); } diff --git a/lib/alg/floyd-warshall.js b/lib/alg/floyd-warshall.js index c014b0bf..c0fde638 100644 --- a/lib/alg/floyd-warshall.js +++ b/lib/alg/floyd-warshall.js @@ -1,35 +1,46 @@ -var DEFAULT_WEIGHT_FUNC = () => 1; +"use strict"; -export default function floydWarshall(g, weightFn, edgeFn) { - return runFloydWarshall(g, - weightFn || DEFAULT_WEIGHT_FUNC, - edgeFn || function(v) { return g.outEdges(v); }); +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports["default"] = floydWarshall; +var DEFAULT_WEIGHT_FUNC = function DEFAULT_WEIGHT_FUNC() { + return 1; +}; +function floydWarshall(g, weightFn, edgeFn) { + return runFloydWarshall(g, weightFn || DEFAULT_WEIGHT_FUNC, edgeFn || function (v) { + return g.outEdges(v); + }); } - function runFloydWarshall(g, weightFn, edgeFn) { var results = {}; var nodes = g.nodes(); - - nodes.forEach(function(v) { + nodes.forEach(function (v) { results[v] = {}; - results[v][v] = { distance: 0 }; - nodes.forEach(function(w) { + results[v][v] = { + distance: 0 + }; + nodes.forEach(function (w) { if (v !== w) { - results[v][w] = { distance: Number.POSITIVE_INFINITY }; + results[v][w] = { + distance: Number.POSITIVE_INFINITY + }; } }); - edgeFn(v).forEach(function(edge) { + edgeFn(v).forEach(function (edge) { var w = edge.v === v ? edge.w : edge.v; var d = weightFn(edge); - results[v][w] = { distance: d, predecessor: v }; + results[v][w] = { + distance: d, + predecessor: v + }; }); }); - - nodes.forEach(function(k) { + nodes.forEach(function (k) { var rowK = results[k]; - nodes.forEach(function(i) { + nodes.forEach(function (i) { var rowI = results[i]; - nodes.forEach(function(j) { + nodes.forEach(function (j) { var ik = rowI[k]; var kj = rowK[j]; var ij = rowI[j]; @@ -41,6 +52,5 @@ function runFloydWarshall(g, weightFn, edgeFn) { }); }); }); - return results; } diff --git a/lib/alg/index.js b/lib/alg/index.js index e8c9abde..8af71b48 100644 --- a/lib/alg/index.js +++ b/lib/alg/index.js @@ -1,11 +1,83 @@ -export { default as components } from "./components.js"; -export { default as dijkstra } from "./dijkstra.js"; -export { default as dijkstraAll } from "./dijkstra-all.js"; -export { default as findCycles } from "./find-cycles.js"; -export { default as floydWarshall } from "./floyd-warshall.js"; -export { default as isAcyclic } from "./is-acyclic.js"; -export { default as postorder } from "./postorder.js"; -export { default as preorder } from "./preorder.js"; -export { default as prim } from "./prim.js"; -export { default as tarjan } from "./tarjan.js"; -export { default as topsort } from "./topsort.js"; +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +Object.defineProperty(exports, "components", { + enumerable: true, + get: function get() { + return _components["default"]; + } +}); +Object.defineProperty(exports, "dijkstra", { + enumerable: true, + get: function get() { + return _dijkstra["default"]; + } +}); +Object.defineProperty(exports, "dijkstraAll", { + enumerable: true, + get: function get() { + return _dijkstraAll["default"]; + } +}); +Object.defineProperty(exports, "findCycles", { + enumerable: true, + get: function get() { + return _findCycles["default"]; + } +}); +Object.defineProperty(exports, "floydWarshall", { + enumerable: true, + get: function get() { + return _floydWarshall["default"]; + } +}); +Object.defineProperty(exports, "isAcyclic", { + enumerable: true, + get: function get() { + return _isAcyclic["default"]; + } +}); +Object.defineProperty(exports, "postorder", { + enumerable: true, + get: function get() { + return _postorder["default"]; + } +}); +Object.defineProperty(exports, "preorder", { + enumerable: true, + get: function get() { + return _preorder["default"]; + } +}); +Object.defineProperty(exports, "prim", { + enumerable: true, + get: function get() { + return _prim["default"]; + } +}); +Object.defineProperty(exports, "tarjan", { + enumerable: true, + get: function get() { + return _tarjan["default"]; + } +}); +Object.defineProperty(exports, "topsort", { + enumerable: true, + get: function get() { + return _topsort["default"]; + } +}); +var _components = _interopRequireDefault(require("./components.js")); +var _dijkstra = _interopRequireDefault(require("./dijkstra.js")); +var _dijkstraAll = _interopRequireDefault(require("./dijkstra-all.js")); +var _findCycles = _interopRequireDefault(require("./find-cycles.js")); +var _floydWarshall = _interopRequireDefault(require("./floyd-warshall.js")); +var _isAcyclic = _interopRequireDefault(require("./is-acyclic.js")); +var _postorder = _interopRequireDefault(require("./postorder.js")); +var _preorder = _interopRequireDefault(require("./preorder.js")); +var _prim = _interopRequireDefault(require("./prim.js")); +var _tarjan = _interopRequireDefault(require("./tarjan.js")); +var _topsort = _interopRequireDefault(require("./topsort.js")); +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; } diff --git a/lib/alg/is-acyclic.js b/lib/alg/is-acyclic.js index e3467560..d626aba8 100644 --- a/lib/alg/is-acyclic.js +++ b/lib/alg/is-acyclic.js @@ -1,10 +1,16 @@ -import { default as topsort } from "./topsort.js"; +"use strict"; -export default function isAcyclic(g) { +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports["default"] = isAcyclic; +var _topsort = _interopRequireDefault(require("./topsort.js")); +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; } +function isAcyclic(g) { try { - topsort(g); + (0, _topsort["default"])(g); } catch (e) { - if (e instanceof topsort.CycleException) { + if (e instanceof _topsort["default"].CycleException) { return false; } throw e; diff --git a/lib/alg/postorder.js b/lib/alg/postorder.js index 23830a43..157125ab 100644 --- a/lib/alg/postorder.js +++ b/lib/alg/postorder.js @@ -1,5 +1,11 @@ -import { default as dfs } from "./dfs.js"; +"use strict"; -export default function postorder(g, vs) { - return dfs(g, vs, "post"); +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports["default"] = postorder; +var _dfs = _interopRequireDefault(require("./dfs.js")); +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; } +function postorder(g, vs) { + return (0, _dfs["default"])(g, vs, "post"); } diff --git a/lib/alg/preorder.js b/lib/alg/preorder.js index 472ba468..327e18f6 100644 --- a/lib/alg/preorder.js +++ b/lib/alg/preorder.js @@ -1,5 +1,11 @@ -import { default as dfs } from "./dfs.js"; +"use strict"; -export default function preorder(g, vs) { - return dfs(g, vs, "pre"); +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports["default"] = preorder; +var _dfs = _interopRequireDefault(require("./dfs.js")); +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; } +function preorder(g, vs) { + return (0, _dfs["default"])(g, vs, "pre"); } diff --git a/lib/alg/prim.js b/lib/alg/prim.js index ce22020c..2cf56fe7 100644 --- a/lib/alg/prim.js +++ b/lib/alg/prim.js @@ -1,12 +1,17 @@ -import { default as Graph } from "../graph.js"; -import { default as PriorityQueue } from "../data/priority-queue.js"; - -export default function prim(g, weightFunc) { - var result = new Graph(); +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports["default"] = prim; +var _graph = _interopRequireDefault(require("../graph.js")); +var _priorityQueue = _interopRequireDefault(require("../data/priority-queue.js")); +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; } +function prim(g, weightFunc) { + var result = new _graph["default"](); var parents = {}; - var pq = new PriorityQueue(); + var pq = new _priorityQueue["default"](); var v; - function updateNeighbors(edge) { var w = edge.v === v ? edge.w : edge.v; var pri = pq.priority(w); @@ -18,19 +23,16 @@ export default function prim(g, weightFunc) { } } } - if (g.nodeCount() === 0) { return result; } - - g.nodes().forEach(function(v) { + g.nodes().forEach(function (v) { pq.add(v, Number.POSITIVE_INFINITY); result.setNode(v); }); // Start from an arbitrary node pq.decrease(g.nodes()[0], 0); - var init = false; while (pq.size() > 0) { v = pq.removeMin(); @@ -41,9 +43,7 @@ export default function prim(g, weightFunc) { } else { init = true; } - g.nodeEdges(v).forEach(updateNeighbors); } - return result; } diff --git a/lib/alg/tarjan.js b/lib/alg/tarjan.js index e38e1a34..8a02f782 100644 --- a/lib/alg/tarjan.js +++ b/lib/alg/tarjan.js @@ -1,9 +1,14 @@ -export default function tarjan(g) { +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports["default"] = tarjan; +function tarjan(g) { var index = 0; var stack = []; var visited = {}; // node id -> { onStack, lowlink, index } var results = []; - function dfs(v) { var entry = visited[v] = { onStack: true, @@ -11,8 +16,7 @@ export default function tarjan(g) { index: index++ }; stack.push(v); - - g.successors(v).forEach(function(w) { + g.successors(v).forEach(function (w) { if (!visited.hasOwnProperty(w)) { dfs(w); entry.lowlink = Math.min(entry.lowlink, visited[w].lowlink); @@ -20,7 +24,6 @@ export default function tarjan(g) { entry.lowlink = Math.min(entry.lowlink, visited[w].index); } }); - if (entry.lowlink === entry.index) { var cmpt = []; var w; @@ -32,12 +35,10 @@ export default function tarjan(g) { results.push(cmpt); } } - - g.nodes().forEach(function(v) { + g.nodes().forEach(function (v) { if (!visited.hasOwnProperty(v)) { dfs(v); } }); - return results; } diff --git a/lib/alg/topsort.js b/lib/alg/topsort.js index cba234ec..06d8f8e2 100644 --- a/lib/alg/topsort.js +++ b/lib/alg/topsort.js @@ -1,13 +1,33 @@ -export default function topsort(g) { +"use strict"; + +function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, _typeof(o); } +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports["default"] = topsort; +function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, _toPropertyKey(descriptor.key), descriptor); } } +function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; } +function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == _typeof(i) ? i : String(i); } +function _toPrimitive(t, r) { if ("object" != _typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != _typeof(i)) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); } +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } +function _callSuper(t, o, e) { return o = _getPrototypeOf(o), _possibleConstructorReturn(t, _isNativeReflectConstruct() ? Reflect.construct(o, e || [], _getPrototypeOf(t).constructor) : o.apply(t, e)); } +function _possibleConstructorReturn(self, call) { if (call && (_typeof(call) === "object" || typeof call === "function")) { return call; } else if (call !== void 0) { throw new TypeError("Derived constructors may only return object or undefined"); } return _assertThisInitialized(self); } +function _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; } +function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); Object.defineProperty(subClass, "prototype", { writable: false }); if (superClass) _setPrototypeOf(subClass, superClass); } +function _wrapNativeSuper(Class) { var _cache = typeof Map === "function" ? new Map() : undefined; _wrapNativeSuper = function _wrapNativeSuper(Class) { if (Class === null || !_isNativeFunction(Class)) return Class; if (typeof Class !== "function") { throw new TypeError("Super expression must either be null or a function"); } if (typeof _cache !== "undefined") { if (_cache.has(Class)) return _cache.get(Class); _cache.set(Class, Wrapper); } function Wrapper() { return _construct(Class, arguments, _getPrototypeOf(this).constructor); } Wrapper.prototype = Object.create(Class.prototype, { constructor: { value: Wrapper, enumerable: false, writable: true, configurable: true } }); return _setPrototypeOf(Wrapper, Class); }; return _wrapNativeSuper(Class); } +function _construct(t, e, r) { if (_isNativeReflectConstruct()) return Reflect.construct.apply(null, arguments); var o = [null]; o.push.apply(o, e); var p = new (t.bind.apply(t, o))(); return r && _setPrototypeOf(p, r.prototype), p; } +function _isNativeReflectConstruct() { try { var t = !Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); } catch (t) {} return (_isNativeReflectConstruct = function _isNativeReflectConstruct() { return !!t; })(); } +function _isNativeFunction(fn) { try { return Function.toString.call(fn).indexOf("[native code]") !== -1; } catch (e) { return typeof fn === "function"; } } +function _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf ? Object.setPrototypeOf.bind() : function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); } +function _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf.bind() : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf(o); } +function topsort(g) { var visited = {}; var stack = {}; var results = []; - function visit(node) { if (stack.hasOwnProperty(node)) { throw new CycleException(); } - if (!visited.hasOwnProperty(node)) { stack[node] = true; visited[node] = true; @@ -16,20 +36,18 @@ export default function topsort(g) { results.push(node); } } - g.sinks().forEach(visit); - if (Object.keys(visited).length !== g.nodeCount()) { throw new CycleException(); } - return results; } - -class CycleException extends Error { - constructor() { - super(...arguments); +var CycleException = /*#__PURE__*/function (_Error) { + _inherits(CycleException, _Error); + function CycleException() { + _classCallCheck(this, CycleException); + return _callSuper(this, CycleException, arguments); } -} - + return _createClass(CycleException); +}( /*#__PURE__*/_wrapNativeSuper(Error)); topsort.CycleException = CycleException; diff --git a/lib/data/priority-queue.js b/lib/data/priority-queue.js index 13b2b5f0..124a360a 100644 --- a/lib/data/priority-queue.js +++ b/lib/data/priority-queue.js @@ -1,3 +1,27 @@ +"use strict"; + +function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, _typeof(o); } +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports["default"] = void 0; +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } +function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, _toPropertyKey(descriptor.key), descriptor); } } +function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; } +function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == _typeof(i) ? i : String(i); } +function _toPrimitive(t, r) { if ("object" != _typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != _typeof(i)) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); } +function _classPrivateMethodInitSpec(obj, privateSet) { _checkPrivateRedeclaration(obj, privateSet); privateSet.add(obj); } +function _classPrivateFieldInitSpec(obj, privateMap, value) { _checkPrivateRedeclaration(obj, privateMap); privateMap.set(obj, value); } +function _checkPrivateRedeclaration(obj, privateCollection) { if (privateCollection.has(obj)) { throw new TypeError("Cannot initialize the same private elements twice on an object"); } } +function _classPrivateMethodGet(receiver, privateSet, fn) { if (!privateSet.has(receiver)) { throw new TypeError("attempted to get private field on non-instance"); } return fn; } +function _classPrivateFieldGet(receiver, privateMap) { var descriptor = _classExtractFieldDescriptor(receiver, privateMap, "get"); return _classApplyDescriptorGet(receiver, descriptor); } +function _classExtractFieldDescriptor(receiver, privateMap, action) { if (!privateMap.has(receiver)) { throw new TypeError("attempted to " + action + " private field on non-instance"); } return privateMap.get(receiver); } +function _classApplyDescriptorGet(receiver, descriptor) { if (descriptor.get) { return descriptor.get.call(receiver); } return descriptor.value; } +var _arr = /*#__PURE__*/new WeakMap(); +var _keyIndices = /*#__PURE__*/new WeakMap(); +var _heapify = /*#__PURE__*/new WeakSet(); +var _decrease = /*#__PURE__*/new WeakSet(); +var _swap = /*#__PURE__*/new WeakSet(); /** * A min-priority queue data structure. This algorithm is derived from Cormen, * et al., "Introduction to Algorithms". The basic idea of a min-priority @@ -5,144 +29,175 @@ * the queue. Adding and removing elements takes O(log n) time. A key can * have its priority decreased in O(log n) time. */ -export default class PriorityQueue { - #arr = []; - #keyIndices = {}; - - /** - * Returns the number of elements in the queue. Takes `O(1)` time. - */ - size() { - return this.#arr.length; - } - - /** - * Returns the keys that are in the queue. Takes `O(n)` time. - */ - keys() { - return this.#arr.map(function(x) { return x.key; }); +var PriorityQueue = exports["default"] = /*#__PURE__*/function () { + function PriorityQueue() { + _classCallCheck(this, PriorityQueue); + _classPrivateMethodInitSpec(this, _swap); + _classPrivateMethodInitSpec(this, _decrease); + _classPrivateMethodInitSpec(this, _heapify); + _classPrivateFieldInitSpec(this, _arr, { + writable: true, + value: [] + }); + _classPrivateFieldInitSpec(this, _keyIndices, { + writable: true, + value: {} + }); } - - /** - * Returns `true` if **key** is in the queue and `false` if not. - */ - has(key) { - return this.#keyIndices.hasOwnProperty(key); - } - - /** - * Returns the priority for **key**. If **key** is not present in the queue - * then this function returns `undefined`. Takes `O(1)` time. - * - * @param {Object} key - */ - priority(key) { - var index = this.#keyIndices[key]; - if (index !== undefined) { - return this.#arr[index].priority; + _createClass(PriorityQueue, [{ + key: "size", + value: + /** + * Returns the number of elements in the queue. Takes `O(1)` time. + */ + function size() { + return _classPrivateFieldGet(this, _arr).length; } - } - /** - * Returns the key for the minimum element in this queue. If the queue is - * empty this function throws an Error. Takes `O(1)` time. - */ - min() { - if (this.size() === 0) { - throw new Error("Queue underflow"); + /** + * Returns the keys that are in the queue. Takes `O(n)` time. + */ + }, { + key: "keys", + value: function keys() { + return _classPrivateFieldGet(this, _arr).map(function (x) { + return x.key; + }); } - return this.#arr[0].key; - } - /** - * Inserts a new key into the priority queue. If the key already exists in - * the queue this function returns `false`; otherwise it will return `true`. - * Takes `O(n)` time. - * - * @param {Object} key the key to add - * @param {Number} priority the initial priority for the key - */ - add(key, priority) { - var keyIndices = this.#keyIndices; - key = String(key); - if (!keyIndices.hasOwnProperty(key)) { - var arr = this.#arr; - var index = arr.length; - keyIndices[key] = index; - arr.push({key: key, priority: priority}); - this.#decrease(index); - return true; + /** + * Returns `true` if **key** is in the queue and `false` if not. + */ + }, { + key: "has", + value: function has(key) { + return _classPrivateFieldGet(this, _keyIndices).hasOwnProperty(key); } - return false; - } - /** - * Removes and returns the smallest key in the queue. Takes `O(log n)` time. - */ - removeMin() { - this.#swap(0, this.#arr.length - 1); - var min = this.#arr.pop(); - delete this.#keyIndices[min.key]; - this.#heapify(0); - return min.key; - } - - /** - * Decreases the priority for **key** to **priority**. If the new priority is - * greater than the previous priority, this function will throw an Error. - * - * @param {Object} key the key for which to raise priority - * @param {Number} priority the new priority for the key - */ - decrease(key, priority) { - var index = this.#keyIndices[key]; - if (priority > this.#arr[index].priority) { - throw new Error("New priority is greater than current priority. " + - "Key: " + key + " Old: " + this.#arr[index].priority + " New: " + priority); + /** + * Returns the priority for **key**. If **key** is not present in the queue + * then this function returns `undefined`. Takes `O(1)` time. + * + * @param {Object} key + */ + }, { + key: "priority", + value: function priority(key) { + var index = _classPrivateFieldGet(this, _keyIndices)[key]; + if (index !== undefined) { + return _classPrivateFieldGet(this, _arr)[index].priority; + } } - this.#arr[index].priority = priority; - this.#decrease(index); - } - #heapify(i) { - var arr = this.#arr; - var l = 2 * i; - var r = l + 1; - var largest = i; - if (l < arr.length) { - largest = arr[l].priority < arr[largest].priority ? l : largest; - if (r < arr.length) { - largest = arr[r].priority < arr[largest].priority ? r : largest; + /** + * Returns the key for the minimum element in this queue. If the queue is + * empty this function throws an Error. Takes `O(1)` time. + */ + }, { + key: "min", + value: function min() { + if (this.size() === 0) { + throw new Error("Queue underflow"); } - if (largest !== i) { - this.#swap(i, largest); - this.#heapify(largest); + return _classPrivateFieldGet(this, _arr)[0].key; + } + + /** + * Inserts a new key into the priority queue. If the key already exists in + * the queue this function returns `false`; otherwise it will return `true`. + * Takes `O(n)` time. + * + * @param {Object} key the key to add + * @param {Number} priority the initial priority for the key + */ + }, { + key: "add", + value: function add(key, priority) { + var keyIndices = _classPrivateFieldGet(this, _keyIndices); + key = String(key); + if (!keyIndices.hasOwnProperty(key)) { + var arr = _classPrivateFieldGet(this, _arr); + var index = arr.length; + keyIndices[key] = index; + arr.push({ + key: key, + priority: priority + }); + _classPrivateMethodGet(this, _decrease, _decrease2).call(this, index); + return true; } + return false; + } + + /** + * Removes and returns the smallest key in the queue. Takes `O(log n)` time. + */ + }, { + key: "removeMin", + value: function removeMin() { + _classPrivateMethodGet(this, _swap, _swap2).call(this, 0, _classPrivateFieldGet(this, _arr).length - 1); + var min = _classPrivateFieldGet(this, _arr).pop(); + delete _classPrivateFieldGet(this, _keyIndices)[min.key]; + _classPrivateMethodGet(this, _heapify, _heapify2).call(this, 0); + return min.key; } - } - #decrease(index) { - var arr = this.#arr; - var priority = arr[index].priority; - var parent; - while (index !== 0) { - parent = index >> 1; - if (arr[parent].priority < priority) { - break; + /** + * Decreases the priority for **key** to **priority**. If the new priority is + * greater than the previous priority, this function will throw an Error. + * + * @param {Object} key the key for which to raise priority + * @param {Number} priority the new priority for the key + */ + }, { + key: "decrease", + value: function decrease(key, priority) { + var index = _classPrivateFieldGet(this, _keyIndices)[key]; + if (priority > _classPrivateFieldGet(this, _arr)[index].priority) { + throw new Error("New priority is greater than current priority. " + "Key: " + key + " Old: " + _classPrivateFieldGet(this, _arr)[index].priority + " New: " + priority); } - this.#swap(index, parent); - index = parent; + _classPrivateFieldGet(this, _arr)[index].priority = priority; + _classPrivateMethodGet(this, _decrease, _decrease2).call(this, index); + } + }]); + return PriorityQueue; +}(); +function _heapify2(i) { + var arr = _classPrivateFieldGet(this, _arr); + var l = 2 * i; + var r = l + 1; + var largest = i; + if (l < arr.length) { + largest = arr[l].priority < arr[largest].priority ? l : largest; + if (r < arr.length) { + largest = arr[r].priority < arr[largest].priority ? r : largest; + } + if (largest !== i) { + _classPrivateMethodGet(this, _swap, _swap2).call(this, i, largest); + _classPrivateMethodGet(this, _heapify, _heapify2).call(this, largest); } } - - #swap(i, j) { - var arr = this.#arr; - var keyIndices = this.#keyIndices; - var origArrI = arr[i]; - var origArrJ = arr[j]; - arr[i] = origArrJ; - arr[j] = origArrI; - keyIndices[origArrJ.key] = i; - keyIndices[origArrI.key] = j; +} +function _decrease2(index) { + var arr = _classPrivateFieldGet(this, _arr); + var priority = arr[index].priority; + var parent; + while (index !== 0) { + parent = index >> 1; + if (arr[parent].priority < priority) { + break; + } + _classPrivateMethodGet(this, _swap, _swap2).call(this, index, parent); + index = parent; } } +function _swap2(i, j) { + var arr = _classPrivateFieldGet(this, _arr); + var keyIndices = _classPrivateFieldGet(this, _keyIndices); + var origArrI = arr[i]; + var origArrJ = arr[j]; + arr[i] = origArrJ; + arr[j] = origArrI; + keyIndices[origArrJ.key] = i; + keyIndices[origArrI.key] = j; +} diff --git a/lib/graph.js b/lib/graph.js index 69cefc8b..8ff44c34 100644 --- a/lib/graph.js +++ b/lib/graph.js @@ -1,5 +1,31 @@ "use strict"; +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports["default"] = void 0; +function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, _typeof(o); } +function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest(); } +function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } +function _iterableToArrayLimit(r, l) { var t = null == r ? null : "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"]; if (null != t) { var e, n, i, u, a = [], f = !0, o = !1; try { if (i = (t = t.call(r)).next, 0 === l) { if (Object(t) !== t) return; f = !1; } else for (; !(f = (e = i.call(t)).done) && (a.push(e.value), a.length !== l); f = !0); } catch (r) { o = !0, n = r; } finally { try { if (!f && null != t["return"] && (u = t["return"](), Object(u) !== u)) return; } finally { if (o) throw n; } } return a; } } +function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; } +function _createForOfIteratorHelper(o, allowArrayLike) { var it = typeof Symbol !== "undefined" && o[Symbol.iterator] || o["@@iterator"]; if (!it) { if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === "number") { if (it) o = it; var i = 0; var F = function F() {}; return { s: F, n: function n() { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }, e: function e(_e) { throw _e; }, f: F }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } var normalCompletion = true, didErr = false, err; return { s: function s() { it = it.call(o); }, n: function n() { var step = it.next(); normalCompletion = step.done; return step; }, e: function e(_e2) { didErr = true; err = _e2; }, f: function f() { try { if (!normalCompletion && it["return"] != null) it["return"](); } finally { if (didErr) throw err; } } }; } +function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); } +function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) arr2[i] = arr[i]; return arr2; } +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } +function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, _toPropertyKey(descriptor.key), descriptor); } } +function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; } +function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == _typeof(i) ? i : String(i); } +function _toPrimitive(t, r) { if ("object" != _typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != _typeof(i)) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); } +function _classPrivateMethodInitSpec(obj, privateSet) { _checkPrivateRedeclaration(obj, privateSet); privateSet.add(obj); } +function _classPrivateFieldInitSpec(obj, privateMap, value) { _checkPrivateRedeclaration(obj, privateMap); privateMap.set(obj, value); } +function _checkPrivateRedeclaration(obj, privateCollection) { if (privateCollection.has(obj)) { throw new TypeError("Cannot initialize the same private elements twice on an object"); } } +function _classPrivateMethodGet(receiver, privateSet, fn) { if (!privateSet.has(receiver)) { throw new TypeError("attempted to get private field on non-instance"); } return fn; } +function _classPrivateFieldGet(receiver, privateMap) { var descriptor = _classExtractFieldDescriptor(receiver, privateMap, "get"); return _classApplyDescriptorGet(receiver, descriptor); } +function _classApplyDescriptorGet(receiver, descriptor) { if (descriptor.get) { return descriptor.get.call(receiver); } return descriptor.value; } +function _classPrivateFieldSet(receiver, privateMap, value) { var descriptor = _classExtractFieldDescriptor(receiver, privateMap, "set"); _classApplyDescriptorSet(receiver, descriptor, value); return value; } +function _classExtractFieldDescriptor(receiver, privateMap, action) { if (!privateMap.has(receiver)) { throw new TypeError("attempted to " + action + " private field on non-instance"); } return privateMap.get(receiver); } +function _classApplyDescriptorSet(receiver, descriptor, value) { if (descriptor.set) { descriptor.set.call(receiver, value); } else { if (!descriptor.writable) { throw new TypeError("attempted to set read only private field"); } descriptor.value = value; } } var DEFAULT_EDGE_NAME = "\x00"; var GRAPH_NODE = "\x00"; var EDGE_KEY_DELIM = "\x01"; @@ -13,66 +39,124 @@ var EDGE_KEY_DELIM = "\x01"; // reference edges. This is because we need a performant way to look these // edges up and, object properties, which have string keys, are the closest // we're going to get to a performant hashtable in JavaScript. - -export default class Graph { - #isDirected = true; - #isMultigraph = false; - #isCompound = false; - - // Label for the graph itself - #label; - - // Defaults to be set when creating a new node - #defaultNodeLabelFn = () => undefined; - - // Defaults to be set when creating a new edge - #defaultEdgeLabelFn = () => undefined; - - // v -> label - #nodes = {}; - - // v -> edgeObj - #in = {}; - - // u -> v -> Number - #preds = {}; - - // v -> edgeObj - #out = {}; - - // v -> w -> Number - #sucs = {}; - - // e -> edgeObj - #edgeObjs = {}; - - // e -> label - #edgeLabels = {}; - - /* Number of nodes in the graph. Should only be changed by the implementation. */ - #nodeCount = 0; - - /* Number of edges in the graph. Should only be changed by the implementation. */ - #edgeCount = 0; - - #parent; - - #children; - - constructor(opts) { +var _isDirected = /*#__PURE__*/new WeakMap(); +var _isMultigraph = /*#__PURE__*/new WeakMap(); +var _isCompound = /*#__PURE__*/new WeakMap(); +var _label = /*#__PURE__*/new WeakMap(); +var _defaultNodeLabelFn = /*#__PURE__*/new WeakMap(); +var _defaultEdgeLabelFn = /*#__PURE__*/new WeakMap(); +var _nodes = /*#__PURE__*/new WeakMap(); +var _in = /*#__PURE__*/new WeakMap(); +var _preds = /*#__PURE__*/new WeakMap(); +var _out = /*#__PURE__*/new WeakMap(); +var _sucs = /*#__PURE__*/new WeakMap(); +var _edgeObjs = /*#__PURE__*/new WeakMap(); +var _edgeLabels = /*#__PURE__*/new WeakMap(); +var _nodeCount = /*#__PURE__*/new WeakMap(); +var _edgeCount = /*#__PURE__*/new WeakMap(); +var _parent = /*#__PURE__*/new WeakMap(); +var _children = /*#__PURE__*/new WeakMap(); +var _removeFromParentsChildList = /*#__PURE__*/new WeakSet(); +var Graph = exports["default"] = /*#__PURE__*/function () { + function Graph(opts) { + _classCallCheck(this, Graph); + _classPrivateMethodInitSpec(this, _removeFromParentsChildList); + _classPrivateFieldInitSpec(this, _isDirected, { + writable: true, + value: true + }); + _classPrivateFieldInitSpec(this, _isMultigraph, { + writable: true, + value: false + }); + _classPrivateFieldInitSpec(this, _isCompound, { + writable: true, + value: false + }); + // Label for the graph itself + _classPrivateFieldInitSpec(this, _label, { + writable: true, + value: void 0 + }); + // Defaults to be set when creating a new node + _classPrivateFieldInitSpec(this, _defaultNodeLabelFn, { + writable: true, + value: function value() { + return undefined; + } + }); + // Defaults to be set when creating a new edge + _classPrivateFieldInitSpec(this, _defaultEdgeLabelFn, { + writable: true, + value: function value() { + return undefined; + } + }); + // v -> label + _classPrivateFieldInitSpec(this, _nodes, { + writable: true, + value: {} + }); + // v -> edgeObj + _classPrivateFieldInitSpec(this, _in, { + writable: true, + value: {} + }); + // u -> v -> Number + _classPrivateFieldInitSpec(this, _preds, { + writable: true, + value: {} + }); + // v -> edgeObj + _classPrivateFieldInitSpec(this, _out, { + writable: true, + value: {} + }); + // v -> w -> Number + _classPrivateFieldInitSpec(this, _sucs, { + writable: true, + value: {} + }); + // e -> edgeObj + _classPrivateFieldInitSpec(this, _edgeObjs, { + writable: true, + value: {} + }); + // e -> label + _classPrivateFieldInitSpec(this, _edgeLabels, { + writable: true, + value: {} + }); + /* Number of nodes in the graph. Should only be changed by the implementation. */ + _classPrivateFieldInitSpec(this, _nodeCount, { + writable: true, + value: 0 + }); + /* Number of edges in the graph. Should only be changed by the implementation. */ + _classPrivateFieldInitSpec(this, _edgeCount, { + writable: true, + value: 0 + }); + _classPrivateFieldInitSpec(this, _parent, { + writable: true, + value: void 0 + }); + _classPrivateFieldInitSpec(this, _children, { + writable: true, + value: void 0 + }); if (opts) { - this.#isDirected = opts.hasOwnProperty("directed") ? opts.directed : true; - this.#isMultigraph = opts.hasOwnProperty("multigraph") ? opts.multigraph : false; - this.#isCompound = opts.hasOwnProperty("compound") ? opts.compound : false; + _classPrivateFieldSet(this, _isDirected, opts.hasOwnProperty("directed") ? opts.directed : true); + _classPrivateFieldSet(this, _isMultigraph, opts.hasOwnProperty("multigraph") ? opts.multigraph : false); + _classPrivateFieldSet(this, _isCompound, opts.hasOwnProperty("compound") ? opts.compound : false); } - - if (this.#isCompound) { + if (_classPrivateFieldGet(this, _isCompound)) { // v -> parent - this.#parent = {}; + _classPrivateFieldSet(this, _parent, {}); // v -> children - this.#children = {}; - this.#children[GRAPH_NODE] = {}; + _classPrivateFieldSet(this, _children, {}); + _classPrivateFieldGet(this, _children)[GRAPH_NODE] = {}; } } @@ -81,575 +165,650 @@ export default class Graph { /** * Whether graph was created with 'directed' flag set to true or not. */ - isDirected() { - return this.#isDirected; - } - - /** - * Whether graph was created with 'multigraph' flag set to true or not. - */ - isMultigraph() { - return this.#isMultigraph; - } - - /** - * Whether graph was created with 'compound' flag set to true or not. - */ - isCompound() { - return this.#isCompound; - } + _createClass(Graph, [{ + key: "isDirected", + value: function isDirected() { + return _classPrivateFieldGet(this, _isDirected); + } - /** - * Sets the label of the graph. - */ - setGraph(label) { - this.#label = label; - return this; - } + /** + * Whether graph was created with 'multigraph' flag set to true or not. + */ + }, { + key: "isMultigraph", + value: function isMultigraph() { + return _classPrivateFieldGet(this, _isMultigraph); + } - /** - * Gets the graph label. - */ - graph() { - return this.#label; - } + /** + * Whether graph was created with 'compound' flag set to true or not. + */ + }, { + key: "isCompound", + value: function isCompound() { + return _classPrivateFieldGet(this, _isCompound); + } + /** + * Sets the label of the graph. + */ + }, { + key: "setGraph", + value: function setGraph(label) { + _classPrivateFieldSet(this, _label, label); + return this; + } - /* === Node functions ========== */ + /** + * Gets the graph label. + */ + }, { + key: "graph", + value: function graph() { + return _classPrivateFieldGet(this, _label); + } - /** - * Sets the default node label. If newDefault is a function, it will be - * invoked ach time when setting a label for a node. Otherwise, this label - * will be assigned as default label in case if no label was specified while - * setting a node. - * Complexity: O(1). - */ - setDefaultNodeLabel(newDefault) { - this.#defaultNodeLabelFn = newDefault; - if (typeof newDefault !== 'function') { - this.#defaultNodeLabelFn = () => newDefault; + /* === Node functions ========== */ + + /** + * Sets the default node label. If newDefault is a function, it will be + * invoked ach time when setting a label for a node. Otherwise, this label + * will be assigned as default label in case if no label was specified while + * setting a node. + * Complexity: O(1). + */ + }, { + key: "setDefaultNodeLabel", + value: function setDefaultNodeLabel(newDefault) { + _classPrivateFieldSet(this, _defaultNodeLabelFn, newDefault); + if (typeof newDefault !== 'function') { + _classPrivateFieldSet(this, _defaultNodeLabelFn, function () { + return newDefault; + }); + } + return this; } - return this; - } + /** + * Gets the number of nodes in the graph. + * Complexity: O(1). + */ + }, { + key: "nodeCount", + value: function nodeCount() { + return _classPrivateFieldGet(this, _nodeCount); + } - /** - * Gets the number of nodes in the graph. - * Complexity: O(1). - */ - nodeCount() { - return this.#nodeCount; - } + /** + * Gets all nodes of the graph. Note, the in case of compound graph subnodes are + * not included in list. + * Complexity: O(1). + */ + }, { + key: "nodes", + value: function nodes() { + return Object.keys(_classPrivateFieldGet(this, _nodes)); + } - /** - * Gets all nodes of the graph. Note, the in case of compound graph subnodes are - * not included in list. - * Complexity: O(1). - */ - nodes() { - return Object.keys(this.#nodes); - } + /** + * Gets list of nodes without in-edges. + * Complexity: O(|V|). + */ + }, { + key: "sources", + value: function sources() { + var self = this; + return this.nodes().filter(function (v) { + return Object.keys(_classPrivateFieldGet(self, _in)[v]).length === 0; + }); + } - /** - * Gets list of nodes without in-edges. - * Complexity: O(|V|). - */ - sources() { - var self = this; - return this.nodes().filter(v => Object.keys(self.#in[v]).length === 0); - } + /** + * Gets list of nodes without out-edges. + * Complexity: O(|V|). + */ + }, { + key: "sinks", + value: function sinks() { + var self = this; + return this.nodes().filter(function (v) { + return Object.keys(_classPrivateFieldGet(self, _out)[v]).length === 0; + }); + } - /** - * Gets list of nodes without out-edges. - * Complexity: O(|V|). - */ - sinks() { - var self = this; - return this.nodes().filter(v => Object.keys(self.#out[v]).length === 0); - } + /** + * Invokes setNode method for each node in names list. + * Complexity: O(|names|). + */ + }, { + key: "setNodes", + value: function setNodes(vs, value) { + var args = arguments; + var self = this; + vs.forEach(function (v) { + if (args.length > 1) { + self.setNode(v, value); + } else { + self.setNode(v); + } + }); + return this; + } - /** - * Invokes setNode method for each node in names list. - * Complexity: O(|names|). - */ - setNodes(vs, value) { - var args = arguments; - var self = this; - vs.forEach(function(v) { - if (args.length > 1) { - self.setNode(v, value); - } else { - self.setNode(v); + /** + * Creates or updates the value for the node v in the graph. If label is supplied + * it is set as the value for the node. If label is not supplied and the node was + * created by this call then the default node label will be assigned. + * Complexity: O(1). + */ + }, { + key: "setNode", + value: function setNode(v, value) { + var _this$nodeCount; + if (_classPrivateFieldGet(this, _nodes).hasOwnProperty(v)) { + if (arguments.length > 1) { + _classPrivateFieldGet(this, _nodes)[v] = value; + } + return this; } - }); - return this; - } - - /** - * Creates or updates the value for the node v in the graph. If label is supplied - * it is set as the value for the node. If label is not supplied and the node was - * created by this call then the default node label will be assigned. - * Complexity: O(1). - */ - setNode(v, value) { - if (this.#nodes.hasOwnProperty(v)) { - if (arguments.length > 1) { - this.#nodes[v] = value; + _classPrivateFieldGet(this, _nodes)[v] = arguments.length > 1 ? value : _classPrivateFieldGet(this, _defaultNodeLabelFn).call(this, v); + if (_classPrivateFieldGet(this, _isCompound)) { + _classPrivateFieldGet(this, _parent)[v] = GRAPH_NODE; + _classPrivateFieldGet(this, _children)[v] = {}; + _classPrivateFieldGet(this, _children)[GRAPH_NODE][v] = true; } + _classPrivateFieldGet(this, _in)[v] = {}; + _classPrivateFieldGet(this, _preds)[v] = {}; + _classPrivateFieldGet(this, _out)[v] = {}; + _classPrivateFieldGet(this, _sucs)[v] = {}; + _classPrivateFieldSet(this, _nodeCount, (_this$nodeCount = _classPrivateFieldGet(this, _nodeCount), ++_this$nodeCount)); return this; } - this.#nodes[v] = arguments.length > 1 ? value : this.#defaultNodeLabelFn(v); - if (this.#isCompound) { - this.#parent[v] = GRAPH_NODE; - this.#children[v] = {}; - this.#children[GRAPH_NODE][v] = true; + /** + * Gets the label of node with specified name. + * Complexity: O(|V|). + */ + }, { + key: "node", + value: function node(v) { + return _classPrivateFieldGet(this, _nodes)[v]; } - this.#in[v] = {}; - this.#preds[v] = {}; - this.#out[v] = {}; - this.#sucs[v] = {}; - ++this.#nodeCount; - return this; - } - - /** - * Gets the label of node with specified name. - * Complexity: O(|V|). - */ - node(v) { - return this.#nodes[v]; - } - /** - * Detects whether graph has a node with specified name or not. - */ - hasNode(v) { - return this.#nodes.hasOwnProperty(v); - } + /** + * Detects whether graph has a node with specified name or not. + */ + }, { + key: "hasNode", + value: function hasNode(v) { + return _classPrivateFieldGet(this, _nodes).hasOwnProperty(v); + } - /** - * Remove the node with the name from the graph or do nothing if the node is not in - * the graph. If the node was removed this function also removes any incident - * edges. - * Complexity: O(1). - */ - removeNode(v) { - var self = this; - if (this.#nodes.hasOwnProperty(v)) { - var removeEdge = e => self.removeEdge(self.#edgeObjs[e]); - delete this.#nodes[v]; - if (this.#isCompound) { - this.#removeFromParentsChildList(v); - delete this.#parent[v]; - this.children(v).forEach(function(child) { - self.setParent(child); - }); - delete this.#children[v]; + /** + * Remove the node with the name from the graph or do nothing if the node is not in + * the graph. If the node was removed this function also removes any incident + * edges. + * Complexity: O(1). + */ + }, { + key: "removeNode", + value: function removeNode(v) { + var self = this; + if (_classPrivateFieldGet(this, _nodes).hasOwnProperty(v)) { + var _this$nodeCount2; + var removeEdge = function removeEdge(e) { + return self.removeEdge(_classPrivateFieldGet(self, _edgeObjs)[e]); + }; + delete _classPrivateFieldGet(this, _nodes)[v]; + if (_classPrivateFieldGet(this, _isCompound)) { + _classPrivateMethodGet(this, _removeFromParentsChildList, _removeFromParentsChildList2).call(this, v); + delete _classPrivateFieldGet(this, _parent)[v]; + this.children(v).forEach(function (child) { + self.setParent(child); + }); + delete _classPrivateFieldGet(this, _children)[v]; + } + Object.keys(_classPrivateFieldGet(this, _in)[v]).forEach(removeEdge); + delete _classPrivateFieldGet(this, _in)[v]; + delete _classPrivateFieldGet(this, _preds)[v]; + Object.keys(_classPrivateFieldGet(this, _out)[v]).forEach(removeEdge); + delete _classPrivateFieldGet(this, _out)[v]; + delete _classPrivateFieldGet(this, _sucs)[v]; + _classPrivateFieldSet(this, _nodeCount, (_this$nodeCount2 = _classPrivateFieldGet(this, _nodeCount), --_this$nodeCount2)); } - Object.keys(this.#in[v]).forEach(removeEdge); - delete this.#in[v]; - delete this.#preds[v]; - Object.keys(this.#out[v]).forEach(removeEdge); - delete this.#out[v]; - delete this.#sucs[v]; - --this.#nodeCount; - } - return this; - } + return this; + } - /** - * Sets node p as a parent for node v if it is defined, or removes the - * parent for v if p is undefined. Method throws an exception in case of - * invoking it in context of noncompound graph. - * Average-case complexity: O(1). - */ - setParent(v, parent) { - if (!this.#isCompound) { - throw new Error("Cannot set parent in a non-compound graph"); - } - - if (parent === undefined) { - parent = GRAPH_NODE; - } else { - // Coerce parent to string - parent += ""; - for (var ancestor = parent; ancestor !== undefined; ancestor = this.parent(ancestor)) { - if (ancestor === v) { - throw new Error("Setting " + parent+ " as parent of " + v + - " would create a cycle"); + /** + * Sets node p as a parent for node v if it is defined, or removes the + * parent for v if p is undefined. Method throws an exception in case of + * invoking it in context of noncompound graph. + * Average-case complexity: O(1). + */ + }, { + key: "setParent", + value: function setParent(v, parent) { + if (!_classPrivateFieldGet(this, _isCompound)) { + throw new Error("Cannot set parent in a non-compound graph"); + } + if (parent === undefined) { + parent = GRAPH_NODE; + } else { + // Coerce parent to string + parent += ""; + for (var ancestor = parent; ancestor !== undefined; ancestor = this.parent(ancestor)) { + if (ancestor === v) { + throw new Error("Setting " + parent + " as parent of " + v + " would create a cycle"); + } } + this.setNode(parent); } - - this.setNode(parent); + this.setNode(v); + _classPrivateMethodGet(this, _removeFromParentsChildList, _removeFromParentsChildList2).call(this, v); + _classPrivateFieldGet(this, _parent)[v] = parent; + _classPrivateFieldGet(this, _children)[parent][v] = true; + return this; } - - this.setNode(v); - this.#removeFromParentsChildList(v); - this.#parent[v] = parent; - this.#children[parent][v] = true; - return this; - } - - #removeFromParentsChildList(v) { - delete this.#children[this.#parent[v]][v]; - } - - /** - * Gets parent node for node v. - * Complexity: O(1). - */ - parent(v) { - if (this.#isCompound) { - var parent = this.#parent[v]; - if (parent !== GRAPH_NODE) { - return parent; + }, { + key: "parent", + value: + /** + * Gets parent node for node v. + * Complexity: O(1). + */ + function parent(v) { + if (_classPrivateFieldGet(this, _isCompound)) { + var parent = _classPrivateFieldGet(this, _parent)[v]; + if (parent !== GRAPH_NODE) { + return parent; + } } } - } - /** - * Gets list of direct children of node v. - * Complexity: O(1). - */ - children(v = GRAPH_NODE) { - if (this.#isCompound) { - var children = this.#children[v]; - if (children) { - return Object.keys(children); + /** + * Gets list of direct children of node v. + * Complexity: O(1). + */ + }, { + key: "children", + value: function children() { + var v = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : GRAPH_NODE; + if (_classPrivateFieldGet(this, _isCompound)) { + var children = _classPrivateFieldGet(this, _children)[v]; + if (children) { + return Object.keys(children); + } + } else if (v === GRAPH_NODE) { + return this.nodes(); + } else if (this.hasNode(v)) { + return []; } - } else if (v === GRAPH_NODE) { - return this.nodes(); - } else if (this.hasNode(v)) { - return []; } - } - /** - * Return all nodes that are predecessors of the specified node or undefined if node v is not in - * the graph. Behavior is undefined for undirected graphs - use neighbors instead. - * Complexity: O(|V|). - */ - predecessors(v) { - var predsV = this.#preds[v]; - if (predsV) { - return Object.keys(predsV); + /** + * Return all nodes that are predecessors of the specified node or undefined if node v is not in + * the graph. Behavior is undefined for undirected graphs - use neighbors instead. + * Complexity: O(|V|). + */ + }, { + key: "predecessors", + value: function predecessors(v) { + var predsV = _classPrivateFieldGet(this, _preds)[v]; + if (predsV) { + return Object.keys(predsV); + } } - } - /** - * Return all nodes that are successors of the specified node or undefined if node v is not in - * the graph. Behavior is undefined for undirected graphs - use neighbors instead. - * Complexity: O(|V|). - */ - successors(v) { - var sucsV = this.#sucs[v]; - if (sucsV) { - return Object.keys(sucsV); + /** + * Return all nodes that are successors of the specified node or undefined if node v is not in + * the graph. Behavior is undefined for undirected graphs - use neighbors instead. + * Complexity: O(|V|). + */ + }, { + key: "successors", + value: function successors(v) { + var sucsV = _classPrivateFieldGet(this, _sucs)[v]; + if (sucsV) { + return Object.keys(sucsV); + } } - } - /** - * Return all nodes that are predecessors or successors of the specified node or undefined if - * node v is not in the graph. - * Complexity: O(|V|). - */ - neighbors(v) { - var preds = this.predecessors(v); - if (preds) { - const union = new Set(preds); - for (var succ of this.successors(v)) { - union.add(succ); + /** + * Return all nodes that are predecessors or successors of the specified node or undefined if + * node v is not in the graph. + * Complexity: O(|V|). + */ + }, { + key: "neighbors", + value: function neighbors(v) { + var preds = this.predecessors(v); + if (preds) { + var union = new Set(preds); + var _iterator = _createForOfIteratorHelper(this.successors(v)), + _step; + try { + for (_iterator.s(); !(_step = _iterator.n()).done;) { + var succ = _step.value; + union.add(succ); + } + } catch (err) { + _iterator.e(err); + } finally { + _iterator.f(); + } + return Array.from(union.values()); } - - return Array.from(union.values()); } - } - - isLeaf(v) { - var neighbors; - if (this.isDirected()) { - neighbors = this.successors(v); - } else { - neighbors = this.neighbors(v); + }, { + key: "isLeaf", + value: function isLeaf(v) { + var neighbors; + if (this.isDirected()) { + neighbors = this.successors(v); + } else { + neighbors = this.neighbors(v); + } + return neighbors.length === 0; } - return neighbors.length === 0; - } - - /** - * Creates new graph with nodes filtered via filter. Edges incident to rejected node - * are also removed. In case of compound graph, if parent is rejected by filter, - * than all its children are rejected too. - * Average-case complexity: O(|E|+|V|). - */ - filterNodes(filter) { - var copy = new this.constructor({ - directed: this.#isDirected, - multigraph: this.#isMultigraph, - compound: this.#isCompound - }); - - copy.setGraph(this.graph()); - var self = this; - Object.entries(this.#nodes).forEach(function([v, value]) { - if (filter(v)) { - copy.setNode(v, value); + /** + * Creates new graph with nodes filtered via filter. Edges incident to rejected node + * are also removed. In case of compound graph, if parent is rejected by filter, + * than all its children are rejected too. + * Average-case complexity: O(|E|+|V|). + */ + }, { + key: "filterNodes", + value: function filterNodes(filter) { + var copy = new this.constructor({ + directed: _classPrivateFieldGet(this, _isDirected), + multigraph: _classPrivateFieldGet(this, _isMultigraph), + compound: _classPrivateFieldGet(this, _isCompound) + }); + copy.setGraph(this.graph()); + var self = this; + Object.entries(_classPrivateFieldGet(this, _nodes)).forEach(function (_ref) { + var _ref2 = _slicedToArray(_ref, 2), + v = _ref2[0], + value = _ref2[1]; + if (filter(v)) { + copy.setNode(v, value); + } + }); + Object.values(_classPrivateFieldGet(this, _edgeObjs)).forEach(function (e) { + if (copy.hasNode(e.v) && copy.hasNode(e.w)) { + copy.setEdge(e, self.edge(e)); + } + }); + var parents = {}; + function findParent(v) { + var parent = self.parent(v); + if (parent === undefined || copy.hasNode(parent)) { + parents[v] = parent; + return parent; + } else if (parent in parents) { + return parents[parent]; + } else { + return findParent(parent); + } } - }); - - Object.values(this.#edgeObjs).forEach(function(e) { - if (copy.hasNode(e.v) && copy.hasNode(e.w)) { - copy.setEdge(e, self.edge(e)); + if (_classPrivateFieldGet(this, _isCompound)) { + copy.nodes().forEach(function (v) { + return copy.setParent(v, findParent(v)); + }); } - }); + return copy; + } - var parents = {}; - function findParent(v) { - var parent = self.parent(v); - if (parent === undefined || copy.hasNode(parent)) { - parents[v] = parent; - return parent; - } else if (parent in parents) { - return parents[parent]; - } else { - return findParent(parent); + /* === Edge functions ========== */ + + /** + * Sets the default edge label or factory function. This label will be + * assigned as default label in case if no label was specified while setting + * an edge or this function will be invoked each time when setting an edge + * with no label specified and returned value * will be used as a label for edge. + * Complexity: O(1). + */ + }, { + key: "setDefaultEdgeLabel", + value: function setDefaultEdgeLabel(newDefault) { + _classPrivateFieldSet(this, _defaultEdgeLabelFn, newDefault); + if (typeof newDefault !== 'function') { + _classPrivateFieldSet(this, _defaultEdgeLabelFn, function () { + return newDefault; + }); } + return this; } - if (this.#isCompound) { - copy.nodes().forEach(v => copy.setParent(v, findParent(v))); + /** + * Gets the number of edges in the graph. + * Complexity: O(1). + */ + }, { + key: "edgeCount", + value: function edgeCount() { + return _classPrivateFieldGet(this, _edgeCount); } - return copy; - } - - /* === Edge functions ========== */ - - /** - * Sets the default edge label or factory function. This label will be - * assigned as default label in case if no label was specified while setting - * an edge or this function will be invoked each time when setting an edge - * with no label specified and returned value * will be used as a label for edge. - * Complexity: O(1). - */ - setDefaultEdgeLabel(newDefault) { - this.#defaultEdgeLabelFn = newDefault; - if (typeof newDefault !== 'function') { - this.#defaultEdgeLabelFn = () => newDefault; + /** + * Gets edges of the graph. In case of compound graph subgraphs are not considered. + * Complexity: O(|E|). + */ + }, { + key: "edges", + value: function edges() { + return Object.values(_classPrivateFieldGet(this, _edgeObjs)); } - return this; - } - - /** - * Gets the number of edges in the graph. - * Complexity: O(1). - */ - edgeCount() { - return this.#edgeCount; - } - - /** - * Gets edges of the graph. In case of compound graph subgraphs are not considered. - * Complexity: O(|E|). - */ - edges() { - return Object.values(this.#edgeObjs); - } + /** + * Establish an edges path over the nodes in nodes list. If some edge is already + * exists, it will update its label, otherwise it will create an edge between pair + * of nodes with label provided or default label if no label provided. + * Complexity: O(|nodes|). + */ + }, { + key: "setPath", + value: function setPath(vs, value) { + var self = this; + var args = arguments; + vs.reduce(function (v, w) { + if (args.length > 1) { + self.setEdge(v, w, value); + } else { + self.setEdge(v, w); + } + return w; + }); + return this; + } - /** - * Establish an edges path over the nodes in nodes list. If some edge is already - * exists, it will update its label, otherwise it will create an edge between pair - * of nodes with label provided or default label if no label provided. - * Complexity: O(|nodes|). - */ - setPath(vs, value) { - var self = this; - var args = arguments; - vs.reduce(function(v, w) { - if (args.length > 1) { - self.setEdge(v, w, value); + /** + * Creates or updates the label for the edge (v, w) with the optionally supplied + * name. If label is supplied it is set as the value for the edge. If label is not + * supplied and the edge was created by this call then the default edge label will + * be assigned. The name parameter is only useful with multigraphs. + */ + }, { + key: "setEdge", + value: function setEdge() { + var _this$edgeCount, _this$edgeCount2; + var v, w, name, value; + var valueSpecified = false; + var arg0 = arguments[0]; + if (_typeof(arg0) === "object" && arg0 !== null && "v" in arg0) { + v = arg0.v; + w = arg0.w; + name = arg0.name; + if (arguments.length === 2) { + value = arguments[1]; + valueSpecified = true; + } } else { - self.setEdge(v, w); + v = arg0; + w = arguments[1]; + name = arguments[3]; + if (arguments.length > 2) { + value = arguments[2]; + valueSpecified = true; + } } - return w; - }); - return this; - } - - /** - * Creates or updates the label for the edge (v, w) with the optionally supplied - * name. If label is supplied it is set as the value for the edge. If label is not - * supplied and the edge was created by this call then the default edge label will - * be assigned. The name parameter is only useful with multigraphs. - */ - setEdge() { - var v, w, name, value; - var valueSpecified = false; - var arg0 = arguments[0]; - - if (typeof arg0 === "object" && arg0 !== null && "v" in arg0) { - v = arg0.v; - w = arg0.w; - name = arg0.name; - if (arguments.length === 2) { - value = arguments[1]; - valueSpecified = true; + v = "" + v; + w = "" + w; + if (name !== undefined) { + name = "" + name; + } + var e = edgeArgsToId(_classPrivateFieldGet(this, _isDirected), v, w, name); + if (_classPrivateFieldGet(this, _edgeLabels).hasOwnProperty(e)) { + if (valueSpecified) { + _classPrivateFieldGet(this, _edgeLabels)[e] = value; + } + return this; } - } else { - v = arg0; - w = arguments[1]; - name = arguments[3]; - if (arguments.length > 2) { - value = arguments[2]; - valueSpecified = true; + if (name !== undefined && !_classPrivateFieldGet(this, _isMultigraph)) { + throw new Error("Cannot set a named edge when isMultigraph = false"); } + + // It didn't exist, so we need to create it. + // First ensure the nodes exist. + this.setNode(v); + this.setNode(w); + _classPrivateFieldGet(this, _edgeLabels)[e] = valueSpecified ? value : _classPrivateFieldGet(this, _defaultEdgeLabelFn).call(this, v, w, name); + var edgeObj = edgeArgsToObj(_classPrivateFieldGet(this, _isDirected), v, w, name); + // Ensure we add undirected edges in a consistent way. + v = edgeObj.v; + w = edgeObj.w; + Object.freeze(edgeObj); + _classPrivateFieldGet(this, _edgeObjs)[e] = edgeObj; + incrementOrInitEntry(_classPrivateFieldGet(this, _preds)[w], v); + incrementOrInitEntry(_classPrivateFieldGet(this, _sucs)[v], w); + _classPrivateFieldGet(this, _in)[w][e] = edgeObj; + _classPrivateFieldGet(this, _out)[v][e] = edgeObj; + _classPrivateFieldSet(this, _edgeCount, (_this$edgeCount = _classPrivateFieldGet(this, _edgeCount), _this$edgeCount2 = _this$edgeCount++, _this$edgeCount)), _this$edgeCount2; + return this; } - v = "" + v; - w = "" + w; - if (name !== undefined) { - name = "" + name; + /** + * Gets the label for the specified edge. + * Complexity: O(1). + */ + }, { + key: "edge", + value: function edge(v, w, name) { + var e = arguments.length === 1 ? edgeObjToId(_classPrivateFieldGet(this, _isDirected), arguments[0]) : edgeArgsToId(_classPrivateFieldGet(this, _isDirected), v, w, name); + return _classPrivateFieldGet(this, _edgeLabels)[e]; } - var e = edgeArgsToId(this.#isDirected, v, w, name); - if (this.#edgeLabels.hasOwnProperty(e)) { - if (valueSpecified) { - this.#edgeLabels[e] = value; + /** + * Gets the label for the specified edge and converts it to an object. + * Complexity: O(1) + */ + }, { + key: "edgeAsObj", + value: function edgeAsObj() { + var edge = this.edge.apply(this, arguments); + if (_typeof(edge) !== "object") { + return { + label: edge + }; } - return this; + return edge; } - if (name !== undefined && !this.#isMultigraph) { - throw new Error("Cannot set a named edge when isMultigraph = false"); + /** + * Detects whether the graph contains specified edge or not. No subgraphs are considered. + * Complexity: O(1). + */ + }, { + key: "hasEdge", + value: function hasEdge(v, w, name) { + var e = arguments.length === 1 ? edgeObjToId(_classPrivateFieldGet(this, _isDirected), arguments[0]) : edgeArgsToId(_classPrivateFieldGet(this, _isDirected), v, w, name); + return _classPrivateFieldGet(this, _edgeLabels).hasOwnProperty(e); } - // It didn't exist, so we need to create it. - // First ensure the nodes exist. - this.setNode(v); - this.setNode(w); - - this.#edgeLabels[e] = valueSpecified ? value : this.#defaultEdgeLabelFn(v, w, name); - - var edgeObj = edgeArgsToObj(this.#isDirected, v, w, name); - // Ensure we add undirected edges in a consistent way. - v = edgeObj.v; - w = edgeObj.w; - - Object.freeze(edgeObj); - this.#edgeObjs[e] = edgeObj; - incrementOrInitEntry(this.#preds[w], v); - incrementOrInitEntry(this.#sucs[v], w); - this.#in[w][e] = edgeObj; - this.#out[v][e] = edgeObj; - this.#edgeCount++; - return this; - } - - /** - * Gets the label for the specified edge. - * Complexity: O(1). - */ - edge(v, w, name) { - var e = (arguments.length === 1 - ? edgeObjToId(this.#isDirected, arguments[0]) - : edgeArgsToId(this.#isDirected, v, w, name)); - return this.#edgeLabels[e]; - } - - /** - * Gets the label for the specified edge and converts it to an object. - * Complexity: O(1) - */ - edgeAsObj() { - const edge = this.edge(...arguments); - if (typeof edge !== "object") { - return {label: edge}; + /** + * Removes the specified edge from the graph. No subgraphs are considered. + * Complexity: O(1). + */ + }, { + key: "removeEdge", + value: function removeEdge(v, w, name) { + var e = arguments.length === 1 ? edgeObjToId(_classPrivateFieldGet(this, _isDirected), arguments[0]) : edgeArgsToId(_classPrivateFieldGet(this, _isDirected), v, w, name); + var edge = _classPrivateFieldGet(this, _edgeObjs)[e]; + if (edge) { + var _this$edgeCount3, _this$edgeCount4; + v = edge.v; + w = edge.w; + delete _classPrivateFieldGet(this, _edgeLabels)[e]; + delete _classPrivateFieldGet(this, _edgeObjs)[e]; + decrementOrRemoveEntry(_classPrivateFieldGet(this, _preds)[w], v); + decrementOrRemoveEntry(_classPrivateFieldGet(this, _sucs)[v], w); + delete _classPrivateFieldGet(this, _in)[w][e]; + delete _classPrivateFieldGet(this, _out)[v][e]; + _classPrivateFieldSet(this, _edgeCount, (_this$edgeCount3 = _classPrivateFieldGet(this, _edgeCount), _this$edgeCount4 = _this$edgeCount3--, _this$edgeCount3)), _this$edgeCount4; + } + return this; } - return edge; - } - - /** - * Detects whether the graph contains specified edge or not. No subgraphs are considered. - * Complexity: O(1). - */ - hasEdge(v, w, name) { - var e = (arguments.length === 1 - ? edgeObjToId(this.#isDirected, arguments[0]) - : edgeArgsToId(this.#isDirected, v, w, name)); - return this.#edgeLabels.hasOwnProperty(e); - } - - /** - * Removes the specified edge from the graph. No subgraphs are considered. - * Complexity: O(1). - */ - removeEdge(v, w, name) { - var e = (arguments.length === 1 - ? edgeObjToId(this.#isDirected, arguments[0]) - : edgeArgsToId(this.#isDirected, v, w, name)); - var edge = this.#edgeObjs[e]; - if (edge) { - v = edge.v; - w = edge.w; - delete this.#edgeLabels[e]; - delete this.#edgeObjs[e]; - decrementOrRemoveEntry(this.#preds[w], v); - decrementOrRemoveEntry(this.#sucs[v], w); - delete this.#in[w][e]; - delete this.#out[v][e]; - this.#edgeCount--; - } - return this; - } - - /** - * Return all edges that point to the node v. Optionally filters those edges down to just those - * coming from node u. Behavior is undefined for undirected graphs - use nodeEdges instead. - * Complexity: O(|E|). - */ - inEdges(v, u) { - var inV = this.#in[v]; - if (inV) { - var edges = Object.values(inV); - if (!u) { - return edges; + /** + * Return all edges that point to the node v. Optionally filters those edges down to just those + * coming from node u. Behavior is undefined for undirected graphs - use nodeEdges instead. + * Complexity: O(|E|). + */ + }, { + key: "inEdges", + value: function inEdges(v, u) { + var inV = _classPrivateFieldGet(this, _in)[v]; + if (inV) { + var edges = Object.values(inV); + if (!u) { + return edges; + } + return edges.filter(function (edge) { + return edge.v === u; + }); } - return edges.filter(edge => edge.v === u); } - } - /** - * Return all edges that are pointed at by node v. Optionally filters those edges down to just - * those point to w. Behavior is undefined for undirected graphs - use nodeEdges instead. - * Complexity: O(|E|). - */ - outEdges(v, w) { - var outV = this.#out[v]; - if (outV) { - var edges = Object.values(outV); - if (!w) { - return edges; + /** + * Return all edges that are pointed at by node v. Optionally filters those edges down to just + * those point to w. Behavior is undefined for undirected graphs - use nodeEdges instead. + * Complexity: O(|E|). + */ + }, { + key: "outEdges", + value: function outEdges(v, w) { + var outV = _classPrivateFieldGet(this, _out)[v]; + if (outV) { + var edges = Object.values(outV); + if (!w) { + return edges; + } + return edges.filter(function (edge) { + return edge.w === w; + }); } - return edges.filter(edge => edge.w === w); } - } - /** - * Returns all edges to or from node v regardless of direction. Optionally filters those edges - * down to just those between nodes v and w regardless of direction. - * Complexity: O(|E|). - */ - nodeEdges(v, w) { - var inEdges = this.inEdges(v, w); - if (inEdges) { - return inEdges.concat(this.outEdges(v, w)); + /** + * Returns all edges to or from node v regardless of direction. Optionally filters those edges + * down to just those between nodes v and w regardless of direction. + * Complexity: O(|E|). + */ + }, { + key: "nodeEdges", + value: function nodeEdges(v, w) { + var inEdges = this.inEdges(v, w); + if (inEdges) { + return inEdges.concat(this.outEdges(v, w)); + } } - } + }]); + return Graph; +}(); +function _removeFromParentsChildList2(v) { + delete _classPrivateFieldGet(this, _children)[_classPrivateFieldGet(this, _parent)[v]][v]; } - function incrementOrInitEntry(map, k) { if (map[k]) { map[k]++; @@ -657,11 +816,11 @@ function incrementOrInitEntry(map, k) { map[k] = 1; } } - function decrementOrRemoveEntry(map, k) { - if (!--map[k]) { delete map[k]; } + if (! --map[k]) { + delete map[k]; + } } - function edgeArgsToId(isDirected, v_, w_, name) { var v = "" + v_; var w = "" + w_; @@ -670,10 +829,8 @@ function edgeArgsToId(isDirected, v_, w_, name) { v = w; w = tmp; } - return v + EDGE_KEY_DELIM + w + EDGE_KEY_DELIM + - (name === undefined ? DEFAULT_EDGE_NAME : name); + return v + EDGE_KEY_DELIM + w + EDGE_KEY_DELIM + (name === undefined ? DEFAULT_EDGE_NAME : name); } - function edgeArgsToObj(isDirected, v_, w_, name) { var v = "" + v_; var w = "" + w_; @@ -682,13 +839,15 @@ function edgeArgsToObj(isDirected, v_, w_, name) { v = w; w = tmp; } - var edgeObj = { v: v, w: w }; + var edgeObj = { + v: v, + w: w + }; if (name) { edgeObj.name = name; } return edgeObj; } - function edgeObjToId(isDirected, edgeObj) { return edgeArgsToId(isDirected, edgeObj.v, edgeObj.w, edgeObj.name); } diff --git a/lib/index.js b/lib/index.js index b0f1da34..94927a7b 100644 --- a/lib/index.js +++ b/lib/index.js @@ -1,5 +1,28 @@ -// Includes only the "core" of graphlib -export {default as Graph} from "./graph.js"; -export {default as version} from "./version.js"; -export * as json from "./json.js"; -export * as alg from "./alg/index.js"; +"use strict"; + +function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, _typeof(o); } +Object.defineProperty(exports, "__esModule", { + value: true +}); +Object.defineProperty(exports, "Graph", { + enumerable: true, + get: function get() { + return _graph["default"]; + } +}); +exports.json = exports.alg = void 0; +Object.defineProperty(exports, "version", { + enumerable: true, + get: function get() { + return _version["default"]; + } +}); +var _graph = _interopRequireDefault(require("./graph.js")); +var _version = _interopRequireDefault(require("./version.js")); +var _json = _interopRequireWildcard(require("./json.js")); +exports.json = _json; +var _alg = _interopRequireWildcard(require("./alg/index.js")); +exports.alg = _alg; +function _getRequireWildcardCache(e) { if ("function" != typeof WeakMap) return null; var r = new WeakMap(), t = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(e) { return e ? t : r; })(e); } +function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e; if (null === e || "object" != _typeof(e) && "function" != typeof e) return { "default": e }; var t = _getRequireWildcardCache(r); if (t && t.has(e)) return t.get(e); var n = { __proto__: null }, a = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var u in e) if ("default" !== u && Object.prototype.hasOwnProperty.call(e, u)) { var i = a ? Object.getOwnPropertyDescriptor(e, u) : null; i && (i.get || i.set) ? Object.defineProperty(n, u, i) : n[u] = e[u]; } return n["default"] = e, t && t.set(e, n), n; } +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; } diff --git a/lib/json.js b/lib/json.js index 92ae41f6..57e1ea66 100644 --- a/lib/json.js +++ b/lib/json.js @@ -1,10 +1,17 @@ -import { default as Graph } from "./graph.js"; +"use strict"; +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.read = read; +exports.write = write; +var _graph = _interopRequireDefault(require("./graph.js")); +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; } /** * Creates a JSON representation of the graph that can be serialized to a string with * JSON.stringify. The graph can later be restored using json.read. */ -export function write(g) { +function write(g) { var json = { options: { directed: g.isDirected(), @@ -14,18 +21,18 @@ export function write(g) { nodes: writeNodes(g), edges: writeEdges(g) }; - if (g.graph() !== undefined) { json.value = structuredClone(g.graph()); } return json; } - function writeNodes(g) { - return g.nodes().map(function(v) { + return g.nodes().map(function (v) { var nodeValue = g.node(v); var parent = g.parent(v); - var node = { v: v }; + var node = { + v: v + }; if (nodeValue !== undefined) { node.value = nodeValue; } @@ -35,11 +42,13 @@ function writeNodes(g) { return node; }); } - function writeEdges(g) { - return g.edges().map(function(e) { + return g.edges().map(function (e) { var edgeValue = g.edge(e); - var edge = { v: e.v, w: e.w }; + var edge = { + v: e.v, + w: e.w + }; if (e.name !== undefined) { edge.name = e.name; } @@ -60,16 +69,20 @@ function writeEdges(g) { * g2.edges() * // [ { v: 'a', w: 'b' } ] */ -export function read(json) { - var g = new Graph(json.options).setGraph(json.value); - json.nodes.forEach(function(entry) { +function read(json) { + var g = new _graph["default"](json.options).setGraph(json.value); + json.nodes.forEach(function (entry) { g.setNode(entry.v, entry.value); if (entry.parent) { g.setParent(entry.v, entry.parent); } }); - json.edges.forEach(function(entry) { - g.setEdge({ v: entry.v, w: entry.w, name: entry.name }, entry.value); + json.edges.forEach(function (entry) { + g.setEdge({ + v: entry.v, + w: entry.w, + name: entry.name + }, entry.value); }); return g; } diff --git a/lib/version.js b/lib/version.js index 41701180..f7c50fc4 100644 --- a/lib/version.js +++ b/lib/version.js @@ -1,2 +1,7 @@ -const version = '2.1.14-pre'; -export { version as default }; +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports["default"] = void 0; +var version = exports["default"] = '2.1.14-pre'; diff --git a/mjs-lib/alg/components.js b/mjs-lib/alg/components.js new file mode 100644 index 00000000..766cdad6 --- /dev/null +++ b/mjs-lib/alg/components.js @@ -0,0 +1,23 @@ +export default function components(g) { + var visited = {}; + var cmpts = []; + var cmpt; + + function dfs(v) { + if (visited.hasOwnProperty(v)) return; + visited[v] = true; + cmpt.push(v); + g.successors(v).forEach(dfs); + g.predecessors(v).forEach(dfs); + } + + g.nodes().forEach(function(v) { + cmpt = []; + dfs(v); + if (cmpt.length) { + cmpts.push(cmpt); + } + }); + + return cmpts; +} diff --git a/mjs-lib/alg/dfs.js b/mjs-lib/alg/dfs.js new file mode 100644 index 00000000..d109bbf0 --- /dev/null +++ b/mjs-lib/alg/dfs.js @@ -0,0 +1,65 @@ +/* + * A helper that preforms a pre- or post-order traversal on the input graph + * and returns the nodes in the order they were visited. If the graph is + * undirected then this algorithm will navigate using neighbors. If the graph + * is directed then this algorithm will navigate using successors. + * + * If the order is not "post", it will be treated as "pre". + */ +export default function dfs(g, vs, order) { + if (!Array.isArray(vs)) { + vs = [vs]; + } + + var navigation = g.isDirected() ? v => g.successors(v) : v => g.neighbors(v); + var orderFunc = order === "post" ? postOrderDfs : preOrderDfs; + + var acc = []; + var visited = {}; + vs.forEach(v => { + if (!g.hasNode(v)) { + throw new Error("Graph does not have node: " + v); + } + + orderFunc(v, navigation, visited, acc); + }); + + return acc; +} + +function postOrderDfs(v, navigation, visited, acc) { + var stack = [[v, false]]; + while (stack.length > 0) { + var curr = stack.pop(); + if (curr[1]) { + acc.push(curr[0]); + } else { + if (!visited.hasOwnProperty(curr[0])) { + visited[curr[0]] = true; + stack.push([curr[0], true]); + forEachRight(navigation(curr[0]), w => stack.push([w, false])); + } + } + } +} + +function preOrderDfs(v, navigation, visited, acc) { + var stack = [v]; + while (stack.length > 0) { + var curr = stack.pop(); + if (!visited.hasOwnProperty(curr)) { + visited[curr] = true; + acc.push(curr); + forEachRight(navigation(curr), w => stack.push(w)); + } + } +} + +function forEachRight(array, iteratee) { + var length = array.length; + while (length--) { + iteratee(array[length], length, array); + } + + return array; +} diff --git a/mjs-lib/alg/dijkstra-all.js b/mjs-lib/alg/dijkstra-all.js new file mode 100644 index 00000000..ef827bce --- /dev/null +++ b/mjs-lib/alg/dijkstra-all.js @@ -0,0 +1,9 @@ +import { default as dijkstra } from "./dijkstra.js"; + + +export default function dijkstraAll(g, weightFunc, edgeFunc) { + return g.nodes().reduce(function(acc, v) { + acc[v] = dijkstra(g, v, weightFunc, edgeFunc); + return acc; + }, {}); +} diff --git a/mjs-lib/alg/dijkstra.js b/mjs-lib/alg/dijkstra.js new file mode 100644 index 00000000..ec646c3f --- /dev/null +++ b/mjs-lib/alg/dijkstra.js @@ -0,0 +1,52 @@ +import { default as PriorityQueue } from "../data/priority-queue.js"; + + +var DEFAULT_WEIGHT_FUNC = () => 1; + +export default function dijkstra(g, source, weightFn, edgeFn) { + return runDijkstra(g, String(source), + weightFn || DEFAULT_WEIGHT_FUNC, + edgeFn || function(v) { return g.outEdges(v); }); +} + +function runDijkstra(g, source, weightFn, edgeFn) { + var results = {}; + var pq = new PriorityQueue(); + var v, vEntry; + + var updateNeighbors = function(edge) { + var w = edge.v !== v ? edge.v : edge.w; + var wEntry = results[w]; + var weight = weightFn(edge); + var distance = vEntry.distance + weight; + + if (weight < 0) { + throw new Error("dijkstra does not allow negative edge weights. " + + "Bad edge: " + edge + " Weight: " + weight); + } + + if (distance < wEntry.distance) { + wEntry.distance = distance; + wEntry.predecessor = v; + pq.decrease(w, distance); + } + }; + + g.nodes().forEach(function(v) { + var distance = v === source ? 0 : Number.POSITIVE_INFINITY; + results[v] = { distance: distance }; + pq.add(v, distance); + }); + + while (pq.size() > 0) { + v = pq.removeMin(); + vEntry = results[v]; + if (vEntry.distance === Number.POSITIVE_INFINITY) { + break; + } + + edgeFn(v).forEach(updateNeighbors); + } + + return results; +} diff --git a/mjs-lib/alg/find-cycles.js b/mjs-lib/alg/find-cycles.js new file mode 100644 index 00000000..42a37d4b --- /dev/null +++ b/mjs-lib/alg/find-cycles.js @@ -0,0 +1,7 @@ +import { default as tarjan } from "./tarjan.js"; + +export default function findCycles(g) { + return tarjan(g).filter(function(cmpt) { + return cmpt.length > 1 || (cmpt.length === 1 && g.hasEdge(cmpt[0], cmpt[0])); + }); +} diff --git a/mjs-lib/alg/floyd-warshall.js b/mjs-lib/alg/floyd-warshall.js new file mode 100644 index 00000000..c014b0bf --- /dev/null +++ b/mjs-lib/alg/floyd-warshall.js @@ -0,0 +1,46 @@ +var DEFAULT_WEIGHT_FUNC = () => 1; + +export default function floydWarshall(g, weightFn, edgeFn) { + return runFloydWarshall(g, + weightFn || DEFAULT_WEIGHT_FUNC, + edgeFn || function(v) { return g.outEdges(v); }); +} + +function runFloydWarshall(g, weightFn, edgeFn) { + var results = {}; + var nodes = g.nodes(); + + nodes.forEach(function(v) { + results[v] = {}; + results[v][v] = { distance: 0 }; + nodes.forEach(function(w) { + if (v !== w) { + results[v][w] = { distance: Number.POSITIVE_INFINITY }; + } + }); + edgeFn(v).forEach(function(edge) { + var w = edge.v === v ? edge.w : edge.v; + var d = weightFn(edge); + results[v][w] = { distance: d, predecessor: v }; + }); + }); + + nodes.forEach(function(k) { + var rowK = results[k]; + nodes.forEach(function(i) { + var rowI = results[i]; + nodes.forEach(function(j) { + var ik = rowI[k]; + var kj = rowK[j]; + var ij = rowI[j]; + var altDistance = ik.distance + kj.distance; + if (altDistance < ij.distance) { + ij.distance = altDistance; + ij.predecessor = kj.predecessor; + } + }); + }); + }); + + return results; +} diff --git a/mjs-lib/alg/index.js b/mjs-lib/alg/index.js new file mode 100644 index 00000000..e8c9abde --- /dev/null +++ b/mjs-lib/alg/index.js @@ -0,0 +1,11 @@ +export { default as components } from "./components.js"; +export { default as dijkstra } from "./dijkstra.js"; +export { default as dijkstraAll } from "./dijkstra-all.js"; +export { default as findCycles } from "./find-cycles.js"; +export { default as floydWarshall } from "./floyd-warshall.js"; +export { default as isAcyclic } from "./is-acyclic.js"; +export { default as postorder } from "./postorder.js"; +export { default as preorder } from "./preorder.js"; +export { default as prim } from "./prim.js"; +export { default as tarjan } from "./tarjan.js"; +export { default as topsort } from "./topsort.js"; diff --git a/mjs-lib/alg/is-acyclic.js b/mjs-lib/alg/is-acyclic.js new file mode 100644 index 00000000..e3467560 --- /dev/null +++ b/mjs-lib/alg/is-acyclic.js @@ -0,0 +1,13 @@ +import { default as topsort } from "./topsort.js"; + +export default function isAcyclic(g) { + try { + topsort(g); + } catch (e) { + if (e instanceof topsort.CycleException) { + return false; + } + throw e; + } + return true; +} diff --git a/mjs-lib/alg/postorder.js b/mjs-lib/alg/postorder.js new file mode 100644 index 00000000..23830a43 --- /dev/null +++ b/mjs-lib/alg/postorder.js @@ -0,0 +1,5 @@ +import { default as dfs } from "./dfs.js"; + +export default function postorder(g, vs) { + return dfs(g, vs, "post"); +} diff --git a/mjs-lib/alg/preorder.js b/mjs-lib/alg/preorder.js new file mode 100644 index 00000000..472ba468 --- /dev/null +++ b/mjs-lib/alg/preorder.js @@ -0,0 +1,5 @@ +import { default as dfs } from "./dfs.js"; + +export default function preorder(g, vs) { + return dfs(g, vs, "pre"); +} diff --git a/mjs-lib/alg/prim.js b/mjs-lib/alg/prim.js new file mode 100644 index 00000000..ce22020c --- /dev/null +++ b/mjs-lib/alg/prim.js @@ -0,0 +1,49 @@ +import { default as Graph } from "../graph.js"; +import { default as PriorityQueue } from "../data/priority-queue.js"; + +export default function prim(g, weightFunc) { + var result = new Graph(); + var parents = {}; + var pq = new PriorityQueue(); + var v; + + function updateNeighbors(edge) { + var w = edge.v === v ? edge.w : edge.v; + var pri = pq.priority(w); + if (pri !== undefined) { + var edgeWeight = weightFunc(edge); + if (edgeWeight < pri) { + parents[w] = v; + pq.decrease(w, edgeWeight); + } + } + } + + if (g.nodeCount() === 0) { + return result; + } + + g.nodes().forEach(function(v) { + pq.add(v, Number.POSITIVE_INFINITY); + result.setNode(v); + }); + + // Start from an arbitrary node + pq.decrease(g.nodes()[0], 0); + + var init = false; + while (pq.size() > 0) { + v = pq.removeMin(); + if (parents.hasOwnProperty(v)) { + result.setEdge(v, parents[v]); + } else if (init) { + throw new Error("Input graph is not connected: " + g); + } else { + init = true; + } + + g.nodeEdges(v).forEach(updateNeighbors); + } + + return result; +} diff --git a/mjs-lib/alg/tarjan.js b/mjs-lib/alg/tarjan.js new file mode 100644 index 00000000..e38e1a34 --- /dev/null +++ b/mjs-lib/alg/tarjan.js @@ -0,0 +1,43 @@ +export default function tarjan(g) { + var index = 0; + var stack = []; + var visited = {}; // node id -> { onStack, lowlink, index } + var results = []; + + function dfs(v) { + var entry = visited[v] = { + onStack: true, + lowlink: index, + index: index++ + }; + stack.push(v); + + g.successors(v).forEach(function(w) { + if (!visited.hasOwnProperty(w)) { + dfs(w); + entry.lowlink = Math.min(entry.lowlink, visited[w].lowlink); + } else if (visited[w].onStack) { + entry.lowlink = Math.min(entry.lowlink, visited[w].index); + } + }); + + if (entry.lowlink === entry.index) { + var cmpt = []; + var w; + do { + w = stack.pop(); + visited[w].onStack = false; + cmpt.push(w); + } while (v !== w); + results.push(cmpt); + } + } + + g.nodes().forEach(function(v) { + if (!visited.hasOwnProperty(v)) { + dfs(v); + } + }); + + return results; +} diff --git a/mjs-lib/alg/topsort.js b/mjs-lib/alg/topsort.js new file mode 100644 index 00000000..cba234ec --- /dev/null +++ b/mjs-lib/alg/topsort.js @@ -0,0 +1,35 @@ +export default function topsort(g) { + var visited = {}; + var stack = {}; + var results = []; + + function visit(node) { + if (stack.hasOwnProperty(node)) { + throw new CycleException(); + } + + if (!visited.hasOwnProperty(node)) { + stack[node] = true; + visited[node] = true; + g.predecessors(node).forEach(visit); + delete stack[node]; + results.push(node); + } + } + + g.sinks().forEach(visit); + + if (Object.keys(visited).length !== g.nodeCount()) { + throw new CycleException(); + } + + return results; +} + +class CycleException extends Error { + constructor() { + super(...arguments); + } +} + +topsort.CycleException = CycleException; diff --git a/mjs-lib/data/priority-queue.js b/mjs-lib/data/priority-queue.js new file mode 100644 index 00000000..13b2b5f0 --- /dev/null +++ b/mjs-lib/data/priority-queue.js @@ -0,0 +1,148 @@ +/** + * A min-priority queue data structure. This algorithm is derived from Cormen, + * et al., "Introduction to Algorithms". The basic idea of a min-priority + * queue is that you can efficiently (in O(1) time) get the smallest key in + * the queue. Adding and removing elements takes O(log n) time. A key can + * have its priority decreased in O(log n) time. + */ +export default class PriorityQueue { + #arr = []; + #keyIndices = {}; + + /** + * Returns the number of elements in the queue. Takes `O(1)` time. + */ + size() { + return this.#arr.length; + } + + /** + * Returns the keys that are in the queue. Takes `O(n)` time. + */ + keys() { + return this.#arr.map(function(x) { return x.key; }); + } + + /** + * Returns `true` if **key** is in the queue and `false` if not. + */ + has(key) { + return this.#keyIndices.hasOwnProperty(key); + } + + /** + * Returns the priority for **key**. If **key** is not present in the queue + * then this function returns `undefined`. Takes `O(1)` time. + * + * @param {Object} key + */ + priority(key) { + var index = this.#keyIndices[key]; + if (index !== undefined) { + return this.#arr[index].priority; + } + } + + /** + * Returns the key for the minimum element in this queue. If the queue is + * empty this function throws an Error. Takes `O(1)` time. + */ + min() { + if (this.size() === 0) { + throw new Error("Queue underflow"); + } + return this.#arr[0].key; + } + + /** + * Inserts a new key into the priority queue. If the key already exists in + * the queue this function returns `false`; otherwise it will return `true`. + * Takes `O(n)` time. + * + * @param {Object} key the key to add + * @param {Number} priority the initial priority for the key + */ + add(key, priority) { + var keyIndices = this.#keyIndices; + key = String(key); + if (!keyIndices.hasOwnProperty(key)) { + var arr = this.#arr; + var index = arr.length; + keyIndices[key] = index; + arr.push({key: key, priority: priority}); + this.#decrease(index); + return true; + } + return false; + } + + /** + * Removes and returns the smallest key in the queue. Takes `O(log n)` time. + */ + removeMin() { + this.#swap(0, this.#arr.length - 1); + var min = this.#arr.pop(); + delete this.#keyIndices[min.key]; + this.#heapify(0); + return min.key; + } + + /** + * Decreases the priority for **key** to **priority**. If the new priority is + * greater than the previous priority, this function will throw an Error. + * + * @param {Object} key the key for which to raise priority + * @param {Number} priority the new priority for the key + */ + decrease(key, priority) { + var index = this.#keyIndices[key]; + if (priority > this.#arr[index].priority) { + throw new Error("New priority is greater than current priority. " + + "Key: " + key + " Old: " + this.#arr[index].priority + " New: " + priority); + } + this.#arr[index].priority = priority; + this.#decrease(index); + } + + #heapify(i) { + var arr = this.#arr; + var l = 2 * i; + var r = l + 1; + var largest = i; + if (l < arr.length) { + largest = arr[l].priority < arr[largest].priority ? l : largest; + if (r < arr.length) { + largest = arr[r].priority < arr[largest].priority ? r : largest; + } + if (largest !== i) { + this.#swap(i, largest); + this.#heapify(largest); + } + } + } + + #decrease(index) { + var arr = this.#arr; + var priority = arr[index].priority; + var parent; + while (index !== 0) { + parent = index >> 1; + if (arr[parent].priority < priority) { + break; + } + this.#swap(index, parent); + index = parent; + } + } + + #swap(i, j) { + var arr = this.#arr; + var keyIndices = this.#keyIndices; + var origArrI = arr[i]; + var origArrJ = arr[j]; + arr[i] = origArrJ; + arr[j] = origArrI; + keyIndices[origArrJ.key] = i; + keyIndices[origArrI.key] = j; + } +} diff --git a/mjs-lib/graph.js b/mjs-lib/graph.js new file mode 100644 index 00000000..69cefc8b --- /dev/null +++ b/mjs-lib/graph.js @@ -0,0 +1,694 @@ +"use strict"; + +var DEFAULT_EDGE_NAME = "\x00"; +var GRAPH_NODE = "\x00"; +var EDGE_KEY_DELIM = "\x01"; + +// Implementation notes: +// +// * Node id query functions should return string ids for the nodes +// * Edge id query functions should return an "edgeObj", edge object, that is +// composed of enough information to uniquely identify an edge: {v, w, name}. +// * Internally we use an "edgeId", a stringified form of the edgeObj, to +// reference edges. This is because we need a performant way to look these +// edges up and, object properties, which have string keys, are the closest +// we're going to get to a performant hashtable in JavaScript. + +export default class Graph { + #isDirected = true; + #isMultigraph = false; + #isCompound = false; + + // Label for the graph itself + #label; + + // Defaults to be set when creating a new node + #defaultNodeLabelFn = () => undefined; + + // Defaults to be set when creating a new edge + #defaultEdgeLabelFn = () => undefined; + + // v -> label + #nodes = {}; + + // v -> edgeObj + #in = {}; + + // u -> v -> Number + #preds = {}; + + // v -> edgeObj + #out = {}; + + // v -> w -> Number + #sucs = {}; + + // e -> edgeObj + #edgeObjs = {}; + + // e -> label + #edgeLabels = {}; + + /* Number of nodes in the graph. Should only be changed by the implementation. */ + #nodeCount = 0; + + /* Number of edges in the graph. Should only be changed by the implementation. */ + #edgeCount = 0; + + #parent; + + #children; + + constructor(opts) { + if (opts) { + this.#isDirected = opts.hasOwnProperty("directed") ? opts.directed : true; + this.#isMultigraph = opts.hasOwnProperty("multigraph") ? opts.multigraph : false; + this.#isCompound = opts.hasOwnProperty("compound") ? opts.compound : false; + } + + if (this.#isCompound) { + // v -> parent + this.#parent = {}; + + // v -> children + this.#children = {}; + this.#children[GRAPH_NODE] = {}; + } + } + + /* === Graph functions ========= */ + + /** + * Whether graph was created with 'directed' flag set to true or not. + */ + isDirected() { + return this.#isDirected; + } + + /** + * Whether graph was created with 'multigraph' flag set to true or not. + */ + isMultigraph() { + return this.#isMultigraph; + } + + /** + * Whether graph was created with 'compound' flag set to true or not. + */ + isCompound() { + return this.#isCompound; + } + + /** + * Sets the label of the graph. + */ + setGraph(label) { + this.#label = label; + return this; + } + + /** + * Gets the graph label. + */ + graph() { + return this.#label; + } + + + /* === Node functions ========== */ + + /** + * Sets the default node label. If newDefault is a function, it will be + * invoked ach time when setting a label for a node. Otherwise, this label + * will be assigned as default label in case if no label was specified while + * setting a node. + * Complexity: O(1). + */ + setDefaultNodeLabel(newDefault) { + this.#defaultNodeLabelFn = newDefault; + if (typeof newDefault !== 'function') { + this.#defaultNodeLabelFn = () => newDefault; + } + + return this; + } + + /** + * Gets the number of nodes in the graph. + * Complexity: O(1). + */ + nodeCount() { + return this.#nodeCount; + } + + /** + * Gets all nodes of the graph. Note, the in case of compound graph subnodes are + * not included in list. + * Complexity: O(1). + */ + nodes() { + return Object.keys(this.#nodes); + } + + /** + * Gets list of nodes without in-edges. + * Complexity: O(|V|). + */ + sources() { + var self = this; + return this.nodes().filter(v => Object.keys(self.#in[v]).length === 0); + } + + /** + * Gets list of nodes without out-edges. + * Complexity: O(|V|). + */ + sinks() { + var self = this; + return this.nodes().filter(v => Object.keys(self.#out[v]).length === 0); + } + + /** + * Invokes setNode method for each node in names list. + * Complexity: O(|names|). + */ + setNodes(vs, value) { + var args = arguments; + var self = this; + vs.forEach(function(v) { + if (args.length > 1) { + self.setNode(v, value); + } else { + self.setNode(v); + } + }); + return this; + } + + /** + * Creates or updates the value for the node v in the graph. If label is supplied + * it is set as the value for the node. If label is not supplied and the node was + * created by this call then the default node label will be assigned. + * Complexity: O(1). + */ + setNode(v, value) { + if (this.#nodes.hasOwnProperty(v)) { + if (arguments.length > 1) { + this.#nodes[v] = value; + } + return this; + } + + this.#nodes[v] = arguments.length > 1 ? value : this.#defaultNodeLabelFn(v); + if (this.#isCompound) { + this.#parent[v] = GRAPH_NODE; + this.#children[v] = {}; + this.#children[GRAPH_NODE][v] = true; + } + this.#in[v] = {}; + this.#preds[v] = {}; + this.#out[v] = {}; + this.#sucs[v] = {}; + ++this.#nodeCount; + return this; + } + + /** + * Gets the label of node with specified name. + * Complexity: O(|V|). + */ + node(v) { + return this.#nodes[v]; + } + + /** + * Detects whether graph has a node with specified name or not. + */ + hasNode(v) { + return this.#nodes.hasOwnProperty(v); + } + + /** + * Remove the node with the name from the graph or do nothing if the node is not in + * the graph. If the node was removed this function also removes any incident + * edges. + * Complexity: O(1). + */ + removeNode(v) { + var self = this; + if (this.#nodes.hasOwnProperty(v)) { + var removeEdge = e => self.removeEdge(self.#edgeObjs[e]); + delete this.#nodes[v]; + if (this.#isCompound) { + this.#removeFromParentsChildList(v); + delete this.#parent[v]; + this.children(v).forEach(function(child) { + self.setParent(child); + }); + delete this.#children[v]; + } + Object.keys(this.#in[v]).forEach(removeEdge); + delete this.#in[v]; + delete this.#preds[v]; + Object.keys(this.#out[v]).forEach(removeEdge); + delete this.#out[v]; + delete this.#sucs[v]; + --this.#nodeCount; + } + return this; + } + + /** + * Sets node p as a parent for node v if it is defined, or removes the + * parent for v if p is undefined. Method throws an exception in case of + * invoking it in context of noncompound graph. + * Average-case complexity: O(1). + */ + setParent(v, parent) { + if (!this.#isCompound) { + throw new Error("Cannot set parent in a non-compound graph"); + } + + if (parent === undefined) { + parent = GRAPH_NODE; + } else { + // Coerce parent to string + parent += ""; + for (var ancestor = parent; ancestor !== undefined; ancestor = this.parent(ancestor)) { + if (ancestor === v) { + throw new Error("Setting " + parent+ " as parent of " + v + + " would create a cycle"); + } + } + + this.setNode(parent); + } + + this.setNode(v); + this.#removeFromParentsChildList(v); + this.#parent[v] = parent; + this.#children[parent][v] = true; + return this; + } + + #removeFromParentsChildList(v) { + delete this.#children[this.#parent[v]][v]; + } + + /** + * Gets parent node for node v. + * Complexity: O(1). + */ + parent(v) { + if (this.#isCompound) { + var parent = this.#parent[v]; + if (parent !== GRAPH_NODE) { + return parent; + } + } + } + + /** + * Gets list of direct children of node v. + * Complexity: O(1). + */ + children(v = GRAPH_NODE) { + if (this.#isCompound) { + var children = this.#children[v]; + if (children) { + return Object.keys(children); + } + } else if (v === GRAPH_NODE) { + return this.nodes(); + } else if (this.hasNode(v)) { + return []; + } + } + + /** + * Return all nodes that are predecessors of the specified node or undefined if node v is not in + * the graph. Behavior is undefined for undirected graphs - use neighbors instead. + * Complexity: O(|V|). + */ + predecessors(v) { + var predsV = this.#preds[v]; + if (predsV) { + return Object.keys(predsV); + } + } + + /** + * Return all nodes that are successors of the specified node or undefined if node v is not in + * the graph. Behavior is undefined for undirected graphs - use neighbors instead. + * Complexity: O(|V|). + */ + successors(v) { + var sucsV = this.#sucs[v]; + if (sucsV) { + return Object.keys(sucsV); + } + } + + /** + * Return all nodes that are predecessors or successors of the specified node or undefined if + * node v is not in the graph. + * Complexity: O(|V|). + */ + neighbors(v) { + var preds = this.predecessors(v); + if (preds) { + const union = new Set(preds); + for (var succ of this.successors(v)) { + union.add(succ); + } + + return Array.from(union.values()); + } + } + + isLeaf(v) { + var neighbors; + if (this.isDirected()) { + neighbors = this.successors(v); + } else { + neighbors = this.neighbors(v); + } + return neighbors.length === 0; + } + + /** + * Creates new graph with nodes filtered via filter. Edges incident to rejected node + * are also removed. In case of compound graph, if parent is rejected by filter, + * than all its children are rejected too. + * Average-case complexity: O(|E|+|V|). + */ + filterNodes(filter) { + var copy = new this.constructor({ + directed: this.#isDirected, + multigraph: this.#isMultigraph, + compound: this.#isCompound + }); + + copy.setGraph(this.graph()); + + var self = this; + Object.entries(this.#nodes).forEach(function([v, value]) { + if (filter(v)) { + copy.setNode(v, value); + } + }); + + Object.values(this.#edgeObjs).forEach(function(e) { + if (copy.hasNode(e.v) && copy.hasNode(e.w)) { + copy.setEdge(e, self.edge(e)); + } + }); + + var parents = {}; + function findParent(v) { + var parent = self.parent(v); + if (parent === undefined || copy.hasNode(parent)) { + parents[v] = parent; + return parent; + } else if (parent in parents) { + return parents[parent]; + } else { + return findParent(parent); + } + } + + if (this.#isCompound) { + copy.nodes().forEach(v => copy.setParent(v, findParent(v))); + } + + return copy; + } + + /* === Edge functions ========== */ + + /** + * Sets the default edge label or factory function. This label will be + * assigned as default label in case if no label was specified while setting + * an edge or this function will be invoked each time when setting an edge + * with no label specified and returned value * will be used as a label for edge. + * Complexity: O(1). + */ + setDefaultEdgeLabel(newDefault) { + this.#defaultEdgeLabelFn = newDefault; + if (typeof newDefault !== 'function') { + this.#defaultEdgeLabelFn = () => newDefault; + } + + return this; + } + + /** + * Gets the number of edges in the graph. + * Complexity: O(1). + */ + edgeCount() { + return this.#edgeCount; + } + + /** + * Gets edges of the graph. In case of compound graph subgraphs are not considered. + * Complexity: O(|E|). + */ + edges() { + return Object.values(this.#edgeObjs); + } + + /** + * Establish an edges path over the nodes in nodes list. If some edge is already + * exists, it will update its label, otherwise it will create an edge between pair + * of nodes with label provided or default label if no label provided. + * Complexity: O(|nodes|). + */ + setPath(vs, value) { + var self = this; + var args = arguments; + vs.reduce(function(v, w) { + if (args.length > 1) { + self.setEdge(v, w, value); + } else { + self.setEdge(v, w); + } + return w; + }); + return this; + } + + /** + * Creates or updates the label for the edge (v, w) with the optionally supplied + * name. If label is supplied it is set as the value for the edge. If label is not + * supplied and the edge was created by this call then the default edge label will + * be assigned. The name parameter is only useful with multigraphs. + */ + setEdge() { + var v, w, name, value; + var valueSpecified = false; + var arg0 = arguments[0]; + + if (typeof arg0 === "object" && arg0 !== null && "v" in arg0) { + v = arg0.v; + w = arg0.w; + name = arg0.name; + if (arguments.length === 2) { + value = arguments[1]; + valueSpecified = true; + } + } else { + v = arg0; + w = arguments[1]; + name = arguments[3]; + if (arguments.length > 2) { + value = arguments[2]; + valueSpecified = true; + } + } + + v = "" + v; + w = "" + w; + if (name !== undefined) { + name = "" + name; + } + + var e = edgeArgsToId(this.#isDirected, v, w, name); + if (this.#edgeLabels.hasOwnProperty(e)) { + if (valueSpecified) { + this.#edgeLabels[e] = value; + } + return this; + } + + if (name !== undefined && !this.#isMultigraph) { + throw new Error("Cannot set a named edge when isMultigraph = false"); + } + + // It didn't exist, so we need to create it. + // First ensure the nodes exist. + this.setNode(v); + this.setNode(w); + + this.#edgeLabels[e] = valueSpecified ? value : this.#defaultEdgeLabelFn(v, w, name); + + var edgeObj = edgeArgsToObj(this.#isDirected, v, w, name); + // Ensure we add undirected edges in a consistent way. + v = edgeObj.v; + w = edgeObj.w; + + Object.freeze(edgeObj); + this.#edgeObjs[e] = edgeObj; + incrementOrInitEntry(this.#preds[w], v); + incrementOrInitEntry(this.#sucs[v], w); + this.#in[w][e] = edgeObj; + this.#out[v][e] = edgeObj; + this.#edgeCount++; + return this; + } + + /** + * Gets the label for the specified edge. + * Complexity: O(1). + */ + edge(v, w, name) { + var e = (arguments.length === 1 + ? edgeObjToId(this.#isDirected, arguments[0]) + : edgeArgsToId(this.#isDirected, v, w, name)); + return this.#edgeLabels[e]; + } + + /** + * Gets the label for the specified edge and converts it to an object. + * Complexity: O(1) + */ + edgeAsObj() { + const edge = this.edge(...arguments); + if (typeof edge !== "object") { + return {label: edge}; + } + + return edge; + } + + /** + * Detects whether the graph contains specified edge or not. No subgraphs are considered. + * Complexity: O(1). + */ + hasEdge(v, w, name) { + var e = (arguments.length === 1 + ? edgeObjToId(this.#isDirected, arguments[0]) + : edgeArgsToId(this.#isDirected, v, w, name)); + return this.#edgeLabels.hasOwnProperty(e); + } + + /** + * Removes the specified edge from the graph. No subgraphs are considered. + * Complexity: O(1). + */ + removeEdge(v, w, name) { + var e = (arguments.length === 1 + ? edgeObjToId(this.#isDirected, arguments[0]) + : edgeArgsToId(this.#isDirected, v, w, name)); + var edge = this.#edgeObjs[e]; + if (edge) { + v = edge.v; + w = edge.w; + delete this.#edgeLabels[e]; + delete this.#edgeObjs[e]; + decrementOrRemoveEntry(this.#preds[w], v); + decrementOrRemoveEntry(this.#sucs[v], w); + delete this.#in[w][e]; + delete this.#out[v][e]; + this.#edgeCount--; + } + return this; + } + + /** + * Return all edges that point to the node v. Optionally filters those edges down to just those + * coming from node u. Behavior is undefined for undirected graphs - use nodeEdges instead. + * Complexity: O(|E|). + */ + inEdges(v, u) { + var inV = this.#in[v]; + if (inV) { + var edges = Object.values(inV); + if (!u) { + return edges; + } + return edges.filter(edge => edge.v === u); + } + } + + /** + * Return all edges that are pointed at by node v. Optionally filters those edges down to just + * those point to w. Behavior is undefined for undirected graphs - use nodeEdges instead. + * Complexity: O(|E|). + */ + outEdges(v, w) { + var outV = this.#out[v]; + if (outV) { + var edges = Object.values(outV); + if (!w) { + return edges; + } + return edges.filter(edge => edge.w === w); + } + } + + /** + * Returns all edges to or from node v regardless of direction. Optionally filters those edges + * down to just those between nodes v and w regardless of direction. + * Complexity: O(|E|). + */ + nodeEdges(v, w) { + var inEdges = this.inEdges(v, w); + if (inEdges) { + return inEdges.concat(this.outEdges(v, w)); + } + } +} + +function incrementOrInitEntry(map, k) { + if (map[k]) { + map[k]++; + } else { + map[k] = 1; + } +} + +function decrementOrRemoveEntry(map, k) { + if (!--map[k]) { delete map[k]; } +} + +function edgeArgsToId(isDirected, v_, w_, name) { + var v = "" + v_; + var w = "" + w_; + if (!isDirected && v > w) { + var tmp = v; + v = w; + w = tmp; + } + return v + EDGE_KEY_DELIM + w + EDGE_KEY_DELIM + + (name === undefined ? DEFAULT_EDGE_NAME : name); +} + +function edgeArgsToObj(isDirected, v_, w_, name) { + var v = "" + v_; + var w = "" + w_; + if (!isDirected && v > w) { + var tmp = v; + v = w; + w = tmp; + } + var edgeObj = { v: v, w: w }; + if (name) { + edgeObj.name = name; + } + return edgeObj; +} + +function edgeObjToId(isDirected, edgeObj) { + return edgeArgsToId(isDirected, edgeObj.v, edgeObj.w, edgeObj.name); +} diff --git a/mjs-lib/index.js b/mjs-lib/index.js new file mode 100644 index 00000000..b0f1da34 --- /dev/null +++ b/mjs-lib/index.js @@ -0,0 +1,5 @@ +// Includes only the "core" of graphlib +export {default as Graph} from "./graph.js"; +export {default as version} from "./version.js"; +export * as json from "./json.js"; +export * as alg from "./alg/index.js"; diff --git a/mjs-lib/json.js b/mjs-lib/json.js new file mode 100644 index 00000000..92ae41f6 --- /dev/null +++ b/mjs-lib/json.js @@ -0,0 +1,75 @@ +import { default as Graph } from "./graph.js"; + +/** + * Creates a JSON representation of the graph that can be serialized to a string with + * JSON.stringify. The graph can later be restored using json.read. + */ +export function write(g) { + var json = { + options: { + directed: g.isDirected(), + multigraph: g.isMultigraph(), + compound: g.isCompound() + }, + nodes: writeNodes(g), + edges: writeEdges(g) + }; + + if (g.graph() !== undefined) { + json.value = structuredClone(g.graph()); + } + return json; +} + +function writeNodes(g) { + return g.nodes().map(function(v) { + var nodeValue = g.node(v); + var parent = g.parent(v); + var node = { v: v }; + if (nodeValue !== undefined) { + node.value = nodeValue; + } + if (parent !== undefined) { + node.parent = parent; + } + return node; + }); +} + +function writeEdges(g) { + return g.edges().map(function(e) { + var edgeValue = g.edge(e); + var edge = { v: e.v, w: e.w }; + if (e.name !== undefined) { + edge.name = e.name; + } + if (edgeValue !== undefined) { + edge.value = edgeValue; + } + return edge; + }); +} + +/** + * Takes JSON as input and returns the graph representation. + * + * @example + * var g2 = graphlib.json.read(JSON.parse(str)); + * g2.nodes(); + * // ['a', 'b'] + * g2.edges() + * // [ { v: 'a', w: 'b' } ] + */ +export function read(json) { + var g = new Graph(json.options).setGraph(json.value); + json.nodes.forEach(function(entry) { + g.setNode(entry.v, entry.value); + if (entry.parent) { + g.setParent(entry.v, entry.parent); + } + }); + json.edges.forEach(function(entry) { + g.setEdge({ v: entry.v, w: entry.w, name: entry.name }, entry.value); + }); + return g; +} diff --git a/mjs-lib/version.js b/mjs-lib/version.js new file mode 100644 index 00000000..41701180 --- /dev/null +++ b/mjs-lib/version.js @@ -0,0 +1,2 @@ +const version = '2.1.14-pre'; +export { version as default }; diff --git a/old-lib/alg/components.js b/old-lib/alg/components.js new file mode 100644 index 00000000..deeb85ed --- /dev/null +++ b/old-lib/alg/components.js @@ -0,0 +1,25 @@ +module.exports = components; + +function components(g) { + var visited = {}; + var cmpts = []; + var cmpt; + + function dfs(v) { + if (visited.hasOwnProperty(v)) return; + visited[v] = true; + cmpt.push(v); + g.successors(v).forEach(dfs); + g.predecessors(v).forEach(dfs); + } + + g.nodes().forEach(function(v) { + cmpt = []; + dfs(v); + if (cmpt.length) { + cmpts.push(cmpt); + } + }); + + return cmpts; +} diff --git a/old-lib/alg/dfs.js b/old-lib/alg/dfs.js new file mode 100644 index 00000000..34a323cb --- /dev/null +++ b/old-lib/alg/dfs.js @@ -0,0 +1,67 @@ +module.exports = dfs; + +/* + * A helper that preforms a pre- or post-order traversal on the input graph + * and returns the nodes in the order they were visited. If the graph is + * undirected then this algorithm will navigate using neighbors. If the graph + * is directed then this algorithm will navigate using successors. + * + * If the order is not "post", it will be treated as "pre". + */ +function dfs(g, vs, order) { + if (!Array.isArray(vs)) { + vs = [vs]; + } + + var navigation = g.isDirected() ? v => g.successors(v) : v => g.neighbors(v); + var orderFunc = order === "post" ? postOrderDfs : preOrderDfs; + + var acc = []; + var visited = {}; + vs.forEach(v => { + if (!g.hasNode(v)) { + throw new Error("Graph does not have node: " + v); + } + + orderFunc(v, navigation, visited, acc); + }); + + return acc; +} + +function postOrderDfs(v, navigation, visited, acc) { + var stack = [[v, false]]; + while (stack.length > 0) { + var curr = stack.pop(); + if (curr[1]) { + acc.push(curr[0]); + } else { + if (!visited.hasOwnProperty(curr[0])) { + visited[curr[0]] = true; + stack.push([curr[0], true]); + forEachRight(navigation(curr[0]), w => stack.push([w, false])); + } + } + } +} + +function preOrderDfs(v, navigation, visited, acc) { + var stack = [v]; + while (stack.length > 0) { + var curr = stack.pop(); + if (!visited.hasOwnProperty(curr)) { + visited[curr] = true; + acc.push(curr); + forEachRight(navigation(curr), w => stack.push(w)); + } + } +} + +function forEachRight(array, iteratee) { + var length = array.length; + while (length--) { + iteratee(array[length], length, array); + } + + return array; +} diff --git a/old-lib/alg/dijkstra-all.js b/old-lib/alg/dijkstra-all.js new file mode 100644 index 00000000..6c5d4b3b --- /dev/null +++ b/old-lib/alg/dijkstra-all.js @@ -0,0 +1,10 @@ +var dijkstra = require("./dijkstra"); + +module.exports = dijkstraAll; + +function dijkstraAll(g, weightFunc, edgeFunc) { + return g.nodes().reduce(function(acc, v) { + acc[v] = dijkstra(g, v, weightFunc, edgeFunc); + return acc; + }, {}); +} diff --git a/old-lib/alg/dijkstra.js b/old-lib/alg/dijkstra.js new file mode 100644 index 00000000..4b74a2dd --- /dev/null +++ b/old-lib/alg/dijkstra.js @@ -0,0 +1,53 @@ +var PriorityQueue = require("../data/priority-queue"); + +module.exports = dijkstra; + +var DEFAULT_WEIGHT_FUNC = () => 1; + +function dijkstra(g, source, weightFn, edgeFn) { + return runDijkstra(g, String(source), + weightFn || DEFAULT_WEIGHT_FUNC, + edgeFn || function(v) { return g.outEdges(v); }); +} + +function runDijkstra(g, source, weightFn, edgeFn) { + var results = {}; + var pq = new PriorityQueue(); + var v, vEntry; + + var updateNeighbors = function(edge) { + var w = edge.v !== v ? edge.v : edge.w; + var wEntry = results[w]; + var weight = weightFn(edge); + var distance = vEntry.distance + weight; + + if (weight < 0) { + throw new Error("dijkstra does not allow negative edge weights. " + + "Bad edge: " + edge + " Weight: " + weight); + } + + if (distance < wEntry.distance) { + wEntry.distance = distance; + wEntry.predecessor = v; + pq.decrease(w, distance); + } + }; + + g.nodes().forEach(function(v) { + var distance = v === source ? 0 : Number.POSITIVE_INFINITY; + results[v] = { distance: distance }; + pq.add(v, distance); + }); + + while (pq.size() > 0) { + v = pq.removeMin(); + vEntry = results[v]; + if (vEntry.distance === Number.POSITIVE_INFINITY) { + break; + } + + edgeFn(v).forEach(updateNeighbors); + } + + return results; +} diff --git a/old-lib/alg/find-cycles.js b/old-lib/alg/find-cycles.js new file mode 100644 index 00000000..95df84f6 --- /dev/null +++ b/old-lib/alg/find-cycles.js @@ -0,0 +1,9 @@ +var tarjan = require("./tarjan"); + +module.exports = findCycles; + +function findCycles(g) { + return tarjan(g).filter(function(cmpt) { + return cmpt.length > 1 || (cmpt.length === 1 && g.hasEdge(cmpt[0], cmpt[0])); + }); +} diff --git a/old-lib/alg/floyd-warshall.js b/old-lib/alg/floyd-warshall.js new file mode 100644 index 00000000..c2f3ae21 --- /dev/null +++ b/old-lib/alg/floyd-warshall.js @@ -0,0 +1,48 @@ +module.exports = floydWarshall; + +var DEFAULT_WEIGHT_FUNC = () => 1; + +function floydWarshall(g, weightFn, edgeFn) { + return runFloydWarshall(g, + weightFn || DEFAULT_WEIGHT_FUNC, + edgeFn || function(v) { return g.outEdges(v); }); +} + +function runFloydWarshall(g, weightFn, edgeFn) { + var results = {}; + var nodes = g.nodes(); + + nodes.forEach(function(v) { + results[v] = {}; + results[v][v] = { distance: 0 }; + nodes.forEach(function(w) { + if (v !== w) { + results[v][w] = { distance: Number.POSITIVE_INFINITY }; + } + }); + edgeFn(v).forEach(function(edge) { + var w = edge.v === v ? edge.w : edge.v; + var d = weightFn(edge); + results[v][w] = { distance: d, predecessor: v }; + }); + }); + + nodes.forEach(function(k) { + var rowK = results[k]; + nodes.forEach(function(i) { + var rowI = results[i]; + nodes.forEach(function(j) { + var ik = rowI[k]; + var kj = rowK[j]; + var ij = rowI[j]; + var altDistance = ik.distance + kj.distance; + if (altDistance < ij.distance) { + ij.distance = altDistance; + ij.predecessor = kj.predecessor; + } + }); + }); + }); + + return results; +} diff --git a/old-lib/alg/index.js b/old-lib/alg/index.js new file mode 100644 index 00000000..2c3d76f2 --- /dev/null +++ b/old-lib/alg/index.js @@ -0,0 +1,13 @@ +module.exports = { + components: require("./components"), + dijkstra: require("./dijkstra"), + dijkstraAll: require("./dijkstra-all"), + findCycles: require("./find-cycles"), + floydWarshall: require("./floyd-warshall"), + isAcyclic: require("./is-acyclic"), + postorder: require("./postorder"), + preorder: require("./preorder"), + prim: require("./prim"), + tarjan: require("./tarjan"), + topsort: require("./topsort") +}; diff --git a/old-lib/alg/is-acyclic.js b/old-lib/alg/is-acyclic.js new file mode 100644 index 00000000..eff4ef0b --- /dev/null +++ b/old-lib/alg/is-acyclic.js @@ -0,0 +1,15 @@ +var topsort = require("./topsort"); + +module.exports = isAcyclic; + +function isAcyclic(g) { + try { + topsort(g); + } catch (e) { + if (e instanceof topsort.CycleException) { + return false; + } + throw e; + } + return true; +} diff --git a/old-lib/alg/postorder.js b/old-lib/alg/postorder.js new file mode 100644 index 00000000..1d82313f --- /dev/null +++ b/old-lib/alg/postorder.js @@ -0,0 +1,7 @@ +var dfs = require("./dfs"); + +module.exports = postorder; + +function postorder(g, vs) { + return dfs(g, vs, "post"); +} diff --git a/old-lib/alg/preorder.js b/old-lib/alg/preorder.js new file mode 100644 index 00000000..cf333cd8 --- /dev/null +++ b/old-lib/alg/preorder.js @@ -0,0 +1,7 @@ +var dfs = require("./dfs"); + +module.exports = preorder; + +function preorder(g, vs) { + return dfs(g, vs, "pre"); +} diff --git a/old-lib/alg/prim.js b/old-lib/alg/prim.js new file mode 100644 index 00000000..72fcd841 --- /dev/null +++ b/old-lib/alg/prim.js @@ -0,0 +1,51 @@ +var Graph = require("../graph"); +var PriorityQueue = require("../data/priority-queue"); + +module.exports = prim; + +function prim(g, weightFunc) { + var result = new Graph(); + var parents = {}; + var pq = new PriorityQueue(); + var v; + + function updateNeighbors(edge) { + var w = edge.v === v ? edge.w : edge.v; + var pri = pq.priority(w); + if (pri !== undefined) { + var edgeWeight = weightFunc(edge); + if (edgeWeight < pri) { + parents[w] = v; + pq.decrease(w, edgeWeight); + } + } + } + + if (g.nodeCount() === 0) { + return result; + } + + g.nodes().forEach(function(v) { + pq.add(v, Number.POSITIVE_INFINITY); + result.setNode(v); + }); + + // Start from an arbitrary node + pq.decrease(g.nodes()[0], 0); + + var init = false; + while (pq.size() > 0) { + v = pq.removeMin(); + if (parents.hasOwnProperty(v)) { + result.setEdge(v, parents[v]); + } else if (init) { + throw new Error("Input graph is not connected: " + g); + } else { + init = true; + } + + g.nodeEdges(v).forEach(updateNeighbors); + } + + return result; +} diff --git a/old-lib/alg/tarjan.js b/old-lib/alg/tarjan.js new file mode 100644 index 00000000..c00eeba7 --- /dev/null +++ b/old-lib/alg/tarjan.js @@ -0,0 +1,45 @@ +module.exports = tarjan; + +function tarjan(g) { + var index = 0; + var stack = []; + var visited = {}; // node id -> { onStack, lowlink, index } + var results = []; + + function dfs(v) { + var entry = visited[v] = { + onStack: true, + lowlink: index, + index: index++ + }; + stack.push(v); + + g.successors(v).forEach(function(w) { + if (!visited.hasOwnProperty(w)) { + dfs(w); + entry.lowlink = Math.min(entry.lowlink, visited[w].lowlink); + } else if (visited[w].onStack) { + entry.lowlink = Math.min(entry.lowlink, visited[w].index); + } + }); + + if (entry.lowlink === entry.index) { + var cmpt = []; + var w; + do { + w = stack.pop(); + visited[w].onStack = false; + cmpt.push(w); + } while (v !== w); + results.push(cmpt); + } + } + + g.nodes().forEach(function(v) { + if (!visited.hasOwnProperty(v)) { + dfs(v); + } + }); + + return results; +} diff --git a/old-lib/alg/topsort.js b/old-lib/alg/topsort.js new file mode 100644 index 00000000..5986ce02 --- /dev/null +++ b/old-lib/alg/topsort.js @@ -0,0 +1,36 @@ +function topsort(g) { + var visited = {}; + var stack = {}; + var results = []; + + function visit(node) { + if (stack.hasOwnProperty(node)) { + throw new CycleException(); + } + + if (!visited.hasOwnProperty(node)) { + stack[node] = true; + visited[node] = true; + g.predecessors(node).forEach(visit); + delete stack[node]; + results.push(node); + } + } + + g.sinks().forEach(visit); + + if (Object.keys(visited).length !== g.nodeCount()) { + throw new CycleException(); + } + + return results; +} + +class CycleException extends Error { + constructor() { + super(...arguments); + } +} + +module.exports = topsort; +topsort.CycleException = CycleException; diff --git a/old-lib/data/priority-queue.js b/old-lib/data/priority-queue.js new file mode 100644 index 00000000..1a411fff --- /dev/null +++ b/old-lib/data/priority-queue.js @@ -0,0 +1,150 @@ +/** + * A min-priority queue data structure. This algorithm is derived from Cormen, + * et al., "Introduction to Algorithms". The basic idea of a min-priority + * queue is that you can efficiently (in O(1) time) get the smallest key in + * the queue. Adding and removing elements takes O(log n) time. A key can + * have its priority decreased in O(log n) time. + */ +class PriorityQueue { + #arr = []; + #keyIndices = {}; + + /** + * Returns the number of elements in the queue. Takes `O(1)` time. + */ + size() { + return this.#arr.length; + } + + /** + * Returns the keys that are in the queue. Takes `O(n)` time. + */ + keys() { + return this.#arr.map(function(x) { return x.key; }); + } + + /** + * Returns `true` if **key** is in the queue and `false` if not. + */ + has(key) { + return this.#keyIndices.hasOwnProperty(key); + } + + /** + * Returns the priority for **key**. If **key** is not present in the queue + * then this function returns `undefined`. Takes `O(1)` time. + * + * @param {Object} key + */ + priority(key) { + var index = this.#keyIndices[key]; + if (index !== undefined) { + return this.#arr[index].priority; + } + } + + /** + * Returns the key for the minimum element in this queue. If the queue is + * empty this function throws an Error. Takes `O(1)` time. + */ + min() { + if (this.size() === 0) { + throw new Error("Queue underflow"); + } + return this.#arr[0].key; + } + + /** + * Inserts a new key into the priority queue. If the key already exists in + * the queue this function returns `false`; otherwise it will return `true`. + * Takes `O(n)` time. + * + * @param {Object} key the key to add + * @param {Number} priority the initial priority for the key + */ + add(key, priority) { + var keyIndices = this.#keyIndices; + key = String(key); + if (!keyIndices.hasOwnProperty(key)) { + var arr = this.#arr; + var index = arr.length; + keyIndices[key] = index; + arr.push({key: key, priority: priority}); + this.#decrease(index); + return true; + } + return false; + } + + /** + * Removes and returns the smallest key in the queue. Takes `O(log n)` time. + */ + removeMin() { + this.#swap(0, this.#arr.length - 1); + var min = this.#arr.pop(); + delete this.#keyIndices[min.key]; + this.#heapify(0); + return min.key; + } + + /** + * Decreases the priority for **key** to **priority**. If the new priority is + * greater than the previous priority, this function will throw an Error. + * + * @param {Object} key the key for which to raise priority + * @param {Number} priority the new priority for the key + */ + decrease(key, priority) { + var index = this.#keyIndices[key]; + if (priority > this.#arr[index].priority) { + throw new Error("New priority is greater than current priority. " + + "Key: " + key + " Old: " + this.#arr[index].priority + " New: " + priority); + } + this.#arr[index].priority = priority; + this.#decrease(index); + } + + #heapify(i) { + var arr = this.#arr; + var l = 2 * i; + var r = l + 1; + var largest = i; + if (l < arr.length) { + largest = arr[l].priority < arr[largest].priority ? l : largest; + if (r < arr.length) { + largest = arr[r].priority < arr[largest].priority ? r : largest; + } + if (largest !== i) { + this.#swap(i, largest); + this.#heapify(largest); + } + } + } + + #decrease(index) { + var arr = this.#arr; + var priority = arr[index].priority; + var parent; + while (index !== 0) { + parent = index >> 1; + if (arr[parent].priority < priority) { + break; + } + this.#swap(index, parent); + index = parent; + } + } + + #swap(i, j) { + var arr = this.#arr; + var keyIndices = this.#keyIndices; + var origArrI = arr[i]; + var origArrJ = arr[j]; + arr[i] = origArrJ; + arr[j] = origArrI; + keyIndices[origArrJ.key] = i; + keyIndices[origArrI.key] = j; + } +} + +module.exports = PriorityQueue; diff --git a/old-lib/graph.js b/old-lib/graph.js new file mode 100644 index 00000000..0b466cd3 --- /dev/null +++ b/old-lib/graph.js @@ -0,0 +1,696 @@ +"use strict"; + +var DEFAULT_EDGE_NAME = "\x00"; +var GRAPH_NODE = "\x00"; +var EDGE_KEY_DELIM = "\x01"; + +// Implementation notes: +// +// * Node id query functions should return string ids for the nodes +// * Edge id query functions should return an "edgeObj", edge object, that is +// composed of enough information to uniquely identify an edge: {v, w, name}. +// * Internally we use an "edgeId", a stringified form of the edgeObj, to +// reference edges. This is because we need a performant way to look these +// edges up and, object properties, which have string keys, are the closest +// we're going to get to a performant hashtable in JavaScript. + +class Graph { + #isDirected = true; + #isMultigraph = false; + #isCompound = false; + + // Label for the graph itself + #label; + + // Defaults to be set when creating a new node + #defaultNodeLabelFn = () => undefined; + + // Defaults to be set when creating a new edge + #defaultEdgeLabelFn = () => undefined; + + // v -> label + #nodes = {}; + + // v -> edgeObj + #in = {}; + + // u -> v -> Number + #preds = {}; + + // v -> edgeObj + #out = {}; + + // v -> w -> Number + #sucs = {}; + + // e -> edgeObj + #edgeObjs = {}; + + // e -> label + #edgeLabels = {}; + + /* Number of nodes in the graph. Should only be changed by the implementation. */ + #nodeCount = 0; + + /* Number of edges in the graph. Should only be changed by the implementation. */ + #edgeCount = 0; + + #parent; + + #children; + + constructor(opts) { + if (opts) { + this.#isDirected = opts.hasOwnProperty("directed") ? opts.directed : true; + this.#isMultigraph = opts.hasOwnProperty("multigraph") ? opts.multigraph : false; + this.#isCompound = opts.hasOwnProperty("compound") ? opts.compound : false; + } + + if (this.#isCompound) { + // v -> parent + this.#parent = {}; + + // v -> children + this.#children = {}; + this.#children[GRAPH_NODE] = {}; + } + } + + /* === Graph functions ========= */ + + /** + * Whether graph was created with 'directed' flag set to true or not. + */ + isDirected() { + return this.#isDirected; + } + + /** + * Whether graph was created with 'multigraph' flag set to true or not. + */ + isMultigraph() { + return this.#isMultigraph; + } + + /** + * Whether graph was created with 'compound' flag set to true or not. + */ + isCompound() { + return this.#isCompound; + } + + /** + * Sets the label of the graph. + */ + setGraph(label) { + this.#label = label; + return this; + } + + /** + * Gets the graph label. + */ + graph() { + return this.#label; + } + + + /* === Node functions ========== */ + + /** + * Sets the default node label. If newDefault is a function, it will be + * invoked ach time when setting a label for a node. Otherwise, this label + * will be assigned as default label in case if no label was specified while + * setting a node. + * Complexity: O(1). + */ + setDefaultNodeLabel(newDefault) { + this.#defaultNodeLabelFn = newDefault; + if (typeof newDefault !== 'function') { + this.#defaultNodeLabelFn = () => newDefault; + } + + return this; + } + + /** + * Gets the number of nodes in the graph. + * Complexity: O(1). + */ + nodeCount() { + return this.#nodeCount; + } + + /** + * Gets all nodes of the graph. Note, the in case of compound graph subnodes are + * not included in list. + * Complexity: O(1). + */ + nodes() { + return Object.keys(this.#nodes); + } + + /** + * Gets list of nodes without in-edges. + * Complexity: O(|V|). + */ + sources() { + var self = this; + return this.nodes().filter(v => Object.keys(self.#in[v]).length === 0); + } + + /** + * Gets list of nodes without out-edges. + * Complexity: O(|V|). + */ + sinks() { + var self = this; + return this.nodes().filter(v => Object.keys(self.#out[v]).length === 0); + } + + /** + * Invokes setNode method for each node in names list. + * Complexity: O(|names|). + */ + setNodes(vs, value) { + var args = arguments; + var self = this; + vs.forEach(function(v) { + if (args.length > 1) { + self.setNode(v, value); + } else { + self.setNode(v); + } + }); + return this; + } + + /** + * Creates or updates the value for the node v in the graph. If label is supplied + * it is set as the value for the node. If label is not supplied and the node was + * created by this call then the default node label will be assigned. + * Complexity: O(1). + */ + setNode(v, value) { + if (this.#nodes.hasOwnProperty(v)) { + if (arguments.length > 1) { + this.#nodes[v] = value; + } + return this; + } + + this.#nodes[v] = arguments.length > 1 ? value : this.#defaultNodeLabelFn(v); + if (this.#isCompound) { + this.#parent[v] = GRAPH_NODE; + this.#children[v] = {}; + this.#children[GRAPH_NODE][v] = true; + } + this.#in[v] = {}; + this.#preds[v] = {}; + this.#out[v] = {}; + this.#sucs[v] = {}; + ++this.#nodeCount; + return this; + } + + /** + * Gets the label of node with specified name. + * Complexity: O(|V|). + */ + node(v) { + return this.#nodes[v]; + } + + /** + * Detects whether graph has a node with specified name or not. + */ + hasNode(v) { + return this.#nodes.hasOwnProperty(v); + } + + /** + * Remove the node with the name from the graph or do nothing if the node is not in + * the graph. If the node was removed this function also removes any incident + * edges. + * Complexity: O(1). + */ + removeNode(v) { + var self = this; + if (this.#nodes.hasOwnProperty(v)) { + var removeEdge = e => self.removeEdge(self.#edgeObjs[e]); + delete this.#nodes[v]; + if (this.#isCompound) { + this.#removeFromParentsChildList(v); + delete this.#parent[v]; + this.children(v).forEach(function(child) { + self.setParent(child); + }); + delete this.#children[v]; + } + Object.keys(this.#in[v]).forEach(removeEdge); + delete this.#in[v]; + delete this.#preds[v]; + Object.keys(this.#out[v]).forEach(removeEdge); + delete this.#out[v]; + delete this.#sucs[v]; + --this.#nodeCount; + } + return this; + } + + /** + * Sets node p as a parent for node v if it is defined, or removes the + * parent for v if p is undefined. Method throws an exception in case of + * invoking it in context of noncompound graph. + * Average-case complexity: O(1). + */ + setParent(v, parent) { + if (!this.#isCompound) { + throw new Error("Cannot set parent in a non-compound graph"); + } + + if (parent === undefined) { + parent = GRAPH_NODE; + } else { + // Coerce parent to string + parent += ""; + for (var ancestor = parent; ancestor !== undefined; ancestor = this.parent(ancestor)) { + if (ancestor === v) { + throw new Error("Setting " + parent+ " as parent of " + v + + " would create a cycle"); + } + } + + this.setNode(parent); + } + + this.setNode(v); + this.#removeFromParentsChildList(v); + this.#parent[v] = parent; + this.#children[parent][v] = true; + return this; + } + + #removeFromParentsChildList(v) { + delete this.#children[this.#parent[v]][v]; + } + + /** + * Gets parent node for node v. + * Complexity: O(1). + */ + parent(v) { + if (this.#isCompound) { + var parent = this.#parent[v]; + if (parent !== GRAPH_NODE) { + return parent; + } + } + } + + /** + * Gets list of direct children of node v. + * Complexity: O(1). + */ + children(v = GRAPH_NODE) { + if (this.#isCompound) { + var children = this.#children[v]; + if (children) { + return Object.keys(children); + } + } else if (v === GRAPH_NODE) { + return this.nodes(); + } else if (this.hasNode(v)) { + return []; + } + } + + /** + * Return all nodes that are predecessors of the specified node or undefined if node v is not in + * the graph. Behavior is undefined for undirected graphs - use neighbors instead. + * Complexity: O(|V|). + */ + predecessors(v) { + var predsV = this.#preds[v]; + if (predsV) { + return Object.keys(predsV); + } + } + + /** + * Return all nodes that are successors of the specified node or undefined if node v is not in + * the graph. Behavior is undefined for undirected graphs - use neighbors instead. + * Complexity: O(|V|). + */ + successors(v) { + var sucsV = this.#sucs[v]; + if (sucsV) { + return Object.keys(sucsV); + } + } + + /** + * Return all nodes that are predecessors or successors of the specified node or undefined if + * node v is not in the graph. + * Complexity: O(|V|). + */ + neighbors(v) { + var preds = this.predecessors(v); + if (preds) { + const union = new Set(preds); + for (var succ of this.successors(v)) { + union.add(succ); + } + + return Array.from(union.values()); + } + } + + isLeaf(v) { + var neighbors; + if (this.isDirected()) { + neighbors = this.successors(v); + } else { + neighbors = this.neighbors(v); + } + return neighbors.length === 0; + } + + /** + * Creates new graph with nodes filtered via filter. Edges incident to rejected node + * are also removed. In case of compound graph, if parent is rejected by filter, + * than all its children are rejected too. + * Average-case complexity: O(|E|+|V|). + */ + filterNodes(filter) { + var copy = new this.constructor({ + directed: this.#isDirected, + multigraph: this.#isMultigraph, + compound: this.#isCompound + }); + + copy.setGraph(this.graph()); + + var self = this; + Object.entries(this.#nodes).forEach(function([v, value]) { + if (filter(v)) { + copy.setNode(v, value); + } + }); + + Object.values(this.#edgeObjs).forEach(function(e) { + if (copy.hasNode(e.v) && copy.hasNode(e.w)) { + copy.setEdge(e, self.edge(e)); + } + }); + + var parents = {}; + function findParent(v) { + var parent = self.parent(v); + if (parent === undefined || copy.hasNode(parent)) { + parents[v] = parent; + return parent; + } else if (parent in parents) { + return parents[parent]; + } else { + return findParent(parent); + } + } + + if (this.#isCompound) { + copy.nodes().forEach(v => copy.setParent(v, findParent(v))); + } + + return copy; + } + + /* === Edge functions ========== */ + + /** + * Sets the default edge label or factory function. This label will be + * assigned as default label in case if no label was specified while setting + * an edge or this function will be invoked each time when setting an edge + * with no label specified and returned value * will be used as a label for edge. + * Complexity: O(1). + */ + setDefaultEdgeLabel(newDefault) { + this.#defaultEdgeLabelFn = newDefault; + if (typeof newDefault !== 'function') { + this.#defaultEdgeLabelFn = () => newDefault; + } + + return this; + } + + /** + * Gets the number of edges in the graph. + * Complexity: O(1). + */ + edgeCount() { + return this.#edgeCount; + } + + /** + * Gets edges of the graph. In case of compound graph subgraphs are not considered. + * Complexity: O(|E|). + */ + edges() { + return Object.values(this.#edgeObjs); + } + + /** + * Establish an edges path over the nodes in nodes list. If some edge is already + * exists, it will update its label, otherwise it will create an edge between pair + * of nodes with label provided or default label if no label provided. + * Complexity: O(|nodes|). + */ + setPath(vs, value) { + var self = this; + var args = arguments; + vs.reduce(function(v, w) { + if (args.length > 1) { + self.setEdge(v, w, value); + } else { + self.setEdge(v, w); + } + return w; + }); + return this; + } + + /** + * Creates or updates the label for the edge (v, w) with the optionally supplied + * name. If label is supplied it is set as the value for the edge. If label is not + * supplied and the edge was created by this call then the default edge label will + * be assigned. The name parameter is only useful with multigraphs. + */ + setEdge() { + var v, w, name, value; + var valueSpecified = false; + var arg0 = arguments[0]; + + if (typeof arg0 === "object" && arg0 !== null && "v" in arg0) { + v = arg0.v; + w = arg0.w; + name = arg0.name; + if (arguments.length === 2) { + value = arguments[1]; + valueSpecified = true; + } + } else { + v = arg0; + w = arguments[1]; + name = arguments[3]; + if (arguments.length > 2) { + value = arguments[2]; + valueSpecified = true; + } + } + + v = "" + v; + w = "" + w; + if (name !== undefined) { + name = "" + name; + } + + var e = edgeArgsToId(this.#isDirected, v, w, name); + if (this.#edgeLabels.hasOwnProperty(e)) { + if (valueSpecified) { + this.#edgeLabels[e] = value; + } + return this; + } + + if (name !== undefined && !this.#isMultigraph) { + throw new Error("Cannot set a named edge when isMultigraph = false"); + } + + // It didn't exist, so we need to create it. + // First ensure the nodes exist. + this.setNode(v); + this.setNode(w); + + this.#edgeLabels[e] = valueSpecified ? value : this.#defaultEdgeLabelFn(v, w, name); + + var edgeObj = edgeArgsToObj(this.#isDirected, v, w, name); + // Ensure we add undirected edges in a consistent way. + v = edgeObj.v; + w = edgeObj.w; + + Object.freeze(edgeObj); + this.#edgeObjs[e] = edgeObj; + incrementOrInitEntry(this.#preds[w], v); + incrementOrInitEntry(this.#sucs[v], w); + this.#in[w][e] = edgeObj; + this.#out[v][e] = edgeObj; + this.#edgeCount++; + return this; + } + + /** + * Gets the label for the specified edge. + * Complexity: O(1). + */ + edge(v, w, name) { + var e = (arguments.length === 1 + ? edgeObjToId(this.#isDirected, arguments[0]) + : edgeArgsToId(this.#isDirected, v, w, name)); + return this.#edgeLabels[e]; + } + + /** + * Gets the label for the specified edge and converts it to an object. + * Complexity: O(1) + */ + edgeAsObj() { + const edge = this.edge(...arguments); + if (typeof edge !== "object") { + return {label: edge}; + } + + return edge; + } + + /** + * Detects whether the graph contains specified edge or not. No subgraphs are considered. + * Complexity: O(1). + */ + hasEdge(v, w, name) { + var e = (arguments.length === 1 + ? edgeObjToId(this.#isDirected, arguments[0]) + : edgeArgsToId(this.#isDirected, v, w, name)); + return this.#edgeLabels.hasOwnProperty(e); + } + + /** + * Removes the specified edge from the graph. No subgraphs are considered. + * Complexity: O(1). + */ + removeEdge(v, w, name) { + var e = (arguments.length === 1 + ? edgeObjToId(this.#isDirected, arguments[0]) + : edgeArgsToId(this.#isDirected, v, w, name)); + var edge = this.#edgeObjs[e]; + if (edge) { + v = edge.v; + w = edge.w; + delete this.#edgeLabels[e]; + delete this.#edgeObjs[e]; + decrementOrRemoveEntry(this.#preds[w], v); + decrementOrRemoveEntry(this.#sucs[v], w); + delete this.#in[w][e]; + delete this.#out[v][e]; + this.#edgeCount--; + } + return this; + } + + /** + * Return all edges that point to the node v. Optionally filters those edges down to just those + * coming from node u. Behavior is undefined for undirected graphs - use nodeEdges instead. + * Complexity: O(|E|). + */ + inEdges(v, u) { + var inV = this.#in[v]; + if (inV) { + var edges = Object.values(inV); + if (!u) { + return edges; + } + return edges.filter(edge => edge.v === u); + } + } + + /** + * Return all edges that are pointed at by node v. Optionally filters those edges down to just + * those point to w. Behavior is undefined for undirected graphs - use nodeEdges instead. + * Complexity: O(|E|). + */ + outEdges(v, w) { + var outV = this.#out[v]; + if (outV) { + var edges = Object.values(outV); + if (!w) { + return edges; + } + return edges.filter(edge => edge.w === w); + } + } + + /** + * Returns all edges to or from node v regardless of direction. Optionally filters those edges + * down to just those between nodes v and w regardless of direction. + * Complexity: O(|E|). + */ + nodeEdges(v, w) { + var inEdges = this.inEdges(v, w); + if (inEdges) { + return inEdges.concat(this.outEdges(v, w)); + } + } +} + +function incrementOrInitEntry(map, k) { + if (map[k]) { + map[k]++; + } else { + map[k] = 1; + } +} + +function decrementOrRemoveEntry(map, k) { + if (!--map[k]) { delete map[k]; } +} + +function edgeArgsToId(isDirected, v_, w_, name) { + var v = "" + v_; + var w = "" + w_; + if (!isDirected && v > w) { + var tmp = v; + v = w; + w = tmp; + } + return v + EDGE_KEY_DELIM + w + EDGE_KEY_DELIM + + (name === undefined ? DEFAULT_EDGE_NAME : name); +} + +function edgeArgsToObj(isDirected, v_, w_, name) { + var v = "" + v_; + var w = "" + w_; + if (!isDirected && v > w) { + var tmp = v; + v = w; + w = tmp; + } + var edgeObj = { v: v, w: w }; + if (name) { + edgeObj.name = name; + } + return edgeObj; +} + +function edgeObjToId(isDirected, edgeObj) { + return edgeArgsToId(isDirected, edgeObj.v, edgeObj.w, edgeObj.name); +} + +module.exports = Graph; diff --git a/old-lib/index.js b/old-lib/index.js new file mode 100644 index 00000000..756e0ab6 --- /dev/null +++ b/old-lib/index.js @@ -0,0 +1,5 @@ +// Includes only the "core" of graphlib +module.exports = { + Graph: require("./graph"), + version: require("./version") +}; diff --git a/old-lib/json.js b/old-lib/json.js new file mode 100644 index 00000000..ac0c2417 --- /dev/null +++ b/old-lib/json.js @@ -0,0 +1,80 @@ +var Graph = require("./graph"); + +module.exports = { + write: write, + read: read +}; + +/** + * Creates a JSON representation of the graph that can be serialized to a string with + * JSON.stringify. The graph can later be restored using json.read. + */ +function write(g) { + var json = { + options: { + directed: g.isDirected(), + multigraph: g.isMultigraph(), + compound: g.isCompound() + }, + nodes: writeNodes(g), + edges: writeEdges(g) + }; + + if (g.graph() !== undefined) { + json.value = structuredClone(g.graph()); + } + return json; +} + +function writeNodes(g) { + return g.nodes().map(function(v) { + var nodeValue = g.node(v); + var parent = g.parent(v); + var node = { v: v }; + if (nodeValue !== undefined) { + node.value = nodeValue; + } + if (parent !== undefined) { + node.parent = parent; + } + return node; + }); +} + +function writeEdges(g) { + return g.edges().map(function(e) { + var edgeValue = g.edge(e); + var edge = { v: e.v, w: e.w }; + if (e.name !== undefined) { + edge.name = e.name; + } + if (edgeValue !== undefined) { + edge.value = edgeValue; + } + return edge; + }); +} + +/** + * Takes JSON as input and returns the graph representation. + * + * @example + * var g2 = graphlib.json.read(JSON.parse(str)); + * g2.nodes(); + * // ['a', 'b'] + * g2.edges() + * // [ { v: 'a', w: 'b' } ] + */ +function read(json) { + var g = new Graph(json.options).setGraph(json.value); + json.nodes.forEach(function(entry) { + g.setNode(entry.v, entry.value); + if (entry.parent) { + g.setParent(entry.v, entry.parent); + } + }); + json.edges.forEach(function(entry) { + g.setEdge({ v: entry.v, w: entry.w, name: entry.name }, entry.value); + }); + return g; +} diff --git a/old-lib/version.js b/old-lib/version.js new file mode 100644 index 00000000..02120ec0 --- /dev/null +++ b/old-lib/version.js @@ -0,0 +1 @@ +module.exports = '2.1.14-pre'; From 0dc9cc6b79437dae071a56418a9bcc2ef43d62db Mon Sep 17 00:00:00 2001 From: Andrew Pikul Date: Wed, 31 Jan 2024 12:15:12 -0500 Subject: [PATCH 46/85] Fix transpilation to follow old commonjs behavior --- .babelrc | 3 +- Makefile | 2 +- lib/alg/components.js | 3 +- lib/alg/dfs.js | 19 +- lib/alg/dijkstra-all.js | 7 +- lib/alg/dijkstra.js | 13 +- lib/alg/find-cycles.js | 7 +- lib/alg/floyd-warshall.js | 7 +- lib/alg/index.js | 46 +- lib/alg/is-acyclic.js | 9 +- lib/alg/postorder.js | 7 +- lib/alg/preorder.js | 7 +- lib/alg/prim.js | 9 +- lib/alg/tarjan.js | 3 +- lib/alg/topsort.js | 30 +- lib/data/priority-queue.js | 300 ++++----- lib/graph.js | 1241 +++++++++++++++--------------------- lib/index.js | 15 +- lib/json.js | 4 +- lib/version.js | 6 +- mjs-lib/version.js | 2 +- package-lock.json | 13 + package.json | 1 + 23 files changed, 758 insertions(+), 996 deletions(-) diff --git a/.babelrc b/.babelrc index d6047238..32bb084c 100644 --- a/.babelrc +++ b/.babelrc @@ -1,4 +1,3 @@ { - "presets": ["@babel/preset-env"], - "plugins": ["@babel/plugin-transform-modules-commonjs"] + "plugins": ["@babel/plugin-transform-export-namespace-from", "@babel/plugin-transform-modules-commonjs", "add-module-exports"] } diff --git a/Makefile b/Makefile index 9d41c7c7..ce985c90 100644 --- a/Makefile +++ b/Makefile @@ -86,5 +86,5 @@ node_modules: package.json convert: mjs-lib/*.js mjs-lib/**/*.js rm -rf lib; mkdir lib - for f in mjs-lib/**/*.js mjs-lib/*.js; do echo "$${f} > lib$${f/mjs-lib/}"; npx babel "$${f}" -o "lib$${f/mjs-lib/}"; done + for f in mjs-lib/**/*.js mjs-lib/*.js; do echo "$${f} > lib$${f/mjs-lib/}"; npx babel "$${f}" -o "lib$${f/mjs-lib/}" || exit 1; done diff --git a/lib/alg/components.js b/lib/alg/components.js index 7d8225ed..9490ff9b 100644 --- a/lib/alg/components.js +++ b/lib/alg/components.js @@ -3,7 +3,7 @@ Object.defineProperty(exports, "__esModule", { value: true }); -exports["default"] = components; +exports.default = components; function components(g) { var visited = {}; var cmpts = []; @@ -24,3 +24,4 @@ function components(g) { }); return cmpts; } +module.exports = exports.default; diff --git a/lib/alg/dfs.js b/lib/alg/dfs.js index 59100b95..4608cd0b 100644 --- a/lib/alg/dfs.js +++ b/lib/alg/dfs.js @@ -3,7 +3,7 @@ Object.defineProperty(exports, "__esModule", { value: true }); -exports["default"] = dfs; +exports.default = dfs; /* * A helper that preforms a pre- or post-order traversal on the input graph * and returns the nodes in the order they were visited. If the graph is @@ -16,15 +16,11 @@ function dfs(g, vs, order) { if (!Array.isArray(vs)) { vs = [vs]; } - var navigation = g.isDirected() ? function (v) { - return g.successors(v); - } : function (v) { - return g.neighbors(v); - }; + var navigation = g.isDirected() ? v => g.successors(v) : v => g.neighbors(v); var orderFunc = order === "post" ? postOrderDfs : preOrderDfs; var acc = []; var visited = {}; - vs.forEach(function (v) { + vs.forEach(v => { if (!g.hasNode(v)) { throw new Error("Graph does not have node: " + v); } @@ -42,9 +38,7 @@ function postOrderDfs(v, navigation, visited, acc) { if (!visited.hasOwnProperty(curr[0])) { visited[curr[0]] = true; stack.push([curr[0], true]); - forEachRight(navigation(curr[0]), function (w) { - return stack.push([w, false]); - }); + forEachRight(navigation(curr[0]), w => stack.push([w, false])); } } } @@ -56,9 +50,7 @@ function preOrderDfs(v, navigation, visited, acc) { if (!visited.hasOwnProperty(curr)) { visited[curr] = true; acc.push(curr); - forEachRight(navigation(curr), function (w) { - return stack.push(w); - }); + forEachRight(navigation(curr), w => stack.push(w)); } } } @@ -69,3 +61,4 @@ function forEachRight(array, iteratee) { } return array; } +module.exports = exports.default; diff --git a/lib/alg/dijkstra-all.js b/lib/alg/dijkstra-all.js index de272384..fbd0fac6 100644 --- a/lib/alg/dijkstra-all.js +++ b/lib/alg/dijkstra-all.js @@ -3,12 +3,13 @@ Object.defineProperty(exports, "__esModule", { value: true }); -exports["default"] = dijkstraAll; +exports.default = dijkstraAll; var _dijkstra = _interopRequireDefault(require("./dijkstra.js")); -function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; } +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function dijkstraAll(g, weightFunc, edgeFunc) { return g.nodes().reduce(function (acc, v) { - acc[v] = (0, _dijkstra["default"])(g, v, weightFunc, edgeFunc); + acc[v] = (0, _dijkstra.default)(g, v, weightFunc, edgeFunc); return acc; }, {}); } +module.exports = exports.default; diff --git a/lib/alg/dijkstra.js b/lib/alg/dijkstra.js index f347aab0..d705ffae 100644 --- a/lib/alg/dijkstra.js +++ b/lib/alg/dijkstra.js @@ -3,12 +3,10 @@ Object.defineProperty(exports, "__esModule", { value: true }); -exports["default"] = dijkstra; +exports.default = dijkstra; var _priorityQueue = _interopRequireDefault(require("../data/priority-queue.js")); -function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; } -var DEFAULT_WEIGHT_FUNC = function DEFAULT_WEIGHT_FUNC() { - return 1; -}; +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } +var DEFAULT_WEIGHT_FUNC = () => 1; function dijkstra(g, source, weightFn, edgeFn) { return runDijkstra(g, String(source), weightFn || DEFAULT_WEIGHT_FUNC, edgeFn || function (v) { return g.outEdges(v); @@ -16,9 +14,9 @@ function dijkstra(g, source, weightFn, edgeFn) { } function runDijkstra(g, source, weightFn, edgeFn) { var results = {}; - var pq = new _priorityQueue["default"](); + var pq = new _priorityQueue.default(); var v, vEntry; - var updateNeighbors = function updateNeighbors(edge) { + var updateNeighbors = function (edge) { var w = edge.v !== v ? edge.v : edge.w; var wEntry = results[w]; var weight = weightFn(edge); @@ -49,3 +47,4 @@ function runDijkstra(g, source, weightFn, edgeFn) { } return results; } +module.exports = exports.default; diff --git a/lib/alg/find-cycles.js b/lib/alg/find-cycles.js index 8655129c..21e6fff8 100644 --- a/lib/alg/find-cycles.js +++ b/lib/alg/find-cycles.js @@ -3,11 +3,12 @@ Object.defineProperty(exports, "__esModule", { value: true }); -exports["default"] = findCycles; +exports.default = findCycles; var _tarjan = _interopRequireDefault(require("./tarjan.js")); -function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; } +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function findCycles(g) { - return (0, _tarjan["default"])(g).filter(function (cmpt) { + return (0, _tarjan.default)(g).filter(function (cmpt) { return cmpt.length > 1 || cmpt.length === 1 && g.hasEdge(cmpt[0], cmpt[0]); }); } +module.exports = exports.default; diff --git a/lib/alg/floyd-warshall.js b/lib/alg/floyd-warshall.js index c0fde638..f8a66b0a 100644 --- a/lib/alg/floyd-warshall.js +++ b/lib/alg/floyd-warshall.js @@ -3,10 +3,8 @@ Object.defineProperty(exports, "__esModule", { value: true }); -exports["default"] = floydWarshall; -var DEFAULT_WEIGHT_FUNC = function DEFAULT_WEIGHT_FUNC() { - return 1; -}; +exports.default = floydWarshall; +var DEFAULT_WEIGHT_FUNC = () => 1; function floydWarshall(g, weightFn, edgeFn) { return runFloydWarshall(g, weightFn || DEFAULT_WEIGHT_FUNC, edgeFn || function (v) { return g.outEdges(v); @@ -54,3 +52,4 @@ function runFloydWarshall(g, weightFn, edgeFn) { }); return results; } +module.exports = exports.default; diff --git a/lib/alg/index.js b/lib/alg/index.js index 8af71b48..5f3b1e7c 100644 --- a/lib/alg/index.js +++ b/lib/alg/index.js @@ -5,68 +5,68 @@ Object.defineProperty(exports, "__esModule", { }); Object.defineProperty(exports, "components", { enumerable: true, - get: function get() { - return _components["default"]; + get: function () { + return _components.default; } }); Object.defineProperty(exports, "dijkstra", { enumerable: true, - get: function get() { - return _dijkstra["default"]; + get: function () { + return _dijkstra.default; } }); Object.defineProperty(exports, "dijkstraAll", { enumerable: true, - get: function get() { - return _dijkstraAll["default"]; + get: function () { + return _dijkstraAll.default; } }); Object.defineProperty(exports, "findCycles", { enumerable: true, - get: function get() { - return _findCycles["default"]; + get: function () { + return _findCycles.default; } }); Object.defineProperty(exports, "floydWarshall", { enumerable: true, - get: function get() { - return _floydWarshall["default"]; + get: function () { + return _floydWarshall.default; } }); Object.defineProperty(exports, "isAcyclic", { enumerable: true, - get: function get() { - return _isAcyclic["default"]; + get: function () { + return _isAcyclic.default; } }); Object.defineProperty(exports, "postorder", { enumerable: true, - get: function get() { - return _postorder["default"]; + get: function () { + return _postorder.default; } }); Object.defineProperty(exports, "preorder", { enumerable: true, - get: function get() { - return _preorder["default"]; + get: function () { + return _preorder.default; } }); Object.defineProperty(exports, "prim", { enumerable: true, - get: function get() { - return _prim["default"]; + get: function () { + return _prim.default; } }); Object.defineProperty(exports, "tarjan", { enumerable: true, - get: function get() { - return _tarjan["default"]; + get: function () { + return _tarjan.default; } }); Object.defineProperty(exports, "topsort", { enumerable: true, - get: function get() { - return _topsort["default"]; + get: function () { + return _topsort.default; } }); var _components = _interopRequireDefault(require("./components.js")); @@ -80,4 +80,4 @@ var _preorder = _interopRequireDefault(require("./preorder.js")); var _prim = _interopRequireDefault(require("./prim.js")); var _tarjan = _interopRequireDefault(require("./tarjan.js")); var _topsort = _interopRequireDefault(require("./topsort.js")); -function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; } +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } diff --git a/lib/alg/is-acyclic.js b/lib/alg/is-acyclic.js index d626aba8..0d82c22a 100644 --- a/lib/alg/is-acyclic.js +++ b/lib/alg/is-acyclic.js @@ -3,17 +3,18 @@ Object.defineProperty(exports, "__esModule", { value: true }); -exports["default"] = isAcyclic; +exports.default = isAcyclic; var _topsort = _interopRequireDefault(require("./topsort.js")); -function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; } +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function isAcyclic(g) { try { - (0, _topsort["default"])(g); + (0, _topsort.default)(g); } catch (e) { - if (e instanceof _topsort["default"].CycleException) { + if (e instanceof _topsort.default.CycleException) { return false; } throw e; } return true; } +module.exports = exports.default; diff --git a/lib/alg/postorder.js b/lib/alg/postorder.js index 157125ab..ef8686eb 100644 --- a/lib/alg/postorder.js +++ b/lib/alg/postorder.js @@ -3,9 +3,10 @@ Object.defineProperty(exports, "__esModule", { value: true }); -exports["default"] = postorder; +exports.default = postorder; var _dfs = _interopRequireDefault(require("./dfs.js")); -function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; } +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function postorder(g, vs) { - return (0, _dfs["default"])(g, vs, "post"); + return (0, _dfs.default)(g, vs, "post"); } +module.exports = exports.default; diff --git a/lib/alg/preorder.js b/lib/alg/preorder.js index 327e18f6..b688d506 100644 --- a/lib/alg/preorder.js +++ b/lib/alg/preorder.js @@ -3,9 +3,10 @@ Object.defineProperty(exports, "__esModule", { value: true }); -exports["default"] = preorder; +exports.default = preorder; var _dfs = _interopRequireDefault(require("./dfs.js")); -function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; } +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function preorder(g, vs) { - return (0, _dfs["default"])(g, vs, "pre"); + return (0, _dfs.default)(g, vs, "pre"); } +module.exports = exports.default; diff --git a/lib/alg/prim.js b/lib/alg/prim.js index 2cf56fe7..e00cde23 100644 --- a/lib/alg/prim.js +++ b/lib/alg/prim.js @@ -3,14 +3,14 @@ Object.defineProperty(exports, "__esModule", { value: true }); -exports["default"] = prim; +exports.default = prim; var _graph = _interopRequireDefault(require("../graph.js")); var _priorityQueue = _interopRequireDefault(require("../data/priority-queue.js")); -function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; } +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function prim(g, weightFunc) { - var result = new _graph["default"](); + var result = new _graph.default(); var parents = {}; - var pq = new _priorityQueue["default"](); + var pq = new _priorityQueue.default(); var v; function updateNeighbors(edge) { var w = edge.v === v ? edge.w : edge.v; @@ -47,3 +47,4 @@ function prim(g, weightFunc) { } return result; } +module.exports = exports.default; diff --git a/lib/alg/tarjan.js b/lib/alg/tarjan.js index 8a02f782..eb47566e 100644 --- a/lib/alg/tarjan.js +++ b/lib/alg/tarjan.js @@ -3,7 +3,7 @@ Object.defineProperty(exports, "__esModule", { value: true }); -exports["default"] = tarjan; +exports.default = tarjan; function tarjan(g) { var index = 0; var stack = []; @@ -42,3 +42,4 @@ function tarjan(g) { }); return results; } +module.exports = exports.default; diff --git a/lib/alg/topsort.js b/lib/alg/topsort.js index 06d8f8e2..a37f0106 100644 --- a/lib/alg/topsort.js +++ b/lib/alg/topsort.js @@ -1,25 +1,9 @@ "use strict"; -function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, _typeof(o); } Object.defineProperty(exports, "__esModule", { value: true }); -exports["default"] = topsort; -function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, _toPropertyKey(descriptor.key), descriptor); } } -function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; } -function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == _typeof(i) ? i : String(i); } -function _toPrimitive(t, r) { if ("object" != _typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != _typeof(i)) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); } -function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } -function _callSuper(t, o, e) { return o = _getPrototypeOf(o), _possibleConstructorReturn(t, _isNativeReflectConstruct() ? Reflect.construct(o, e || [], _getPrototypeOf(t).constructor) : o.apply(t, e)); } -function _possibleConstructorReturn(self, call) { if (call && (_typeof(call) === "object" || typeof call === "function")) { return call; } else if (call !== void 0) { throw new TypeError("Derived constructors may only return object or undefined"); } return _assertThisInitialized(self); } -function _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; } -function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); Object.defineProperty(subClass, "prototype", { writable: false }); if (superClass) _setPrototypeOf(subClass, superClass); } -function _wrapNativeSuper(Class) { var _cache = typeof Map === "function" ? new Map() : undefined; _wrapNativeSuper = function _wrapNativeSuper(Class) { if (Class === null || !_isNativeFunction(Class)) return Class; if (typeof Class !== "function") { throw new TypeError("Super expression must either be null or a function"); } if (typeof _cache !== "undefined") { if (_cache.has(Class)) return _cache.get(Class); _cache.set(Class, Wrapper); } function Wrapper() { return _construct(Class, arguments, _getPrototypeOf(this).constructor); } Wrapper.prototype = Object.create(Class.prototype, { constructor: { value: Wrapper, enumerable: false, writable: true, configurable: true } }); return _setPrototypeOf(Wrapper, Class); }; return _wrapNativeSuper(Class); } -function _construct(t, e, r) { if (_isNativeReflectConstruct()) return Reflect.construct.apply(null, arguments); var o = [null]; o.push.apply(o, e); var p = new (t.bind.apply(t, o))(); return r && _setPrototypeOf(p, r.prototype), p; } -function _isNativeReflectConstruct() { try { var t = !Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); } catch (t) {} return (_isNativeReflectConstruct = function _isNativeReflectConstruct() { return !!t; })(); } -function _isNativeFunction(fn) { try { return Function.toString.call(fn).indexOf("[native code]") !== -1; } catch (e) { return typeof fn === "function"; } } -function _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf ? Object.setPrototypeOf.bind() : function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); } -function _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf.bind() : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf(o); } +exports.default = topsort; function topsort(g) { var visited = {}; var stack = {}; @@ -42,12 +26,10 @@ function topsort(g) { } return results; } -var CycleException = /*#__PURE__*/function (_Error) { - _inherits(CycleException, _Error); - function CycleException() { - _classCallCheck(this, CycleException); - return _callSuper(this, CycleException, arguments); +class CycleException extends Error { + constructor() { + super(...arguments); } - return _createClass(CycleException); -}( /*#__PURE__*/_wrapNativeSuper(Error)); +} topsort.CycleException = CycleException; +module.exports = exports.default; diff --git a/lib/data/priority-queue.js b/lib/data/priority-queue.js index 124a360a..9c260495 100644 --- a/lib/data/priority-queue.js +++ b/lib/data/priority-queue.js @@ -1,27 +1,9 @@ "use strict"; -function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, _typeof(o); } Object.defineProperty(exports, "__esModule", { value: true }); -exports["default"] = void 0; -function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } -function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, _toPropertyKey(descriptor.key), descriptor); } } -function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; } -function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == _typeof(i) ? i : String(i); } -function _toPrimitive(t, r) { if ("object" != _typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != _typeof(i)) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); } -function _classPrivateMethodInitSpec(obj, privateSet) { _checkPrivateRedeclaration(obj, privateSet); privateSet.add(obj); } -function _classPrivateFieldInitSpec(obj, privateMap, value) { _checkPrivateRedeclaration(obj, privateMap); privateMap.set(obj, value); } -function _checkPrivateRedeclaration(obj, privateCollection) { if (privateCollection.has(obj)) { throw new TypeError("Cannot initialize the same private elements twice on an object"); } } -function _classPrivateMethodGet(receiver, privateSet, fn) { if (!privateSet.has(receiver)) { throw new TypeError("attempted to get private field on non-instance"); } return fn; } -function _classPrivateFieldGet(receiver, privateMap) { var descriptor = _classExtractFieldDescriptor(receiver, privateMap, "get"); return _classApplyDescriptorGet(receiver, descriptor); } -function _classExtractFieldDescriptor(receiver, privateMap, action) { if (!privateMap.has(receiver)) { throw new TypeError("attempted to " + action + " private field on non-instance"); } return privateMap.get(receiver); } -function _classApplyDescriptorGet(receiver, descriptor) { if (descriptor.get) { return descriptor.get.call(receiver); } return descriptor.value; } -var _arr = /*#__PURE__*/new WeakMap(); -var _keyIndices = /*#__PURE__*/new WeakMap(); -var _heapify = /*#__PURE__*/new WeakSet(); -var _decrease = /*#__PURE__*/new WeakSet(); -var _swap = /*#__PURE__*/new WeakSet(); +exports.default = void 0; /** * A min-priority queue data structure. This algorithm is derived from Cormen, * et al., "Introduction to Algorithms". The basic idea of a min-priority @@ -29,175 +11,147 @@ var _swap = /*#__PURE__*/new WeakSet(); * the queue. Adding and removing elements takes O(log n) time. A key can * have its priority decreased in O(log n) time. */ -var PriorityQueue = exports["default"] = /*#__PURE__*/function () { - function PriorityQueue() { - _classCallCheck(this, PriorityQueue); - _classPrivateMethodInitSpec(this, _swap); - _classPrivateMethodInitSpec(this, _decrease); - _classPrivateMethodInitSpec(this, _heapify); - _classPrivateFieldInitSpec(this, _arr, { - writable: true, - value: [] - }); - _classPrivateFieldInitSpec(this, _keyIndices, { - writable: true, - value: {} +class PriorityQueue { + #arr = []; + #keyIndices = {}; + + /** + * Returns the number of elements in the queue. Takes `O(1)` time. + */ + size() { + return this.#arr.length; + } + + /** + * Returns the keys that are in the queue. Takes `O(n)` time. + */ + keys() { + return this.#arr.map(function (x) { + return x.key; }); } - _createClass(PriorityQueue, [{ - key: "size", - value: - /** - * Returns the number of elements in the queue. Takes `O(1)` time. - */ - function size() { - return _classPrivateFieldGet(this, _arr).length; - } - /** - * Returns the keys that are in the queue. Takes `O(n)` time. - */ - }, { - key: "keys", - value: function keys() { - return _classPrivateFieldGet(this, _arr).map(function (x) { - return x.key; - }); - } + /** + * Returns `true` if **key** is in the queue and `false` if not. + */ + has(key) { + return this.#keyIndices.hasOwnProperty(key); + } - /** - * Returns `true` if **key** is in the queue and `false` if not. - */ - }, { - key: "has", - value: function has(key) { - return _classPrivateFieldGet(this, _keyIndices).hasOwnProperty(key); + /** + * Returns the priority for **key**. If **key** is not present in the queue + * then this function returns `undefined`. Takes `O(1)` time. + * + * @param {Object} key + */ + priority(key) { + var index = this.#keyIndices[key]; + if (index !== undefined) { + return this.#arr[index].priority; } + } - /** - * Returns the priority for **key**. If **key** is not present in the queue - * then this function returns `undefined`. Takes `O(1)` time. - * - * @param {Object} key - */ - }, { - key: "priority", - value: function priority(key) { - var index = _classPrivateFieldGet(this, _keyIndices)[key]; - if (index !== undefined) { - return _classPrivateFieldGet(this, _arr)[index].priority; - } + /** + * Returns the key for the minimum element in this queue. If the queue is + * empty this function throws an Error. Takes `O(1)` time. + */ + min() { + if (this.size() === 0) { + throw new Error("Queue underflow"); } + return this.#arr[0].key; + } - /** - * Returns the key for the minimum element in this queue. If the queue is - * empty this function throws an Error. Takes `O(1)` time. - */ - }, { - key: "min", - value: function min() { - if (this.size() === 0) { - throw new Error("Queue underflow"); - } - return _classPrivateFieldGet(this, _arr)[0].key; + /** + * Inserts a new key into the priority queue. If the key already exists in + * the queue this function returns `false`; otherwise it will return `true`. + * Takes `O(n)` time. + * + * @param {Object} key the key to add + * @param {Number} priority the initial priority for the key + */ + add(key, priority) { + var keyIndices = this.#keyIndices; + key = String(key); + if (!keyIndices.hasOwnProperty(key)) { + var arr = this.#arr; + var index = arr.length; + keyIndices[key] = index; + arr.push({ + key: key, + priority: priority + }); + this.#decrease(index); + return true; } + return false; + } - /** - * Inserts a new key into the priority queue. If the key already exists in - * the queue this function returns `false`; otherwise it will return `true`. - * Takes `O(n)` time. - * - * @param {Object} key the key to add - * @param {Number} priority the initial priority for the key - */ - }, { - key: "add", - value: function add(key, priority) { - var keyIndices = _classPrivateFieldGet(this, _keyIndices); - key = String(key); - if (!keyIndices.hasOwnProperty(key)) { - var arr = _classPrivateFieldGet(this, _arr); - var index = arr.length; - keyIndices[key] = index; - arr.push({ - key: key, - priority: priority - }); - _classPrivateMethodGet(this, _decrease, _decrease2).call(this, index); - return true; - } - return false; - } + /** + * Removes and returns the smallest key in the queue. Takes `O(log n)` time. + */ + removeMin() { + this.#swap(0, this.#arr.length - 1); + var min = this.#arr.pop(); + delete this.#keyIndices[min.key]; + this.#heapify(0); + return min.key; + } - /** - * Removes and returns the smallest key in the queue. Takes `O(log n)` time. - */ - }, { - key: "removeMin", - value: function removeMin() { - _classPrivateMethodGet(this, _swap, _swap2).call(this, 0, _classPrivateFieldGet(this, _arr).length - 1); - var min = _classPrivateFieldGet(this, _arr).pop(); - delete _classPrivateFieldGet(this, _keyIndices)[min.key]; - _classPrivateMethodGet(this, _heapify, _heapify2).call(this, 0); - return min.key; + /** + * Decreases the priority for **key** to **priority**. If the new priority is + * greater than the previous priority, this function will throw an Error. + * + * @param {Object} key the key for which to raise priority + * @param {Number} priority the new priority for the key + */ + decrease(key, priority) { + var index = this.#keyIndices[key]; + if (priority > this.#arr[index].priority) { + throw new Error("New priority is greater than current priority. " + "Key: " + key + " Old: " + this.#arr[index].priority + " New: " + priority); } - - /** - * Decreases the priority for **key** to **priority**. If the new priority is - * greater than the previous priority, this function will throw an Error. - * - * @param {Object} key the key for which to raise priority - * @param {Number} priority the new priority for the key - */ - }, { - key: "decrease", - value: function decrease(key, priority) { - var index = _classPrivateFieldGet(this, _keyIndices)[key]; - if (priority > _classPrivateFieldGet(this, _arr)[index].priority) { - throw new Error("New priority is greater than current priority. " + "Key: " + key + " Old: " + _classPrivateFieldGet(this, _arr)[index].priority + " New: " + priority); + this.#arr[index].priority = priority; + this.#decrease(index); + } + #heapify(i) { + var arr = this.#arr; + var l = 2 * i; + var r = l + 1; + var largest = i; + if (l < arr.length) { + largest = arr[l].priority < arr[largest].priority ? l : largest; + if (r < arr.length) { + largest = arr[r].priority < arr[largest].priority ? r : largest; + } + if (largest !== i) { + this.#swap(i, largest); + this.#heapify(largest); } - _classPrivateFieldGet(this, _arr)[index].priority = priority; - _classPrivateMethodGet(this, _decrease, _decrease2).call(this, index); - } - }]); - return PriorityQueue; -}(); -function _heapify2(i) { - var arr = _classPrivateFieldGet(this, _arr); - var l = 2 * i; - var r = l + 1; - var largest = i; - if (l < arr.length) { - largest = arr[l].priority < arr[largest].priority ? l : largest; - if (r < arr.length) { - largest = arr[r].priority < arr[largest].priority ? r : largest; - } - if (largest !== i) { - _classPrivateMethodGet(this, _swap, _swap2).call(this, i, largest); - _classPrivateMethodGet(this, _heapify, _heapify2).call(this, largest); } } -} -function _decrease2(index) { - var arr = _classPrivateFieldGet(this, _arr); - var priority = arr[index].priority; - var parent; - while (index !== 0) { - parent = index >> 1; - if (arr[parent].priority < priority) { - break; + #decrease(index) { + var arr = this.#arr; + var priority = arr[index].priority; + var parent; + while (index !== 0) { + parent = index >> 1; + if (arr[parent].priority < priority) { + break; + } + this.#swap(index, parent); + index = parent; } - _classPrivateMethodGet(this, _swap, _swap2).call(this, index, parent); - index = parent; + } + #swap(i, j) { + var arr = this.#arr; + var keyIndices = this.#keyIndices; + var origArrI = arr[i]; + var origArrJ = arr[j]; + arr[i] = origArrJ; + arr[j] = origArrI; + keyIndices[origArrJ.key] = i; + keyIndices[origArrI.key] = j; } } -function _swap2(i, j) { - var arr = _classPrivateFieldGet(this, _arr); - var keyIndices = _classPrivateFieldGet(this, _keyIndices); - var origArrI = arr[i]; - var origArrJ = arr[j]; - arr[i] = origArrJ; - arr[j] = origArrI; - keyIndices[origArrJ.key] = i; - keyIndices[origArrI.key] = j; -} +exports.default = PriorityQueue; +module.exports = exports.default; diff --git a/lib/graph.js b/lib/graph.js index 8ff44c34..1fa7f9cf 100644 --- a/lib/graph.js +++ b/lib/graph.js @@ -3,29 +3,7 @@ Object.defineProperty(exports, "__esModule", { value: true }); -exports["default"] = void 0; -function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, _typeof(o); } -function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest(); } -function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } -function _iterableToArrayLimit(r, l) { var t = null == r ? null : "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"]; if (null != t) { var e, n, i, u, a = [], f = !0, o = !1; try { if (i = (t = t.call(r)).next, 0 === l) { if (Object(t) !== t) return; f = !1; } else for (; !(f = (e = i.call(t)).done) && (a.push(e.value), a.length !== l); f = !0); } catch (r) { o = !0, n = r; } finally { try { if (!f && null != t["return"] && (u = t["return"](), Object(u) !== u)) return; } finally { if (o) throw n; } } return a; } } -function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; } -function _createForOfIteratorHelper(o, allowArrayLike) { var it = typeof Symbol !== "undefined" && o[Symbol.iterator] || o["@@iterator"]; if (!it) { if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === "number") { if (it) o = it; var i = 0; var F = function F() {}; return { s: F, n: function n() { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }, e: function e(_e) { throw _e; }, f: F }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } var normalCompletion = true, didErr = false, err; return { s: function s() { it = it.call(o); }, n: function n() { var step = it.next(); normalCompletion = step.done; return step; }, e: function e(_e2) { didErr = true; err = _e2; }, f: function f() { try { if (!normalCompletion && it["return"] != null) it["return"](); } finally { if (didErr) throw err; } } }; } -function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); } -function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) arr2[i] = arr[i]; return arr2; } -function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } -function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, _toPropertyKey(descriptor.key), descriptor); } } -function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; } -function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == _typeof(i) ? i : String(i); } -function _toPrimitive(t, r) { if ("object" != _typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != _typeof(i)) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); } -function _classPrivateMethodInitSpec(obj, privateSet) { _checkPrivateRedeclaration(obj, privateSet); privateSet.add(obj); } -function _classPrivateFieldInitSpec(obj, privateMap, value) { _checkPrivateRedeclaration(obj, privateMap); privateMap.set(obj, value); } -function _checkPrivateRedeclaration(obj, privateCollection) { if (privateCollection.has(obj)) { throw new TypeError("Cannot initialize the same private elements twice on an object"); } } -function _classPrivateMethodGet(receiver, privateSet, fn) { if (!privateSet.has(receiver)) { throw new TypeError("attempted to get private field on non-instance"); } return fn; } -function _classPrivateFieldGet(receiver, privateMap) { var descriptor = _classExtractFieldDescriptor(receiver, privateMap, "get"); return _classApplyDescriptorGet(receiver, descriptor); } -function _classApplyDescriptorGet(receiver, descriptor) { if (descriptor.get) { return descriptor.get.call(receiver); } return descriptor.value; } -function _classPrivateFieldSet(receiver, privateMap, value) { var descriptor = _classExtractFieldDescriptor(receiver, privateMap, "set"); _classApplyDescriptorSet(receiver, descriptor, value); return value; } -function _classExtractFieldDescriptor(receiver, privateMap, action) { if (!privateMap.has(receiver)) { throw new TypeError("attempted to " + action + " private field on non-instance"); } return privateMap.get(receiver); } -function _classApplyDescriptorSet(receiver, descriptor, value) { if (descriptor.set) { descriptor.set.call(receiver, value); } else { if (!descriptor.writable) { throw new TypeError("attempted to set read only private field"); } descriptor.value = value; } } +exports.default = void 0; var DEFAULT_EDGE_NAME = "\x00"; var GRAPH_NODE = "\x00"; var EDGE_KEY_DELIM = "\x01"; @@ -39,124 +17,62 @@ var EDGE_KEY_DELIM = "\x01"; // reference edges. This is because we need a performant way to look these // edges up and, object properties, which have string keys, are the closest // we're going to get to a performant hashtable in JavaScript. -var _isDirected = /*#__PURE__*/new WeakMap(); -var _isMultigraph = /*#__PURE__*/new WeakMap(); -var _isCompound = /*#__PURE__*/new WeakMap(); -var _label = /*#__PURE__*/new WeakMap(); -var _defaultNodeLabelFn = /*#__PURE__*/new WeakMap(); -var _defaultEdgeLabelFn = /*#__PURE__*/new WeakMap(); -var _nodes = /*#__PURE__*/new WeakMap(); -var _in = /*#__PURE__*/new WeakMap(); -var _preds = /*#__PURE__*/new WeakMap(); -var _out = /*#__PURE__*/new WeakMap(); -var _sucs = /*#__PURE__*/new WeakMap(); -var _edgeObjs = /*#__PURE__*/new WeakMap(); -var _edgeLabels = /*#__PURE__*/new WeakMap(); -var _nodeCount = /*#__PURE__*/new WeakMap(); -var _edgeCount = /*#__PURE__*/new WeakMap(); -var _parent = /*#__PURE__*/new WeakMap(); -var _children = /*#__PURE__*/new WeakMap(); -var _removeFromParentsChildList = /*#__PURE__*/new WeakSet(); -var Graph = exports["default"] = /*#__PURE__*/function () { - function Graph(opts) { - _classCallCheck(this, Graph); - _classPrivateMethodInitSpec(this, _removeFromParentsChildList); - _classPrivateFieldInitSpec(this, _isDirected, { - writable: true, - value: true - }); - _classPrivateFieldInitSpec(this, _isMultigraph, { - writable: true, - value: false - }); - _classPrivateFieldInitSpec(this, _isCompound, { - writable: true, - value: false - }); - // Label for the graph itself - _classPrivateFieldInitSpec(this, _label, { - writable: true, - value: void 0 - }); - // Defaults to be set when creating a new node - _classPrivateFieldInitSpec(this, _defaultNodeLabelFn, { - writable: true, - value: function value() { - return undefined; - } - }); - // Defaults to be set when creating a new edge - _classPrivateFieldInitSpec(this, _defaultEdgeLabelFn, { - writable: true, - value: function value() { - return undefined; - } - }); - // v -> label - _classPrivateFieldInitSpec(this, _nodes, { - writable: true, - value: {} - }); - // v -> edgeObj - _classPrivateFieldInitSpec(this, _in, { - writable: true, - value: {} - }); - // u -> v -> Number - _classPrivateFieldInitSpec(this, _preds, { - writable: true, - value: {} - }); - // v -> edgeObj - _classPrivateFieldInitSpec(this, _out, { - writable: true, - value: {} - }); - // v -> w -> Number - _classPrivateFieldInitSpec(this, _sucs, { - writable: true, - value: {} - }); - // e -> edgeObj - _classPrivateFieldInitSpec(this, _edgeObjs, { - writable: true, - value: {} - }); - // e -> label - _classPrivateFieldInitSpec(this, _edgeLabels, { - writable: true, - value: {} - }); - /* Number of nodes in the graph. Should only be changed by the implementation. */ - _classPrivateFieldInitSpec(this, _nodeCount, { - writable: true, - value: 0 - }); - /* Number of edges in the graph. Should only be changed by the implementation. */ - _classPrivateFieldInitSpec(this, _edgeCount, { - writable: true, - value: 0 - }); - _classPrivateFieldInitSpec(this, _parent, { - writable: true, - value: void 0 - }); - _classPrivateFieldInitSpec(this, _children, { - writable: true, - value: void 0 - }); + +class Graph { + #isDirected = true; + #isMultigraph = false; + #isCompound = false; + + // Label for the graph itself + #label; + + // Defaults to be set when creating a new node + #defaultNodeLabelFn = () => undefined; + + // Defaults to be set when creating a new edge + #defaultEdgeLabelFn = () => undefined; + + // v -> label + #nodes = {}; + + // v -> edgeObj + #in = {}; + + // u -> v -> Number + #preds = {}; + + // v -> edgeObj + #out = {}; + + // v -> w -> Number + #sucs = {}; + + // e -> edgeObj + #edgeObjs = {}; + + // e -> label + #edgeLabels = {}; + + /* Number of nodes in the graph. Should only be changed by the implementation. */ + #nodeCount = 0; + + /* Number of edges in the graph. Should only be changed by the implementation. */ + #edgeCount = 0; + #parent; + #children; + constructor(opts) { if (opts) { - _classPrivateFieldSet(this, _isDirected, opts.hasOwnProperty("directed") ? opts.directed : true); - _classPrivateFieldSet(this, _isMultigraph, opts.hasOwnProperty("multigraph") ? opts.multigraph : false); - _classPrivateFieldSet(this, _isCompound, opts.hasOwnProperty("compound") ? opts.compound : false); + this.#isDirected = opts.hasOwnProperty("directed") ? opts.directed : true; + this.#isMultigraph = opts.hasOwnProperty("multigraph") ? opts.multigraph : false; + this.#isCompound = opts.hasOwnProperty("compound") ? opts.compound : false; } - if (_classPrivateFieldGet(this, _isCompound)) { + if (this.#isCompound) { // v -> parent - _classPrivateFieldSet(this, _parent, {}); + this.#parent = {}; // v -> children - _classPrivateFieldSet(this, _children, {}); - _classPrivateFieldGet(this, _children)[GRAPH_NODE] = {}; + this.#children = {}; + this.#children[GRAPH_NODE] = {}; } } @@ -165,650 +81,546 @@ var Graph = exports["default"] = /*#__PURE__*/function () { /** * Whether graph was created with 'directed' flag set to true or not. */ - _createClass(Graph, [{ - key: "isDirected", - value: function isDirected() { - return _classPrivateFieldGet(this, _isDirected); - } + isDirected() { + return this.#isDirected; + } - /** - * Whether graph was created with 'multigraph' flag set to true or not. - */ - }, { - key: "isMultigraph", - value: function isMultigraph() { - return _classPrivateFieldGet(this, _isMultigraph); - } + /** + * Whether graph was created with 'multigraph' flag set to true or not. + */ + isMultigraph() { + return this.#isMultigraph; + } - /** - * Whether graph was created with 'compound' flag set to true or not. - */ - }, { - key: "isCompound", - value: function isCompound() { - return _classPrivateFieldGet(this, _isCompound); - } + /** + * Whether graph was created with 'compound' flag set to true or not. + */ + isCompound() { + return this.#isCompound; + } - /** - * Sets the label of the graph. - */ - }, { - key: "setGraph", - value: function setGraph(label) { - _classPrivateFieldSet(this, _label, label); - return this; - } + /** + * Sets the label of the graph. + */ + setGraph(label) { + this.#label = label; + return this; + } - /** - * Gets the graph label. - */ - }, { - key: "graph", - value: function graph() { - return _classPrivateFieldGet(this, _label); - } + /** + * Gets the graph label. + */ + graph() { + return this.#label; + } - /* === Node functions ========== */ - - /** - * Sets the default node label. If newDefault is a function, it will be - * invoked ach time when setting a label for a node. Otherwise, this label - * will be assigned as default label in case if no label was specified while - * setting a node. - * Complexity: O(1). - */ - }, { - key: "setDefaultNodeLabel", - value: function setDefaultNodeLabel(newDefault) { - _classPrivateFieldSet(this, _defaultNodeLabelFn, newDefault); - if (typeof newDefault !== 'function') { - _classPrivateFieldSet(this, _defaultNodeLabelFn, function () { - return newDefault; - }); - } - return this; - } + /* === Node functions ========== */ - /** - * Gets the number of nodes in the graph. - * Complexity: O(1). - */ - }, { - key: "nodeCount", - value: function nodeCount() { - return _classPrivateFieldGet(this, _nodeCount); + /** + * Sets the default node label. If newDefault is a function, it will be + * invoked ach time when setting a label for a node. Otherwise, this label + * will be assigned as default label in case if no label was specified while + * setting a node. + * Complexity: O(1). + */ + setDefaultNodeLabel(newDefault) { + this.#defaultNodeLabelFn = newDefault; + if (typeof newDefault !== 'function') { + this.#defaultNodeLabelFn = () => newDefault; } + return this; + } - /** - * Gets all nodes of the graph. Note, the in case of compound graph subnodes are - * not included in list. - * Complexity: O(1). - */ - }, { - key: "nodes", - value: function nodes() { - return Object.keys(_classPrivateFieldGet(this, _nodes)); - } + /** + * Gets the number of nodes in the graph. + * Complexity: O(1). + */ + nodeCount() { + return this.#nodeCount; + } - /** - * Gets list of nodes without in-edges. - * Complexity: O(|V|). - */ - }, { - key: "sources", - value: function sources() { - var self = this; - return this.nodes().filter(function (v) { - return Object.keys(_classPrivateFieldGet(self, _in)[v]).length === 0; - }); - } + /** + * Gets all nodes of the graph. Note, the in case of compound graph subnodes are + * not included in list. + * Complexity: O(1). + */ + nodes() { + return Object.keys(this.#nodes); + } - /** - * Gets list of nodes without out-edges. - * Complexity: O(|V|). - */ - }, { - key: "sinks", - value: function sinks() { - var self = this; - return this.nodes().filter(function (v) { - return Object.keys(_classPrivateFieldGet(self, _out)[v]).length === 0; - }); - } + /** + * Gets list of nodes without in-edges. + * Complexity: O(|V|). + */ + sources() { + var self = this; + return this.nodes().filter(v => Object.keys(self.#in[v]).length === 0); + } - /** - * Invokes setNode method for each node in names list. - * Complexity: O(|names|). - */ - }, { - key: "setNodes", - value: function setNodes(vs, value) { - var args = arguments; - var self = this; - vs.forEach(function (v) { - if (args.length > 1) { - self.setNode(v, value); - } else { - self.setNode(v); - } - }); - return this; - } + /** + * Gets list of nodes without out-edges. + * Complexity: O(|V|). + */ + sinks() { + var self = this; + return this.nodes().filter(v => Object.keys(self.#out[v]).length === 0); + } - /** - * Creates or updates the value for the node v in the graph. If label is supplied - * it is set as the value for the node. If label is not supplied and the node was - * created by this call then the default node label will be assigned. - * Complexity: O(1). - */ - }, { - key: "setNode", - value: function setNode(v, value) { - var _this$nodeCount; - if (_classPrivateFieldGet(this, _nodes).hasOwnProperty(v)) { - if (arguments.length > 1) { - _classPrivateFieldGet(this, _nodes)[v] = value; - } - return this; + /** + * Invokes setNode method for each node in names list. + * Complexity: O(|names|). + */ + setNodes(vs, value) { + var args = arguments; + var self = this; + vs.forEach(function (v) { + if (args.length > 1) { + self.setNode(v, value); + } else { + self.setNode(v); } - _classPrivateFieldGet(this, _nodes)[v] = arguments.length > 1 ? value : _classPrivateFieldGet(this, _defaultNodeLabelFn).call(this, v); - if (_classPrivateFieldGet(this, _isCompound)) { - _classPrivateFieldGet(this, _parent)[v] = GRAPH_NODE; - _classPrivateFieldGet(this, _children)[v] = {}; - _classPrivateFieldGet(this, _children)[GRAPH_NODE][v] = true; + }); + return this; + } + + /** + * Creates or updates the value for the node v in the graph. If label is supplied + * it is set as the value for the node. If label is not supplied and the node was + * created by this call then the default node label will be assigned. + * Complexity: O(1). + */ + setNode(v, value) { + if (this.#nodes.hasOwnProperty(v)) { + if (arguments.length > 1) { + this.#nodes[v] = value; } - _classPrivateFieldGet(this, _in)[v] = {}; - _classPrivateFieldGet(this, _preds)[v] = {}; - _classPrivateFieldGet(this, _out)[v] = {}; - _classPrivateFieldGet(this, _sucs)[v] = {}; - _classPrivateFieldSet(this, _nodeCount, (_this$nodeCount = _classPrivateFieldGet(this, _nodeCount), ++_this$nodeCount)); return this; } + this.#nodes[v] = arguments.length > 1 ? value : this.#defaultNodeLabelFn(v); + if (this.#isCompound) { + this.#parent[v] = GRAPH_NODE; + this.#children[v] = {}; + this.#children[GRAPH_NODE][v] = true; + } + this.#in[v] = {}; + this.#preds[v] = {}; + this.#out[v] = {}; + this.#sucs[v] = {}; + ++this.#nodeCount; + return this; + } - /** - * Gets the label of node with specified name. - * Complexity: O(|V|). - */ - }, { - key: "node", - value: function node(v) { - return _classPrivateFieldGet(this, _nodes)[v]; - } + /** + * Gets the label of node with specified name. + * Complexity: O(|V|). + */ + node(v) { + return this.#nodes[v]; + } - /** - * Detects whether graph has a node with specified name or not. - */ - }, { - key: "hasNode", - value: function hasNode(v) { - return _classPrivateFieldGet(this, _nodes).hasOwnProperty(v); - } + /** + * Detects whether graph has a node with specified name or not. + */ + hasNode(v) { + return this.#nodes.hasOwnProperty(v); + } - /** - * Remove the node with the name from the graph or do nothing if the node is not in - * the graph. If the node was removed this function also removes any incident - * edges. - * Complexity: O(1). - */ - }, { - key: "removeNode", - value: function removeNode(v) { - var self = this; - if (_classPrivateFieldGet(this, _nodes).hasOwnProperty(v)) { - var _this$nodeCount2; - var removeEdge = function removeEdge(e) { - return self.removeEdge(_classPrivateFieldGet(self, _edgeObjs)[e]); - }; - delete _classPrivateFieldGet(this, _nodes)[v]; - if (_classPrivateFieldGet(this, _isCompound)) { - _classPrivateMethodGet(this, _removeFromParentsChildList, _removeFromParentsChildList2).call(this, v); - delete _classPrivateFieldGet(this, _parent)[v]; - this.children(v).forEach(function (child) { - self.setParent(child); - }); - delete _classPrivateFieldGet(this, _children)[v]; - } - Object.keys(_classPrivateFieldGet(this, _in)[v]).forEach(removeEdge); - delete _classPrivateFieldGet(this, _in)[v]; - delete _classPrivateFieldGet(this, _preds)[v]; - Object.keys(_classPrivateFieldGet(this, _out)[v]).forEach(removeEdge); - delete _classPrivateFieldGet(this, _out)[v]; - delete _classPrivateFieldGet(this, _sucs)[v]; - _classPrivateFieldSet(this, _nodeCount, (_this$nodeCount2 = _classPrivateFieldGet(this, _nodeCount), --_this$nodeCount2)); + /** + * Remove the node with the name from the graph or do nothing if the node is not in + * the graph. If the node was removed this function also removes any incident + * edges. + * Complexity: O(1). + */ + removeNode(v) { + var self = this; + if (this.#nodes.hasOwnProperty(v)) { + var removeEdge = e => self.removeEdge(self.#edgeObjs[e]); + delete this.#nodes[v]; + if (this.#isCompound) { + this.#removeFromParentsChildList(v); + delete this.#parent[v]; + this.children(v).forEach(function (child) { + self.setParent(child); + }); + delete this.#children[v]; } - return this; - } + Object.keys(this.#in[v]).forEach(removeEdge); + delete this.#in[v]; + delete this.#preds[v]; + Object.keys(this.#out[v]).forEach(removeEdge); + delete this.#out[v]; + delete this.#sucs[v]; + --this.#nodeCount; + } + return this; + } - /** - * Sets node p as a parent for node v if it is defined, or removes the - * parent for v if p is undefined. Method throws an exception in case of - * invoking it in context of noncompound graph. - * Average-case complexity: O(1). - */ - }, { - key: "setParent", - value: function setParent(v, parent) { - if (!_classPrivateFieldGet(this, _isCompound)) { - throw new Error("Cannot set parent in a non-compound graph"); - } - if (parent === undefined) { - parent = GRAPH_NODE; - } else { - // Coerce parent to string - parent += ""; - for (var ancestor = parent; ancestor !== undefined; ancestor = this.parent(ancestor)) { - if (ancestor === v) { - throw new Error("Setting " + parent + " as parent of " + v + " would create a cycle"); - } - } - this.setNode(parent); - } - this.setNode(v); - _classPrivateMethodGet(this, _removeFromParentsChildList, _removeFromParentsChildList2).call(this, v); - _classPrivateFieldGet(this, _parent)[v] = parent; - _classPrivateFieldGet(this, _children)[parent][v] = true; - return this; - } - }, { - key: "parent", - value: - /** - * Gets parent node for node v. - * Complexity: O(1). - */ - function parent(v) { - if (_classPrivateFieldGet(this, _isCompound)) { - var parent = _classPrivateFieldGet(this, _parent)[v]; - if (parent !== GRAPH_NODE) { - return parent; + /** + * Sets node p as a parent for node v if it is defined, or removes the + * parent for v if p is undefined. Method throws an exception in case of + * invoking it in context of noncompound graph. + * Average-case complexity: O(1). + */ + setParent(v, parent) { + if (!this.#isCompound) { + throw new Error("Cannot set parent in a non-compound graph"); + } + if (parent === undefined) { + parent = GRAPH_NODE; + } else { + // Coerce parent to string + parent += ""; + for (var ancestor = parent; ancestor !== undefined; ancestor = this.parent(ancestor)) { + if (ancestor === v) { + throw new Error("Setting " + parent + " as parent of " + v + " would create a cycle"); } } + this.setNode(parent); } + this.setNode(v); + this.#removeFromParentsChildList(v); + this.#parent[v] = parent; + this.#children[parent][v] = true; + return this; + } + #removeFromParentsChildList(v) { + delete this.#children[this.#parent[v]][v]; + } - /** - * Gets list of direct children of node v. - * Complexity: O(1). - */ - }, { - key: "children", - value: function children() { - var v = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : GRAPH_NODE; - if (_classPrivateFieldGet(this, _isCompound)) { - var children = _classPrivateFieldGet(this, _children)[v]; - if (children) { - return Object.keys(children); - } - } else if (v === GRAPH_NODE) { - return this.nodes(); - } else if (this.hasNode(v)) { - return []; + /** + * Gets parent node for node v. + * Complexity: O(1). + */ + parent(v) { + if (this.#isCompound) { + var parent = this.#parent[v]; + if (parent !== GRAPH_NODE) { + return parent; } } + } - /** - * Return all nodes that are predecessors of the specified node or undefined if node v is not in - * the graph. Behavior is undefined for undirected graphs - use neighbors instead. - * Complexity: O(|V|). - */ - }, { - key: "predecessors", - value: function predecessors(v) { - var predsV = _classPrivateFieldGet(this, _preds)[v]; - if (predsV) { - return Object.keys(predsV); + /** + * Gets list of direct children of node v. + * Complexity: O(1). + */ + children(v = GRAPH_NODE) { + if (this.#isCompound) { + var children = this.#children[v]; + if (children) { + return Object.keys(children); } + } else if (v === GRAPH_NODE) { + return this.nodes(); + } else if (this.hasNode(v)) { + return []; } + } - /** - * Return all nodes that are successors of the specified node or undefined if node v is not in - * the graph. Behavior is undefined for undirected graphs - use neighbors instead. - * Complexity: O(|V|). - */ - }, { - key: "successors", - value: function successors(v) { - var sucsV = _classPrivateFieldGet(this, _sucs)[v]; - if (sucsV) { - return Object.keys(sucsV); - } + /** + * Return all nodes that are predecessors of the specified node or undefined if node v is not in + * the graph. Behavior is undefined for undirected graphs - use neighbors instead. + * Complexity: O(|V|). + */ + predecessors(v) { + var predsV = this.#preds[v]; + if (predsV) { + return Object.keys(predsV); } + } - /** - * Return all nodes that are predecessors or successors of the specified node or undefined if - * node v is not in the graph. - * Complexity: O(|V|). - */ - }, { - key: "neighbors", - value: function neighbors(v) { - var preds = this.predecessors(v); - if (preds) { - var union = new Set(preds); - var _iterator = _createForOfIteratorHelper(this.successors(v)), - _step; - try { - for (_iterator.s(); !(_step = _iterator.n()).done;) { - var succ = _step.value; - union.add(succ); - } - } catch (err) { - _iterator.e(err); - } finally { - _iterator.f(); - } - return Array.from(union.values()); - } + /** + * Return all nodes that are successors of the specified node or undefined if node v is not in + * the graph. Behavior is undefined for undirected graphs - use neighbors instead. + * Complexity: O(|V|). + */ + successors(v) { + var sucsV = this.#sucs[v]; + if (sucsV) { + return Object.keys(sucsV); } - }, { - key: "isLeaf", - value: function isLeaf(v) { - var neighbors; - if (this.isDirected()) { - neighbors = this.successors(v); - } else { - neighbors = this.neighbors(v); + } + + /** + * Return all nodes that are predecessors or successors of the specified node or undefined if + * node v is not in the graph. + * Complexity: O(|V|). + */ + neighbors(v) { + var preds = this.predecessors(v); + if (preds) { + const union = new Set(preds); + for (var succ of this.successors(v)) { + union.add(succ); } - return neighbors.length === 0; + return Array.from(union.values()); } + } + isLeaf(v) { + var neighbors; + if (this.isDirected()) { + neighbors = this.successors(v); + } else { + neighbors = this.neighbors(v); + } + return neighbors.length === 0; + } - /** - * Creates new graph with nodes filtered via filter. Edges incident to rejected node - * are also removed. In case of compound graph, if parent is rejected by filter, - * than all its children are rejected too. - * Average-case complexity: O(|E|+|V|). - */ - }, { - key: "filterNodes", - value: function filterNodes(filter) { - var copy = new this.constructor({ - directed: _classPrivateFieldGet(this, _isDirected), - multigraph: _classPrivateFieldGet(this, _isMultigraph), - compound: _classPrivateFieldGet(this, _isCompound) - }); - copy.setGraph(this.graph()); - var self = this; - Object.entries(_classPrivateFieldGet(this, _nodes)).forEach(function (_ref) { - var _ref2 = _slicedToArray(_ref, 2), - v = _ref2[0], - value = _ref2[1]; - if (filter(v)) { - copy.setNode(v, value); - } - }); - Object.values(_classPrivateFieldGet(this, _edgeObjs)).forEach(function (e) { - if (copy.hasNode(e.v) && copy.hasNode(e.w)) { - copy.setEdge(e, self.edge(e)); - } - }); - var parents = {}; - function findParent(v) { - var parent = self.parent(v); - if (parent === undefined || copy.hasNode(parent)) { - parents[v] = parent; - return parent; - } else if (parent in parents) { - return parents[parent]; - } else { - return findParent(parent); - } + /** + * Creates new graph with nodes filtered via filter. Edges incident to rejected node + * are also removed. In case of compound graph, if parent is rejected by filter, + * than all its children are rejected too. + * Average-case complexity: O(|E|+|V|). + */ + filterNodes(filter) { + var copy = new this.constructor({ + directed: this.#isDirected, + multigraph: this.#isMultigraph, + compound: this.#isCompound + }); + copy.setGraph(this.graph()); + var self = this; + Object.entries(this.#nodes).forEach(function ([v, value]) { + if (filter(v)) { + copy.setNode(v, value); } - if (_classPrivateFieldGet(this, _isCompound)) { - copy.nodes().forEach(function (v) { - return copy.setParent(v, findParent(v)); - }); + }); + Object.values(this.#edgeObjs).forEach(function (e) { + if (copy.hasNode(e.v) && copy.hasNode(e.w)) { + copy.setEdge(e, self.edge(e)); } - return copy; - } - - /* === Edge functions ========== */ - - /** - * Sets the default edge label or factory function. This label will be - * assigned as default label in case if no label was specified while setting - * an edge or this function will be invoked each time when setting an edge - * with no label specified and returned value * will be used as a label for edge. - * Complexity: O(1). - */ - }, { - key: "setDefaultEdgeLabel", - value: function setDefaultEdgeLabel(newDefault) { - _classPrivateFieldSet(this, _defaultEdgeLabelFn, newDefault); - if (typeof newDefault !== 'function') { - _classPrivateFieldSet(this, _defaultEdgeLabelFn, function () { - return newDefault; - }); + }); + var parents = {}; + function findParent(v) { + var parent = self.parent(v); + if (parent === undefined || copy.hasNode(parent)) { + parents[v] = parent; + return parent; + } else if (parent in parents) { + return parents[parent]; + } else { + return findParent(parent); } - return this; } - - /** - * Gets the number of edges in the graph. - * Complexity: O(1). - */ - }, { - key: "edgeCount", - value: function edgeCount() { - return _classPrivateFieldGet(this, _edgeCount); + if (this.#isCompound) { + copy.nodes().forEach(v => copy.setParent(v, findParent(v))); } + return copy; + } - /** - * Gets edges of the graph. In case of compound graph subgraphs are not considered. - * Complexity: O(|E|). - */ - }, { - key: "edges", - value: function edges() { - return Object.values(_classPrivateFieldGet(this, _edgeObjs)); - } + /* === Edge functions ========== */ - /** - * Establish an edges path over the nodes in nodes list. If some edge is already - * exists, it will update its label, otherwise it will create an edge between pair - * of nodes with label provided or default label if no label provided. - * Complexity: O(|nodes|). - */ - }, { - key: "setPath", - value: function setPath(vs, value) { - var self = this; - var args = arguments; - vs.reduce(function (v, w) { - if (args.length > 1) { - self.setEdge(v, w, value); - } else { - self.setEdge(v, w); - } - return w; - }); - return this; + /** + * Sets the default edge label or factory function. This label will be + * assigned as default label in case if no label was specified while setting + * an edge or this function will be invoked each time when setting an edge + * with no label specified and returned value * will be used as a label for edge. + * Complexity: O(1). + */ + setDefaultEdgeLabel(newDefault) { + this.#defaultEdgeLabelFn = newDefault; + if (typeof newDefault !== 'function') { + this.#defaultEdgeLabelFn = () => newDefault; } + return this; + } - /** - * Creates or updates the label for the edge (v, w) with the optionally supplied - * name. If label is supplied it is set as the value for the edge. If label is not - * supplied and the edge was created by this call then the default edge label will - * be assigned. The name parameter is only useful with multigraphs. - */ - }, { - key: "setEdge", - value: function setEdge() { - var _this$edgeCount, _this$edgeCount2; - var v, w, name, value; - var valueSpecified = false; - var arg0 = arguments[0]; - if (_typeof(arg0) === "object" && arg0 !== null && "v" in arg0) { - v = arg0.v; - w = arg0.w; - name = arg0.name; - if (arguments.length === 2) { - value = arguments[1]; - valueSpecified = true; - } + /** + * Gets the number of edges in the graph. + * Complexity: O(1). + */ + edgeCount() { + return this.#edgeCount; + } + + /** + * Gets edges of the graph. In case of compound graph subgraphs are not considered. + * Complexity: O(|E|). + */ + edges() { + return Object.values(this.#edgeObjs); + } + + /** + * Establish an edges path over the nodes in nodes list. If some edge is already + * exists, it will update its label, otherwise it will create an edge between pair + * of nodes with label provided or default label if no label provided. + * Complexity: O(|nodes|). + */ + setPath(vs, value) { + var self = this; + var args = arguments; + vs.reduce(function (v, w) { + if (args.length > 1) { + self.setEdge(v, w, value); } else { - v = arg0; - w = arguments[1]; - name = arguments[3]; - if (arguments.length > 2) { - value = arguments[2]; - valueSpecified = true; - } + self.setEdge(v, w); } - v = "" + v; - w = "" + w; - if (name !== undefined) { - name = "" + name; + return w; + }); + return this; + } + + /** + * Creates or updates the label for the edge (v, w) with the optionally supplied + * name. If label is supplied it is set as the value for the edge. If label is not + * supplied and the edge was created by this call then the default edge label will + * be assigned. The name parameter is only useful with multigraphs. + */ + setEdge() { + var v, w, name, value; + var valueSpecified = false; + var arg0 = arguments[0]; + if (typeof arg0 === "object" && arg0 !== null && "v" in arg0) { + v = arg0.v; + w = arg0.w; + name = arg0.name; + if (arguments.length === 2) { + value = arguments[1]; + valueSpecified = true; } - var e = edgeArgsToId(_classPrivateFieldGet(this, _isDirected), v, w, name); - if (_classPrivateFieldGet(this, _edgeLabels).hasOwnProperty(e)) { - if (valueSpecified) { - _classPrivateFieldGet(this, _edgeLabels)[e] = value; - } - return this; + } else { + v = arg0; + w = arguments[1]; + name = arguments[3]; + if (arguments.length > 2) { + value = arguments[2]; + valueSpecified = true; } - if (name !== undefined && !_classPrivateFieldGet(this, _isMultigraph)) { - throw new Error("Cannot set a named edge when isMultigraph = false"); + } + v = "" + v; + w = "" + w; + if (name !== undefined) { + name = "" + name; + } + var e = edgeArgsToId(this.#isDirected, v, w, name); + if (this.#edgeLabels.hasOwnProperty(e)) { + if (valueSpecified) { + this.#edgeLabels[e] = value; } - - // It didn't exist, so we need to create it. - // First ensure the nodes exist. - this.setNode(v); - this.setNode(w); - _classPrivateFieldGet(this, _edgeLabels)[e] = valueSpecified ? value : _classPrivateFieldGet(this, _defaultEdgeLabelFn).call(this, v, w, name); - var edgeObj = edgeArgsToObj(_classPrivateFieldGet(this, _isDirected), v, w, name); - // Ensure we add undirected edges in a consistent way. - v = edgeObj.v; - w = edgeObj.w; - Object.freeze(edgeObj); - _classPrivateFieldGet(this, _edgeObjs)[e] = edgeObj; - incrementOrInitEntry(_classPrivateFieldGet(this, _preds)[w], v); - incrementOrInitEntry(_classPrivateFieldGet(this, _sucs)[v], w); - _classPrivateFieldGet(this, _in)[w][e] = edgeObj; - _classPrivateFieldGet(this, _out)[v][e] = edgeObj; - _classPrivateFieldSet(this, _edgeCount, (_this$edgeCount = _classPrivateFieldGet(this, _edgeCount), _this$edgeCount2 = _this$edgeCount++, _this$edgeCount)), _this$edgeCount2; return this; } + if (name !== undefined && !this.#isMultigraph) { + throw new Error("Cannot set a named edge when isMultigraph = false"); + } + + // It didn't exist, so we need to create it. + // First ensure the nodes exist. + this.setNode(v); + this.setNode(w); + this.#edgeLabels[e] = valueSpecified ? value : this.#defaultEdgeLabelFn(v, w, name); + var edgeObj = edgeArgsToObj(this.#isDirected, v, w, name); + // Ensure we add undirected edges in a consistent way. + v = edgeObj.v; + w = edgeObj.w; + Object.freeze(edgeObj); + this.#edgeObjs[e] = edgeObj; + incrementOrInitEntry(this.#preds[w], v); + incrementOrInitEntry(this.#sucs[v], w); + this.#in[w][e] = edgeObj; + this.#out[v][e] = edgeObj; + this.#edgeCount++; + return this; + } - /** - * Gets the label for the specified edge. - * Complexity: O(1). - */ - }, { - key: "edge", - value: function edge(v, w, name) { - var e = arguments.length === 1 ? edgeObjToId(_classPrivateFieldGet(this, _isDirected), arguments[0]) : edgeArgsToId(_classPrivateFieldGet(this, _isDirected), v, w, name); - return _classPrivateFieldGet(this, _edgeLabels)[e]; - } + /** + * Gets the label for the specified edge. + * Complexity: O(1). + */ + edge(v, w, name) { + var e = arguments.length === 1 ? edgeObjToId(this.#isDirected, arguments[0]) : edgeArgsToId(this.#isDirected, v, w, name); + return this.#edgeLabels[e]; + } - /** - * Gets the label for the specified edge and converts it to an object. - * Complexity: O(1) - */ - }, { - key: "edgeAsObj", - value: function edgeAsObj() { - var edge = this.edge.apply(this, arguments); - if (_typeof(edge) !== "object") { - return { - label: edge - }; - } - return edge; - } + /** + * Gets the label for the specified edge and converts it to an object. + * Complexity: O(1) + */ + edgeAsObj() { + const edge = this.edge(...arguments); + if (typeof edge !== "object") { + return { + label: edge + }; + } + return edge; + } - /** - * Detects whether the graph contains specified edge or not. No subgraphs are considered. - * Complexity: O(1). - */ - }, { - key: "hasEdge", - value: function hasEdge(v, w, name) { - var e = arguments.length === 1 ? edgeObjToId(_classPrivateFieldGet(this, _isDirected), arguments[0]) : edgeArgsToId(_classPrivateFieldGet(this, _isDirected), v, w, name); - return _classPrivateFieldGet(this, _edgeLabels).hasOwnProperty(e); - } + /** + * Detects whether the graph contains specified edge or not. No subgraphs are considered. + * Complexity: O(1). + */ + hasEdge(v, w, name) { + var e = arguments.length === 1 ? edgeObjToId(this.#isDirected, arguments[0]) : edgeArgsToId(this.#isDirected, v, w, name); + return this.#edgeLabels.hasOwnProperty(e); + } - /** - * Removes the specified edge from the graph. No subgraphs are considered. - * Complexity: O(1). - */ - }, { - key: "removeEdge", - value: function removeEdge(v, w, name) { - var e = arguments.length === 1 ? edgeObjToId(_classPrivateFieldGet(this, _isDirected), arguments[0]) : edgeArgsToId(_classPrivateFieldGet(this, _isDirected), v, w, name); - var edge = _classPrivateFieldGet(this, _edgeObjs)[e]; - if (edge) { - var _this$edgeCount3, _this$edgeCount4; - v = edge.v; - w = edge.w; - delete _classPrivateFieldGet(this, _edgeLabels)[e]; - delete _classPrivateFieldGet(this, _edgeObjs)[e]; - decrementOrRemoveEntry(_classPrivateFieldGet(this, _preds)[w], v); - decrementOrRemoveEntry(_classPrivateFieldGet(this, _sucs)[v], w); - delete _classPrivateFieldGet(this, _in)[w][e]; - delete _classPrivateFieldGet(this, _out)[v][e]; - _classPrivateFieldSet(this, _edgeCount, (_this$edgeCount3 = _classPrivateFieldGet(this, _edgeCount), _this$edgeCount4 = _this$edgeCount3--, _this$edgeCount3)), _this$edgeCount4; - } - return this; - } + /** + * Removes the specified edge from the graph. No subgraphs are considered. + * Complexity: O(1). + */ + removeEdge(v, w, name) { + var e = arguments.length === 1 ? edgeObjToId(this.#isDirected, arguments[0]) : edgeArgsToId(this.#isDirected, v, w, name); + var edge = this.#edgeObjs[e]; + if (edge) { + v = edge.v; + w = edge.w; + delete this.#edgeLabels[e]; + delete this.#edgeObjs[e]; + decrementOrRemoveEntry(this.#preds[w], v); + decrementOrRemoveEntry(this.#sucs[v], w); + delete this.#in[w][e]; + delete this.#out[v][e]; + this.#edgeCount--; + } + return this; + } - /** - * Return all edges that point to the node v. Optionally filters those edges down to just those - * coming from node u. Behavior is undefined for undirected graphs - use nodeEdges instead. - * Complexity: O(|E|). - */ - }, { - key: "inEdges", - value: function inEdges(v, u) { - var inV = _classPrivateFieldGet(this, _in)[v]; - if (inV) { - var edges = Object.values(inV); - if (!u) { - return edges; - } - return edges.filter(function (edge) { - return edge.v === u; - }); + /** + * Return all edges that point to the node v. Optionally filters those edges down to just those + * coming from node u. Behavior is undefined for undirected graphs - use nodeEdges instead. + * Complexity: O(|E|). + */ + inEdges(v, u) { + var inV = this.#in[v]; + if (inV) { + var edges = Object.values(inV); + if (!u) { + return edges; } + return edges.filter(edge => edge.v === u); } + } - /** - * Return all edges that are pointed at by node v. Optionally filters those edges down to just - * those point to w. Behavior is undefined for undirected graphs - use nodeEdges instead. - * Complexity: O(|E|). - */ - }, { - key: "outEdges", - value: function outEdges(v, w) { - var outV = _classPrivateFieldGet(this, _out)[v]; - if (outV) { - var edges = Object.values(outV); - if (!w) { - return edges; - } - return edges.filter(function (edge) { - return edge.w === w; - }); + /** + * Return all edges that are pointed at by node v. Optionally filters those edges down to just + * those point to w. Behavior is undefined for undirected graphs - use nodeEdges instead. + * Complexity: O(|E|). + */ + outEdges(v, w) { + var outV = this.#out[v]; + if (outV) { + var edges = Object.values(outV); + if (!w) { + return edges; } + return edges.filter(edge => edge.w === w); } + } - /** - * Returns all edges to or from node v regardless of direction. Optionally filters those edges - * down to just those between nodes v and w regardless of direction. - * Complexity: O(|E|). - */ - }, { - key: "nodeEdges", - value: function nodeEdges(v, w) { - var inEdges = this.inEdges(v, w); - if (inEdges) { - return inEdges.concat(this.outEdges(v, w)); - } + /** + * Returns all edges to or from node v regardless of direction. Optionally filters those edges + * down to just those between nodes v and w regardless of direction. + * Complexity: O(|E|). + */ + nodeEdges(v, w) { + var inEdges = this.inEdges(v, w); + if (inEdges) { + return inEdges.concat(this.outEdges(v, w)); } - }]); - return Graph; -}(); -function _removeFromParentsChildList2(v) { - delete _classPrivateFieldGet(this, _children)[_classPrivateFieldGet(this, _parent)[v]][v]; + } } +exports.default = Graph; function incrementOrInitEntry(map, k) { if (map[k]) { map[k]++; @@ -851,3 +663,4 @@ function edgeArgsToObj(isDirected, v_, w_, name) { function edgeObjToId(isDirected, edgeObj) { return edgeArgsToId(isDirected, edgeObj.v, edgeObj.w, edgeObj.name); } +module.exports = exports.default; diff --git a/lib/index.js b/lib/index.js index 94927a7b..0e5945f0 100644 --- a/lib/index.js +++ b/lib/index.js @@ -1,20 +1,19 @@ "use strict"; -function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, _typeof(o); } Object.defineProperty(exports, "__esModule", { value: true }); Object.defineProperty(exports, "Graph", { enumerable: true, - get: function get() { - return _graph["default"]; + get: function () { + return _graph.default; } }); exports.json = exports.alg = void 0; Object.defineProperty(exports, "version", { enumerable: true, - get: function get() { - return _version["default"]; + get: function () { + return _version.default; } }); var _graph = _interopRequireDefault(require("./graph.js")); @@ -23,6 +22,6 @@ var _json = _interopRequireWildcard(require("./json.js")); exports.json = _json; var _alg = _interopRequireWildcard(require("./alg/index.js")); exports.alg = _alg; -function _getRequireWildcardCache(e) { if ("function" != typeof WeakMap) return null; var r = new WeakMap(), t = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(e) { return e ? t : r; })(e); } -function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e; if (null === e || "object" != _typeof(e) && "function" != typeof e) return { "default": e }; var t = _getRequireWildcardCache(r); if (t && t.has(e)) return t.get(e); var n = { __proto__: null }, a = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var u in e) if ("default" !== u && Object.prototype.hasOwnProperty.call(e, u)) { var i = a ? Object.getOwnPropertyDescriptor(e, u) : null; i && (i.get || i.set) ? Object.defineProperty(n, u, i) : n[u] = e[u]; } return n["default"] = e, t && t.set(e, n), n; } -function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; } +function _getRequireWildcardCache(e) { if ("function" != typeof WeakMap) return null; var r = new WeakMap(), t = new WeakMap(); return (_getRequireWildcardCache = function (e) { return e ? t : r; })(e); } +function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e; if (null === e || "object" != typeof e && "function" != typeof e) return { default: e }; var t = _getRequireWildcardCache(r); if (t && t.has(e)) return t.get(e); var n = { __proto__: null }, a = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var u in e) if ("default" !== u && Object.prototype.hasOwnProperty.call(e, u)) { var i = a ? Object.getOwnPropertyDescriptor(e, u) : null; i && (i.get || i.set) ? Object.defineProperty(n, u, i) : n[u] = e[u]; } return n.default = e, t && t.set(e, n), n; } +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } diff --git a/lib/json.js b/lib/json.js index 57e1ea66..f9975564 100644 --- a/lib/json.js +++ b/lib/json.js @@ -6,7 +6,7 @@ Object.defineProperty(exports, "__esModule", { exports.read = read; exports.write = write; var _graph = _interopRequireDefault(require("./graph.js")); -function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; } +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } /** * Creates a JSON representation of the graph that can be serialized to a string with * JSON.stringify. The graph can later be restored using json.read. @@ -70,7 +70,7 @@ function writeEdges(g) { * // [ { v: 'a', w: 'b' } ] */ function read(json) { - var g = new _graph["default"](json.options).setGraph(json.value); + var g = new _graph.default(json.options).setGraph(json.value); json.nodes.forEach(function (entry) { g.setNode(entry.v, entry.value); if (entry.parent) { diff --git a/lib/version.js b/lib/version.js index f7c50fc4..9b49b85f 100644 --- a/lib/version.js +++ b/lib/version.js @@ -3,5 +3,7 @@ Object.defineProperty(exports, "__esModule", { value: true }); -exports["default"] = void 0; -var version = exports["default"] = '2.1.14-pre'; +exports.default = void 0; +const version = '2.1.14-pre'; +var _default = exports.default = version; +module.exports = exports.default; diff --git a/mjs-lib/version.js b/mjs-lib/version.js index 41701180..f5c52610 100644 --- a/mjs-lib/version.js +++ b/mjs-lib/version.js @@ -1,2 +1,2 @@ const version = '2.1.14-pre'; -export { version as default }; +export default version; diff --git a/package-lock.json b/package-lock.json index 2acea628..10a9af2e 100644 --- a/package-lock.json +++ b/package-lock.json @@ -13,6 +13,7 @@ "@babel/core": "^7.23.9", "@babel/plugin-transform-modules-commonjs": "^7.23.3", "@babel/preset-env": "^7.23.9", + "babel-plugin-add-module-exports": "^1.0.4", "benchmark": "2.1.4", "browserify": "16.5.1", "chai": "^4.3.6", @@ -2314,6 +2315,12 @@ "node": "*" } }, + "node_modules/babel-plugin-add-module-exports": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/babel-plugin-add-module-exports/-/babel-plugin-add-module-exports-1.0.4.tgz", + "integrity": "sha512-g+8yxHUZ60RcyaUpfNzy56OtWW+x9cyEe9j+CranqLiqbju2yf/Cy6ZtYK40EZxtrdHllzlVZgLmcOUCTlJ7Jg==", + "dev": true + }, "node_modules/babel-plugin-polyfill-corejs2": { "version": "0.4.8", "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.8.tgz", @@ -9128,6 +9135,12 @@ "version": "1.1.0", "dev": true }, + "babel-plugin-add-module-exports": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/babel-plugin-add-module-exports/-/babel-plugin-add-module-exports-1.0.4.tgz", + "integrity": "sha512-g+8yxHUZ60RcyaUpfNzy56OtWW+x9cyEe9j+CranqLiqbju2yf/Cy6ZtYK40EZxtrdHllzlVZgLmcOUCTlJ7Jg==", + "dev": true + }, "babel-plugin-polyfill-corejs2": { "version": "0.4.8", "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.8.tgz", diff --git a/package.json b/package.json index 54cd072e..2ab91053 100644 --- a/package.json +++ b/package.json @@ -28,6 +28,7 @@ "@babel/core": "^7.23.9", "@babel/plugin-transform-modules-commonjs": "^7.23.3", "@babel/preset-env": "^7.23.9", + "babel-plugin-add-module-exports": "^1.0.4", "benchmark": "2.1.4", "browserify": "16.5.1", "chai": "^4.3.6", From cb4e4a425ddd593b23bbf2b024884914513ebd42 Mon Sep 17 00:00:00 2001 From: Andrew Pikul Date: Wed, 31 Jan 2024 13:32:54 -0500 Subject: [PATCH 47/85] Optimize Makefile: We now seperate mjs-files and cjs-files cjs files only generate if mjs-file changed Lint does not lint generated files index.js depends on cjs-files so it is listed as such Add convert-clean to remove files in lib/ not in mjs-lib/ --- Makefile | 33 ++++++++++++++++++++------------- lib/version.js | 3 +-- mjs-lib/version.js | 3 +-- src/release/make-version.js | 2 +- 4 files changed, 23 insertions(+), 18 deletions(-) diff --git a/Makefile b/Makefile index ce985c90..1d30fa94 100644 --- a/Makefile +++ b/Makefile @@ -16,23 +16,24 @@ BUILD_DIR = build COVERAGE_DIR = ./.nyc_output DIST_DIR = dist -# Why is this doubled up? -SRC_FILES = lib/index.js lib/version.js $(shell find lib -type f -name '*.js') + +MJS_FILES = $(shell find mjs-lib -type f -name '*.js') +# CJS_FILES are based off mjs files. +CJS_FILES = $(shell find mjs-lib -type f -name '*.js' -printf lib/%P\\n) TEST_FILES = $(shell find test -type f -name '*.js' | grep -v 'bundle-test.js' | grep -v 'test-main.js') BUILD_FILES = $(addprefix $(BUILD_DIR)/, \ $(MOD).js $(MOD).min.js \ $(MOD).core.js $(MOD).core.min.js) - DIRS = $(BUILD_DIR) -.PHONY: all bench clean browser-test unit-test test dist convert +.PHONY: all bench clean convert-clean browser-test unit-test test dist all: unit-test lint bench: unit-test lint @src/bench.js -lib/version.js: package.json +mjs-lib/version.js: package.json @src/release/make-version.js > $@ $(DIRS): @@ -40,7 +41,7 @@ $(DIRS): test: unit-test browser-test -unit-test: $(SRC_FILES) $(TEST_FILES) node_modules | $(BUILD_DIR) +unit-test: convert $(CJS_FILES) $(TEST_FILES) node_modules | $(BUILD_DIR) -$(NYC) $(MOCHA) --dir $(COVERAGE_DIR) -- $(MOCHA_OPTS) $(TEST_FILES) || $(MOCHA) $(MOCHA_OPTS) $(TEST_FILES) browser-test: $(BUILD_DIR)/$(MOD).js $(BUILD_DIR)/$(MOD).core.js @@ -50,17 +51,20 @@ browser-test: $(BUILD_DIR)/$(MOD).js $(BUILD_DIR)/$(MOD).core.js bower.json: package.json src/release/make-bower.json.js @src/release/make-bower.json.js > $@ +# index.js still uses require! +index.js: convert + lint: @$(JSHINT) $(JSHINT_OPTS) $(filter-out node_modules, $?) - @$(ESLINT) $(SRC_FILES) $(TEST_FILES) + @$(ESLINT) $(MJS_FILES) $(TEST_FILES) -$(BUILD_DIR)/$(MOD).js: index.js $(SRC_FILES) | unit-test +$(BUILD_DIR)/$(MOD).js: index.js $(CJS_FILES) | unit-test @$(BROWSERIFY) $< > $@ -s graphlib $(BUILD_DIR)/$(MOD).min.js: $(BUILD_DIR)/$(MOD).js @$(UGLIFY) $< --comments '@license' > $@ -$(BUILD_DIR)/$(MOD).core.js: index.js $(SRC_FILES) | unit-test +$(BUILD_DIR)/$(MOD).core.js: index.js $(CJS_FILES) | unit-test @$(BROWSERIFY) $< > $@ --no-bundle-external -s graphlib $(BUILD_DIR)/$(MOD).core.min.js: $(BUILD_DIR)/$(MOD).core.js @@ -75,7 +79,7 @@ release: dist @echo @echo Starting release... @echo - @src/release/release.sh $(MOD) dist + @src/release/release.sh $(MOD) dist # TODO LOOK clean: rm -rf $(BUILD_DIR) @@ -84,7 +88,10 @@ node_modules: package.json @$(NPM) install @touch $@ -convert: mjs-lib/*.js mjs-lib/**/*.js - rm -rf lib; mkdir lib - for f in mjs-lib/**/*.js mjs-lib/*.js; do echo "$${f} > lib$${f/mjs-lib/}"; npx babel "$${f}" -o "lib$${f/mjs-lib/}" || exit 1; done +lib/%.js: mjs-lib/%.js + npx babel "$<" -o "$@" + +convert-clean: + rsync --ignore-existing --delete -r mjs-lib/ lib/ +convert: $(CJS_FILES) diff --git a/lib/version.js b/lib/version.js index 9b49b85f..4a1665a0 100644 --- a/lib/version.js +++ b/lib/version.js @@ -4,6 +4,5 @@ Object.defineProperty(exports, "__esModule", { value: true }); exports.default = void 0; -const version = '2.1.14-pre'; -var _default = exports.default = version; +var _default = exports.default = '2.1.14-pre'; module.exports = exports.default; diff --git a/mjs-lib/version.js b/mjs-lib/version.js index f5c52610..f26714cb 100644 --- a/mjs-lib/version.js +++ b/mjs-lib/version.js @@ -1,2 +1 @@ -const version = '2.1.14-pre'; -export default version; +export default '2.1.14-pre'; diff --git a/src/release/make-version.js b/src/release/make-version.js index 39f2642b..fdbc92ca 100755 --- a/src/release/make-version.js +++ b/src/release/make-version.js @@ -1,4 +1,4 @@ #!/usr/bin/env node var package = require('../../package.json'); -console.log('module.exports = \'' + package.version + '\';'); +console.log('export default \'' + package.version + '\';'); From fd00700dbd6eec50f2fe474e894ccbfb4029190c Mon Sep 17 00:00:00 2001 From: Andrew Pikul Date: Wed, 31 Jan 2024 13:41:03 -0500 Subject: [PATCH 48/85] Update package.json to give module/require paths --- package.json | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/package.json b/package.json index 2ab91053..e9fbcc47 100644 --- a/package.json +++ b/package.json @@ -9,6 +9,11 @@ "lint": "make lint", "test": "make test" }, + "module": "./mjs-lib/index.js", + "exports": { + "import": "./mjs-lib/index.js", + "require": "./lib/index.js" + }, "files": [ "index.js", "index.d.ts", From fd3e318593eeb5ced825508a464d64a7d63d6ac4 Mon Sep 17 00:00:00 2001 From: Andrew Pikul Date: Wed, 31 Jan 2024 13:45:51 -0500 Subject: [PATCH 49/85] Fix rsync to really only delete extra files --- Makefile | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Makefile b/Makefile index 1d30fa94..7a011782 100644 --- a/Makefile +++ b/Makefile @@ -92,6 +92,6 @@ lib/%.js: mjs-lib/%.js npx babel "$<" -o "$@" convert-clean: - rsync --ignore-existing --delete -r mjs-lib/ lib/ + rsync --existing --ignore-existing --delete -r mjs-lib/ lib/ -convert: $(CJS_FILES) +convert: convert-clean $(CJS_FILES) From c7d23d24f68e7ec283c52e8cd36d9db2a32335ff Mon Sep 17 00:00:00 2001 From: Andrew Pikul Date: Thu, 1 Feb 2024 09:25:52 -0500 Subject: [PATCH 50/85] Re-add index.js to target deps in tests --- Makefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Makefile b/Makefile index 7a011782..984f1e32 100644 --- a/Makefile +++ b/Makefile @@ -19,7 +19,7 @@ DIST_DIR = dist MJS_FILES = $(shell find mjs-lib -type f -name '*.js') # CJS_FILES are based off mjs files. -CJS_FILES = $(shell find mjs-lib -type f -name '*.js' -printf lib/%P\\n) +CJS_FILES = index.js $(shell find mjs-lib -type f -name '*.js' -printf lib/%P\\n) TEST_FILES = $(shell find test -type f -name '*.js' | grep -v 'bundle-test.js' | grep -v 'test-main.js') BUILD_FILES = $(addprefix $(BUILD_DIR)/, \ $(MOD).js $(MOD).min.js \ From f768cd33a5bcc3ac4f0e60b800c8d380d1fb30fb Mon Sep 17 00:00:00 2001 From: Andrew Pikul Date: Thu, 1 Feb 2024 09:29:40 -0500 Subject: [PATCH 51/85] Remove some redundancies in Makefile --- Makefile | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Makefile b/Makefile index 984f1e32..847515d4 100644 --- a/Makefile +++ b/Makefile @@ -58,13 +58,13 @@ lint: @$(JSHINT) $(JSHINT_OPTS) $(filter-out node_modules, $?) @$(ESLINT) $(MJS_FILES) $(TEST_FILES) -$(BUILD_DIR)/$(MOD).js: index.js $(CJS_FILES) | unit-test +$(BUILD_DIR)/$(MOD).js: $(CJS_FILES) | unit-test @$(BROWSERIFY) $< > $@ -s graphlib $(BUILD_DIR)/$(MOD).min.js: $(BUILD_DIR)/$(MOD).js @$(UGLIFY) $< --comments '@license' > $@ -$(BUILD_DIR)/$(MOD).core.js: index.js $(CJS_FILES) | unit-test +$(BUILD_DIR)/$(MOD).core.js: $(CJS_FILES) | unit-test @$(BROWSERIFY) $< > $@ --no-bundle-external -s graphlib $(BUILD_DIR)/$(MOD).core.min.js: $(BUILD_DIR)/$(MOD).core.js From 8d030b6e7992cd197b7cdce79667a7ce011f7dce Mon Sep 17 00:00:00 2001 From: Andrew Pikul Date: Thu, 1 Feb 2024 12:47:02 -0500 Subject: [PATCH 52/85] Separate index.js from CJS_FILES in Makefile: It's inconvenient to have index.js be in CJS_FILES because: CJS_FILES are the target deps for `make convert` And `convert` is a target dep for for `index.js` So they both want each other to updated and Makefile complains about circular dependencies. Errata: CJS_FILES (originally SRC_FILES) contained index.js AND index.js was also specified next to SRC_FILES at the same time (so being specified twice), so even originally it was a bit weird. --- Makefile | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/Makefile b/Makefile index 847515d4..66ba1c46 100644 --- a/Makefile +++ b/Makefile @@ -19,7 +19,7 @@ DIST_DIR = dist MJS_FILES = $(shell find mjs-lib -type f -name '*.js') # CJS_FILES are based off mjs files. -CJS_FILES = index.js $(shell find mjs-lib -type f -name '*.js' -printf lib/%P\\n) +CJS_FILES = $(shell find mjs-lib -type f -name '*.js' -printf lib/%P\\n) TEST_FILES = $(shell find test -type f -name '*.js' | grep -v 'bundle-test.js' | grep -v 'test-main.js') BUILD_FILES = $(addprefix $(BUILD_DIR)/, \ $(MOD).js $(MOD).min.js \ @@ -41,7 +41,7 @@ $(DIRS): test: unit-test browser-test -unit-test: convert $(CJS_FILES) $(TEST_FILES) node_modules | $(BUILD_DIR) +unit-test: convert index.js $(CJS_FILES) $(TEST_FILES) node_modules | $(BUILD_DIR) -$(NYC) $(MOCHA) --dir $(COVERAGE_DIR) -- $(MOCHA_OPTS) $(TEST_FILES) || $(MOCHA) $(MOCHA_OPTS) $(TEST_FILES) browser-test: $(BUILD_DIR)/$(MOD).js $(BUILD_DIR)/$(MOD).core.js @@ -58,13 +58,13 @@ lint: @$(JSHINT) $(JSHINT_OPTS) $(filter-out node_modules, $?) @$(ESLINT) $(MJS_FILES) $(TEST_FILES) -$(BUILD_DIR)/$(MOD).js: $(CJS_FILES) | unit-test +$(BUILD_DIR)/$(MOD).js: index.js $(CJS_FILES) | unit-test @$(BROWSERIFY) $< > $@ -s graphlib $(BUILD_DIR)/$(MOD).min.js: $(BUILD_DIR)/$(MOD).js @$(UGLIFY) $< --comments '@license' > $@ -$(BUILD_DIR)/$(MOD).core.js: $(CJS_FILES) | unit-test +$(BUILD_DIR)/$(MOD).core.js: index.js $(CJS_FILES) | unit-test @$(BROWSERIFY) $< > $@ --no-bundle-external -s graphlib $(BUILD_DIR)/$(MOD).core.min.js: $(BUILD_DIR)/$(MOD).core.js From 708153175cca720dc77c3e53dec7c5db83ce5ed7 Mon Sep 17 00:00:00 2001 From: Andrew Pikul Date: Thu, 1 Feb 2024 13:10:03 -0500 Subject: [PATCH 53/85] Fix up src/release* for the ESM port --- src/release/make-bower.json.js | 2 ++ src/release/release.sh | 2 +- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/src/release/make-bower.json.js b/src/release/make-bower.json.js index 6fcf4b20..7b327c90 100755 --- a/src/release/make-bower.json.js +++ b/src/release/make-bower.json.js @@ -21,6 +21,8 @@ var template = { "index.js", "karma*", "lib/**", + "mjs-lib/**", + "old-lib/**", "package.json", "src/**", "test/**" diff --git a/src/release/release.sh b/src/release/release.sh index f098194f..9ea41554 100755 --- a/src/release/release.sh +++ b/src/release/release.sh @@ -59,7 +59,7 @@ echo Published to npm # Update patch level version + commit ./src/release/bump-version.js -make lib/version.js +make mjs-lib/version.js git commit package.json lib/version.js -m "Bump version and set as pre-release" git push origin echo Updated patch version From acfc6ceab3eaf8b8f20fd2302191a74923e4fa1c Mon Sep 17 00:00:00 2001 From: Andrew Pikul Date: Thu, 1 Feb 2024 13:12:39 -0500 Subject: [PATCH 54/85] Update package.json to distribute mjs-lib/ --- package.json | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index e9fbcc47..02ffc8e5 100644 --- a/package.json +++ b/package.json @@ -12,13 +12,14 @@ "module": "./mjs-lib/index.js", "exports": { "import": "./mjs-lib/index.js", - "require": "./lib/index.js" + "require": "./index.js" }, "files": [ "index.js", "index.d.ts", "dist/", - "lib/" + "lib/", + "mjs-lib/" ], "engines": { "node": ">17.0.0" From 8a97c581e285df36b0b05614318f51e4319941b0 Mon Sep 17 00:00:00 2001 From: David Newell Date: Tue, 12 Mar 2024 14:57:31 +0000 Subject: [PATCH 55/85] Pushing the version change --- bower.json | 4 +- dist/graphlib.core.js | 542 +++++++++++++++++++++++--------------- dist/graphlib.core.min.js | 19 +- dist/graphlib.js | 542 +++++++++++++++++++++++--------------- dist/graphlib.min.js | 19 +- lib/version.js | 2 +- mjs-lib/version.js | 2 +- 7 files changed, 673 insertions(+), 457 deletions(-) diff --git a/bower.json b/bower.json index 272f18b6..96965ee6 100644 --- a/bower.json +++ b/bower.json @@ -1,6 +1,6 @@ { "name": "graphlib", - "version": "2.1.13", + "version": "2.1.14-pre", "main": [ "dist/graphlib.core.js" ], @@ -15,6 +15,8 @@ "index.js", "karma*", "lib/**", + "mjs-lib/**", + "old-lib/**", "package.json", "src/**", "test/**" diff --git a/dist/graphlib.core.js b/dist/graphlib.core.js index 98478b34..5b96649c 100644 --- a/dist/graphlib.core.js +++ b/dist/graphlib.core.js @@ -39,13 +39,16 @@ module.exports = { }; },{"./lib":17,"./lib/alg":8,"./lib/json":18}],2:[function(require,module,exports){ -module.exports = components; +"use strict"; +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.default = components; function components(g) { var visited = {}; var cmpts = []; var cmpt; - function dfs(v) { if (visited.hasOwnProperty(v)) return; visited[v] = true; @@ -53,21 +56,24 @@ function components(g) { g.successors(v).forEach(dfs); g.predecessors(v).forEach(dfs); } - - g.nodes().forEach(function(v) { + g.nodes().forEach(function (v) { cmpt = []; dfs(v); if (cmpt.length) { cmpts.push(cmpt); } }); - return cmpts; } +module.exports = exports.default; },{}],3:[function(require,module,exports){ -module.exports = dfs; +"use strict"; +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.default = dfs; /* * A helper that preforms a pre- or post-order traversal on the input graph * and returns the nodes in the order they were visited. If the graph is @@ -80,23 +86,18 @@ function dfs(g, vs, order) { if (!Array.isArray(vs)) { vs = [vs]; } - var navigation = g.isDirected() ? v => g.successors(v) : v => g.neighbors(v); var orderFunc = order === "post" ? postOrderDfs : preOrderDfs; - var acc = []; var visited = {}; vs.forEach(v => { if (!g.hasNode(v)) { throw new Error("Graph does not have node: " + v); } - orderFunc(v, navigation, visited, acc); }); - return acc; } - function postOrderDfs(v, navigation, visited, acc) { var stack = [[v, false]]; while (stack.length > 0) { @@ -112,7 +113,6 @@ function postOrderDfs(v, navigation, visited, acc) { } } } - function preOrderDfs(v, navigation, visited, acc) { var stack = [v]; while (stack.length > 0) { @@ -124,129 +124,142 @@ function preOrderDfs(v, navigation, visited, acc) { } } } - function forEachRight(array, iteratee) { var length = array.length; while (length--) { iteratee(array[length], length, array); } - return array; } +module.exports = exports.default; },{}],4:[function(require,module,exports){ -var dijkstra = require("./dijkstra"); - -module.exports = dijkstraAll; +"use strict"; +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.default = dijkstraAll; +var _dijkstra = _interopRequireDefault(require("./dijkstra.js")); +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function dijkstraAll(g, weightFunc, edgeFunc) { - return g.nodes().reduce(function(acc, v) { - acc[v] = dijkstra(g, v, weightFunc, edgeFunc); + return g.nodes().reduce(function (acc, v) { + acc[v] = (0, _dijkstra.default)(g, v, weightFunc, edgeFunc); return acc; }, {}); } +module.exports = exports.default; -},{"./dijkstra":5}],5:[function(require,module,exports){ -var PriorityQueue = require("../data/priority-queue"); - -module.exports = dijkstra; +},{"./dijkstra.js":5}],5:[function(require,module,exports){ +"use strict"; +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.default = dijkstra; +var _priorityQueue = _interopRequireDefault(require("../data/priority-queue.js")); +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } var DEFAULT_WEIGHT_FUNC = () => 1; - function dijkstra(g, source, weightFn, edgeFn) { - return runDijkstra(g, String(source), - weightFn || DEFAULT_WEIGHT_FUNC, - edgeFn || function(v) { return g.outEdges(v); }); + return runDijkstra(g, String(source), weightFn || DEFAULT_WEIGHT_FUNC, edgeFn || function (v) { + return g.outEdges(v); + }); } - function runDijkstra(g, source, weightFn, edgeFn) { var results = {}; - var pq = new PriorityQueue(); + var pq = new _priorityQueue.default(); var v, vEntry; - - var updateNeighbors = function(edge) { + var updateNeighbors = function (edge) { var w = edge.v !== v ? edge.v : edge.w; var wEntry = results[w]; var weight = weightFn(edge); var distance = vEntry.distance + weight; - if (weight < 0) { - throw new Error("dijkstra does not allow negative edge weights. " + - "Bad edge: " + edge + " Weight: " + weight); + throw new Error("dijkstra does not allow negative edge weights. " + "Bad edge: " + edge + " Weight: " + weight); } - if (distance < wEntry.distance) { wEntry.distance = distance; wEntry.predecessor = v; pq.decrease(w, distance); } }; - - g.nodes().forEach(function(v) { + g.nodes().forEach(function (v) { var distance = v === source ? 0 : Number.POSITIVE_INFINITY; - results[v] = { distance: distance }; + results[v] = { + distance: distance + }; pq.add(v, distance); }); - while (pq.size() > 0) { v = pq.removeMin(); vEntry = results[v]; if (vEntry.distance === Number.POSITIVE_INFINITY) { break; } - edgeFn(v).forEach(updateNeighbors); } - return results; } +module.exports = exports.default; -},{"../data/priority-queue":15}],6:[function(require,module,exports){ -var tarjan = require("./tarjan"); - -module.exports = findCycles; +},{"../data/priority-queue.js":15}],6:[function(require,module,exports){ +"use strict"; +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.default = findCycles; +var _tarjan = _interopRequireDefault(require("./tarjan.js")); +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function findCycles(g) { - return tarjan(g).filter(function(cmpt) { - return cmpt.length > 1 || (cmpt.length === 1 && g.hasEdge(cmpt[0], cmpt[0])); + return (0, _tarjan.default)(g).filter(function (cmpt) { + return cmpt.length > 1 || cmpt.length === 1 && g.hasEdge(cmpt[0], cmpt[0]); }); } +module.exports = exports.default; -},{"./tarjan":13}],7:[function(require,module,exports){ -module.exports = floydWarshall; +},{"./tarjan.js":13}],7:[function(require,module,exports){ +"use strict"; +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.default = floydWarshall; var DEFAULT_WEIGHT_FUNC = () => 1; - function floydWarshall(g, weightFn, edgeFn) { - return runFloydWarshall(g, - weightFn || DEFAULT_WEIGHT_FUNC, - edgeFn || function(v) { return g.outEdges(v); }); + return runFloydWarshall(g, weightFn || DEFAULT_WEIGHT_FUNC, edgeFn || function (v) { + return g.outEdges(v); + }); } - function runFloydWarshall(g, weightFn, edgeFn) { var results = {}; var nodes = g.nodes(); - - nodes.forEach(function(v) { + nodes.forEach(function (v) { results[v] = {}; - results[v][v] = { distance: 0 }; - nodes.forEach(function(w) { + results[v][v] = { + distance: 0 + }; + nodes.forEach(function (w) { if (v !== w) { - results[v][w] = { distance: Number.POSITIVE_INFINITY }; + results[v][w] = { + distance: Number.POSITIVE_INFINITY + }; } }); - edgeFn(v).forEach(function(edge) { + edgeFn(v).forEach(function (edge) { var w = edge.v === v ? edge.w : edge.v; var d = weightFn(edge); - results[v][w] = { distance: d, predecessor: v }; + results[v][w] = { + distance: d, + predecessor: v + }; }); }); - - nodes.forEach(function(k) { + nodes.forEach(function (k) { var rowK = results[k]; - nodes.forEach(function(i) { + nodes.forEach(function (i) { var rowI = results[i]; - nodes.forEach(function(j) { + nodes.forEach(function (j) { var ik = rowI[k]; var kj = rowK[j]; var ij = rowI[j]; @@ -258,72 +271,160 @@ function runFloydWarshall(g, weightFn, edgeFn) { }); }); }); - return results; } +module.exports = exports.default; },{}],8:[function(require,module,exports){ -module.exports = { - components: require("./components"), - dijkstra: require("./dijkstra"), - dijkstraAll: require("./dijkstra-all"), - findCycles: require("./find-cycles"), - floydWarshall: require("./floyd-warshall"), - isAcyclic: require("./is-acyclic"), - postorder: require("./postorder"), - preorder: require("./preorder"), - prim: require("./prim"), - tarjan: require("./tarjan"), - topsort: require("./topsort") -}; - -},{"./components":2,"./dijkstra":5,"./dijkstra-all":4,"./find-cycles":6,"./floyd-warshall":7,"./is-acyclic":9,"./postorder":10,"./preorder":11,"./prim":12,"./tarjan":13,"./topsort":14}],9:[function(require,module,exports){ -var topsort = require("./topsort"); +"use strict"; -module.exports = isAcyclic; +Object.defineProperty(exports, "__esModule", { + value: true +}); +Object.defineProperty(exports, "components", { + enumerable: true, + get: function () { + return _components.default; + } +}); +Object.defineProperty(exports, "dijkstra", { + enumerable: true, + get: function () { + return _dijkstra.default; + } +}); +Object.defineProperty(exports, "dijkstraAll", { + enumerable: true, + get: function () { + return _dijkstraAll.default; + } +}); +Object.defineProperty(exports, "findCycles", { + enumerable: true, + get: function () { + return _findCycles.default; + } +}); +Object.defineProperty(exports, "floydWarshall", { + enumerable: true, + get: function () { + return _floydWarshall.default; + } +}); +Object.defineProperty(exports, "isAcyclic", { + enumerable: true, + get: function () { + return _isAcyclic.default; + } +}); +Object.defineProperty(exports, "postorder", { + enumerable: true, + get: function () { + return _postorder.default; + } +}); +Object.defineProperty(exports, "preorder", { + enumerable: true, + get: function () { + return _preorder.default; + } +}); +Object.defineProperty(exports, "prim", { + enumerable: true, + get: function () { + return _prim.default; + } +}); +Object.defineProperty(exports, "tarjan", { + enumerable: true, + get: function () { + return _tarjan.default; + } +}); +Object.defineProperty(exports, "topsort", { + enumerable: true, + get: function () { + return _topsort.default; + } +}); +var _components = _interopRequireDefault(require("./components.js")); +var _dijkstra = _interopRequireDefault(require("./dijkstra.js")); +var _dijkstraAll = _interopRequireDefault(require("./dijkstra-all.js")); +var _findCycles = _interopRequireDefault(require("./find-cycles.js")); +var _floydWarshall = _interopRequireDefault(require("./floyd-warshall.js")); +var _isAcyclic = _interopRequireDefault(require("./is-acyclic.js")); +var _postorder = _interopRequireDefault(require("./postorder.js")); +var _preorder = _interopRequireDefault(require("./preorder.js")); +var _prim = _interopRequireDefault(require("./prim.js")); +var _tarjan = _interopRequireDefault(require("./tarjan.js")); +var _topsort = _interopRequireDefault(require("./topsort.js")); +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +},{"./components.js":2,"./dijkstra-all.js":4,"./dijkstra.js":5,"./find-cycles.js":6,"./floyd-warshall.js":7,"./is-acyclic.js":9,"./postorder.js":10,"./preorder.js":11,"./prim.js":12,"./tarjan.js":13,"./topsort.js":14}],9:[function(require,module,exports){ +"use strict"; +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.default = isAcyclic; +var _topsort = _interopRequireDefault(require("./topsort.js")); +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function isAcyclic(g) { try { - topsort(g); + (0, _topsort.default)(g); } catch (e) { - if (e instanceof topsort.CycleException) { + if (e instanceof _topsort.default.CycleException) { return false; } throw e; } return true; } +module.exports = exports.default; -},{"./topsort":14}],10:[function(require,module,exports){ -var dfs = require("./dfs"); - -module.exports = postorder; +},{"./topsort.js":14}],10:[function(require,module,exports){ +"use strict"; +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.default = postorder; +var _dfs = _interopRequireDefault(require("./dfs.js")); +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function postorder(g, vs) { - return dfs(g, vs, "post"); + return (0, _dfs.default)(g, vs, "post"); } +module.exports = exports.default; -},{"./dfs":3}],11:[function(require,module,exports){ -var dfs = require("./dfs"); - -module.exports = preorder; +},{"./dfs.js":3}],11:[function(require,module,exports){ +"use strict"; +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.default = preorder; +var _dfs = _interopRequireDefault(require("./dfs.js")); +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function preorder(g, vs) { - return dfs(g, vs, "pre"); + return (0, _dfs.default)(g, vs, "pre"); } +module.exports = exports.default; -},{"./dfs":3}],12:[function(require,module,exports){ -var Graph = require("../graph"); -var PriorityQueue = require("../data/priority-queue"); - -module.exports = prim; +},{"./dfs.js":3}],12:[function(require,module,exports){ +"use strict"; +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.default = prim; +var _graph = _interopRequireDefault(require("../graph.js")); +var _priorityQueue = _interopRequireDefault(require("../data/priority-queue.js")); +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function prim(g, weightFunc) { - var result = new Graph(); + var result = new _graph.default(); var parents = {}; - var pq = new PriorityQueue(); + var pq = new _priorityQueue.default(); var v; - function updateNeighbors(edge) { var w = edge.v === v ? edge.w : edge.v; var pri = pq.priority(w); @@ -335,19 +436,16 @@ function prim(g, weightFunc) { } } } - if (g.nodeCount() === 0) { return result; } - - g.nodes().forEach(function(v) { + g.nodes().forEach(function (v) { pq.add(v, Number.POSITIVE_INFINITY); result.setNode(v); }); // Start from an arbitrary node pq.decrease(g.nodes()[0], 0); - var init = false; while (pq.size() > 0) { v = pq.removeMin(); @@ -358,22 +456,24 @@ function prim(g, weightFunc) { } else { init = true; } - g.nodeEdges(v).forEach(updateNeighbors); } - return result; } +module.exports = exports.default; -},{"../data/priority-queue":15,"../graph":16}],13:[function(require,module,exports){ -module.exports = tarjan; +},{"../data/priority-queue.js":15,"../graph.js":16}],13:[function(require,module,exports){ +"use strict"; +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.default = tarjan; function tarjan(g) { var index = 0; var stack = []; var visited = {}; // node id -> { onStack, lowlink, index } var results = []; - function dfs(v) { var entry = visited[v] = { onStack: true, @@ -381,8 +481,7 @@ function tarjan(g) { index: index++ }; stack.push(v); - - g.successors(v).forEach(function(w) { + g.successors(v).forEach(function (w) { if (!visited.hasOwnProperty(w)) { dfs(w); entry.lowlink = Math.min(entry.lowlink, visited[w].lowlink); @@ -390,7 +489,6 @@ function tarjan(g) { entry.lowlink = Math.min(entry.lowlink, visited[w].index); } }); - if (entry.lowlink === entry.index) { var cmpt = []; var w; @@ -402,27 +500,30 @@ function tarjan(g) { results.push(cmpt); } } - - g.nodes().forEach(function(v) { + g.nodes().forEach(function (v) { if (!visited.hasOwnProperty(v)) { dfs(v); } }); - return results; } +module.exports = exports.default; },{}],14:[function(require,module,exports){ +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.default = topsort; function topsort(g) { var visited = {}; var stack = {}; var results = []; - function visit(node) { if (stack.hasOwnProperty(node)) { throw new CycleException(); } - if (!visited.hasOwnProperty(node)) { stack[node] = true; visited[node] = true; @@ -431,26 +532,27 @@ function topsort(g) { results.push(node); } } - g.sinks().forEach(visit); - if (Object.keys(visited).length !== g.nodeCount()) { throw new CycleException(); } - return results; } - class CycleException extends Error { constructor() { super(...arguments); } } - -module.exports = topsort; topsort.CycleException = CycleException; +module.exports = exports.default; },{}],15:[function(require,module,exports){ +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.default = void 0; /** * A min-priority queue data structure. This algorithm is derived from Cormen, * et al., "Introduction to Algorithms". The basic idea of a min-priority @@ -473,7 +575,9 @@ class PriorityQueue { * Returns the keys that are in the queue. Takes `O(n)` time. */ keys() { - return this.#arr.map(function(x) { return x.key; }); + return this.#arr.map(function (x) { + return x.key; + }); } /** @@ -522,7 +626,10 @@ class PriorityQueue { var arr = this.#arr; var index = arr.length; keyIndices[key] = index; - arr.push({key: key, priority: priority}); + arr.push({ + key: key, + priority: priority + }); this.#decrease(index); return true; } @@ -550,13 +657,11 @@ class PriorityQueue { decrease(key, priority) { var index = this.#keyIndices[key]; if (priority > this.#arr[index].priority) { - throw new Error("New priority is greater than current priority. " + - "Key: " + key + " Old: " + this.#arr[index].priority + " New: " + priority); + throw new Error("New priority is greater than current priority. " + "Key: " + key + " Old: " + this.#arr[index].priority + " New: " + priority); } this.#arr[index].priority = priority; this.#decrease(index); } - #heapify(i) { var arr = this.#arr; var l = 2 * i; @@ -573,7 +678,6 @@ class PriorityQueue { } } } - #decrease(index) { var arr = this.#arr; var priority = arr[index].priority; @@ -587,7 +691,6 @@ class PriorityQueue { index = parent; } } - #swap(i, j) { var arr = this.#arr; var keyIndices = this.#keyIndices; @@ -599,12 +702,16 @@ class PriorityQueue { keyIndices[origArrI.key] = j; } } - -module.exports = PriorityQueue; +exports.default = PriorityQueue; +module.exports = exports.default; },{}],16:[function(require,module,exports){ "use strict"; +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.default = void 0; var DEFAULT_EDGE_NAME = "\x00"; var GRAPH_NODE = "\x00"; var EDGE_KEY_DELIM = "\x01"; @@ -659,18 +766,14 @@ class Graph { /* Number of edges in the graph. Should only be changed by the implementation. */ #edgeCount = 0; - #parent; - #children; - constructor(opts) { if (opts) { this.#isDirected = opts.hasOwnProperty("directed") ? opts.directed : true; this.#isMultigraph = opts.hasOwnProperty("multigraph") ? opts.multigraph : false; this.#isCompound = opts.hasOwnProperty("compound") ? opts.compound : false; } - if (this.#isCompound) { // v -> parent this.#parent = {}; @@ -719,7 +822,6 @@ class Graph { return this.#label; } - /* === Node functions ========== */ /** @@ -734,7 +836,6 @@ class Graph { if (typeof newDefault !== 'function') { this.#defaultNodeLabelFn = () => newDefault; } - return this; } @@ -780,7 +881,7 @@ class Graph { setNodes(vs, value) { var args = arguments; var self = this; - vs.forEach(function(v) { + vs.forEach(function (v) { if (args.length > 1) { self.setNode(v, value); } else { @@ -803,7 +904,6 @@ class Graph { } return this; } - this.#nodes[v] = arguments.length > 1 ? value : this.#defaultNodeLabelFn(v); if (this.#isCompound) { this.#parent[v] = GRAPH_NODE; @@ -847,7 +947,7 @@ class Graph { if (this.#isCompound) { this.#removeFromParentsChildList(v); delete this.#parent[v]; - this.children(v).forEach(function(child) { + this.children(v).forEach(function (child) { self.setParent(child); }); delete this.#children[v]; @@ -873,7 +973,6 @@ class Graph { if (!this.#isCompound) { throw new Error("Cannot set parent in a non-compound graph"); } - if (parent === undefined) { parent = GRAPH_NODE; } else { @@ -881,21 +980,17 @@ class Graph { parent += ""; for (var ancestor = parent; ancestor !== undefined; ancestor = this.parent(ancestor)) { if (ancestor === v) { - throw new Error("Setting " + parent+ " as parent of " + v + - " would create a cycle"); + throw new Error("Setting " + parent + " as parent of " + v + " would create a cycle"); } } - this.setNode(parent); } - this.setNode(v); this.#removeFromParentsChildList(v); this.#parent[v] = parent; this.#children[parent][v] = true; return this; } - #removeFromParentsChildList(v) { delete this.#children[this.#parent[v]][v]; } @@ -966,11 +1061,9 @@ class Graph { for (var succ of this.successors(v)) { union.add(succ); } - return Array.from(union.values()); } } - isLeaf(v) { var neighbors; if (this.isDirected()) { @@ -993,22 +1086,18 @@ class Graph { multigraph: this.#isMultigraph, compound: this.#isCompound }); - copy.setGraph(this.graph()); - var self = this; - Object.entries(this.#nodes).forEach(function([v, value]) { + Object.entries(this.#nodes).forEach(function ([v, value]) { if (filter(v)) { copy.setNode(v, value); } }); - - Object.values(this.#edgeObjs).forEach(function(e) { + Object.values(this.#edgeObjs).forEach(function (e) { if (copy.hasNode(e.v) && copy.hasNode(e.w)) { copy.setEdge(e, self.edge(e)); } }); - var parents = {}; function findParent(v) { var parent = self.parent(v); @@ -1021,11 +1110,9 @@ class Graph { return findParent(parent); } } - if (this.#isCompound) { copy.nodes().forEach(v => copy.setParent(v, findParent(v))); } - return copy; } @@ -1043,7 +1130,6 @@ class Graph { if (typeof newDefault !== 'function') { this.#defaultEdgeLabelFn = () => newDefault; } - return this; } @@ -1072,7 +1158,7 @@ class Graph { setPath(vs, value) { var self = this; var args = arguments; - vs.reduce(function(v, w) { + vs.reduce(function (v, w) { if (args.length > 1) { self.setEdge(v, w, value); } else { @@ -1093,7 +1179,6 @@ class Graph { var v, w, name, value; var valueSpecified = false; var arg0 = arguments[0]; - if (typeof arg0 === "object" && arg0 !== null && "v" in arg0) { v = arg0.v; w = arg0.w; @@ -1111,13 +1196,11 @@ class Graph { valueSpecified = true; } } - v = "" + v; w = "" + w; if (name !== undefined) { name = "" + name; } - var e = edgeArgsToId(this.#isDirected, v, w, name); if (this.#edgeLabels.hasOwnProperty(e)) { if (valueSpecified) { @@ -1125,7 +1208,6 @@ class Graph { } return this; } - if (name !== undefined && !this.#isMultigraph) { throw new Error("Cannot set a named edge when isMultigraph = false"); } @@ -1134,14 +1216,11 @@ class Graph { // First ensure the nodes exist. this.setNode(v); this.setNode(w); - this.#edgeLabels[e] = valueSpecified ? value : this.#defaultEdgeLabelFn(v, w, name); - var edgeObj = edgeArgsToObj(this.#isDirected, v, w, name); // Ensure we add undirected edges in a consistent way. v = edgeObj.v; w = edgeObj.w; - Object.freeze(edgeObj); this.#edgeObjs[e] = edgeObj; incrementOrInitEntry(this.#preds[w], v); @@ -1157,9 +1236,7 @@ class Graph { * Complexity: O(1). */ edge(v, w, name) { - var e = (arguments.length === 1 - ? edgeObjToId(this.#isDirected, arguments[0]) - : edgeArgsToId(this.#isDirected, v, w, name)); + var e = arguments.length === 1 ? edgeObjToId(this.#isDirected, arguments[0]) : edgeArgsToId(this.#isDirected, v, w, name); return this.#edgeLabels[e]; } @@ -1170,9 +1247,10 @@ class Graph { edgeAsObj() { const edge = this.edge(...arguments); if (typeof edge !== "object") { - return {label: edge}; + return { + label: edge + }; } - return edge; } @@ -1181,9 +1259,7 @@ class Graph { * Complexity: O(1). */ hasEdge(v, w, name) { - var e = (arguments.length === 1 - ? edgeObjToId(this.#isDirected, arguments[0]) - : edgeArgsToId(this.#isDirected, v, w, name)); + var e = arguments.length === 1 ? edgeObjToId(this.#isDirected, arguments[0]) : edgeArgsToId(this.#isDirected, v, w, name); return this.#edgeLabels.hasOwnProperty(e); } @@ -1192,9 +1268,7 @@ class Graph { * Complexity: O(1). */ removeEdge(v, w, name) { - var e = (arguments.length === 1 - ? edgeObjToId(this.#isDirected, arguments[0]) - : edgeArgsToId(this.#isDirected, v, w, name)); + var e = arguments.length === 1 ? edgeObjToId(this.#isDirected, arguments[0]) : edgeArgsToId(this.#isDirected, v, w, name); var edge = this.#edgeObjs[e]; if (edge) { v = edge.v; @@ -1254,7 +1328,7 @@ class Graph { } } } - +exports.default = Graph; function incrementOrInitEntry(map, k) { if (map[k]) { map[k]++; @@ -1262,11 +1336,11 @@ function incrementOrInitEntry(map, k) { map[k] = 1; } } - function decrementOrRemoveEntry(map, k) { - if (!--map[k]) { delete map[k]; } + if (! --map[k]) { + delete map[k]; + } } - function edgeArgsToId(isDirected, v_, w_, name) { var v = "" + v_; var w = "" + w_; @@ -1275,10 +1349,8 @@ function edgeArgsToId(isDirected, v_, w_, name) { v = w; w = tmp; } - return v + EDGE_KEY_DELIM + w + EDGE_KEY_DELIM + - (name === undefined ? DEFAULT_EDGE_NAME : name); + return v + EDGE_KEY_DELIM + w + EDGE_KEY_DELIM + (name === undefined ? DEFAULT_EDGE_NAME : name); } - function edgeArgsToObj(isDirected, v_, w_, name) { var v = "" + v_; var w = "" + w_; @@ -1287,34 +1359,59 @@ function edgeArgsToObj(isDirected, v_, w_, name) { v = w; w = tmp; } - var edgeObj = { v: v, w: w }; + var edgeObj = { + v: v, + w: w + }; if (name) { edgeObj.name = name; } return edgeObj; } - function edgeObjToId(isDirected, edgeObj) { return edgeArgsToId(isDirected, edgeObj.v, edgeObj.w, edgeObj.name); } - -module.exports = Graph; +module.exports = exports.default; },{}],17:[function(require,module,exports){ -// Includes only the "core" of graphlib -module.exports = { - Graph: require("./graph"), - version: require("./version") -}; - -},{"./graph":16,"./version":19}],18:[function(require,module,exports){ -var Graph = require("./graph"); +"use strict"; -module.exports = { - write: write, - read: read -}; +Object.defineProperty(exports, "__esModule", { + value: true +}); +Object.defineProperty(exports, "Graph", { + enumerable: true, + get: function () { + return _graph.default; + } +}); +exports.json = exports.alg = void 0; +Object.defineProperty(exports, "version", { + enumerable: true, + get: function () { + return _version.default; + } +}); +var _graph = _interopRequireDefault(require("./graph.js")); +var _version = _interopRequireDefault(require("./version.js")); +var _json = _interopRequireWildcard(require("./json.js")); +exports.json = _json; +var _alg = _interopRequireWildcard(require("./alg/index.js")); +exports.alg = _alg; +function _getRequireWildcardCache(e) { if ("function" != typeof WeakMap) return null; var r = new WeakMap(), t = new WeakMap(); return (_getRequireWildcardCache = function (e) { return e ? t : r; })(e); } +function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e; if (null === e || "object" != typeof e && "function" != typeof e) return { default: e }; var t = _getRequireWildcardCache(r); if (t && t.has(e)) return t.get(e); var n = { __proto__: null }, a = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var u in e) if ("default" !== u && Object.prototype.hasOwnProperty.call(e, u)) { var i = a ? Object.getOwnPropertyDescriptor(e, u) : null; i && (i.get || i.set) ? Object.defineProperty(n, u, i) : n[u] = e[u]; } return n.default = e, t && t.set(e, n), n; } +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +},{"./alg/index.js":8,"./graph.js":16,"./json.js":18,"./version.js":19}],18:[function(require,module,exports){ +"use strict"; +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.read = read; +exports.write = write; +var _graph = _interopRequireDefault(require("./graph.js")); +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } /** * Creates a JSON representation of the graph that can be serialized to a string with * JSON.stringify. The graph can later be restored using json.read. @@ -1329,18 +1426,18 @@ function write(g) { nodes: writeNodes(g), edges: writeEdges(g) }; - if (g.graph() !== undefined) { json.value = structuredClone(g.graph()); } return json; } - function writeNodes(g) { - return g.nodes().map(function(v) { + return g.nodes().map(function (v) { var nodeValue = g.node(v); var parent = g.parent(v); - var node = { v: v }; + var node = { + v: v + }; if (nodeValue !== undefined) { node.value = nodeValue; } @@ -1350,11 +1447,13 @@ function writeNodes(g) { return node; }); } - function writeEdges(g) { - return g.edges().map(function(e) { + return g.edges().map(function (e) { var edgeValue = g.edge(e); - var edge = { v: e.v, w: e.w }; + var edge = { + v: e.v, + w: e.w + }; if (e.name !== undefined) { edge.name = e.name; } @@ -1376,21 +1475,32 @@ function writeEdges(g) { * // [ { v: 'a', w: 'b' } ] */ function read(json) { - var g = new Graph(json.options).setGraph(json.value); - json.nodes.forEach(function(entry) { + var g = new _graph.default(json.options).setGraph(json.value); + json.nodes.forEach(function (entry) { g.setNode(entry.v, entry.value); if (entry.parent) { g.setParent(entry.v, entry.parent); } }); - json.edges.forEach(function(entry) { - g.setEdge({ v: entry.v, w: entry.w, name: entry.name }, entry.value); + json.edges.forEach(function (entry) { + g.setEdge({ + v: entry.v, + w: entry.w, + name: entry.name + }, entry.value); }); return g; } -},{"./graph":16}],19:[function(require,module,exports){ -module.exports = '2.1.13'; +},{"./graph.js":16}],19:[function(require,module,exports){ +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.default = void 0; +var _default = exports.default = '2.1.14-pre'; +module.exports = exports.default; },{}]},{},[1])(1) }); diff --git a/dist/graphlib.core.min.js b/dist/graphlib.core.min.js index 1dd2a361..7b9e1427 100644 --- a/dist/graphlib.core.min.js +++ b/dist/graphlib.core.min.js @@ -28,7 +28,7 @@ * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -var lib=require("./lib");module.exports={Graph:lib.Graph,json:require("./lib/json"),alg:require("./lib/alg"),version:lib.version}},{"./lib":17,"./lib/alg":8,"./lib/json":18}],2:[function(require,module,exports){module.exports=components;function components(g){var visited={};var cmpts=[];var cmpt;function dfs(v){if(visited.hasOwnProperty(v))return;visited[v]=true;cmpt.push(v);g.successors(v).forEach(dfs);g.predecessors(v).forEach(dfs)}g.nodes().forEach(function(v){cmpt=[];dfs(v);if(cmpt.length){cmpts.push(cmpt)}});return cmpts}},{}],3:[function(require,module,exports){module.exports=dfs; +var lib=require("./lib");module.exports={Graph:lib.Graph,json:require("./lib/json"),alg:require("./lib/alg"),version:lib.version}},{"./lib":17,"./lib/alg":8,"./lib/json":18}],2:[function(require,module,exports){"use strict";Object.defineProperty(exports,"__esModule",{value:true});exports.default=components;function components(g){var visited={};var cmpts=[];var cmpt;function dfs(v){if(visited.hasOwnProperty(v))return;visited[v]=true;cmpt.push(v);g.successors(v).forEach(dfs);g.predecessors(v).forEach(dfs)}g.nodes().forEach(function(v){cmpt=[];dfs(v);if(cmpt.length){cmpts.push(cmpt)}});return cmpts}module.exports=exports.default},{}],3:[function(require,module,exports){"use strict";Object.defineProperty(exports,"__esModule",{value:true});exports.default=dfs; /* * A helper that preforms a pre- or post-order traversal on the input graph * and returns the nodes in the order they were visited. If the graph is @@ -36,18 +36,17 @@ var lib=require("./lib");module.exports={Graph:lib.Graph,json:require("./lib/jso * is directed then this algorithm will navigate using successors. * * If the order is not "post", it will be treated as "pre". - */function dfs(g,vs,order){if(!Array.isArray(vs)){vs=[vs]}var navigation=g.isDirected()?v=>g.successors(v):v=>g.neighbors(v);var orderFunc=order==="post"?postOrderDfs:preOrderDfs;var acc=[];var visited={};vs.forEach(v=>{if(!g.hasNode(v)){throw new Error("Graph does not have node: "+v)}orderFunc(v,navigation,visited,acc)});return acc}function postOrderDfs(v,navigation,visited,acc){var stack=[[v,false]];while(stack.length>0){var curr=stack.pop();if(curr[1]){acc.push(curr[0])}else{if(!visited.hasOwnProperty(curr[0])){visited[curr[0]]=true;stack.push([curr[0],true]);forEachRight(navigation(curr[0]),w=>stack.push([w,false]))}}}}function preOrderDfs(v,navigation,visited,acc){var stack=[v];while(stack.length>0){var curr=stack.pop();if(!visited.hasOwnProperty(curr)){visited[curr]=true;acc.push(curr);forEachRight(navigation(curr),w=>stack.push(w))}}}function forEachRight(array,iteratee){var length=array.length;while(length--){iteratee(array[length],length,array)}return array}},{}],4:[function(require,module,exports){var dijkstra=require("./dijkstra");module.exports=dijkstraAll;function dijkstraAll(g,weightFunc,edgeFunc){return g.nodes().reduce(function(acc,v){acc[v]=dijkstra(g,v,weightFunc,edgeFunc);return acc},{})}},{"./dijkstra":5}],5:[function(require,module,exports){var PriorityQueue=require("../data/priority-queue");module.exports=dijkstra;var DEFAULT_WEIGHT_FUNC=()=>1;function dijkstra(g,source,weightFn,edgeFn){return runDijkstra(g,String(source),weightFn||DEFAULT_WEIGHT_FUNC,edgeFn||function(v){return g.outEdges(v)})}function runDijkstra(g,source,weightFn,edgeFn){var results={};var pq=new PriorityQueue;var v,vEntry;var updateNeighbors=function(edge){var w=edge.v!==v?edge.v:edge.w;var wEntry=results[w];var weight=weightFn(edge);var distance=vEntry.distance+weight;if(weight<0){throw new Error("dijkstra does not allow negative edge weights. "+"Bad edge: "+edge+" Weight: "+weight)}if(distance0){v=pq.removeMin();vEntry=results[v];if(vEntry.distance===Number.POSITIVE_INFINITY){break}edgeFn(v).forEach(updateNeighbors)}return results}},{"../data/priority-queue":15}],6:[function(require,module,exports){var tarjan=require("./tarjan");module.exports=findCycles;function findCycles(g){return tarjan(g).filter(function(cmpt){return cmpt.length>1||cmpt.length===1&&g.hasEdge(cmpt[0],cmpt[0])})}},{"./tarjan":13}],7:[function(require,module,exports){module.exports=floydWarshall;var DEFAULT_WEIGHT_FUNC=()=>1;function floydWarshall(g,weightFn,edgeFn){return runFloydWarshall(g,weightFn||DEFAULT_WEIGHT_FUNC,edgeFn||function(v){return g.outEdges(v)})}function runFloydWarshall(g,weightFn,edgeFn){var results={};var nodes=g.nodes();nodes.forEach(function(v){results[v]={};results[v][v]={distance:0};nodes.forEach(function(w){if(v!==w){results[v][w]={distance:Number.POSITIVE_INFINITY}}});edgeFn(v).forEach(function(edge){var w=edge.v===v?edge.w:edge.v;var d=weightFn(edge);results[v][w]={distance:d,predecessor:v}})});nodes.forEach(function(k){var rowK=results[k];nodes.forEach(function(i){var rowI=results[i];nodes.forEach(function(j){var ik=rowI[k];var kj=rowK[j];var ij=rowI[j];var altDistance=ik.distance+kj.distance;if(altDistanceg.successors(v):v=>g.neighbors(v);var orderFunc=order==="post"?postOrderDfs:preOrderDfs;var acc=[];var visited={};vs.forEach(v=>{if(!g.hasNode(v)){throw new Error("Graph does not have node: "+v)}orderFunc(v,navigation,visited,acc)});return acc}function postOrderDfs(v,navigation,visited,acc){var stack=[[v,false]];while(stack.length>0){var curr=stack.pop();if(curr[1]){acc.push(curr[0])}else{if(!visited.hasOwnProperty(curr[0])){visited[curr[0]]=true;stack.push([curr[0],true]);forEachRight(navigation(curr[0]),w=>stack.push([w,false]))}}}}function preOrderDfs(v,navigation,visited,acc){var stack=[v];while(stack.length>0){var curr=stack.pop();if(!visited.hasOwnProperty(curr)){visited[curr]=true;acc.push(curr);forEachRight(navigation(curr),w=>stack.push(w))}}}function forEachRight(array,iteratee){var length=array.length;while(length--){iteratee(array[length],length,array)}return array}module.exports=exports.default},{}],4:[function(require,module,exports){"use strict";Object.defineProperty(exports,"__esModule",{value:true});exports.default=dijkstraAll;var _dijkstra=_interopRequireDefault(require("./dijkstra.js"));function _interopRequireDefault(obj){return obj&&obj.__esModule?obj:{default:obj}}function dijkstraAll(g,weightFunc,edgeFunc){return g.nodes().reduce(function(acc,v){acc[v]=(0,_dijkstra.default)(g,v,weightFunc,edgeFunc);return acc},{})}module.exports=exports.default},{"./dijkstra.js":5}],5:[function(require,module,exports){"use strict";Object.defineProperty(exports,"__esModule",{value:true});exports.default=dijkstra;var _priorityQueue=_interopRequireDefault(require("../data/priority-queue.js"));function _interopRequireDefault(obj){return obj&&obj.__esModule?obj:{default:obj}}var DEFAULT_WEIGHT_FUNC=()=>1;function dijkstra(g,source,weightFn,edgeFn){return runDijkstra(g,String(source),weightFn||DEFAULT_WEIGHT_FUNC,edgeFn||function(v){return g.outEdges(v)})}function runDijkstra(g,source,weightFn,edgeFn){var results={};var pq=new _priorityQueue.default;var v,vEntry;var updateNeighbors=function(edge){var w=edge.v!==v?edge.v:edge.w;var wEntry=results[w];var weight=weightFn(edge);var distance=vEntry.distance+weight;if(weight<0){throw new Error("dijkstra does not allow negative edge weights. "+"Bad edge: "+edge+" Weight: "+weight)}if(distance0){v=pq.removeMin();vEntry=results[v];if(vEntry.distance===Number.POSITIVE_INFINITY){break}edgeFn(v).forEach(updateNeighbors)}return results}module.exports=exports.default},{"../data/priority-queue.js":15}],6:[function(require,module,exports){"use strict";Object.defineProperty(exports,"__esModule",{value:true});exports.default=findCycles;var _tarjan=_interopRequireDefault(require("./tarjan.js"));function _interopRequireDefault(obj){return obj&&obj.__esModule?obj:{default:obj}}function findCycles(g){return(0,_tarjan.default)(g).filter(function(cmpt){return cmpt.length>1||cmpt.length===1&&g.hasEdge(cmpt[0],cmpt[0])})}module.exports=exports.default},{"./tarjan.js":13}],7:[function(require,module,exports){"use strict";Object.defineProperty(exports,"__esModule",{value:true});exports.default=floydWarshall;var DEFAULT_WEIGHT_FUNC=()=>1;function floydWarshall(g,weightFn,edgeFn){return runFloydWarshall(g,weightFn||DEFAULT_WEIGHT_FUNC,edgeFn||function(v){return g.outEdges(v)})}function runFloydWarshall(g,weightFn,edgeFn){var results={};var nodes=g.nodes();nodes.forEach(function(v){results[v]={};results[v][v]={distance:0};nodes.forEach(function(w){if(v!==w){results[v][w]={distance:Number.POSITIVE_INFINITY}}});edgeFn(v).forEach(function(edge){var w=edge.v===v?edge.w:edge.v;var d=weightFn(edge);results[v][w]={distance:d,predecessor:v}})});nodes.forEach(function(k){var rowK=results[k];nodes.forEach(function(i){var rowI=results[i];nodes.forEach(function(j){var ik=rowI[k];var kj=rowK[j];var ij=rowI[j];var altDistance=ik.distance+kj.distance;if(altDistance0){v=pq.removeMin();if(parents.hasOwnProperty(v)){result.setEdge(v,parents[v])}else if(init){throw new Error("Input graph is not connected: "+g)}else{init=true}g.nodeEdges(v).forEach(updateNeighbors)}return result}},{"../data/priority-queue":15,"../graph":16}],13:[function(require,module,exports){module.exports=tarjan;function tarjan(g){var index=0;var stack=[];var visited={};// node id -> { onStack, lowlink, index } -var results=[];function dfs(v){var entry=visited[v]={onStack:true,lowlink:index,index:index++};stack.push(v);g.successors(v).forEach(function(w){if(!visited.hasOwnProperty(w)){dfs(w);entry.lowlink=Math.min(entry.lowlink,visited[w].lowlink)}else if(visited[w].onStack){entry.lowlink=Math.min(entry.lowlink,visited[w].index)}});if(entry.lowlink===entry.index){var cmpt=[];var w;do{w=stack.pop();visited[w].onStack=false;cmpt.push(w)}while(v!==w);results.push(cmpt)}}g.nodes().forEach(function(v){if(!visited.hasOwnProperty(v)){dfs(v)}});return results}},{}],14:[function(require,module,exports){function topsort(g){var visited={};var stack={};var results=[];function visit(node){if(stack.hasOwnProperty(node)){throw new CycleException}if(!visited.hasOwnProperty(node)){stack[node]=true;visited[node]=true;g.predecessors(node).forEach(visit);delete stack[node];results.push(node)}}g.sinks().forEach(visit);if(Object.keys(visited).length!==g.nodeCount()){throw new CycleException}return results}class CycleException extends Error{constructor(){super(...arguments)}}module.exports=topsort;topsort.CycleException=CycleException},{}],15:[function(require,module,exports){ +pq.decrease(g.nodes()[0],0);var init=false;while(pq.size()>0){v=pq.removeMin();if(parents.hasOwnProperty(v)){result.setEdge(v,parents[v])}else if(init){throw new Error("Input graph is not connected: "+g)}else{init=true}g.nodeEdges(v).forEach(updateNeighbors)}return result}module.exports=exports.default},{"../data/priority-queue.js":15,"../graph.js":16}],13:[function(require,module,exports){"use strict";Object.defineProperty(exports,"__esModule",{value:true});exports.default=tarjan;function tarjan(g){var index=0;var stack=[];var visited={};// node id -> { onStack, lowlink, index } +var results=[];function dfs(v){var entry=visited[v]={onStack:true,lowlink:index,index:index++};stack.push(v);g.successors(v).forEach(function(w){if(!visited.hasOwnProperty(w)){dfs(w);entry.lowlink=Math.min(entry.lowlink,visited[w].lowlink)}else if(visited[w].onStack){entry.lowlink=Math.min(entry.lowlink,visited[w].index)}});if(entry.lowlink===entry.index){var cmpt=[];var w;do{w=stack.pop();visited[w].onStack=false;cmpt.push(w)}while(v!==w);results.push(cmpt)}}g.nodes().forEach(function(v){if(!visited.hasOwnProperty(v)){dfs(v)}});return results}module.exports=exports.default},{}],14:[function(require,module,exports){"use strict";Object.defineProperty(exports,"__esModule",{value:true});exports.default=topsort;function topsort(g){var visited={};var stack={};var results=[];function visit(node){if(stack.hasOwnProperty(node)){throw new CycleException}if(!visited.hasOwnProperty(node)){stack[node]=true;visited[node]=true;g.predecessors(node).forEach(visit);delete stack[node];results.push(node)}}g.sinks().forEach(visit);if(Object.keys(visited).length!==g.nodeCount()){throw new CycleException}return results}class CycleException extends Error{constructor(){super(...arguments)}}topsort.CycleException=CycleException;module.exports=exports.default},{}],15:[function(require,module,exports){"use strict";Object.defineProperty(exports,"__esModule",{value:true});exports.default=void 0; /** * A min-priority queue data structure. This algorithm is derived from Cormen, * et al., "Introduction to Algorithms". The basic idea of a min-priority * queue is that you can efficiently (in O(1) time) get the smallest key in * the queue. Adding and removing elements takes O(log n) time. A key can * have its priority decreased in O(log n) time. - */ -class PriorityQueue{#arr=[];#keyIndices={}; + */class PriorityQueue{#arr=[];#keyIndices={}; /** * Returns the number of elements in the queue. Takes `O(1)` time. */size(){return this.#arr.length} @@ -84,7 +83,7 @@ class PriorityQueue{#arr=[];#keyIndices={}; * * @param {Object} key the key for which to raise priority * @param {Number} priority the new priority for the key - */decrease(key,priority){var index=this.#keyIndices[key];if(priority>this.#arr[index].priority){throw new Error("New priority is greater than current priority. "+"Key: "+key+" Old: "+this.#arr[index].priority+" New: "+priority)}this.#arr[index].priority=priority;this.#decrease(index)}#heapify(i){var arr=this.#arr;var l=2*i;var r=l+1;var largest=i;if(l>1;if(arr[parent].prioritythis.#arr[index].priority){throw new Error("New priority is greater than current priority. "+"Key: "+key+" Old: "+this.#arr[index].priority+" New: "+priority)}this.#arr[index].priority=priority;this.#decrease(index)}#heapify(i){var arr=this.#arr;var l=2*i;var r=l+1;var largest=i;if(l>1;if(arr[parent].priorityw){var tmp=v;v=w;w=tmp}return v+EDGE_KEY_DELIM+w+EDGE_KEY_DELIM+(name===undefined?DEFAULT_EDGE_NAME:name)}function edgeArgsToObj(isDirected,v_,w_,name){var v=""+v_;var w=""+w_;if(!isDirected&&v>w){var tmp=v;v=w;w=tmp}var edgeObj={v:v,w:w};if(name){edgeObj.name=name}return edgeObj}function edgeObjToId(isDirected,edgeObj){return edgeArgsToId(isDirected,edgeObj.v,edgeObj.w,edgeObj.name)}module.exports=Graph},{}],17:[function(require,module,exports){ -// Includes only the "core" of graphlib -module.exports={Graph:require("./graph"),version:require("./version")}},{"./graph":16,"./version":19}],18:[function(require,module,exports){var Graph=require("./graph");module.exports={write:write,read:read}; + */nodeEdges(v,w){var inEdges=this.inEdges(v,w);if(inEdges){return inEdges.concat(this.outEdges(v,w))}}}exports.default=Graph;function incrementOrInitEntry(map,k){if(map[k]){map[k]++}else{map[k]=1}}function decrementOrRemoveEntry(map,k){if(!--map[k]){delete map[k]}}function edgeArgsToId(isDirected,v_,w_,name){var v=""+v_;var w=""+w_;if(!isDirected&&v>w){var tmp=v;v=w;w=tmp}return v+EDGE_KEY_DELIM+w+EDGE_KEY_DELIM+(name===undefined?DEFAULT_EDGE_NAME:name)}function edgeArgsToObj(isDirected,v_,w_,name){var v=""+v_;var w=""+w_;if(!isDirected&&v>w){var tmp=v;v=w;w=tmp}var edgeObj={v:v,w:w};if(name){edgeObj.name=name}return edgeObj}function edgeObjToId(isDirected,edgeObj){return edgeArgsToId(isDirected,edgeObj.v,edgeObj.w,edgeObj.name)}module.exports=exports.default},{}],17:[function(require,module,exports){"use strict";Object.defineProperty(exports,"__esModule",{value:true});Object.defineProperty(exports,"Graph",{enumerable:true,get:function(){return _graph.default}});exports.json=exports.alg=void 0;Object.defineProperty(exports,"version",{enumerable:true,get:function(){return _version.default}});var _graph=_interopRequireDefault(require("./graph.js"));var _version=_interopRequireDefault(require("./version.js"));var _json=_interopRequireWildcard(require("./json.js"));exports.json=_json;var _alg=_interopRequireWildcard(require("./alg/index.js"));exports.alg=_alg;function _getRequireWildcardCache(e){if("function"!=typeof WeakMap)return null;var r=new WeakMap,t=new WeakMap;return(_getRequireWildcardCache=function(e){return e?t:r})(e)}function _interopRequireWildcard(e,r){if(!r&&e&&e.__esModule)return e;if(null===e||"object"!=typeof e&&"function"!=typeof e)return{default:e};var t=_getRequireWildcardCache(r);if(t&&t.has(e))return t.get(e);var n={__proto__:null},a=Object.defineProperty&&Object.getOwnPropertyDescriptor;for(var u in e)if("default"!==u&&Object.prototype.hasOwnProperty.call(e,u)){var i=a?Object.getOwnPropertyDescriptor(e,u):null;i&&(i.get||i.set)?Object.defineProperty(n,u,i):n[u]=e[u]}return n.default=e,t&&t.set(e,n),n}function _interopRequireDefault(obj){return obj&&obj.__esModule?obj:{default:obj}}},{"./alg/index.js":8,"./graph.js":16,"./json.js":18,"./version.js":19}],18:[function(require,module,exports){"use strict";Object.defineProperty(exports,"__esModule",{value:true});exports.read=read;exports.write=write;var _graph=_interopRequireDefault(require("./graph.js"));function _interopRequireDefault(obj){return obj&&obj.__esModule?obj:{default:obj}} /** * Creates a JSON representation of the graph that can be serialized to a string with * JSON.stringify. The graph can later be restored using json.read. @@ -301,4 +298,4 @@ module.exports={Graph:require("./graph"),version:require("./version")}},{"./grap * // ['a', 'b'] * g2.edges() * // [ { v: 'a', w: 'b' } ] - */function read(json){var g=new Graph(json.options).setGraph(json.value);json.nodes.forEach(function(entry){g.setNode(entry.v,entry.value);if(entry.parent){g.setParent(entry.v,entry.parent)}});json.edges.forEach(function(entry){g.setEdge({v:entry.v,w:entry.w,name:entry.name},entry.value)});return g}},{"./graph":16}],19:[function(require,module,exports){module.exports="2.1.13"},{}]},{},[1])(1)}); + */function read(json){var g=new _graph.default(json.options).setGraph(json.value);json.nodes.forEach(function(entry){g.setNode(entry.v,entry.value);if(entry.parent){g.setParent(entry.v,entry.parent)}});json.edges.forEach(function(entry){g.setEdge({v:entry.v,w:entry.w,name:entry.name},entry.value)});return g}},{"./graph.js":16}],19:[function(require,module,exports){"use strict";Object.defineProperty(exports,"__esModule",{value:true});exports.default=void 0;var _default=exports.default="2.1.14-pre";module.exports=exports.default},{}]},{},[1])(1)}); diff --git a/dist/graphlib.js b/dist/graphlib.js index 98478b34..5b96649c 100644 --- a/dist/graphlib.js +++ b/dist/graphlib.js @@ -39,13 +39,16 @@ module.exports = { }; },{"./lib":17,"./lib/alg":8,"./lib/json":18}],2:[function(require,module,exports){ -module.exports = components; +"use strict"; +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.default = components; function components(g) { var visited = {}; var cmpts = []; var cmpt; - function dfs(v) { if (visited.hasOwnProperty(v)) return; visited[v] = true; @@ -53,21 +56,24 @@ function components(g) { g.successors(v).forEach(dfs); g.predecessors(v).forEach(dfs); } - - g.nodes().forEach(function(v) { + g.nodes().forEach(function (v) { cmpt = []; dfs(v); if (cmpt.length) { cmpts.push(cmpt); } }); - return cmpts; } +module.exports = exports.default; },{}],3:[function(require,module,exports){ -module.exports = dfs; +"use strict"; +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.default = dfs; /* * A helper that preforms a pre- or post-order traversal on the input graph * and returns the nodes in the order they were visited. If the graph is @@ -80,23 +86,18 @@ function dfs(g, vs, order) { if (!Array.isArray(vs)) { vs = [vs]; } - var navigation = g.isDirected() ? v => g.successors(v) : v => g.neighbors(v); var orderFunc = order === "post" ? postOrderDfs : preOrderDfs; - var acc = []; var visited = {}; vs.forEach(v => { if (!g.hasNode(v)) { throw new Error("Graph does not have node: " + v); } - orderFunc(v, navigation, visited, acc); }); - return acc; } - function postOrderDfs(v, navigation, visited, acc) { var stack = [[v, false]]; while (stack.length > 0) { @@ -112,7 +113,6 @@ function postOrderDfs(v, navigation, visited, acc) { } } } - function preOrderDfs(v, navigation, visited, acc) { var stack = [v]; while (stack.length > 0) { @@ -124,129 +124,142 @@ function preOrderDfs(v, navigation, visited, acc) { } } } - function forEachRight(array, iteratee) { var length = array.length; while (length--) { iteratee(array[length], length, array); } - return array; } +module.exports = exports.default; },{}],4:[function(require,module,exports){ -var dijkstra = require("./dijkstra"); - -module.exports = dijkstraAll; +"use strict"; +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.default = dijkstraAll; +var _dijkstra = _interopRequireDefault(require("./dijkstra.js")); +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function dijkstraAll(g, weightFunc, edgeFunc) { - return g.nodes().reduce(function(acc, v) { - acc[v] = dijkstra(g, v, weightFunc, edgeFunc); + return g.nodes().reduce(function (acc, v) { + acc[v] = (0, _dijkstra.default)(g, v, weightFunc, edgeFunc); return acc; }, {}); } +module.exports = exports.default; -},{"./dijkstra":5}],5:[function(require,module,exports){ -var PriorityQueue = require("../data/priority-queue"); - -module.exports = dijkstra; +},{"./dijkstra.js":5}],5:[function(require,module,exports){ +"use strict"; +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.default = dijkstra; +var _priorityQueue = _interopRequireDefault(require("../data/priority-queue.js")); +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } var DEFAULT_WEIGHT_FUNC = () => 1; - function dijkstra(g, source, weightFn, edgeFn) { - return runDijkstra(g, String(source), - weightFn || DEFAULT_WEIGHT_FUNC, - edgeFn || function(v) { return g.outEdges(v); }); + return runDijkstra(g, String(source), weightFn || DEFAULT_WEIGHT_FUNC, edgeFn || function (v) { + return g.outEdges(v); + }); } - function runDijkstra(g, source, weightFn, edgeFn) { var results = {}; - var pq = new PriorityQueue(); + var pq = new _priorityQueue.default(); var v, vEntry; - - var updateNeighbors = function(edge) { + var updateNeighbors = function (edge) { var w = edge.v !== v ? edge.v : edge.w; var wEntry = results[w]; var weight = weightFn(edge); var distance = vEntry.distance + weight; - if (weight < 0) { - throw new Error("dijkstra does not allow negative edge weights. " + - "Bad edge: " + edge + " Weight: " + weight); + throw new Error("dijkstra does not allow negative edge weights. " + "Bad edge: " + edge + " Weight: " + weight); } - if (distance < wEntry.distance) { wEntry.distance = distance; wEntry.predecessor = v; pq.decrease(w, distance); } }; - - g.nodes().forEach(function(v) { + g.nodes().forEach(function (v) { var distance = v === source ? 0 : Number.POSITIVE_INFINITY; - results[v] = { distance: distance }; + results[v] = { + distance: distance + }; pq.add(v, distance); }); - while (pq.size() > 0) { v = pq.removeMin(); vEntry = results[v]; if (vEntry.distance === Number.POSITIVE_INFINITY) { break; } - edgeFn(v).forEach(updateNeighbors); } - return results; } +module.exports = exports.default; -},{"../data/priority-queue":15}],6:[function(require,module,exports){ -var tarjan = require("./tarjan"); - -module.exports = findCycles; +},{"../data/priority-queue.js":15}],6:[function(require,module,exports){ +"use strict"; +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.default = findCycles; +var _tarjan = _interopRequireDefault(require("./tarjan.js")); +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function findCycles(g) { - return tarjan(g).filter(function(cmpt) { - return cmpt.length > 1 || (cmpt.length === 1 && g.hasEdge(cmpt[0], cmpt[0])); + return (0, _tarjan.default)(g).filter(function (cmpt) { + return cmpt.length > 1 || cmpt.length === 1 && g.hasEdge(cmpt[0], cmpt[0]); }); } +module.exports = exports.default; -},{"./tarjan":13}],7:[function(require,module,exports){ -module.exports = floydWarshall; +},{"./tarjan.js":13}],7:[function(require,module,exports){ +"use strict"; +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.default = floydWarshall; var DEFAULT_WEIGHT_FUNC = () => 1; - function floydWarshall(g, weightFn, edgeFn) { - return runFloydWarshall(g, - weightFn || DEFAULT_WEIGHT_FUNC, - edgeFn || function(v) { return g.outEdges(v); }); + return runFloydWarshall(g, weightFn || DEFAULT_WEIGHT_FUNC, edgeFn || function (v) { + return g.outEdges(v); + }); } - function runFloydWarshall(g, weightFn, edgeFn) { var results = {}; var nodes = g.nodes(); - - nodes.forEach(function(v) { + nodes.forEach(function (v) { results[v] = {}; - results[v][v] = { distance: 0 }; - nodes.forEach(function(w) { + results[v][v] = { + distance: 0 + }; + nodes.forEach(function (w) { if (v !== w) { - results[v][w] = { distance: Number.POSITIVE_INFINITY }; + results[v][w] = { + distance: Number.POSITIVE_INFINITY + }; } }); - edgeFn(v).forEach(function(edge) { + edgeFn(v).forEach(function (edge) { var w = edge.v === v ? edge.w : edge.v; var d = weightFn(edge); - results[v][w] = { distance: d, predecessor: v }; + results[v][w] = { + distance: d, + predecessor: v + }; }); }); - - nodes.forEach(function(k) { + nodes.forEach(function (k) { var rowK = results[k]; - nodes.forEach(function(i) { + nodes.forEach(function (i) { var rowI = results[i]; - nodes.forEach(function(j) { + nodes.forEach(function (j) { var ik = rowI[k]; var kj = rowK[j]; var ij = rowI[j]; @@ -258,72 +271,160 @@ function runFloydWarshall(g, weightFn, edgeFn) { }); }); }); - return results; } +module.exports = exports.default; },{}],8:[function(require,module,exports){ -module.exports = { - components: require("./components"), - dijkstra: require("./dijkstra"), - dijkstraAll: require("./dijkstra-all"), - findCycles: require("./find-cycles"), - floydWarshall: require("./floyd-warshall"), - isAcyclic: require("./is-acyclic"), - postorder: require("./postorder"), - preorder: require("./preorder"), - prim: require("./prim"), - tarjan: require("./tarjan"), - topsort: require("./topsort") -}; - -},{"./components":2,"./dijkstra":5,"./dijkstra-all":4,"./find-cycles":6,"./floyd-warshall":7,"./is-acyclic":9,"./postorder":10,"./preorder":11,"./prim":12,"./tarjan":13,"./topsort":14}],9:[function(require,module,exports){ -var topsort = require("./topsort"); +"use strict"; -module.exports = isAcyclic; +Object.defineProperty(exports, "__esModule", { + value: true +}); +Object.defineProperty(exports, "components", { + enumerable: true, + get: function () { + return _components.default; + } +}); +Object.defineProperty(exports, "dijkstra", { + enumerable: true, + get: function () { + return _dijkstra.default; + } +}); +Object.defineProperty(exports, "dijkstraAll", { + enumerable: true, + get: function () { + return _dijkstraAll.default; + } +}); +Object.defineProperty(exports, "findCycles", { + enumerable: true, + get: function () { + return _findCycles.default; + } +}); +Object.defineProperty(exports, "floydWarshall", { + enumerable: true, + get: function () { + return _floydWarshall.default; + } +}); +Object.defineProperty(exports, "isAcyclic", { + enumerable: true, + get: function () { + return _isAcyclic.default; + } +}); +Object.defineProperty(exports, "postorder", { + enumerable: true, + get: function () { + return _postorder.default; + } +}); +Object.defineProperty(exports, "preorder", { + enumerable: true, + get: function () { + return _preorder.default; + } +}); +Object.defineProperty(exports, "prim", { + enumerable: true, + get: function () { + return _prim.default; + } +}); +Object.defineProperty(exports, "tarjan", { + enumerable: true, + get: function () { + return _tarjan.default; + } +}); +Object.defineProperty(exports, "topsort", { + enumerable: true, + get: function () { + return _topsort.default; + } +}); +var _components = _interopRequireDefault(require("./components.js")); +var _dijkstra = _interopRequireDefault(require("./dijkstra.js")); +var _dijkstraAll = _interopRequireDefault(require("./dijkstra-all.js")); +var _findCycles = _interopRequireDefault(require("./find-cycles.js")); +var _floydWarshall = _interopRequireDefault(require("./floyd-warshall.js")); +var _isAcyclic = _interopRequireDefault(require("./is-acyclic.js")); +var _postorder = _interopRequireDefault(require("./postorder.js")); +var _preorder = _interopRequireDefault(require("./preorder.js")); +var _prim = _interopRequireDefault(require("./prim.js")); +var _tarjan = _interopRequireDefault(require("./tarjan.js")); +var _topsort = _interopRequireDefault(require("./topsort.js")); +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +},{"./components.js":2,"./dijkstra-all.js":4,"./dijkstra.js":5,"./find-cycles.js":6,"./floyd-warshall.js":7,"./is-acyclic.js":9,"./postorder.js":10,"./preorder.js":11,"./prim.js":12,"./tarjan.js":13,"./topsort.js":14}],9:[function(require,module,exports){ +"use strict"; +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.default = isAcyclic; +var _topsort = _interopRequireDefault(require("./topsort.js")); +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function isAcyclic(g) { try { - topsort(g); + (0, _topsort.default)(g); } catch (e) { - if (e instanceof topsort.CycleException) { + if (e instanceof _topsort.default.CycleException) { return false; } throw e; } return true; } +module.exports = exports.default; -},{"./topsort":14}],10:[function(require,module,exports){ -var dfs = require("./dfs"); - -module.exports = postorder; +},{"./topsort.js":14}],10:[function(require,module,exports){ +"use strict"; +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.default = postorder; +var _dfs = _interopRequireDefault(require("./dfs.js")); +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function postorder(g, vs) { - return dfs(g, vs, "post"); + return (0, _dfs.default)(g, vs, "post"); } +module.exports = exports.default; -},{"./dfs":3}],11:[function(require,module,exports){ -var dfs = require("./dfs"); - -module.exports = preorder; +},{"./dfs.js":3}],11:[function(require,module,exports){ +"use strict"; +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.default = preorder; +var _dfs = _interopRequireDefault(require("./dfs.js")); +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function preorder(g, vs) { - return dfs(g, vs, "pre"); + return (0, _dfs.default)(g, vs, "pre"); } +module.exports = exports.default; -},{"./dfs":3}],12:[function(require,module,exports){ -var Graph = require("../graph"); -var PriorityQueue = require("../data/priority-queue"); - -module.exports = prim; +},{"./dfs.js":3}],12:[function(require,module,exports){ +"use strict"; +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.default = prim; +var _graph = _interopRequireDefault(require("../graph.js")); +var _priorityQueue = _interopRequireDefault(require("../data/priority-queue.js")); +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function prim(g, weightFunc) { - var result = new Graph(); + var result = new _graph.default(); var parents = {}; - var pq = new PriorityQueue(); + var pq = new _priorityQueue.default(); var v; - function updateNeighbors(edge) { var w = edge.v === v ? edge.w : edge.v; var pri = pq.priority(w); @@ -335,19 +436,16 @@ function prim(g, weightFunc) { } } } - if (g.nodeCount() === 0) { return result; } - - g.nodes().forEach(function(v) { + g.nodes().forEach(function (v) { pq.add(v, Number.POSITIVE_INFINITY); result.setNode(v); }); // Start from an arbitrary node pq.decrease(g.nodes()[0], 0); - var init = false; while (pq.size() > 0) { v = pq.removeMin(); @@ -358,22 +456,24 @@ function prim(g, weightFunc) { } else { init = true; } - g.nodeEdges(v).forEach(updateNeighbors); } - return result; } +module.exports = exports.default; -},{"../data/priority-queue":15,"../graph":16}],13:[function(require,module,exports){ -module.exports = tarjan; +},{"../data/priority-queue.js":15,"../graph.js":16}],13:[function(require,module,exports){ +"use strict"; +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.default = tarjan; function tarjan(g) { var index = 0; var stack = []; var visited = {}; // node id -> { onStack, lowlink, index } var results = []; - function dfs(v) { var entry = visited[v] = { onStack: true, @@ -381,8 +481,7 @@ function tarjan(g) { index: index++ }; stack.push(v); - - g.successors(v).forEach(function(w) { + g.successors(v).forEach(function (w) { if (!visited.hasOwnProperty(w)) { dfs(w); entry.lowlink = Math.min(entry.lowlink, visited[w].lowlink); @@ -390,7 +489,6 @@ function tarjan(g) { entry.lowlink = Math.min(entry.lowlink, visited[w].index); } }); - if (entry.lowlink === entry.index) { var cmpt = []; var w; @@ -402,27 +500,30 @@ function tarjan(g) { results.push(cmpt); } } - - g.nodes().forEach(function(v) { + g.nodes().forEach(function (v) { if (!visited.hasOwnProperty(v)) { dfs(v); } }); - return results; } +module.exports = exports.default; },{}],14:[function(require,module,exports){ +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.default = topsort; function topsort(g) { var visited = {}; var stack = {}; var results = []; - function visit(node) { if (stack.hasOwnProperty(node)) { throw new CycleException(); } - if (!visited.hasOwnProperty(node)) { stack[node] = true; visited[node] = true; @@ -431,26 +532,27 @@ function topsort(g) { results.push(node); } } - g.sinks().forEach(visit); - if (Object.keys(visited).length !== g.nodeCount()) { throw new CycleException(); } - return results; } - class CycleException extends Error { constructor() { super(...arguments); } } - -module.exports = topsort; topsort.CycleException = CycleException; +module.exports = exports.default; },{}],15:[function(require,module,exports){ +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.default = void 0; /** * A min-priority queue data structure. This algorithm is derived from Cormen, * et al., "Introduction to Algorithms". The basic idea of a min-priority @@ -473,7 +575,9 @@ class PriorityQueue { * Returns the keys that are in the queue. Takes `O(n)` time. */ keys() { - return this.#arr.map(function(x) { return x.key; }); + return this.#arr.map(function (x) { + return x.key; + }); } /** @@ -522,7 +626,10 @@ class PriorityQueue { var arr = this.#arr; var index = arr.length; keyIndices[key] = index; - arr.push({key: key, priority: priority}); + arr.push({ + key: key, + priority: priority + }); this.#decrease(index); return true; } @@ -550,13 +657,11 @@ class PriorityQueue { decrease(key, priority) { var index = this.#keyIndices[key]; if (priority > this.#arr[index].priority) { - throw new Error("New priority is greater than current priority. " + - "Key: " + key + " Old: " + this.#arr[index].priority + " New: " + priority); + throw new Error("New priority is greater than current priority. " + "Key: " + key + " Old: " + this.#arr[index].priority + " New: " + priority); } this.#arr[index].priority = priority; this.#decrease(index); } - #heapify(i) { var arr = this.#arr; var l = 2 * i; @@ -573,7 +678,6 @@ class PriorityQueue { } } } - #decrease(index) { var arr = this.#arr; var priority = arr[index].priority; @@ -587,7 +691,6 @@ class PriorityQueue { index = parent; } } - #swap(i, j) { var arr = this.#arr; var keyIndices = this.#keyIndices; @@ -599,12 +702,16 @@ class PriorityQueue { keyIndices[origArrI.key] = j; } } - -module.exports = PriorityQueue; +exports.default = PriorityQueue; +module.exports = exports.default; },{}],16:[function(require,module,exports){ "use strict"; +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.default = void 0; var DEFAULT_EDGE_NAME = "\x00"; var GRAPH_NODE = "\x00"; var EDGE_KEY_DELIM = "\x01"; @@ -659,18 +766,14 @@ class Graph { /* Number of edges in the graph. Should only be changed by the implementation. */ #edgeCount = 0; - #parent; - #children; - constructor(opts) { if (opts) { this.#isDirected = opts.hasOwnProperty("directed") ? opts.directed : true; this.#isMultigraph = opts.hasOwnProperty("multigraph") ? opts.multigraph : false; this.#isCompound = opts.hasOwnProperty("compound") ? opts.compound : false; } - if (this.#isCompound) { // v -> parent this.#parent = {}; @@ -719,7 +822,6 @@ class Graph { return this.#label; } - /* === Node functions ========== */ /** @@ -734,7 +836,6 @@ class Graph { if (typeof newDefault !== 'function') { this.#defaultNodeLabelFn = () => newDefault; } - return this; } @@ -780,7 +881,7 @@ class Graph { setNodes(vs, value) { var args = arguments; var self = this; - vs.forEach(function(v) { + vs.forEach(function (v) { if (args.length > 1) { self.setNode(v, value); } else { @@ -803,7 +904,6 @@ class Graph { } return this; } - this.#nodes[v] = arguments.length > 1 ? value : this.#defaultNodeLabelFn(v); if (this.#isCompound) { this.#parent[v] = GRAPH_NODE; @@ -847,7 +947,7 @@ class Graph { if (this.#isCompound) { this.#removeFromParentsChildList(v); delete this.#parent[v]; - this.children(v).forEach(function(child) { + this.children(v).forEach(function (child) { self.setParent(child); }); delete this.#children[v]; @@ -873,7 +973,6 @@ class Graph { if (!this.#isCompound) { throw new Error("Cannot set parent in a non-compound graph"); } - if (parent === undefined) { parent = GRAPH_NODE; } else { @@ -881,21 +980,17 @@ class Graph { parent += ""; for (var ancestor = parent; ancestor !== undefined; ancestor = this.parent(ancestor)) { if (ancestor === v) { - throw new Error("Setting " + parent+ " as parent of " + v + - " would create a cycle"); + throw new Error("Setting " + parent + " as parent of " + v + " would create a cycle"); } } - this.setNode(parent); } - this.setNode(v); this.#removeFromParentsChildList(v); this.#parent[v] = parent; this.#children[parent][v] = true; return this; } - #removeFromParentsChildList(v) { delete this.#children[this.#parent[v]][v]; } @@ -966,11 +1061,9 @@ class Graph { for (var succ of this.successors(v)) { union.add(succ); } - return Array.from(union.values()); } } - isLeaf(v) { var neighbors; if (this.isDirected()) { @@ -993,22 +1086,18 @@ class Graph { multigraph: this.#isMultigraph, compound: this.#isCompound }); - copy.setGraph(this.graph()); - var self = this; - Object.entries(this.#nodes).forEach(function([v, value]) { + Object.entries(this.#nodes).forEach(function ([v, value]) { if (filter(v)) { copy.setNode(v, value); } }); - - Object.values(this.#edgeObjs).forEach(function(e) { + Object.values(this.#edgeObjs).forEach(function (e) { if (copy.hasNode(e.v) && copy.hasNode(e.w)) { copy.setEdge(e, self.edge(e)); } }); - var parents = {}; function findParent(v) { var parent = self.parent(v); @@ -1021,11 +1110,9 @@ class Graph { return findParent(parent); } } - if (this.#isCompound) { copy.nodes().forEach(v => copy.setParent(v, findParent(v))); } - return copy; } @@ -1043,7 +1130,6 @@ class Graph { if (typeof newDefault !== 'function') { this.#defaultEdgeLabelFn = () => newDefault; } - return this; } @@ -1072,7 +1158,7 @@ class Graph { setPath(vs, value) { var self = this; var args = arguments; - vs.reduce(function(v, w) { + vs.reduce(function (v, w) { if (args.length > 1) { self.setEdge(v, w, value); } else { @@ -1093,7 +1179,6 @@ class Graph { var v, w, name, value; var valueSpecified = false; var arg0 = arguments[0]; - if (typeof arg0 === "object" && arg0 !== null && "v" in arg0) { v = arg0.v; w = arg0.w; @@ -1111,13 +1196,11 @@ class Graph { valueSpecified = true; } } - v = "" + v; w = "" + w; if (name !== undefined) { name = "" + name; } - var e = edgeArgsToId(this.#isDirected, v, w, name); if (this.#edgeLabels.hasOwnProperty(e)) { if (valueSpecified) { @@ -1125,7 +1208,6 @@ class Graph { } return this; } - if (name !== undefined && !this.#isMultigraph) { throw new Error("Cannot set a named edge when isMultigraph = false"); } @@ -1134,14 +1216,11 @@ class Graph { // First ensure the nodes exist. this.setNode(v); this.setNode(w); - this.#edgeLabels[e] = valueSpecified ? value : this.#defaultEdgeLabelFn(v, w, name); - var edgeObj = edgeArgsToObj(this.#isDirected, v, w, name); // Ensure we add undirected edges in a consistent way. v = edgeObj.v; w = edgeObj.w; - Object.freeze(edgeObj); this.#edgeObjs[e] = edgeObj; incrementOrInitEntry(this.#preds[w], v); @@ -1157,9 +1236,7 @@ class Graph { * Complexity: O(1). */ edge(v, w, name) { - var e = (arguments.length === 1 - ? edgeObjToId(this.#isDirected, arguments[0]) - : edgeArgsToId(this.#isDirected, v, w, name)); + var e = arguments.length === 1 ? edgeObjToId(this.#isDirected, arguments[0]) : edgeArgsToId(this.#isDirected, v, w, name); return this.#edgeLabels[e]; } @@ -1170,9 +1247,10 @@ class Graph { edgeAsObj() { const edge = this.edge(...arguments); if (typeof edge !== "object") { - return {label: edge}; + return { + label: edge + }; } - return edge; } @@ -1181,9 +1259,7 @@ class Graph { * Complexity: O(1). */ hasEdge(v, w, name) { - var e = (arguments.length === 1 - ? edgeObjToId(this.#isDirected, arguments[0]) - : edgeArgsToId(this.#isDirected, v, w, name)); + var e = arguments.length === 1 ? edgeObjToId(this.#isDirected, arguments[0]) : edgeArgsToId(this.#isDirected, v, w, name); return this.#edgeLabels.hasOwnProperty(e); } @@ -1192,9 +1268,7 @@ class Graph { * Complexity: O(1). */ removeEdge(v, w, name) { - var e = (arguments.length === 1 - ? edgeObjToId(this.#isDirected, arguments[0]) - : edgeArgsToId(this.#isDirected, v, w, name)); + var e = arguments.length === 1 ? edgeObjToId(this.#isDirected, arguments[0]) : edgeArgsToId(this.#isDirected, v, w, name); var edge = this.#edgeObjs[e]; if (edge) { v = edge.v; @@ -1254,7 +1328,7 @@ class Graph { } } } - +exports.default = Graph; function incrementOrInitEntry(map, k) { if (map[k]) { map[k]++; @@ -1262,11 +1336,11 @@ function incrementOrInitEntry(map, k) { map[k] = 1; } } - function decrementOrRemoveEntry(map, k) { - if (!--map[k]) { delete map[k]; } + if (! --map[k]) { + delete map[k]; + } } - function edgeArgsToId(isDirected, v_, w_, name) { var v = "" + v_; var w = "" + w_; @@ -1275,10 +1349,8 @@ function edgeArgsToId(isDirected, v_, w_, name) { v = w; w = tmp; } - return v + EDGE_KEY_DELIM + w + EDGE_KEY_DELIM + - (name === undefined ? DEFAULT_EDGE_NAME : name); + return v + EDGE_KEY_DELIM + w + EDGE_KEY_DELIM + (name === undefined ? DEFAULT_EDGE_NAME : name); } - function edgeArgsToObj(isDirected, v_, w_, name) { var v = "" + v_; var w = "" + w_; @@ -1287,34 +1359,59 @@ function edgeArgsToObj(isDirected, v_, w_, name) { v = w; w = tmp; } - var edgeObj = { v: v, w: w }; + var edgeObj = { + v: v, + w: w + }; if (name) { edgeObj.name = name; } return edgeObj; } - function edgeObjToId(isDirected, edgeObj) { return edgeArgsToId(isDirected, edgeObj.v, edgeObj.w, edgeObj.name); } - -module.exports = Graph; +module.exports = exports.default; },{}],17:[function(require,module,exports){ -// Includes only the "core" of graphlib -module.exports = { - Graph: require("./graph"), - version: require("./version") -}; - -},{"./graph":16,"./version":19}],18:[function(require,module,exports){ -var Graph = require("./graph"); +"use strict"; -module.exports = { - write: write, - read: read -}; +Object.defineProperty(exports, "__esModule", { + value: true +}); +Object.defineProperty(exports, "Graph", { + enumerable: true, + get: function () { + return _graph.default; + } +}); +exports.json = exports.alg = void 0; +Object.defineProperty(exports, "version", { + enumerable: true, + get: function () { + return _version.default; + } +}); +var _graph = _interopRequireDefault(require("./graph.js")); +var _version = _interopRequireDefault(require("./version.js")); +var _json = _interopRequireWildcard(require("./json.js")); +exports.json = _json; +var _alg = _interopRequireWildcard(require("./alg/index.js")); +exports.alg = _alg; +function _getRequireWildcardCache(e) { if ("function" != typeof WeakMap) return null; var r = new WeakMap(), t = new WeakMap(); return (_getRequireWildcardCache = function (e) { return e ? t : r; })(e); } +function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e; if (null === e || "object" != typeof e && "function" != typeof e) return { default: e }; var t = _getRequireWildcardCache(r); if (t && t.has(e)) return t.get(e); var n = { __proto__: null }, a = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var u in e) if ("default" !== u && Object.prototype.hasOwnProperty.call(e, u)) { var i = a ? Object.getOwnPropertyDescriptor(e, u) : null; i && (i.get || i.set) ? Object.defineProperty(n, u, i) : n[u] = e[u]; } return n.default = e, t && t.set(e, n), n; } +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +},{"./alg/index.js":8,"./graph.js":16,"./json.js":18,"./version.js":19}],18:[function(require,module,exports){ +"use strict"; +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.read = read; +exports.write = write; +var _graph = _interopRequireDefault(require("./graph.js")); +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } /** * Creates a JSON representation of the graph that can be serialized to a string with * JSON.stringify. The graph can later be restored using json.read. @@ -1329,18 +1426,18 @@ function write(g) { nodes: writeNodes(g), edges: writeEdges(g) }; - if (g.graph() !== undefined) { json.value = structuredClone(g.graph()); } return json; } - function writeNodes(g) { - return g.nodes().map(function(v) { + return g.nodes().map(function (v) { var nodeValue = g.node(v); var parent = g.parent(v); - var node = { v: v }; + var node = { + v: v + }; if (nodeValue !== undefined) { node.value = nodeValue; } @@ -1350,11 +1447,13 @@ function writeNodes(g) { return node; }); } - function writeEdges(g) { - return g.edges().map(function(e) { + return g.edges().map(function (e) { var edgeValue = g.edge(e); - var edge = { v: e.v, w: e.w }; + var edge = { + v: e.v, + w: e.w + }; if (e.name !== undefined) { edge.name = e.name; } @@ -1376,21 +1475,32 @@ function writeEdges(g) { * // [ { v: 'a', w: 'b' } ] */ function read(json) { - var g = new Graph(json.options).setGraph(json.value); - json.nodes.forEach(function(entry) { + var g = new _graph.default(json.options).setGraph(json.value); + json.nodes.forEach(function (entry) { g.setNode(entry.v, entry.value); if (entry.parent) { g.setParent(entry.v, entry.parent); } }); - json.edges.forEach(function(entry) { - g.setEdge({ v: entry.v, w: entry.w, name: entry.name }, entry.value); + json.edges.forEach(function (entry) { + g.setEdge({ + v: entry.v, + w: entry.w, + name: entry.name + }, entry.value); }); return g; } -},{"./graph":16}],19:[function(require,module,exports){ -module.exports = '2.1.13'; +},{"./graph.js":16}],19:[function(require,module,exports){ +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.default = void 0; +var _default = exports.default = '2.1.14-pre'; +module.exports = exports.default; },{}]},{},[1])(1) }); diff --git a/dist/graphlib.min.js b/dist/graphlib.min.js index 1dd2a361..7b9e1427 100644 --- a/dist/graphlib.min.js +++ b/dist/graphlib.min.js @@ -28,7 +28,7 @@ * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -var lib=require("./lib");module.exports={Graph:lib.Graph,json:require("./lib/json"),alg:require("./lib/alg"),version:lib.version}},{"./lib":17,"./lib/alg":8,"./lib/json":18}],2:[function(require,module,exports){module.exports=components;function components(g){var visited={};var cmpts=[];var cmpt;function dfs(v){if(visited.hasOwnProperty(v))return;visited[v]=true;cmpt.push(v);g.successors(v).forEach(dfs);g.predecessors(v).forEach(dfs)}g.nodes().forEach(function(v){cmpt=[];dfs(v);if(cmpt.length){cmpts.push(cmpt)}});return cmpts}},{}],3:[function(require,module,exports){module.exports=dfs; +var lib=require("./lib");module.exports={Graph:lib.Graph,json:require("./lib/json"),alg:require("./lib/alg"),version:lib.version}},{"./lib":17,"./lib/alg":8,"./lib/json":18}],2:[function(require,module,exports){"use strict";Object.defineProperty(exports,"__esModule",{value:true});exports.default=components;function components(g){var visited={};var cmpts=[];var cmpt;function dfs(v){if(visited.hasOwnProperty(v))return;visited[v]=true;cmpt.push(v);g.successors(v).forEach(dfs);g.predecessors(v).forEach(dfs)}g.nodes().forEach(function(v){cmpt=[];dfs(v);if(cmpt.length){cmpts.push(cmpt)}});return cmpts}module.exports=exports.default},{}],3:[function(require,module,exports){"use strict";Object.defineProperty(exports,"__esModule",{value:true});exports.default=dfs; /* * A helper that preforms a pre- or post-order traversal on the input graph * and returns the nodes in the order they were visited. If the graph is @@ -36,18 +36,17 @@ var lib=require("./lib");module.exports={Graph:lib.Graph,json:require("./lib/jso * is directed then this algorithm will navigate using successors. * * If the order is not "post", it will be treated as "pre". - */function dfs(g,vs,order){if(!Array.isArray(vs)){vs=[vs]}var navigation=g.isDirected()?v=>g.successors(v):v=>g.neighbors(v);var orderFunc=order==="post"?postOrderDfs:preOrderDfs;var acc=[];var visited={};vs.forEach(v=>{if(!g.hasNode(v)){throw new Error("Graph does not have node: "+v)}orderFunc(v,navigation,visited,acc)});return acc}function postOrderDfs(v,navigation,visited,acc){var stack=[[v,false]];while(stack.length>0){var curr=stack.pop();if(curr[1]){acc.push(curr[0])}else{if(!visited.hasOwnProperty(curr[0])){visited[curr[0]]=true;stack.push([curr[0],true]);forEachRight(navigation(curr[0]),w=>stack.push([w,false]))}}}}function preOrderDfs(v,navigation,visited,acc){var stack=[v];while(stack.length>0){var curr=stack.pop();if(!visited.hasOwnProperty(curr)){visited[curr]=true;acc.push(curr);forEachRight(navigation(curr),w=>stack.push(w))}}}function forEachRight(array,iteratee){var length=array.length;while(length--){iteratee(array[length],length,array)}return array}},{}],4:[function(require,module,exports){var dijkstra=require("./dijkstra");module.exports=dijkstraAll;function dijkstraAll(g,weightFunc,edgeFunc){return g.nodes().reduce(function(acc,v){acc[v]=dijkstra(g,v,weightFunc,edgeFunc);return acc},{})}},{"./dijkstra":5}],5:[function(require,module,exports){var PriorityQueue=require("../data/priority-queue");module.exports=dijkstra;var DEFAULT_WEIGHT_FUNC=()=>1;function dijkstra(g,source,weightFn,edgeFn){return runDijkstra(g,String(source),weightFn||DEFAULT_WEIGHT_FUNC,edgeFn||function(v){return g.outEdges(v)})}function runDijkstra(g,source,weightFn,edgeFn){var results={};var pq=new PriorityQueue;var v,vEntry;var updateNeighbors=function(edge){var w=edge.v!==v?edge.v:edge.w;var wEntry=results[w];var weight=weightFn(edge);var distance=vEntry.distance+weight;if(weight<0){throw new Error("dijkstra does not allow negative edge weights. "+"Bad edge: "+edge+" Weight: "+weight)}if(distance0){v=pq.removeMin();vEntry=results[v];if(vEntry.distance===Number.POSITIVE_INFINITY){break}edgeFn(v).forEach(updateNeighbors)}return results}},{"../data/priority-queue":15}],6:[function(require,module,exports){var tarjan=require("./tarjan");module.exports=findCycles;function findCycles(g){return tarjan(g).filter(function(cmpt){return cmpt.length>1||cmpt.length===1&&g.hasEdge(cmpt[0],cmpt[0])})}},{"./tarjan":13}],7:[function(require,module,exports){module.exports=floydWarshall;var DEFAULT_WEIGHT_FUNC=()=>1;function floydWarshall(g,weightFn,edgeFn){return runFloydWarshall(g,weightFn||DEFAULT_WEIGHT_FUNC,edgeFn||function(v){return g.outEdges(v)})}function runFloydWarshall(g,weightFn,edgeFn){var results={};var nodes=g.nodes();nodes.forEach(function(v){results[v]={};results[v][v]={distance:0};nodes.forEach(function(w){if(v!==w){results[v][w]={distance:Number.POSITIVE_INFINITY}}});edgeFn(v).forEach(function(edge){var w=edge.v===v?edge.w:edge.v;var d=weightFn(edge);results[v][w]={distance:d,predecessor:v}})});nodes.forEach(function(k){var rowK=results[k];nodes.forEach(function(i){var rowI=results[i];nodes.forEach(function(j){var ik=rowI[k];var kj=rowK[j];var ij=rowI[j];var altDistance=ik.distance+kj.distance;if(altDistanceg.successors(v):v=>g.neighbors(v);var orderFunc=order==="post"?postOrderDfs:preOrderDfs;var acc=[];var visited={};vs.forEach(v=>{if(!g.hasNode(v)){throw new Error("Graph does not have node: "+v)}orderFunc(v,navigation,visited,acc)});return acc}function postOrderDfs(v,navigation,visited,acc){var stack=[[v,false]];while(stack.length>0){var curr=stack.pop();if(curr[1]){acc.push(curr[0])}else{if(!visited.hasOwnProperty(curr[0])){visited[curr[0]]=true;stack.push([curr[0],true]);forEachRight(navigation(curr[0]),w=>stack.push([w,false]))}}}}function preOrderDfs(v,navigation,visited,acc){var stack=[v];while(stack.length>0){var curr=stack.pop();if(!visited.hasOwnProperty(curr)){visited[curr]=true;acc.push(curr);forEachRight(navigation(curr),w=>stack.push(w))}}}function forEachRight(array,iteratee){var length=array.length;while(length--){iteratee(array[length],length,array)}return array}module.exports=exports.default},{}],4:[function(require,module,exports){"use strict";Object.defineProperty(exports,"__esModule",{value:true});exports.default=dijkstraAll;var _dijkstra=_interopRequireDefault(require("./dijkstra.js"));function _interopRequireDefault(obj){return obj&&obj.__esModule?obj:{default:obj}}function dijkstraAll(g,weightFunc,edgeFunc){return g.nodes().reduce(function(acc,v){acc[v]=(0,_dijkstra.default)(g,v,weightFunc,edgeFunc);return acc},{})}module.exports=exports.default},{"./dijkstra.js":5}],5:[function(require,module,exports){"use strict";Object.defineProperty(exports,"__esModule",{value:true});exports.default=dijkstra;var _priorityQueue=_interopRequireDefault(require("../data/priority-queue.js"));function _interopRequireDefault(obj){return obj&&obj.__esModule?obj:{default:obj}}var DEFAULT_WEIGHT_FUNC=()=>1;function dijkstra(g,source,weightFn,edgeFn){return runDijkstra(g,String(source),weightFn||DEFAULT_WEIGHT_FUNC,edgeFn||function(v){return g.outEdges(v)})}function runDijkstra(g,source,weightFn,edgeFn){var results={};var pq=new _priorityQueue.default;var v,vEntry;var updateNeighbors=function(edge){var w=edge.v!==v?edge.v:edge.w;var wEntry=results[w];var weight=weightFn(edge);var distance=vEntry.distance+weight;if(weight<0){throw new Error("dijkstra does not allow negative edge weights. "+"Bad edge: "+edge+" Weight: "+weight)}if(distance0){v=pq.removeMin();vEntry=results[v];if(vEntry.distance===Number.POSITIVE_INFINITY){break}edgeFn(v).forEach(updateNeighbors)}return results}module.exports=exports.default},{"../data/priority-queue.js":15}],6:[function(require,module,exports){"use strict";Object.defineProperty(exports,"__esModule",{value:true});exports.default=findCycles;var _tarjan=_interopRequireDefault(require("./tarjan.js"));function _interopRequireDefault(obj){return obj&&obj.__esModule?obj:{default:obj}}function findCycles(g){return(0,_tarjan.default)(g).filter(function(cmpt){return cmpt.length>1||cmpt.length===1&&g.hasEdge(cmpt[0],cmpt[0])})}module.exports=exports.default},{"./tarjan.js":13}],7:[function(require,module,exports){"use strict";Object.defineProperty(exports,"__esModule",{value:true});exports.default=floydWarshall;var DEFAULT_WEIGHT_FUNC=()=>1;function floydWarshall(g,weightFn,edgeFn){return runFloydWarshall(g,weightFn||DEFAULT_WEIGHT_FUNC,edgeFn||function(v){return g.outEdges(v)})}function runFloydWarshall(g,weightFn,edgeFn){var results={};var nodes=g.nodes();nodes.forEach(function(v){results[v]={};results[v][v]={distance:0};nodes.forEach(function(w){if(v!==w){results[v][w]={distance:Number.POSITIVE_INFINITY}}});edgeFn(v).forEach(function(edge){var w=edge.v===v?edge.w:edge.v;var d=weightFn(edge);results[v][w]={distance:d,predecessor:v}})});nodes.forEach(function(k){var rowK=results[k];nodes.forEach(function(i){var rowI=results[i];nodes.forEach(function(j){var ik=rowI[k];var kj=rowK[j];var ij=rowI[j];var altDistance=ik.distance+kj.distance;if(altDistance0){v=pq.removeMin();if(parents.hasOwnProperty(v)){result.setEdge(v,parents[v])}else if(init){throw new Error("Input graph is not connected: "+g)}else{init=true}g.nodeEdges(v).forEach(updateNeighbors)}return result}},{"../data/priority-queue":15,"../graph":16}],13:[function(require,module,exports){module.exports=tarjan;function tarjan(g){var index=0;var stack=[];var visited={};// node id -> { onStack, lowlink, index } -var results=[];function dfs(v){var entry=visited[v]={onStack:true,lowlink:index,index:index++};stack.push(v);g.successors(v).forEach(function(w){if(!visited.hasOwnProperty(w)){dfs(w);entry.lowlink=Math.min(entry.lowlink,visited[w].lowlink)}else if(visited[w].onStack){entry.lowlink=Math.min(entry.lowlink,visited[w].index)}});if(entry.lowlink===entry.index){var cmpt=[];var w;do{w=stack.pop();visited[w].onStack=false;cmpt.push(w)}while(v!==w);results.push(cmpt)}}g.nodes().forEach(function(v){if(!visited.hasOwnProperty(v)){dfs(v)}});return results}},{}],14:[function(require,module,exports){function topsort(g){var visited={};var stack={};var results=[];function visit(node){if(stack.hasOwnProperty(node)){throw new CycleException}if(!visited.hasOwnProperty(node)){stack[node]=true;visited[node]=true;g.predecessors(node).forEach(visit);delete stack[node];results.push(node)}}g.sinks().forEach(visit);if(Object.keys(visited).length!==g.nodeCount()){throw new CycleException}return results}class CycleException extends Error{constructor(){super(...arguments)}}module.exports=topsort;topsort.CycleException=CycleException},{}],15:[function(require,module,exports){ +pq.decrease(g.nodes()[0],0);var init=false;while(pq.size()>0){v=pq.removeMin();if(parents.hasOwnProperty(v)){result.setEdge(v,parents[v])}else if(init){throw new Error("Input graph is not connected: "+g)}else{init=true}g.nodeEdges(v).forEach(updateNeighbors)}return result}module.exports=exports.default},{"../data/priority-queue.js":15,"../graph.js":16}],13:[function(require,module,exports){"use strict";Object.defineProperty(exports,"__esModule",{value:true});exports.default=tarjan;function tarjan(g){var index=0;var stack=[];var visited={};// node id -> { onStack, lowlink, index } +var results=[];function dfs(v){var entry=visited[v]={onStack:true,lowlink:index,index:index++};stack.push(v);g.successors(v).forEach(function(w){if(!visited.hasOwnProperty(w)){dfs(w);entry.lowlink=Math.min(entry.lowlink,visited[w].lowlink)}else if(visited[w].onStack){entry.lowlink=Math.min(entry.lowlink,visited[w].index)}});if(entry.lowlink===entry.index){var cmpt=[];var w;do{w=stack.pop();visited[w].onStack=false;cmpt.push(w)}while(v!==w);results.push(cmpt)}}g.nodes().forEach(function(v){if(!visited.hasOwnProperty(v)){dfs(v)}});return results}module.exports=exports.default},{}],14:[function(require,module,exports){"use strict";Object.defineProperty(exports,"__esModule",{value:true});exports.default=topsort;function topsort(g){var visited={};var stack={};var results=[];function visit(node){if(stack.hasOwnProperty(node)){throw new CycleException}if(!visited.hasOwnProperty(node)){stack[node]=true;visited[node]=true;g.predecessors(node).forEach(visit);delete stack[node];results.push(node)}}g.sinks().forEach(visit);if(Object.keys(visited).length!==g.nodeCount()){throw new CycleException}return results}class CycleException extends Error{constructor(){super(...arguments)}}topsort.CycleException=CycleException;module.exports=exports.default},{}],15:[function(require,module,exports){"use strict";Object.defineProperty(exports,"__esModule",{value:true});exports.default=void 0; /** * A min-priority queue data structure. This algorithm is derived from Cormen, * et al., "Introduction to Algorithms". The basic idea of a min-priority * queue is that you can efficiently (in O(1) time) get the smallest key in * the queue. Adding and removing elements takes O(log n) time. A key can * have its priority decreased in O(log n) time. - */ -class PriorityQueue{#arr=[];#keyIndices={}; + */class PriorityQueue{#arr=[];#keyIndices={}; /** * Returns the number of elements in the queue. Takes `O(1)` time. */size(){return this.#arr.length} @@ -84,7 +83,7 @@ class PriorityQueue{#arr=[];#keyIndices={}; * * @param {Object} key the key for which to raise priority * @param {Number} priority the new priority for the key - */decrease(key,priority){var index=this.#keyIndices[key];if(priority>this.#arr[index].priority){throw new Error("New priority is greater than current priority. "+"Key: "+key+" Old: "+this.#arr[index].priority+" New: "+priority)}this.#arr[index].priority=priority;this.#decrease(index)}#heapify(i){var arr=this.#arr;var l=2*i;var r=l+1;var largest=i;if(l>1;if(arr[parent].prioritythis.#arr[index].priority){throw new Error("New priority is greater than current priority. "+"Key: "+key+" Old: "+this.#arr[index].priority+" New: "+priority)}this.#arr[index].priority=priority;this.#decrease(index)}#heapify(i){var arr=this.#arr;var l=2*i;var r=l+1;var largest=i;if(l>1;if(arr[parent].priorityw){var tmp=v;v=w;w=tmp}return v+EDGE_KEY_DELIM+w+EDGE_KEY_DELIM+(name===undefined?DEFAULT_EDGE_NAME:name)}function edgeArgsToObj(isDirected,v_,w_,name){var v=""+v_;var w=""+w_;if(!isDirected&&v>w){var tmp=v;v=w;w=tmp}var edgeObj={v:v,w:w};if(name){edgeObj.name=name}return edgeObj}function edgeObjToId(isDirected,edgeObj){return edgeArgsToId(isDirected,edgeObj.v,edgeObj.w,edgeObj.name)}module.exports=Graph},{}],17:[function(require,module,exports){ -// Includes only the "core" of graphlib -module.exports={Graph:require("./graph"),version:require("./version")}},{"./graph":16,"./version":19}],18:[function(require,module,exports){var Graph=require("./graph");module.exports={write:write,read:read}; + */nodeEdges(v,w){var inEdges=this.inEdges(v,w);if(inEdges){return inEdges.concat(this.outEdges(v,w))}}}exports.default=Graph;function incrementOrInitEntry(map,k){if(map[k]){map[k]++}else{map[k]=1}}function decrementOrRemoveEntry(map,k){if(!--map[k]){delete map[k]}}function edgeArgsToId(isDirected,v_,w_,name){var v=""+v_;var w=""+w_;if(!isDirected&&v>w){var tmp=v;v=w;w=tmp}return v+EDGE_KEY_DELIM+w+EDGE_KEY_DELIM+(name===undefined?DEFAULT_EDGE_NAME:name)}function edgeArgsToObj(isDirected,v_,w_,name){var v=""+v_;var w=""+w_;if(!isDirected&&v>w){var tmp=v;v=w;w=tmp}var edgeObj={v:v,w:w};if(name){edgeObj.name=name}return edgeObj}function edgeObjToId(isDirected,edgeObj){return edgeArgsToId(isDirected,edgeObj.v,edgeObj.w,edgeObj.name)}module.exports=exports.default},{}],17:[function(require,module,exports){"use strict";Object.defineProperty(exports,"__esModule",{value:true});Object.defineProperty(exports,"Graph",{enumerable:true,get:function(){return _graph.default}});exports.json=exports.alg=void 0;Object.defineProperty(exports,"version",{enumerable:true,get:function(){return _version.default}});var _graph=_interopRequireDefault(require("./graph.js"));var _version=_interopRequireDefault(require("./version.js"));var _json=_interopRequireWildcard(require("./json.js"));exports.json=_json;var _alg=_interopRequireWildcard(require("./alg/index.js"));exports.alg=_alg;function _getRequireWildcardCache(e){if("function"!=typeof WeakMap)return null;var r=new WeakMap,t=new WeakMap;return(_getRequireWildcardCache=function(e){return e?t:r})(e)}function _interopRequireWildcard(e,r){if(!r&&e&&e.__esModule)return e;if(null===e||"object"!=typeof e&&"function"!=typeof e)return{default:e};var t=_getRequireWildcardCache(r);if(t&&t.has(e))return t.get(e);var n={__proto__:null},a=Object.defineProperty&&Object.getOwnPropertyDescriptor;for(var u in e)if("default"!==u&&Object.prototype.hasOwnProperty.call(e,u)){var i=a?Object.getOwnPropertyDescriptor(e,u):null;i&&(i.get||i.set)?Object.defineProperty(n,u,i):n[u]=e[u]}return n.default=e,t&&t.set(e,n),n}function _interopRequireDefault(obj){return obj&&obj.__esModule?obj:{default:obj}}},{"./alg/index.js":8,"./graph.js":16,"./json.js":18,"./version.js":19}],18:[function(require,module,exports){"use strict";Object.defineProperty(exports,"__esModule",{value:true});exports.read=read;exports.write=write;var _graph=_interopRequireDefault(require("./graph.js"));function _interopRequireDefault(obj){return obj&&obj.__esModule?obj:{default:obj}} /** * Creates a JSON representation of the graph that can be serialized to a string with * JSON.stringify. The graph can later be restored using json.read. @@ -301,4 +298,4 @@ module.exports={Graph:require("./graph"),version:require("./version")}},{"./grap * // ['a', 'b'] * g2.edges() * // [ { v: 'a', w: 'b' } ] - */function read(json){var g=new Graph(json.options).setGraph(json.value);json.nodes.forEach(function(entry){g.setNode(entry.v,entry.value);if(entry.parent){g.setParent(entry.v,entry.parent)}});json.edges.forEach(function(entry){g.setEdge({v:entry.v,w:entry.w,name:entry.name},entry.value)});return g}},{"./graph":16}],19:[function(require,module,exports){module.exports="2.1.13"},{}]},{},[1])(1)}); + */function read(json){var g=new _graph.default(json.options).setGraph(json.value);json.nodes.forEach(function(entry){g.setNode(entry.v,entry.value);if(entry.parent){g.setParent(entry.v,entry.parent)}});json.edges.forEach(function(entry){g.setEdge({v:entry.v,w:entry.w,name:entry.name},entry.value)});return g}},{"./graph.js":16}],19:[function(require,module,exports){"use strict";Object.defineProperty(exports,"__esModule",{value:true});exports.default=void 0;var _default=exports.default="2.1.14-pre";module.exports=exports.default},{}]},{},[1])(1)}); diff --git a/lib/version.js b/lib/version.js index 4a1665a0..ffcb2e9c 100644 --- a/lib/version.js +++ b/lib/version.js @@ -4,5 +4,5 @@ Object.defineProperty(exports, "__esModule", { value: true }); exports.default = void 0; -var _default = exports.default = '2.1.14-pre'; +var _default = exports.default = '2.2.0'; module.exports = exports.default; diff --git a/mjs-lib/version.js b/mjs-lib/version.js index f26714cb..d6aa1be8 100644 --- a/mjs-lib/version.js +++ b/mjs-lib/version.js @@ -1 +1 @@ -export default '2.1.14-pre'; +export default '2.2.0'; From 2f9a5537493a40b925b46eb2a3f1d50ad79b1678 Mon Sep 17 00:00:00 2001 From: David Newell Date: Tue, 12 Mar 2024 14:58:59 +0000 Subject: [PATCH 56/85] Bumping the package.json version --- dist/graphlib.core.js | 2 +- dist/graphlib.core.min.js | 2 +- dist/graphlib.js | 2 +- dist/graphlib.min.js | 2 +- package.json | 2 +- 5 files changed, 5 insertions(+), 5 deletions(-) diff --git a/dist/graphlib.core.js b/dist/graphlib.core.js index 5b96649c..6d12a675 100644 --- a/dist/graphlib.core.js +++ b/dist/graphlib.core.js @@ -1499,7 +1499,7 @@ Object.defineProperty(exports, "__esModule", { value: true }); exports.default = void 0; -var _default = exports.default = '2.1.14-pre'; +var _default = exports.default = '2.2.0'; module.exports = exports.default; },{}]},{},[1])(1) diff --git a/dist/graphlib.core.min.js b/dist/graphlib.core.min.js index 7b9e1427..91a8d88b 100644 --- a/dist/graphlib.core.min.js +++ b/dist/graphlib.core.min.js @@ -298,4 +298,4 @@ v=edgeObj.v;w=edgeObj.w;Object.freeze(edgeObj);this.#edgeObjs[e]=edgeObj;increme * // ['a', 'b'] * g2.edges() * // [ { v: 'a', w: 'b' } ] - */function read(json){var g=new _graph.default(json.options).setGraph(json.value);json.nodes.forEach(function(entry){g.setNode(entry.v,entry.value);if(entry.parent){g.setParent(entry.v,entry.parent)}});json.edges.forEach(function(entry){g.setEdge({v:entry.v,w:entry.w,name:entry.name},entry.value)});return g}},{"./graph.js":16}],19:[function(require,module,exports){"use strict";Object.defineProperty(exports,"__esModule",{value:true});exports.default=void 0;var _default=exports.default="2.1.14-pre";module.exports=exports.default},{}]},{},[1])(1)}); + */function read(json){var g=new _graph.default(json.options).setGraph(json.value);json.nodes.forEach(function(entry){g.setNode(entry.v,entry.value);if(entry.parent){g.setParent(entry.v,entry.parent)}});json.edges.forEach(function(entry){g.setEdge({v:entry.v,w:entry.w,name:entry.name},entry.value)});return g}},{"./graph.js":16}],19:[function(require,module,exports){"use strict";Object.defineProperty(exports,"__esModule",{value:true});exports.default=void 0;var _default=exports.default="2.2.0";module.exports=exports.default},{}]},{},[1])(1)}); diff --git a/dist/graphlib.js b/dist/graphlib.js index 5b96649c..6d12a675 100644 --- a/dist/graphlib.js +++ b/dist/graphlib.js @@ -1499,7 +1499,7 @@ Object.defineProperty(exports, "__esModule", { value: true }); exports.default = void 0; -var _default = exports.default = '2.1.14-pre'; +var _default = exports.default = '2.2.0'; module.exports = exports.default; },{}]},{},[1])(1) diff --git a/dist/graphlib.min.js b/dist/graphlib.min.js index 7b9e1427..91a8d88b 100644 --- a/dist/graphlib.min.js +++ b/dist/graphlib.min.js @@ -298,4 +298,4 @@ v=edgeObj.v;w=edgeObj.w;Object.freeze(edgeObj);this.#edgeObjs[e]=edgeObj;increme * // ['a', 'b'] * g2.edges() * // [ { v: 'a', w: 'b' } ] - */function read(json){var g=new _graph.default(json.options).setGraph(json.value);json.nodes.forEach(function(entry){g.setNode(entry.v,entry.value);if(entry.parent){g.setParent(entry.v,entry.parent)}});json.edges.forEach(function(entry){g.setEdge({v:entry.v,w:entry.w,name:entry.name},entry.value)});return g}},{"./graph.js":16}],19:[function(require,module,exports){"use strict";Object.defineProperty(exports,"__esModule",{value:true});exports.default=void 0;var _default=exports.default="2.1.14-pre";module.exports=exports.default},{}]},{},[1])(1)}); + */function read(json){var g=new _graph.default(json.options).setGraph(json.value);json.nodes.forEach(function(entry){g.setNode(entry.v,entry.value);if(entry.parent){g.setParent(entry.v,entry.parent)}});json.edges.forEach(function(entry){g.setEdge({v:entry.v,w:entry.w,name:entry.name},entry.value)});return g}},{"./graph.js":16}],19:[function(require,module,exports){"use strict";Object.defineProperty(exports,"__esModule",{value:true});exports.default=void 0;var _default=exports.default="2.2.0";module.exports=exports.default},{}]},{},[1])(1)}); diff --git a/package.json b/package.json index 02ffc8e5..770da611 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@dagrejs/graphlib", - "version": "2.1.14-pre", + "version": "2.2.0", "description": "A directed and undirected multi-graph library", "author": "Chris Pettitt ", "license": "MIT", From 548619a8ceb22bda50315df84ad10c5bd923b1d4 Mon Sep 17 00:00:00 2001 From: David Newell Date: Tue, 12 Mar 2024 14:59:44 +0000 Subject: [PATCH 57/85] Pushing the package lock --- bower.json | 2 +- package-lock.json | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/bower.json b/bower.json index 96965ee6..233672ef 100644 --- a/bower.json +++ b/bower.json @@ -1,6 +1,6 @@ { "name": "graphlib", - "version": "2.1.14-pre", + "version": "2.2.0", "main": [ "dist/graphlib.core.js" ], diff --git a/package-lock.json b/package-lock.json index 1b506afa..7af69b87 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "@dagrejs/graphlib", - "version": "2.1.14-pre", + "version": "2.2.0", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "@dagrejs/graphlib", - "version": "2.1.14-pre", + "version": "2.2.0", "license": "MIT", "devDependencies": { "@babel/cli": "^7.23.9", From fe517a9654cfc99f3aee2167469cc619a16fb708 Mon Sep 17 00:00:00 2001 From: David Newell Date: Tue, 12 Mar 2024 15:00:19 +0000 Subject: [PATCH 58/85] Bump version and set as pre-release --- package.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index 770da611..71064c4d 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@dagrejs/graphlib", - "version": "2.2.0", + "version": "2.2.1-pre", "description": "A directed and undirected multi-graph library", "author": "Chris Pettitt ", "license": "MIT", @@ -59,4 +59,4 @@ "type": "git", "url": "https://github.com/dagrejs/graphlib.git" } -} +} \ No newline at end of file From 7247473658ccfc5f71a6f3a925b56dfd8792bbbf Mon Sep 17 00:00:00 2001 From: David Newell Date: Fri, 15 Mar 2024 14:32:06 +0000 Subject: [PATCH 59/85] Set version to prerelease --- lib/version.js | 2 +- mjs-lib/version.js | 2 +- package-lock.json | 4 ++-- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/lib/version.js b/lib/version.js index ffcb2e9c..8e28d935 100644 --- a/lib/version.js +++ b/lib/version.js @@ -4,5 +4,5 @@ Object.defineProperty(exports, "__esModule", { value: true }); exports.default = void 0; -var _default = exports.default = '2.2.0'; +var _default = exports.default = '2.2.1-pre'; module.exports = exports.default; diff --git a/mjs-lib/version.js b/mjs-lib/version.js index d6aa1be8..467bcc31 100644 --- a/mjs-lib/version.js +++ b/mjs-lib/version.js @@ -1 +1 @@ -export default '2.2.0'; +export default '2.2.1-pre'; diff --git a/package-lock.json b/package-lock.json index 7af69b87..648e03ca 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "@dagrejs/graphlib", - "version": "2.2.0", + "version": "2.2.1-pre", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "@dagrejs/graphlib", - "version": "2.2.0", + "version": "2.2.1-pre", "license": "MIT", "devDependencies": { "@babel/cli": "^7.23.9", From 843a03ff753f810a921570cb9a8d3f011e8b4e7d Mon Sep 17 00:00:00 2001 From: David Newell Date: Fri, 15 Mar 2024 14:37:27 +0000 Subject: [PATCH 60/85] Revert "Merge pull request #189 from grupopikul/master" This reverts commit ddf797fe9ce1718fb93ee5a23f1290c9cb8532b9, reversing changes made to 2a68d35910085b6f20f0cee0e7b9fe3670e3b077. --- .babelrc | 3 - .eslintrc.json | 4 +- Makefile | 37 +- lib/alg/components.js | 12 +- lib/alg/dfs.js | 15 +- lib/alg/dijkstra-all.js | 15 +- lib/alg/dijkstra.js | 41 +- lib/alg/find-cycles.js | 15 +- lib/alg/floyd-warshall.js | 43 +- lib/alg/index.js | 96 +- lib/alg/is-acyclic.js | 15 +- lib/alg/postorder.js | 13 +- lib/alg/preorder.js | 13 +- lib/alg/prim.js | 27 +- lib/alg/tarjan.js | 16 +- lib/alg/topsort.js | 15 +- lib/data/priority-queue.js | 25 +- lib/graph.js | 82 +- lib/index.js | 32 +- lib/json.js | 42 +- lib/version.js | 9 +- mjs-lib/alg/components.js | 23 - mjs-lib/alg/dfs.js | 65 - mjs-lib/alg/dijkstra-all.js | 9 - mjs-lib/alg/dijkstra.js | 52 - mjs-lib/alg/find-cycles.js | 7 - mjs-lib/alg/floyd-warshall.js | 46 - mjs-lib/alg/index.js | 11 - mjs-lib/alg/is-acyclic.js | 13 - mjs-lib/alg/postorder.js | 5 - mjs-lib/alg/preorder.js | 5 - mjs-lib/alg/prim.js | 49 - mjs-lib/alg/tarjan.js | 43 - mjs-lib/alg/topsort.js | 35 - mjs-lib/data/priority-queue.js | 148 - mjs-lib/graph.js | 694 --- mjs-lib/index.js | 5 - mjs-lib/json.js | 75 - mjs-lib/version.js | 1 - old-lib/alg/components.js | 25 - old-lib/alg/dfs.js | 67 - old-lib/alg/dijkstra-all.js | 10 - old-lib/alg/dijkstra.js | 53 - old-lib/alg/find-cycles.js | 9 - old-lib/alg/floyd-warshall.js | 48 - old-lib/alg/index.js | 13 - old-lib/alg/is-acyclic.js | 15 - old-lib/alg/postorder.js | 7 - old-lib/alg/preorder.js | 7 - old-lib/alg/prim.js | 51 - old-lib/alg/tarjan.js | 45 - old-lib/alg/topsort.js | 36 - old-lib/data/priority-queue.js | 150 - old-lib/graph.js | 696 --- old-lib/index.js | 5 - old-lib/json.js | 80 - old-lib/version.js | 1 - package-lock.json | 10011 +++++++++++-------------------- package.json | 13 +- src/release/make-bower.json.js | 2 - src/release/make-version.js | 2 +- src/release/release.sh | 2 +- 62 files changed, 3721 insertions(+), 9483 deletions(-) delete mode 100644 .babelrc delete mode 100644 mjs-lib/alg/components.js delete mode 100644 mjs-lib/alg/dfs.js delete mode 100644 mjs-lib/alg/dijkstra-all.js delete mode 100644 mjs-lib/alg/dijkstra.js delete mode 100644 mjs-lib/alg/find-cycles.js delete mode 100644 mjs-lib/alg/floyd-warshall.js delete mode 100644 mjs-lib/alg/index.js delete mode 100644 mjs-lib/alg/is-acyclic.js delete mode 100644 mjs-lib/alg/postorder.js delete mode 100644 mjs-lib/alg/preorder.js delete mode 100644 mjs-lib/alg/prim.js delete mode 100644 mjs-lib/alg/tarjan.js delete mode 100644 mjs-lib/alg/topsort.js delete mode 100644 mjs-lib/data/priority-queue.js delete mode 100644 mjs-lib/graph.js delete mode 100644 mjs-lib/index.js delete mode 100644 mjs-lib/json.js delete mode 100644 mjs-lib/version.js delete mode 100644 old-lib/alg/components.js delete mode 100644 old-lib/alg/dfs.js delete mode 100644 old-lib/alg/dijkstra-all.js delete mode 100644 old-lib/alg/dijkstra.js delete mode 100644 old-lib/alg/find-cycles.js delete mode 100644 old-lib/alg/floyd-warshall.js delete mode 100644 old-lib/alg/index.js delete mode 100644 old-lib/alg/is-acyclic.js delete mode 100644 old-lib/alg/postorder.js delete mode 100644 old-lib/alg/preorder.js delete mode 100644 old-lib/alg/prim.js delete mode 100644 old-lib/alg/tarjan.js delete mode 100644 old-lib/alg/topsort.js delete mode 100644 old-lib/data/priority-queue.js delete mode 100644 old-lib/graph.js delete mode 100644 old-lib/index.js delete mode 100644 old-lib/json.js delete mode 100644 old-lib/version.js diff --git a/.babelrc b/.babelrc deleted file mode 100644 index 32bb084c..00000000 --- a/.babelrc +++ /dev/null @@ -1,3 +0,0 @@ -{ - "plugins": ["@babel/plugin-transform-export-namespace-from", "@babel/plugin-transform-modules-commonjs", "add-module-exports"] -} diff --git a/.eslintrc.json b/.eslintrc.json index 971f9dc9..67a5caa7 100644 --- a/.eslintrc.json +++ b/.eslintrc.json @@ -6,9 +6,7 @@ "mocha": true }, "parserOptions": { - "ecmaVersion": "latest", - "sourceType": "module", - "allowImportExportEverywhere": true + "ecmaVersion": "latest" }, "env": { "es6": true, diff --git a/Makefile b/Makefile index 66ba1c46..7b3bded5 100644 --- a/Makefile +++ b/Makefile @@ -16,24 +16,22 @@ BUILD_DIR = build COVERAGE_DIR = ./.nyc_output DIST_DIR = dist - -MJS_FILES = $(shell find mjs-lib -type f -name '*.js') -# CJS_FILES are based off mjs files. -CJS_FILES = $(shell find mjs-lib -type f -name '*.js' -printf lib/%P\\n) +SRC_FILES = index.js lib/version.js $(shell find lib -type f -name '*.js') TEST_FILES = $(shell find test -type f -name '*.js' | grep -v 'bundle-test.js' | grep -v 'test-main.js') BUILD_FILES = $(addprefix $(BUILD_DIR)/, \ $(MOD).js $(MOD).min.js \ $(MOD).core.js $(MOD).core.min.js) + DIRS = $(BUILD_DIR) -.PHONY: all bench clean convert-clean browser-test unit-test test dist +.PHONY: all bench clean browser-test unit-test test dist all: unit-test lint bench: unit-test lint @src/bench.js -mjs-lib/version.js: package.json +lib/version.js: package.json @src/release/make-version.js > $@ $(DIRS): @@ -41,30 +39,27 @@ $(DIRS): test: unit-test browser-test -unit-test: convert index.js $(CJS_FILES) $(TEST_FILES) node_modules | $(BUILD_DIR) - -$(NYC) $(MOCHA) --dir $(COVERAGE_DIR) -- $(MOCHA_OPTS) $(TEST_FILES) || $(MOCHA) $(MOCHA_OPTS) $(TEST_FILES) +unit-test: $(SRC_FILES) $(TEST_FILES) node_modules | $(BUILD_DIR) + $(NYC) $(MOCHA) --dir $(COVERAGE_DIR) -- $(MOCHA_OPTS) $(TEST_FILES) || $(MOCHA) $(MOCHA_OPTS) $(TEST_FILES) browser-test: $(BUILD_DIR)/$(MOD).js $(BUILD_DIR)/$(MOD).core.js - -$(KARMA) start --single-run $(KARMA_OPTS) - -$(KARMA) start karma.core.conf.js --single-run $(KARMA_OPTS) + $(KARMA) start --single-run $(KARMA_OPTS) + $(KARMA) start karma.core.conf.js --single-run $(KARMA_OPTS) bower.json: package.json src/release/make-bower.json.js @src/release/make-bower.json.js > $@ -# index.js still uses require! -index.js: convert - lint: @$(JSHINT) $(JSHINT_OPTS) $(filter-out node_modules, $?) - @$(ESLINT) $(MJS_FILES) $(TEST_FILES) + @$(ESLINT) $(SRC_FILES) $(TEST_FILES) -$(BUILD_DIR)/$(MOD).js: index.js $(CJS_FILES) | unit-test +$(BUILD_DIR)/$(MOD).js: index.js $(SRC_FILES) | unit-test @$(BROWSERIFY) $< > $@ -s graphlib $(BUILD_DIR)/$(MOD).min.js: $(BUILD_DIR)/$(MOD).js @$(UGLIFY) $< --comments '@license' > $@ -$(BUILD_DIR)/$(MOD).core.js: index.js $(CJS_FILES) | unit-test +$(BUILD_DIR)/$(MOD).core.js: index.js $(SRC_FILES) | unit-test @$(BROWSERIFY) $< > $@ --no-bundle-external -s graphlib $(BUILD_DIR)/$(MOD).core.min.js: $(BUILD_DIR)/$(MOD).core.js @@ -79,7 +74,7 @@ release: dist @echo @echo Starting release... @echo - @src/release/release.sh $(MOD) dist # TODO LOOK + @src/release/release.sh $(MOD) dist clean: rm -rf $(BUILD_DIR) @@ -87,11 +82,3 @@ clean: node_modules: package.json @$(NPM) install @touch $@ - -lib/%.js: mjs-lib/%.js - npx babel "$<" -o "$@" - -convert-clean: - rsync --existing --ignore-existing --delete -r mjs-lib/ lib/ - -convert: convert-clean $(CJS_FILES) diff --git a/lib/alg/components.js b/lib/alg/components.js index 9490ff9b..deeb85ed 100644 --- a/lib/alg/components.js +++ b/lib/alg/components.js @@ -1,13 +1,10 @@ -"use strict"; +module.exports = components; -Object.defineProperty(exports, "__esModule", { - value: true -}); -exports.default = components; function components(g) { var visited = {}; var cmpts = []; var cmpt; + function dfs(v) { if (visited.hasOwnProperty(v)) return; visited[v] = true; @@ -15,13 +12,14 @@ function components(g) { g.successors(v).forEach(dfs); g.predecessors(v).forEach(dfs); } - g.nodes().forEach(function (v) { + + g.nodes().forEach(function(v) { cmpt = []; dfs(v); if (cmpt.length) { cmpts.push(cmpt); } }); + return cmpts; } -module.exports = exports.default; diff --git a/lib/alg/dfs.js b/lib/alg/dfs.js index 4608cd0b..34a323cb 100644 --- a/lib/alg/dfs.js +++ b/lib/alg/dfs.js @@ -1,9 +1,5 @@ -"use strict"; +module.exports = dfs; -Object.defineProperty(exports, "__esModule", { - value: true -}); -exports.default = dfs; /* * A helper that preforms a pre- or post-order traversal on the input graph * and returns the nodes in the order they were visited. If the graph is @@ -16,18 +12,23 @@ function dfs(g, vs, order) { if (!Array.isArray(vs)) { vs = [vs]; } + var navigation = g.isDirected() ? v => g.successors(v) : v => g.neighbors(v); var orderFunc = order === "post" ? postOrderDfs : preOrderDfs; + var acc = []; var visited = {}; vs.forEach(v => { if (!g.hasNode(v)) { throw new Error("Graph does not have node: " + v); } + orderFunc(v, navigation, visited, acc); }); + return acc; } + function postOrderDfs(v, navigation, visited, acc) { var stack = [[v, false]]; while (stack.length > 0) { @@ -43,6 +44,7 @@ function postOrderDfs(v, navigation, visited, acc) { } } } + function preOrderDfs(v, navigation, visited, acc) { var stack = [v]; while (stack.length > 0) { @@ -54,11 +56,12 @@ function preOrderDfs(v, navigation, visited, acc) { } } } + function forEachRight(array, iteratee) { var length = array.length; while (length--) { iteratee(array[length], length, array); } + return array; } -module.exports = exports.default; diff --git a/lib/alg/dijkstra-all.js b/lib/alg/dijkstra-all.js index fbd0fac6..6c5d4b3b 100644 --- a/lib/alg/dijkstra-all.js +++ b/lib/alg/dijkstra-all.js @@ -1,15 +1,10 @@ -"use strict"; +var dijkstra = require("./dijkstra"); + +module.exports = dijkstraAll; -Object.defineProperty(exports, "__esModule", { - value: true -}); -exports.default = dijkstraAll; -var _dijkstra = _interopRequireDefault(require("./dijkstra.js")); -function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function dijkstraAll(g, weightFunc, edgeFunc) { - return g.nodes().reduce(function (acc, v) { - acc[v] = (0, _dijkstra.default)(g, v, weightFunc, edgeFunc); + return g.nodes().reduce(function(acc, v) { + acc[v] = dijkstra(g, v, weightFunc, edgeFunc); return acc; }, {}); } -module.exports = exports.default; diff --git a/lib/alg/dijkstra.js b/lib/alg/dijkstra.js index d705ffae..4b74a2dd 100644 --- a/lib/alg/dijkstra.js +++ b/lib/alg/dijkstra.js @@ -1,50 +1,53 @@ -"use strict"; - -Object.defineProperty(exports, "__esModule", { - value: true -}); -exports.default = dijkstra; -var _priorityQueue = _interopRequireDefault(require("../data/priority-queue.js")); -function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } +var PriorityQueue = require("../data/priority-queue"); + +module.exports = dijkstra; + var DEFAULT_WEIGHT_FUNC = () => 1; + function dijkstra(g, source, weightFn, edgeFn) { - return runDijkstra(g, String(source), weightFn || DEFAULT_WEIGHT_FUNC, edgeFn || function (v) { - return g.outEdges(v); - }); + return runDijkstra(g, String(source), + weightFn || DEFAULT_WEIGHT_FUNC, + edgeFn || function(v) { return g.outEdges(v); }); } + function runDijkstra(g, source, weightFn, edgeFn) { var results = {}; - var pq = new _priorityQueue.default(); + var pq = new PriorityQueue(); var v, vEntry; - var updateNeighbors = function (edge) { + + var updateNeighbors = function(edge) { var w = edge.v !== v ? edge.v : edge.w; var wEntry = results[w]; var weight = weightFn(edge); var distance = vEntry.distance + weight; + if (weight < 0) { - throw new Error("dijkstra does not allow negative edge weights. " + "Bad edge: " + edge + " Weight: " + weight); + throw new Error("dijkstra does not allow negative edge weights. " + + "Bad edge: " + edge + " Weight: " + weight); } + if (distance < wEntry.distance) { wEntry.distance = distance; wEntry.predecessor = v; pq.decrease(w, distance); } }; - g.nodes().forEach(function (v) { + + g.nodes().forEach(function(v) { var distance = v === source ? 0 : Number.POSITIVE_INFINITY; - results[v] = { - distance: distance - }; + results[v] = { distance: distance }; pq.add(v, distance); }); + while (pq.size() > 0) { v = pq.removeMin(); vEntry = results[v]; if (vEntry.distance === Number.POSITIVE_INFINITY) { break; } + edgeFn(v).forEach(updateNeighbors); } + return results; } -module.exports = exports.default; diff --git a/lib/alg/find-cycles.js b/lib/alg/find-cycles.js index 21e6fff8..95df84f6 100644 --- a/lib/alg/find-cycles.js +++ b/lib/alg/find-cycles.js @@ -1,14 +1,9 @@ -"use strict"; +var tarjan = require("./tarjan"); + +module.exports = findCycles; -Object.defineProperty(exports, "__esModule", { - value: true -}); -exports.default = findCycles; -var _tarjan = _interopRequireDefault(require("./tarjan.js")); -function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function findCycles(g) { - return (0, _tarjan.default)(g).filter(function (cmpt) { - return cmpt.length > 1 || cmpt.length === 1 && g.hasEdge(cmpt[0], cmpt[0]); + return tarjan(g).filter(function(cmpt) { + return cmpt.length > 1 || (cmpt.length === 1 && g.hasEdge(cmpt[0], cmpt[0])); }); } -module.exports = exports.default; diff --git a/lib/alg/floyd-warshall.js b/lib/alg/floyd-warshall.js index f8a66b0a..c2f3ae21 100644 --- a/lib/alg/floyd-warshall.js +++ b/lib/alg/floyd-warshall.js @@ -1,44 +1,37 @@ -"use strict"; +module.exports = floydWarshall; -Object.defineProperty(exports, "__esModule", { - value: true -}); -exports.default = floydWarshall; var DEFAULT_WEIGHT_FUNC = () => 1; + function floydWarshall(g, weightFn, edgeFn) { - return runFloydWarshall(g, weightFn || DEFAULT_WEIGHT_FUNC, edgeFn || function (v) { - return g.outEdges(v); - }); + return runFloydWarshall(g, + weightFn || DEFAULT_WEIGHT_FUNC, + edgeFn || function(v) { return g.outEdges(v); }); } + function runFloydWarshall(g, weightFn, edgeFn) { var results = {}; var nodes = g.nodes(); - nodes.forEach(function (v) { + + nodes.forEach(function(v) { results[v] = {}; - results[v][v] = { - distance: 0 - }; - nodes.forEach(function (w) { + results[v][v] = { distance: 0 }; + nodes.forEach(function(w) { if (v !== w) { - results[v][w] = { - distance: Number.POSITIVE_INFINITY - }; + results[v][w] = { distance: Number.POSITIVE_INFINITY }; } }); - edgeFn(v).forEach(function (edge) { + edgeFn(v).forEach(function(edge) { var w = edge.v === v ? edge.w : edge.v; var d = weightFn(edge); - results[v][w] = { - distance: d, - predecessor: v - }; + results[v][w] = { distance: d, predecessor: v }; }); }); - nodes.forEach(function (k) { + + nodes.forEach(function(k) { var rowK = results[k]; - nodes.forEach(function (i) { + nodes.forEach(function(i) { var rowI = results[i]; - nodes.forEach(function (j) { + nodes.forEach(function(j) { var ik = rowI[k]; var kj = rowK[j]; var ij = rowI[j]; @@ -50,6 +43,6 @@ function runFloydWarshall(g, weightFn, edgeFn) { }); }); }); + return results; } -module.exports = exports.default; diff --git a/lib/alg/index.js b/lib/alg/index.js index 5f3b1e7c..2c3d76f2 100644 --- a/lib/alg/index.js +++ b/lib/alg/index.js @@ -1,83 +1,13 @@ -"use strict"; - -Object.defineProperty(exports, "__esModule", { - value: true -}); -Object.defineProperty(exports, "components", { - enumerable: true, - get: function () { - return _components.default; - } -}); -Object.defineProperty(exports, "dijkstra", { - enumerable: true, - get: function () { - return _dijkstra.default; - } -}); -Object.defineProperty(exports, "dijkstraAll", { - enumerable: true, - get: function () { - return _dijkstraAll.default; - } -}); -Object.defineProperty(exports, "findCycles", { - enumerable: true, - get: function () { - return _findCycles.default; - } -}); -Object.defineProperty(exports, "floydWarshall", { - enumerable: true, - get: function () { - return _floydWarshall.default; - } -}); -Object.defineProperty(exports, "isAcyclic", { - enumerable: true, - get: function () { - return _isAcyclic.default; - } -}); -Object.defineProperty(exports, "postorder", { - enumerable: true, - get: function () { - return _postorder.default; - } -}); -Object.defineProperty(exports, "preorder", { - enumerable: true, - get: function () { - return _preorder.default; - } -}); -Object.defineProperty(exports, "prim", { - enumerable: true, - get: function () { - return _prim.default; - } -}); -Object.defineProperty(exports, "tarjan", { - enumerable: true, - get: function () { - return _tarjan.default; - } -}); -Object.defineProperty(exports, "topsort", { - enumerable: true, - get: function () { - return _topsort.default; - } -}); -var _components = _interopRequireDefault(require("./components.js")); -var _dijkstra = _interopRequireDefault(require("./dijkstra.js")); -var _dijkstraAll = _interopRequireDefault(require("./dijkstra-all.js")); -var _findCycles = _interopRequireDefault(require("./find-cycles.js")); -var _floydWarshall = _interopRequireDefault(require("./floyd-warshall.js")); -var _isAcyclic = _interopRequireDefault(require("./is-acyclic.js")); -var _postorder = _interopRequireDefault(require("./postorder.js")); -var _preorder = _interopRequireDefault(require("./preorder.js")); -var _prim = _interopRequireDefault(require("./prim.js")); -var _tarjan = _interopRequireDefault(require("./tarjan.js")); -var _topsort = _interopRequireDefault(require("./topsort.js")); -function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } +module.exports = { + components: require("./components"), + dijkstra: require("./dijkstra"), + dijkstraAll: require("./dijkstra-all"), + findCycles: require("./find-cycles"), + floydWarshall: require("./floyd-warshall"), + isAcyclic: require("./is-acyclic"), + postorder: require("./postorder"), + preorder: require("./preorder"), + prim: require("./prim"), + tarjan: require("./tarjan"), + topsort: require("./topsort") +}; diff --git a/lib/alg/is-acyclic.js b/lib/alg/is-acyclic.js index 0d82c22a..eff4ef0b 100644 --- a/lib/alg/is-acyclic.js +++ b/lib/alg/is-acyclic.js @@ -1,20 +1,15 @@ -"use strict"; +var topsort = require("./topsort"); + +module.exports = isAcyclic; -Object.defineProperty(exports, "__esModule", { - value: true -}); -exports.default = isAcyclic; -var _topsort = _interopRequireDefault(require("./topsort.js")); -function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function isAcyclic(g) { try { - (0, _topsort.default)(g); + topsort(g); } catch (e) { - if (e instanceof _topsort.default.CycleException) { + if (e instanceof topsort.CycleException) { return false; } throw e; } return true; } -module.exports = exports.default; diff --git a/lib/alg/postorder.js b/lib/alg/postorder.js index ef8686eb..1d82313f 100644 --- a/lib/alg/postorder.js +++ b/lib/alg/postorder.js @@ -1,12 +1,7 @@ -"use strict"; +var dfs = require("./dfs"); + +module.exports = postorder; -Object.defineProperty(exports, "__esModule", { - value: true -}); -exports.default = postorder; -var _dfs = _interopRequireDefault(require("./dfs.js")); -function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function postorder(g, vs) { - return (0, _dfs.default)(g, vs, "post"); + return dfs(g, vs, "post"); } -module.exports = exports.default; diff --git a/lib/alg/preorder.js b/lib/alg/preorder.js index b688d506..cf333cd8 100644 --- a/lib/alg/preorder.js +++ b/lib/alg/preorder.js @@ -1,12 +1,7 @@ -"use strict"; +var dfs = require("./dfs"); + +module.exports = preorder; -Object.defineProperty(exports, "__esModule", { - value: true -}); -exports.default = preorder; -var _dfs = _interopRequireDefault(require("./dfs.js")); -function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function preorder(g, vs) { - return (0, _dfs.default)(g, vs, "pre"); + return dfs(g, vs, "pre"); } -module.exports = exports.default; diff --git a/lib/alg/prim.js b/lib/alg/prim.js index e00cde23..72fcd841 100644 --- a/lib/alg/prim.js +++ b/lib/alg/prim.js @@ -1,17 +1,14 @@ -"use strict"; - -Object.defineProperty(exports, "__esModule", { - value: true -}); -exports.default = prim; -var _graph = _interopRequireDefault(require("../graph.js")); -var _priorityQueue = _interopRequireDefault(require("../data/priority-queue.js")); -function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } +var Graph = require("../graph"); +var PriorityQueue = require("../data/priority-queue"); + +module.exports = prim; + function prim(g, weightFunc) { - var result = new _graph.default(); + var result = new Graph(); var parents = {}; - var pq = new _priorityQueue.default(); + var pq = new PriorityQueue(); var v; + function updateNeighbors(edge) { var w = edge.v === v ? edge.w : edge.v; var pri = pq.priority(w); @@ -23,16 +20,19 @@ function prim(g, weightFunc) { } } } + if (g.nodeCount() === 0) { return result; } - g.nodes().forEach(function (v) { + + g.nodes().forEach(function(v) { pq.add(v, Number.POSITIVE_INFINITY); result.setNode(v); }); // Start from an arbitrary node pq.decrease(g.nodes()[0], 0); + var init = false; while (pq.size() > 0) { v = pq.removeMin(); @@ -43,8 +43,9 @@ function prim(g, weightFunc) { } else { init = true; } + g.nodeEdges(v).forEach(updateNeighbors); } + return result; } -module.exports = exports.default; diff --git a/lib/alg/tarjan.js b/lib/alg/tarjan.js index eb47566e..c00eeba7 100644 --- a/lib/alg/tarjan.js +++ b/lib/alg/tarjan.js @@ -1,14 +1,11 @@ -"use strict"; +module.exports = tarjan; -Object.defineProperty(exports, "__esModule", { - value: true -}); -exports.default = tarjan; function tarjan(g) { var index = 0; var stack = []; var visited = {}; // node id -> { onStack, lowlink, index } var results = []; + function dfs(v) { var entry = visited[v] = { onStack: true, @@ -16,7 +13,8 @@ function tarjan(g) { index: index++ }; stack.push(v); - g.successors(v).forEach(function (w) { + + g.successors(v).forEach(function(w) { if (!visited.hasOwnProperty(w)) { dfs(w); entry.lowlink = Math.min(entry.lowlink, visited[w].lowlink); @@ -24,6 +22,7 @@ function tarjan(g) { entry.lowlink = Math.min(entry.lowlink, visited[w].index); } }); + if (entry.lowlink === entry.index) { var cmpt = []; var w; @@ -35,11 +34,12 @@ function tarjan(g) { results.push(cmpt); } } - g.nodes().forEach(function (v) { + + g.nodes().forEach(function(v) { if (!visited.hasOwnProperty(v)) { dfs(v); } }); + return results; } -module.exports = exports.default; diff --git a/lib/alg/topsort.js b/lib/alg/topsort.js index a37f0106..5986ce02 100644 --- a/lib/alg/topsort.js +++ b/lib/alg/topsort.js @@ -1,17 +1,13 @@ -"use strict"; - -Object.defineProperty(exports, "__esModule", { - value: true -}); -exports.default = topsort; function topsort(g) { var visited = {}; var stack = {}; var results = []; + function visit(node) { if (stack.hasOwnProperty(node)) { throw new CycleException(); } + if (!visited.hasOwnProperty(node)) { stack[node] = true; visited[node] = true; @@ -20,16 +16,21 @@ function topsort(g) { results.push(node); } } + g.sinks().forEach(visit); + if (Object.keys(visited).length !== g.nodeCount()) { throw new CycleException(); } + return results; } + class CycleException extends Error { constructor() { super(...arguments); } } + +module.exports = topsort; topsort.CycleException = CycleException; -module.exports = exports.default; diff --git a/lib/data/priority-queue.js b/lib/data/priority-queue.js index 9c260495..1a411fff 100644 --- a/lib/data/priority-queue.js +++ b/lib/data/priority-queue.js @@ -1,9 +1,3 @@ -"use strict"; - -Object.defineProperty(exports, "__esModule", { - value: true -}); -exports.default = void 0; /** * A min-priority queue data structure. This algorithm is derived from Cormen, * et al., "Introduction to Algorithms". The basic idea of a min-priority @@ -26,9 +20,7 @@ class PriorityQueue { * Returns the keys that are in the queue. Takes `O(n)` time. */ keys() { - return this.#arr.map(function (x) { - return x.key; - }); + return this.#arr.map(function(x) { return x.key; }); } /** @@ -77,10 +69,7 @@ class PriorityQueue { var arr = this.#arr; var index = arr.length; keyIndices[key] = index; - arr.push({ - key: key, - priority: priority - }); + arr.push({key: key, priority: priority}); this.#decrease(index); return true; } @@ -108,11 +97,13 @@ class PriorityQueue { decrease(key, priority) { var index = this.#keyIndices[key]; if (priority > this.#arr[index].priority) { - throw new Error("New priority is greater than current priority. " + "Key: " + key + " Old: " + this.#arr[index].priority + " New: " + priority); + throw new Error("New priority is greater than current priority. " + + "Key: " + key + " Old: " + this.#arr[index].priority + " New: " + priority); } this.#arr[index].priority = priority; this.#decrease(index); } + #heapify(i) { var arr = this.#arr; var l = 2 * i; @@ -129,6 +120,7 @@ class PriorityQueue { } } } + #decrease(index) { var arr = this.#arr; var priority = arr[index].priority; @@ -142,6 +134,7 @@ class PriorityQueue { index = parent; } } + #swap(i, j) { var arr = this.#arr; var keyIndices = this.#keyIndices; @@ -153,5 +146,5 @@ class PriorityQueue { keyIndices[origArrI.key] = j; } } -exports.default = PriorityQueue; -module.exports = exports.default; + +module.exports = PriorityQueue; diff --git a/lib/graph.js b/lib/graph.js index 1fa7f9cf..0b466cd3 100644 --- a/lib/graph.js +++ b/lib/graph.js @@ -1,9 +1,5 @@ "use strict"; -Object.defineProperty(exports, "__esModule", { - value: true -}); -exports.default = void 0; var DEFAULT_EDGE_NAME = "\x00"; var GRAPH_NODE = "\x00"; var EDGE_KEY_DELIM = "\x01"; @@ -58,14 +54,18 @@ class Graph { /* Number of edges in the graph. Should only be changed by the implementation. */ #edgeCount = 0; + #parent; + #children; + constructor(opts) { if (opts) { this.#isDirected = opts.hasOwnProperty("directed") ? opts.directed : true; this.#isMultigraph = opts.hasOwnProperty("multigraph") ? opts.multigraph : false; this.#isCompound = opts.hasOwnProperty("compound") ? opts.compound : false; } + if (this.#isCompound) { // v -> parent this.#parent = {}; @@ -114,6 +114,7 @@ class Graph { return this.#label; } + /* === Node functions ========== */ /** @@ -128,6 +129,7 @@ class Graph { if (typeof newDefault !== 'function') { this.#defaultNodeLabelFn = () => newDefault; } + return this; } @@ -173,7 +175,7 @@ class Graph { setNodes(vs, value) { var args = arguments; var self = this; - vs.forEach(function (v) { + vs.forEach(function(v) { if (args.length > 1) { self.setNode(v, value); } else { @@ -196,6 +198,7 @@ class Graph { } return this; } + this.#nodes[v] = arguments.length > 1 ? value : this.#defaultNodeLabelFn(v); if (this.#isCompound) { this.#parent[v] = GRAPH_NODE; @@ -239,7 +242,7 @@ class Graph { if (this.#isCompound) { this.#removeFromParentsChildList(v); delete this.#parent[v]; - this.children(v).forEach(function (child) { + this.children(v).forEach(function(child) { self.setParent(child); }); delete this.#children[v]; @@ -265,6 +268,7 @@ class Graph { if (!this.#isCompound) { throw new Error("Cannot set parent in a non-compound graph"); } + if (parent === undefined) { parent = GRAPH_NODE; } else { @@ -272,17 +276,21 @@ class Graph { parent += ""; for (var ancestor = parent; ancestor !== undefined; ancestor = this.parent(ancestor)) { if (ancestor === v) { - throw new Error("Setting " + parent + " as parent of " + v + " would create a cycle"); + throw new Error("Setting " + parent+ " as parent of " + v + + " would create a cycle"); } } + this.setNode(parent); } + this.setNode(v); this.#removeFromParentsChildList(v); this.#parent[v] = parent; this.#children[parent][v] = true; return this; } + #removeFromParentsChildList(v) { delete this.#children[this.#parent[v]][v]; } @@ -353,9 +361,11 @@ class Graph { for (var succ of this.successors(v)) { union.add(succ); } + return Array.from(union.values()); } } + isLeaf(v) { var neighbors; if (this.isDirected()) { @@ -378,18 +388,22 @@ class Graph { multigraph: this.#isMultigraph, compound: this.#isCompound }); + copy.setGraph(this.graph()); + var self = this; - Object.entries(this.#nodes).forEach(function ([v, value]) { + Object.entries(this.#nodes).forEach(function([v, value]) { if (filter(v)) { copy.setNode(v, value); } }); - Object.values(this.#edgeObjs).forEach(function (e) { + + Object.values(this.#edgeObjs).forEach(function(e) { if (copy.hasNode(e.v) && copy.hasNode(e.w)) { copy.setEdge(e, self.edge(e)); } }); + var parents = {}; function findParent(v) { var parent = self.parent(v); @@ -402,9 +416,11 @@ class Graph { return findParent(parent); } } + if (this.#isCompound) { copy.nodes().forEach(v => copy.setParent(v, findParent(v))); } + return copy; } @@ -422,6 +438,7 @@ class Graph { if (typeof newDefault !== 'function') { this.#defaultEdgeLabelFn = () => newDefault; } + return this; } @@ -450,7 +467,7 @@ class Graph { setPath(vs, value) { var self = this; var args = arguments; - vs.reduce(function (v, w) { + vs.reduce(function(v, w) { if (args.length > 1) { self.setEdge(v, w, value); } else { @@ -471,6 +488,7 @@ class Graph { var v, w, name, value; var valueSpecified = false; var arg0 = arguments[0]; + if (typeof arg0 === "object" && arg0 !== null && "v" in arg0) { v = arg0.v; w = arg0.w; @@ -488,11 +506,13 @@ class Graph { valueSpecified = true; } } + v = "" + v; w = "" + w; if (name !== undefined) { name = "" + name; } + var e = edgeArgsToId(this.#isDirected, v, w, name); if (this.#edgeLabels.hasOwnProperty(e)) { if (valueSpecified) { @@ -500,6 +520,7 @@ class Graph { } return this; } + if (name !== undefined && !this.#isMultigraph) { throw new Error("Cannot set a named edge when isMultigraph = false"); } @@ -508,11 +529,14 @@ class Graph { // First ensure the nodes exist. this.setNode(v); this.setNode(w); + this.#edgeLabels[e] = valueSpecified ? value : this.#defaultEdgeLabelFn(v, w, name); + var edgeObj = edgeArgsToObj(this.#isDirected, v, w, name); // Ensure we add undirected edges in a consistent way. v = edgeObj.v; w = edgeObj.w; + Object.freeze(edgeObj); this.#edgeObjs[e] = edgeObj; incrementOrInitEntry(this.#preds[w], v); @@ -528,7 +552,9 @@ class Graph { * Complexity: O(1). */ edge(v, w, name) { - var e = arguments.length === 1 ? edgeObjToId(this.#isDirected, arguments[0]) : edgeArgsToId(this.#isDirected, v, w, name); + var e = (arguments.length === 1 + ? edgeObjToId(this.#isDirected, arguments[0]) + : edgeArgsToId(this.#isDirected, v, w, name)); return this.#edgeLabels[e]; } @@ -539,10 +565,9 @@ class Graph { edgeAsObj() { const edge = this.edge(...arguments); if (typeof edge !== "object") { - return { - label: edge - }; + return {label: edge}; } + return edge; } @@ -551,7 +576,9 @@ class Graph { * Complexity: O(1). */ hasEdge(v, w, name) { - var e = arguments.length === 1 ? edgeObjToId(this.#isDirected, arguments[0]) : edgeArgsToId(this.#isDirected, v, w, name); + var e = (arguments.length === 1 + ? edgeObjToId(this.#isDirected, arguments[0]) + : edgeArgsToId(this.#isDirected, v, w, name)); return this.#edgeLabels.hasOwnProperty(e); } @@ -560,7 +587,9 @@ class Graph { * Complexity: O(1). */ removeEdge(v, w, name) { - var e = arguments.length === 1 ? edgeObjToId(this.#isDirected, arguments[0]) : edgeArgsToId(this.#isDirected, v, w, name); + var e = (arguments.length === 1 + ? edgeObjToId(this.#isDirected, arguments[0]) + : edgeArgsToId(this.#isDirected, v, w, name)); var edge = this.#edgeObjs[e]; if (edge) { v = edge.v; @@ -620,7 +649,7 @@ class Graph { } } } -exports.default = Graph; + function incrementOrInitEntry(map, k) { if (map[k]) { map[k]++; @@ -628,11 +657,11 @@ function incrementOrInitEntry(map, k) { map[k] = 1; } } + function decrementOrRemoveEntry(map, k) { - if (! --map[k]) { - delete map[k]; - } + if (!--map[k]) { delete map[k]; } } + function edgeArgsToId(isDirected, v_, w_, name) { var v = "" + v_; var w = "" + w_; @@ -641,8 +670,10 @@ function edgeArgsToId(isDirected, v_, w_, name) { v = w; w = tmp; } - return v + EDGE_KEY_DELIM + w + EDGE_KEY_DELIM + (name === undefined ? DEFAULT_EDGE_NAME : name); + return v + EDGE_KEY_DELIM + w + EDGE_KEY_DELIM + + (name === undefined ? DEFAULT_EDGE_NAME : name); } + function edgeArgsToObj(isDirected, v_, w_, name) { var v = "" + v_; var w = "" + w_; @@ -651,16 +682,15 @@ function edgeArgsToObj(isDirected, v_, w_, name) { v = w; w = tmp; } - var edgeObj = { - v: v, - w: w - }; + var edgeObj = { v: v, w: w }; if (name) { edgeObj.name = name; } return edgeObj; } + function edgeObjToId(isDirected, edgeObj) { return edgeArgsToId(isDirected, edgeObj.v, edgeObj.w, edgeObj.name); } -module.exports = exports.default; + +module.exports = Graph; diff --git a/lib/index.js b/lib/index.js index 0e5945f0..756e0ab6 100644 --- a/lib/index.js +++ b/lib/index.js @@ -1,27 +1,5 @@ -"use strict"; - -Object.defineProperty(exports, "__esModule", { - value: true -}); -Object.defineProperty(exports, "Graph", { - enumerable: true, - get: function () { - return _graph.default; - } -}); -exports.json = exports.alg = void 0; -Object.defineProperty(exports, "version", { - enumerable: true, - get: function () { - return _version.default; - } -}); -var _graph = _interopRequireDefault(require("./graph.js")); -var _version = _interopRequireDefault(require("./version.js")); -var _json = _interopRequireWildcard(require("./json.js")); -exports.json = _json; -var _alg = _interopRequireWildcard(require("./alg/index.js")); -exports.alg = _alg; -function _getRequireWildcardCache(e) { if ("function" != typeof WeakMap) return null; var r = new WeakMap(), t = new WeakMap(); return (_getRequireWildcardCache = function (e) { return e ? t : r; })(e); } -function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e; if (null === e || "object" != typeof e && "function" != typeof e) return { default: e }; var t = _getRequireWildcardCache(r); if (t && t.has(e)) return t.get(e); var n = { __proto__: null }, a = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var u in e) if ("default" !== u && Object.prototype.hasOwnProperty.call(e, u)) { var i = a ? Object.getOwnPropertyDescriptor(e, u) : null; i && (i.get || i.set) ? Object.defineProperty(n, u, i) : n[u] = e[u]; } return n.default = e, t && t.set(e, n), n; } -function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } +// Includes only the "core" of graphlib +module.exports = { + Graph: require("./graph"), + version: require("./version") +}; diff --git a/lib/json.js b/lib/json.js index f9975564..ac0c2417 100644 --- a/lib/json.js +++ b/lib/json.js @@ -1,12 +1,10 @@ -"use strict"; +var Graph = require("./graph"); + +module.exports = { + write: write, + read: read +}; -Object.defineProperty(exports, "__esModule", { - value: true -}); -exports.read = read; -exports.write = write; -var _graph = _interopRequireDefault(require("./graph.js")); -function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } /** * Creates a JSON representation of the graph that can be serialized to a string with * JSON.stringify. The graph can later be restored using json.read. @@ -21,18 +19,18 @@ function write(g) { nodes: writeNodes(g), edges: writeEdges(g) }; + if (g.graph() !== undefined) { json.value = structuredClone(g.graph()); } return json; } + function writeNodes(g) { - return g.nodes().map(function (v) { + return g.nodes().map(function(v) { var nodeValue = g.node(v); var parent = g.parent(v); - var node = { - v: v - }; + var node = { v: v }; if (nodeValue !== undefined) { node.value = nodeValue; } @@ -42,13 +40,11 @@ function writeNodes(g) { return node; }); } + function writeEdges(g) { - return g.edges().map(function (e) { + return g.edges().map(function(e) { var edgeValue = g.edge(e); - var edge = { - v: e.v, - w: e.w - }; + var edge = { v: e.v, w: e.w }; if (e.name !== undefined) { edge.name = e.name; } @@ -70,19 +66,15 @@ function writeEdges(g) { * // [ { v: 'a', w: 'b' } ] */ function read(json) { - var g = new _graph.default(json.options).setGraph(json.value); - json.nodes.forEach(function (entry) { + var g = new Graph(json.options).setGraph(json.value); + json.nodes.forEach(function(entry) { g.setNode(entry.v, entry.value); if (entry.parent) { g.setParent(entry.v, entry.parent); } }); - json.edges.forEach(function (entry) { - g.setEdge({ - v: entry.v, - w: entry.w, - name: entry.name - }, entry.value); + json.edges.forEach(function(entry) { + g.setEdge({ v: entry.v, w: entry.w, name: entry.name }, entry.value); }); return g; } diff --git a/lib/version.js b/lib/version.js index 8e28d935..cf694a31 100644 --- a/lib/version.js +++ b/lib/version.js @@ -1,8 +1 @@ -"use strict"; - -Object.defineProperty(exports, "__esModule", { - value: true -}); -exports.default = void 0; -var _default = exports.default = '2.2.1-pre'; -module.exports = exports.default; +module.exports = '2.2.1-pre'; diff --git a/mjs-lib/alg/components.js b/mjs-lib/alg/components.js deleted file mode 100644 index 766cdad6..00000000 --- a/mjs-lib/alg/components.js +++ /dev/null @@ -1,23 +0,0 @@ -export default function components(g) { - var visited = {}; - var cmpts = []; - var cmpt; - - function dfs(v) { - if (visited.hasOwnProperty(v)) return; - visited[v] = true; - cmpt.push(v); - g.successors(v).forEach(dfs); - g.predecessors(v).forEach(dfs); - } - - g.nodes().forEach(function(v) { - cmpt = []; - dfs(v); - if (cmpt.length) { - cmpts.push(cmpt); - } - }); - - return cmpts; -} diff --git a/mjs-lib/alg/dfs.js b/mjs-lib/alg/dfs.js deleted file mode 100644 index d109bbf0..00000000 --- a/mjs-lib/alg/dfs.js +++ /dev/null @@ -1,65 +0,0 @@ -/* - * A helper that preforms a pre- or post-order traversal on the input graph - * and returns the nodes in the order they were visited. If the graph is - * undirected then this algorithm will navigate using neighbors. If the graph - * is directed then this algorithm will navigate using successors. - * - * If the order is not "post", it will be treated as "pre". - */ -export default function dfs(g, vs, order) { - if (!Array.isArray(vs)) { - vs = [vs]; - } - - var navigation = g.isDirected() ? v => g.successors(v) : v => g.neighbors(v); - var orderFunc = order === "post" ? postOrderDfs : preOrderDfs; - - var acc = []; - var visited = {}; - vs.forEach(v => { - if (!g.hasNode(v)) { - throw new Error("Graph does not have node: " + v); - } - - orderFunc(v, navigation, visited, acc); - }); - - return acc; -} - -function postOrderDfs(v, navigation, visited, acc) { - var stack = [[v, false]]; - while (stack.length > 0) { - var curr = stack.pop(); - if (curr[1]) { - acc.push(curr[0]); - } else { - if (!visited.hasOwnProperty(curr[0])) { - visited[curr[0]] = true; - stack.push([curr[0], true]); - forEachRight(navigation(curr[0]), w => stack.push([w, false])); - } - } - } -} - -function preOrderDfs(v, navigation, visited, acc) { - var stack = [v]; - while (stack.length > 0) { - var curr = stack.pop(); - if (!visited.hasOwnProperty(curr)) { - visited[curr] = true; - acc.push(curr); - forEachRight(navigation(curr), w => stack.push(w)); - } - } -} - -function forEachRight(array, iteratee) { - var length = array.length; - while (length--) { - iteratee(array[length], length, array); - } - - return array; -} diff --git a/mjs-lib/alg/dijkstra-all.js b/mjs-lib/alg/dijkstra-all.js deleted file mode 100644 index ef827bce..00000000 --- a/mjs-lib/alg/dijkstra-all.js +++ /dev/null @@ -1,9 +0,0 @@ -import { default as dijkstra } from "./dijkstra.js"; - - -export default function dijkstraAll(g, weightFunc, edgeFunc) { - return g.nodes().reduce(function(acc, v) { - acc[v] = dijkstra(g, v, weightFunc, edgeFunc); - return acc; - }, {}); -} diff --git a/mjs-lib/alg/dijkstra.js b/mjs-lib/alg/dijkstra.js deleted file mode 100644 index ec646c3f..00000000 --- a/mjs-lib/alg/dijkstra.js +++ /dev/null @@ -1,52 +0,0 @@ -import { default as PriorityQueue } from "../data/priority-queue.js"; - - -var DEFAULT_WEIGHT_FUNC = () => 1; - -export default function dijkstra(g, source, weightFn, edgeFn) { - return runDijkstra(g, String(source), - weightFn || DEFAULT_WEIGHT_FUNC, - edgeFn || function(v) { return g.outEdges(v); }); -} - -function runDijkstra(g, source, weightFn, edgeFn) { - var results = {}; - var pq = new PriorityQueue(); - var v, vEntry; - - var updateNeighbors = function(edge) { - var w = edge.v !== v ? edge.v : edge.w; - var wEntry = results[w]; - var weight = weightFn(edge); - var distance = vEntry.distance + weight; - - if (weight < 0) { - throw new Error("dijkstra does not allow negative edge weights. " + - "Bad edge: " + edge + " Weight: " + weight); - } - - if (distance < wEntry.distance) { - wEntry.distance = distance; - wEntry.predecessor = v; - pq.decrease(w, distance); - } - }; - - g.nodes().forEach(function(v) { - var distance = v === source ? 0 : Number.POSITIVE_INFINITY; - results[v] = { distance: distance }; - pq.add(v, distance); - }); - - while (pq.size() > 0) { - v = pq.removeMin(); - vEntry = results[v]; - if (vEntry.distance === Number.POSITIVE_INFINITY) { - break; - } - - edgeFn(v).forEach(updateNeighbors); - } - - return results; -} diff --git a/mjs-lib/alg/find-cycles.js b/mjs-lib/alg/find-cycles.js deleted file mode 100644 index 42a37d4b..00000000 --- a/mjs-lib/alg/find-cycles.js +++ /dev/null @@ -1,7 +0,0 @@ -import { default as tarjan } from "./tarjan.js"; - -export default function findCycles(g) { - return tarjan(g).filter(function(cmpt) { - return cmpt.length > 1 || (cmpt.length === 1 && g.hasEdge(cmpt[0], cmpt[0])); - }); -} diff --git a/mjs-lib/alg/floyd-warshall.js b/mjs-lib/alg/floyd-warshall.js deleted file mode 100644 index c014b0bf..00000000 --- a/mjs-lib/alg/floyd-warshall.js +++ /dev/null @@ -1,46 +0,0 @@ -var DEFAULT_WEIGHT_FUNC = () => 1; - -export default function floydWarshall(g, weightFn, edgeFn) { - return runFloydWarshall(g, - weightFn || DEFAULT_WEIGHT_FUNC, - edgeFn || function(v) { return g.outEdges(v); }); -} - -function runFloydWarshall(g, weightFn, edgeFn) { - var results = {}; - var nodes = g.nodes(); - - nodes.forEach(function(v) { - results[v] = {}; - results[v][v] = { distance: 0 }; - nodes.forEach(function(w) { - if (v !== w) { - results[v][w] = { distance: Number.POSITIVE_INFINITY }; - } - }); - edgeFn(v).forEach(function(edge) { - var w = edge.v === v ? edge.w : edge.v; - var d = weightFn(edge); - results[v][w] = { distance: d, predecessor: v }; - }); - }); - - nodes.forEach(function(k) { - var rowK = results[k]; - nodes.forEach(function(i) { - var rowI = results[i]; - nodes.forEach(function(j) { - var ik = rowI[k]; - var kj = rowK[j]; - var ij = rowI[j]; - var altDistance = ik.distance + kj.distance; - if (altDistance < ij.distance) { - ij.distance = altDistance; - ij.predecessor = kj.predecessor; - } - }); - }); - }); - - return results; -} diff --git a/mjs-lib/alg/index.js b/mjs-lib/alg/index.js deleted file mode 100644 index e8c9abde..00000000 --- a/mjs-lib/alg/index.js +++ /dev/null @@ -1,11 +0,0 @@ -export { default as components } from "./components.js"; -export { default as dijkstra } from "./dijkstra.js"; -export { default as dijkstraAll } from "./dijkstra-all.js"; -export { default as findCycles } from "./find-cycles.js"; -export { default as floydWarshall } from "./floyd-warshall.js"; -export { default as isAcyclic } from "./is-acyclic.js"; -export { default as postorder } from "./postorder.js"; -export { default as preorder } from "./preorder.js"; -export { default as prim } from "./prim.js"; -export { default as tarjan } from "./tarjan.js"; -export { default as topsort } from "./topsort.js"; diff --git a/mjs-lib/alg/is-acyclic.js b/mjs-lib/alg/is-acyclic.js deleted file mode 100644 index e3467560..00000000 --- a/mjs-lib/alg/is-acyclic.js +++ /dev/null @@ -1,13 +0,0 @@ -import { default as topsort } from "./topsort.js"; - -export default function isAcyclic(g) { - try { - topsort(g); - } catch (e) { - if (e instanceof topsort.CycleException) { - return false; - } - throw e; - } - return true; -} diff --git a/mjs-lib/alg/postorder.js b/mjs-lib/alg/postorder.js deleted file mode 100644 index 23830a43..00000000 --- a/mjs-lib/alg/postorder.js +++ /dev/null @@ -1,5 +0,0 @@ -import { default as dfs } from "./dfs.js"; - -export default function postorder(g, vs) { - return dfs(g, vs, "post"); -} diff --git a/mjs-lib/alg/preorder.js b/mjs-lib/alg/preorder.js deleted file mode 100644 index 472ba468..00000000 --- a/mjs-lib/alg/preorder.js +++ /dev/null @@ -1,5 +0,0 @@ -import { default as dfs } from "./dfs.js"; - -export default function preorder(g, vs) { - return dfs(g, vs, "pre"); -} diff --git a/mjs-lib/alg/prim.js b/mjs-lib/alg/prim.js deleted file mode 100644 index ce22020c..00000000 --- a/mjs-lib/alg/prim.js +++ /dev/null @@ -1,49 +0,0 @@ -import { default as Graph } from "../graph.js"; -import { default as PriorityQueue } from "../data/priority-queue.js"; - -export default function prim(g, weightFunc) { - var result = new Graph(); - var parents = {}; - var pq = new PriorityQueue(); - var v; - - function updateNeighbors(edge) { - var w = edge.v === v ? edge.w : edge.v; - var pri = pq.priority(w); - if (pri !== undefined) { - var edgeWeight = weightFunc(edge); - if (edgeWeight < pri) { - parents[w] = v; - pq.decrease(w, edgeWeight); - } - } - } - - if (g.nodeCount() === 0) { - return result; - } - - g.nodes().forEach(function(v) { - pq.add(v, Number.POSITIVE_INFINITY); - result.setNode(v); - }); - - // Start from an arbitrary node - pq.decrease(g.nodes()[0], 0); - - var init = false; - while (pq.size() > 0) { - v = pq.removeMin(); - if (parents.hasOwnProperty(v)) { - result.setEdge(v, parents[v]); - } else if (init) { - throw new Error("Input graph is not connected: " + g); - } else { - init = true; - } - - g.nodeEdges(v).forEach(updateNeighbors); - } - - return result; -} diff --git a/mjs-lib/alg/tarjan.js b/mjs-lib/alg/tarjan.js deleted file mode 100644 index e38e1a34..00000000 --- a/mjs-lib/alg/tarjan.js +++ /dev/null @@ -1,43 +0,0 @@ -export default function tarjan(g) { - var index = 0; - var stack = []; - var visited = {}; // node id -> { onStack, lowlink, index } - var results = []; - - function dfs(v) { - var entry = visited[v] = { - onStack: true, - lowlink: index, - index: index++ - }; - stack.push(v); - - g.successors(v).forEach(function(w) { - if (!visited.hasOwnProperty(w)) { - dfs(w); - entry.lowlink = Math.min(entry.lowlink, visited[w].lowlink); - } else if (visited[w].onStack) { - entry.lowlink = Math.min(entry.lowlink, visited[w].index); - } - }); - - if (entry.lowlink === entry.index) { - var cmpt = []; - var w; - do { - w = stack.pop(); - visited[w].onStack = false; - cmpt.push(w); - } while (v !== w); - results.push(cmpt); - } - } - - g.nodes().forEach(function(v) { - if (!visited.hasOwnProperty(v)) { - dfs(v); - } - }); - - return results; -} diff --git a/mjs-lib/alg/topsort.js b/mjs-lib/alg/topsort.js deleted file mode 100644 index cba234ec..00000000 --- a/mjs-lib/alg/topsort.js +++ /dev/null @@ -1,35 +0,0 @@ -export default function topsort(g) { - var visited = {}; - var stack = {}; - var results = []; - - function visit(node) { - if (stack.hasOwnProperty(node)) { - throw new CycleException(); - } - - if (!visited.hasOwnProperty(node)) { - stack[node] = true; - visited[node] = true; - g.predecessors(node).forEach(visit); - delete stack[node]; - results.push(node); - } - } - - g.sinks().forEach(visit); - - if (Object.keys(visited).length !== g.nodeCount()) { - throw new CycleException(); - } - - return results; -} - -class CycleException extends Error { - constructor() { - super(...arguments); - } -} - -topsort.CycleException = CycleException; diff --git a/mjs-lib/data/priority-queue.js b/mjs-lib/data/priority-queue.js deleted file mode 100644 index 13b2b5f0..00000000 --- a/mjs-lib/data/priority-queue.js +++ /dev/null @@ -1,148 +0,0 @@ -/** - * A min-priority queue data structure. This algorithm is derived from Cormen, - * et al., "Introduction to Algorithms". The basic idea of a min-priority - * queue is that you can efficiently (in O(1) time) get the smallest key in - * the queue. Adding and removing elements takes O(log n) time. A key can - * have its priority decreased in O(log n) time. - */ -export default class PriorityQueue { - #arr = []; - #keyIndices = {}; - - /** - * Returns the number of elements in the queue. Takes `O(1)` time. - */ - size() { - return this.#arr.length; - } - - /** - * Returns the keys that are in the queue. Takes `O(n)` time. - */ - keys() { - return this.#arr.map(function(x) { return x.key; }); - } - - /** - * Returns `true` if **key** is in the queue and `false` if not. - */ - has(key) { - return this.#keyIndices.hasOwnProperty(key); - } - - /** - * Returns the priority for **key**. If **key** is not present in the queue - * then this function returns `undefined`. Takes `O(1)` time. - * - * @param {Object} key - */ - priority(key) { - var index = this.#keyIndices[key]; - if (index !== undefined) { - return this.#arr[index].priority; - } - } - - /** - * Returns the key for the minimum element in this queue. If the queue is - * empty this function throws an Error. Takes `O(1)` time. - */ - min() { - if (this.size() === 0) { - throw new Error("Queue underflow"); - } - return this.#arr[0].key; - } - - /** - * Inserts a new key into the priority queue. If the key already exists in - * the queue this function returns `false`; otherwise it will return `true`. - * Takes `O(n)` time. - * - * @param {Object} key the key to add - * @param {Number} priority the initial priority for the key - */ - add(key, priority) { - var keyIndices = this.#keyIndices; - key = String(key); - if (!keyIndices.hasOwnProperty(key)) { - var arr = this.#arr; - var index = arr.length; - keyIndices[key] = index; - arr.push({key: key, priority: priority}); - this.#decrease(index); - return true; - } - return false; - } - - /** - * Removes and returns the smallest key in the queue. Takes `O(log n)` time. - */ - removeMin() { - this.#swap(0, this.#arr.length - 1); - var min = this.#arr.pop(); - delete this.#keyIndices[min.key]; - this.#heapify(0); - return min.key; - } - - /** - * Decreases the priority for **key** to **priority**. If the new priority is - * greater than the previous priority, this function will throw an Error. - * - * @param {Object} key the key for which to raise priority - * @param {Number} priority the new priority for the key - */ - decrease(key, priority) { - var index = this.#keyIndices[key]; - if (priority > this.#arr[index].priority) { - throw new Error("New priority is greater than current priority. " + - "Key: " + key + " Old: " + this.#arr[index].priority + " New: " + priority); - } - this.#arr[index].priority = priority; - this.#decrease(index); - } - - #heapify(i) { - var arr = this.#arr; - var l = 2 * i; - var r = l + 1; - var largest = i; - if (l < arr.length) { - largest = arr[l].priority < arr[largest].priority ? l : largest; - if (r < arr.length) { - largest = arr[r].priority < arr[largest].priority ? r : largest; - } - if (largest !== i) { - this.#swap(i, largest); - this.#heapify(largest); - } - } - } - - #decrease(index) { - var arr = this.#arr; - var priority = arr[index].priority; - var parent; - while (index !== 0) { - parent = index >> 1; - if (arr[parent].priority < priority) { - break; - } - this.#swap(index, parent); - index = parent; - } - } - - #swap(i, j) { - var arr = this.#arr; - var keyIndices = this.#keyIndices; - var origArrI = arr[i]; - var origArrJ = arr[j]; - arr[i] = origArrJ; - arr[j] = origArrI; - keyIndices[origArrJ.key] = i; - keyIndices[origArrI.key] = j; - } -} diff --git a/mjs-lib/graph.js b/mjs-lib/graph.js deleted file mode 100644 index 69cefc8b..00000000 --- a/mjs-lib/graph.js +++ /dev/null @@ -1,694 +0,0 @@ -"use strict"; - -var DEFAULT_EDGE_NAME = "\x00"; -var GRAPH_NODE = "\x00"; -var EDGE_KEY_DELIM = "\x01"; - -// Implementation notes: -// -// * Node id query functions should return string ids for the nodes -// * Edge id query functions should return an "edgeObj", edge object, that is -// composed of enough information to uniquely identify an edge: {v, w, name}. -// * Internally we use an "edgeId", a stringified form of the edgeObj, to -// reference edges. This is because we need a performant way to look these -// edges up and, object properties, which have string keys, are the closest -// we're going to get to a performant hashtable in JavaScript. - -export default class Graph { - #isDirected = true; - #isMultigraph = false; - #isCompound = false; - - // Label for the graph itself - #label; - - // Defaults to be set when creating a new node - #defaultNodeLabelFn = () => undefined; - - // Defaults to be set when creating a new edge - #defaultEdgeLabelFn = () => undefined; - - // v -> label - #nodes = {}; - - // v -> edgeObj - #in = {}; - - // u -> v -> Number - #preds = {}; - - // v -> edgeObj - #out = {}; - - // v -> w -> Number - #sucs = {}; - - // e -> edgeObj - #edgeObjs = {}; - - // e -> label - #edgeLabels = {}; - - /* Number of nodes in the graph. Should only be changed by the implementation. */ - #nodeCount = 0; - - /* Number of edges in the graph. Should only be changed by the implementation. */ - #edgeCount = 0; - - #parent; - - #children; - - constructor(opts) { - if (opts) { - this.#isDirected = opts.hasOwnProperty("directed") ? opts.directed : true; - this.#isMultigraph = opts.hasOwnProperty("multigraph") ? opts.multigraph : false; - this.#isCompound = opts.hasOwnProperty("compound") ? opts.compound : false; - } - - if (this.#isCompound) { - // v -> parent - this.#parent = {}; - - // v -> children - this.#children = {}; - this.#children[GRAPH_NODE] = {}; - } - } - - /* === Graph functions ========= */ - - /** - * Whether graph was created with 'directed' flag set to true or not. - */ - isDirected() { - return this.#isDirected; - } - - /** - * Whether graph was created with 'multigraph' flag set to true or not. - */ - isMultigraph() { - return this.#isMultigraph; - } - - /** - * Whether graph was created with 'compound' flag set to true or not. - */ - isCompound() { - return this.#isCompound; - } - - /** - * Sets the label of the graph. - */ - setGraph(label) { - this.#label = label; - return this; - } - - /** - * Gets the graph label. - */ - graph() { - return this.#label; - } - - - /* === Node functions ========== */ - - /** - * Sets the default node label. If newDefault is a function, it will be - * invoked ach time when setting a label for a node. Otherwise, this label - * will be assigned as default label in case if no label was specified while - * setting a node. - * Complexity: O(1). - */ - setDefaultNodeLabel(newDefault) { - this.#defaultNodeLabelFn = newDefault; - if (typeof newDefault !== 'function') { - this.#defaultNodeLabelFn = () => newDefault; - } - - return this; - } - - /** - * Gets the number of nodes in the graph. - * Complexity: O(1). - */ - nodeCount() { - return this.#nodeCount; - } - - /** - * Gets all nodes of the graph. Note, the in case of compound graph subnodes are - * not included in list. - * Complexity: O(1). - */ - nodes() { - return Object.keys(this.#nodes); - } - - /** - * Gets list of nodes without in-edges. - * Complexity: O(|V|). - */ - sources() { - var self = this; - return this.nodes().filter(v => Object.keys(self.#in[v]).length === 0); - } - - /** - * Gets list of nodes without out-edges. - * Complexity: O(|V|). - */ - sinks() { - var self = this; - return this.nodes().filter(v => Object.keys(self.#out[v]).length === 0); - } - - /** - * Invokes setNode method for each node in names list. - * Complexity: O(|names|). - */ - setNodes(vs, value) { - var args = arguments; - var self = this; - vs.forEach(function(v) { - if (args.length > 1) { - self.setNode(v, value); - } else { - self.setNode(v); - } - }); - return this; - } - - /** - * Creates or updates the value for the node v in the graph. If label is supplied - * it is set as the value for the node. If label is not supplied and the node was - * created by this call then the default node label will be assigned. - * Complexity: O(1). - */ - setNode(v, value) { - if (this.#nodes.hasOwnProperty(v)) { - if (arguments.length > 1) { - this.#nodes[v] = value; - } - return this; - } - - this.#nodes[v] = arguments.length > 1 ? value : this.#defaultNodeLabelFn(v); - if (this.#isCompound) { - this.#parent[v] = GRAPH_NODE; - this.#children[v] = {}; - this.#children[GRAPH_NODE][v] = true; - } - this.#in[v] = {}; - this.#preds[v] = {}; - this.#out[v] = {}; - this.#sucs[v] = {}; - ++this.#nodeCount; - return this; - } - - /** - * Gets the label of node with specified name. - * Complexity: O(|V|). - */ - node(v) { - return this.#nodes[v]; - } - - /** - * Detects whether graph has a node with specified name or not. - */ - hasNode(v) { - return this.#nodes.hasOwnProperty(v); - } - - /** - * Remove the node with the name from the graph or do nothing if the node is not in - * the graph. If the node was removed this function also removes any incident - * edges. - * Complexity: O(1). - */ - removeNode(v) { - var self = this; - if (this.#nodes.hasOwnProperty(v)) { - var removeEdge = e => self.removeEdge(self.#edgeObjs[e]); - delete this.#nodes[v]; - if (this.#isCompound) { - this.#removeFromParentsChildList(v); - delete this.#parent[v]; - this.children(v).forEach(function(child) { - self.setParent(child); - }); - delete this.#children[v]; - } - Object.keys(this.#in[v]).forEach(removeEdge); - delete this.#in[v]; - delete this.#preds[v]; - Object.keys(this.#out[v]).forEach(removeEdge); - delete this.#out[v]; - delete this.#sucs[v]; - --this.#nodeCount; - } - return this; - } - - /** - * Sets node p as a parent for node v if it is defined, or removes the - * parent for v if p is undefined. Method throws an exception in case of - * invoking it in context of noncompound graph. - * Average-case complexity: O(1). - */ - setParent(v, parent) { - if (!this.#isCompound) { - throw new Error("Cannot set parent in a non-compound graph"); - } - - if (parent === undefined) { - parent = GRAPH_NODE; - } else { - // Coerce parent to string - parent += ""; - for (var ancestor = parent; ancestor !== undefined; ancestor = this.parent(ancestor)) { - if (ancestor === v) { - throw new Error("Setting " + parent+ " as parent of " + v + - " would create a cycle"); - } - } - - this.setNode(parent); - } - - this.setNode(v); - this.#removeFromParentsChildList(v); - this.#parent[v] = parent; - this.#children[parent][v] = true; - return this; - } - - #removeFromParentsChildList(v) { - delete this.#children[this.#parent[v]][v]; - } - - /** - * Gets parent node for node v. - * Complexity: O(1). - */ - parent(v) { - if (this.#isCompound) { - var parent = this.#parent[v]; - if (parent !== GRAPH_NODE) { - return parent; - } - } - } - - /** - * Gets list of direct children of node v. - * Complexity: O(1). - */ - children(v = GRAPH_NODE) { - if (this.#isCompound) { - var children = this.#children[v]; - if (children) { - return Object.keys(children); - } - } else if (v === GRAPH_NODE) { - return this.nodes(); - } else if (this.hasNode(v)) { - return []; - } - } - - /** - * Return all nodes that are predecessors of the specified node or undefined if node v is not in - * the graph. Behavior is undefined for undirected graphs - use neighbors instead. - * Complexity: O(|V|). - */ - predecessors(v) { - var predsV = this.#preds[v]; - if (predsV) { - return Object.keys(predsV); - } - } - - /** - * Return all nodes that are successors of the specified node or undefined if node v is not in - * the graph. Behavior is undefined for undirected graphs - use neighbors instead. - * Complexity: O(|V|). - */ - successors(v) { - var sucsV = this.#sucs[v]; - if (sucsV) { - return Object.keys(sucsV); - } - } - - /** - * Return all nodes that are predecessors or successors of the specified node or undefined if - * node v is not in the graph. - * Complexity: O(|V|). - */ - neighbors(v) { - var preds = this.predecessors(v); - if (preds) { - const union = new Set(preds); - for (var succ of this.successors(v)) { - union.add(succ); - } - - return Array.from(union.values()); - } - } - - isLeaf(v) { - var neighbors; - if (this.isDirected()) { - neighbors = this.successors(v); - } else { - neighbors = this.neighbors(v); - } - return neighbors.length === 0; - } - - /** - * Creates new graph with nodes filtered via filter. Edges incident to rejected node - * are also removed. In case of compound graph, if parent is rejected by filter, - * than all its children are rejected too. - * Average-case complexity: O(|E|+|V|). - */ - filterNodes(filter) { - var copy = new this.constructor({ - directed: this.#isDirected, - multigraph: this.#isMultigraph, - compound: this.#isCompound - }); - - copy.setGraph(this.graph()); - - var self = this; - Object.entries(this.#nodes).forEach(function([v, value]) { - if (filter(v)) { - copy.setNode(v, value); - } - }); - - Object.values(this.#edgeObjs).forEach(function(e) { - if (copy.hasNode(e.v) && copy.hasNode(e.w)) { - copy.setEdge(e, self.edge(e)); - } - }); - - var parents = {}; - function findParent(v) { - var parent = self.parent(v); - if (parent === undefined || copy.hasNode(parent)) { - parents[v] = parent; - return parent; - } else if (parent in parents) { - return parents[parent]; - } else { - return findParent(parent); - } - } - - if (this.#isCompound) { - copy.nodes().forEach(v => copy.setParent(v, findParent(v))); - } - - return copy; - } - - /* === Edge functions ========== */ - - /** - * Sets the default edge label or factory function. This label will be - * assigned as default label in case if no label was specified while setting - * an edge or this function will be invoked each time when setting an edge - * with no label specified and returned value * will be used as a label for edge. - * Complexity: O(1). - */ - setDefaultEdgeLabel(newDefault) { - this.#defaultEdgeLabelFn = newDefault; - if (typeof newDefault !== 'function') { - this.#defaultEdgeLabelFn = () => newDefault; - } - - return this; - } - - /** - * Gets the number of edges in the graph. - * Complexity: O(1). - */ - edgeCount() { - return this.#edgeCount; - } - - /** - * Gets edges of the graph. In case of compound graph subgraphs are not considered. - * Complexity: O(|E|). - */ - edges() { - return Object.values(this.#edgeObjs); - } - - /** - * Establish an edges path over the nodes in nodes list. If some edge is already - * exists, it will update its label, otherwise it will create an edge between pair - * of nodes with label provided or default label if no label provided. - * Complexity: O(|nodes|). - */ - setPath(vs, value) { - var self = this; - var args = arguments; - vs.reduce(function(v, w) { - if (args.length > 1) { - self.setEdge(v, w, value); - } else { - self.setEdge(v, w); - } - return w; - }); - return this; - } - - /** - * Creates or updates the label for the edge (v, w) with the optionally supplied - * name. If label is supplied it is set as the value for the edge. If label is not - * supplied and the edge was created by this call then the default edge label will - * be assigned. The name parameter is only useful with multigraphs. - */ - setEdge() { - var v, w, name, value; - var valueSpecified = false; - var arg0 = arguments[0]; - - if (typeof arg0 === "object" && arg0 !== null && "v" in arg0) { - v = arg0.v; - w = arg0.w; - name = arg0.name; - if (arguments.length === 2) { - value = arguments[1]; - valueSpecified = true; - } - } else { - v = arg0; - w = arguments[1]; - name = arguments[3]; - if (arguments.length > 2) { - value = arguments[2]; - valueSpecified = true; - } - } - - v = "" + v; - w = "" + w; - if (name !== undefined) { - name = "" + name; - } - - var e = edgeArgsToId(this.#isDirected, v, w, name); - if (this.#edgeLabels.hasOwnProperty(e)) { - if (valueSpecified) { - this.#edgeLabels[e] = value; - } - return this; - } - - if (name !== undefined && !this.#isMultigraph) { - throw new Error("Cannot set a named edge when isMultigraph = false"); - } - - // It didn't exist, so we need to create it. - // First ensure the nodes exist. - this.setNode(v); - this.setNode(w); - - this.#edgeLabels[e] = valueSpecified ? value : this.#defaultEdgeLabelFn(v, w, name); - - var edgeObj = edgeArgsToObj(this.#isDirected, v, w, name); - // Ensure we add undirected edges in a consistent way. - v = edgeObj.v; - w = edgeObj.w; - - Object.freeze(edgeObj); - this.#edgeObjs[e] = edgeObj; - incrementOrInitEntry(this.#preds[w], v); - incrementOrInitEntry(this.#sucs[v], w); - this.#in[w][e] = edgeObj; - this.#out[v][e] = edgeObj; - this.#edgeCount++; - return this; - } - - /** - * Gets the label for the specified edge. - * Complexity: O(1). - */ - edge(v, w, name) { - var e = (arguments.length === 1 - ? edgeObjToId(this.#isDirected, arguments[0]) - : edgeArgsToId(this.#isDirected, v, w, name)); - return this.#edgeLabels[e]; - } - - /** - * Gets the label for the specified edge and converts it to an object. - * Complexity: O(1) - */ - edgeAsObj() { - const edge = this.edge(...arguments); - if (typeof edge !== "object") { - return {label: edge}; - } - - return edge; - } - - /** - * Detects whether the graph contains specified edge or not. No subgraphs are considered. - * Complexity: O(1). - */ - hasEdge(v, w, name) { - var e = (arguments.length === 1 - ? edgeObjToId(this.#isDirected, arguments[0]) - : edgeArgsToId(this.#isDirected, v, w, name)); - return this.#edgeLabels.hasOwnProperty(e); - } - - /** - * Removes the specified edge from the graph. No subgraphs are considered. - * Complexity: O(1). - */ - removeEdge(v, w, name) { - var e = (arguments.length === 1 - ? edgeObjToId(this.#isDirected, arguments[0]) - : edgeArgsToId(this.#isDirected, v, w, name)); - var edge = this.#edgeObjs[e]; - if (edge) { - v = edge.v; - w = edge.w; - delete this.#edgeLabels[e]; - delete this.#edgeObjs[e]; - decrementOrRemoveEntry(this.#preds[w], v); - decrementOrRemoveEntry(this.#sucs[v], w); - delete this.#in[w][e]; - delete this.#out[v][e]; - this.#edgeCount--; - } - return this; - } - - /** - * Return all edges that point to the node v. Optionally filters those edges down to just those - * coming from node u. Behavior is undefined for undirected graphs - use nodeEdges instead. - * Complexity: O(|E|). - */ - inEdges(v, u) { - var inV = this.#in[v]; - if (inV) { - var edges = Object.values(inV); - if (!u) { - return edges; - } - return edges.filter(edge => edge.v === u); - } - } - - /** - * Return all edges that are pointed at by node v. Optionally filters those edges down to just - * those point to w. Behavior is undefined for undirected graphs - use nodeEdges instead. - * Complexity: O(|E|). - */ - outEdges(v, w) { - var outV = this.#out[v]; - if (outV) { - var edges = Object.values(outV); - if (!w) { - return edges; - } - return edges.filter(edge => edge.w === w); - } - } - - /** - * Returns all edges to or from node v regardless of direction. Optionally filters those edges - * down to just those between nodes v and w regardless of direction. - * Complexity: O(|E|). - */ - nodeEdges(v, w) { - var inEdges = this.inEdges(v, w); - if (inEdges) { - return inEdges.concat(this.outEdges(v, w)); - } - } -} - -function incrementOrInitEntry(map, k) { - if (map[k]) { - map[k]++; - } else { - map[k] = 1; - } -} - -function decrementOrRemoveEntry(map, k) { - if (!--map[k]) { delete map[k]; } -} - -function edgeArgsToId(isDirected, v_, w_, name) { - var v = "" + v_; - var w = "" + w_; - if (!isDirected && v > w) { - var tmp = v; - v = w; - w = tmp; - } - return v + EDGE_KEY_DELIM + w + EDGE_KEY_DELIM + - (name === undefined ? DEFAULT_EDGE_NAME : name); -} - -function edgeArgsToObj(isDirected, v_, w_, name) { - var v = "" + v_; - var w = "" + w_; - if (!isDirected && v > w) { - var tmp = v; - v = w; - w = tmp; - } - var edgeObj = { v: v, w: w }; - if (name) { - edgeObj.name = name; - } - return edgeObj; -} - -function edgeObjToId(isDirected, edgeObj) { - return edgeArgsToId(isDirected, edgeObj.v, edgeObj.w, edgeObj.name); -} diff --git a/mjs-lib/index.js b/mjs-lib/index.js deleted file mode 100644 index b0f1da34..00000000 --- a/mjs-lib/index.js +++ /dev/null @@ -1,5 +0,0 @@ -// Includes only the "core" of graphlib -export {default as Graph} from "./graph.js"; -export {default as version} from "./version.js"; -export * as json from "./json.js"; -export * as alg from "./alg/index.js"; diff --git a/mjs-lib/json.js b/mjs-lib/json.js deleted file mode 100644 index 92ae41f6..00000000 --- a/mjs-lib/json.js +++ /dev/null @@ -1,75 +0,0 @@ -import { default as Graph } from "./graph.js"; - -/** - * Creates a JSON representation of the graph that can be serialized to a string with - * JSON.stringify. The graph can later be restored using json.read. - */ -export function write(g) { - var json = { - options: { - directed: g.isDirected(), - multigraph: g.isMultigraph(), - compound: g.isCompound() - }, - nodes: writeNodes(g), - edges: writeEdges(g) - }; - - if (g.graph() !== undefined) { - json.value = structuredClone(g.graph()); - } - return json; -} - -function writeNodes(g) { - return g.nodes().map(function(v) { - var nodeValue = g.node(v); - var parent = g.parent(v); - var node = { v: v }; - if (nodeValue !== undefined) { - node.value = nodeValue; - } - if (parent !== undefined) { - node.parent = parent; - } - return node; - }); -} - -function writeEdges(g) { - return g.edges().map(function(e) { - var edgeValue = g.edge(e); - var edge = { v: e.v, w: e.w }; - if (e.name !== undefined) { - edge.name = e.name; - } - if (edgeValue !== undefined) { - edge.value = edgeValue; - } - return edge; - }); -} - -/** - * Takes JSON as input and returns the graph representation. - * - * @example - * var g2 = graphlib.json.read(JSON.parse(str)); - * g2.nodes(); - * // ['a', 'b'] - * g2.edges() - * // [ { v: 'a', w: 'b' } ] - */ -export function read(json) { - var g = new Graph(json.options).setGraph(json.value); - json.nodes.forEach(function(entry) { - g.setNode(entry.v, entry.value); - if (entry.parent) { - g.setParent(entry.v, entry.parent); - } - }); - json.edges.forEach(function(entry) { - g.setEdge({ v: entry.v, w: entry.w, name: entry.name }, entry.value); - }); - return g; -} diff --git a/mjs-lib/version.js b/mjs-lib/version.js deleted file mode 100644 index 467bcc31..00000000 --- a/mjs-lib/version.js +++ /dev/null @@ -1 +0,0 @@ -export default '2.2.1-pre'; diff --git a/old-lib/alg/components.js b/old-lib/alg/components.js deleted file mode 100644 index deeb85ed..00000000 --- a/old-lib/alg/components.js +++ /dev/null @@ -1,25 +0,0 @@ -module.exports = components; - -function components(g) { - var visited = {}; - var cmpts = []; - var cmpt; - - function dfs(v) { - if (visited.hasOwnProperty(v)) return; - visited[v] = true; - cmpt.push(v); - g.successors(v).forEach(dfs); - g.predecessors(v).forEach(dfs); - } - - g.nodes().forEach(function(v) { - cmpt = []; - dfs(v); - if (cmpt.length) { - cmpts.push(cmpt); - } - }); - - return cmpts; -} diff --git a/old-lib/alg/dfs.js b/old-lib/alg/dfs.js deleted file mode 100644 index 34a323cb..00000000 --- a/old-lib/alg/dfs.js +++ /dev/null @@ -1,67 +0,0 @@ -module.exports = dfs; - -/* - * A helper that preforms a pre- or post-order traversal on the input graph - * and returns the nodes in the order they were visited. If the graph is - * undirected then this algorithm will navigate using neighbors. If the graph - * is directed then this algorithm will navigate using successors. - * - * If the order is not "post", it will be treated as "pre". - */ -function dfs(g, vs, order) { - if (!Array.isArray(vs)) { - vs = [vs]; - } - - var navigation = g.isDirected() ? v => g.successors(v) : v => g.neighbors(v); - var orderFunc = order === "post" ? postOrderDfs : preOrderDfs; - - var acc = []; - var visited = {}; - vs.forEach(v => { - if (!g.hasNode(v)) { - throw new Error("Graph does not have node: " + v); - } - - orderFunc(v, navigation, visited, acc); - }); - - return acc; -} - -function postOrderDfs(v, navigation, visited, acc) { - var stack = [[v, false]]; - while (stack.length > 0) { - var curr = stack.pop(); - if (curr[1]) { - acc.push(curr[0]); - } else { - if (!visited.hasOwnProperty(curr[0])) { - visited[curr[0]] = true; - stack.push([curr[0], true]); - forEachRight(navigation(curr[0]), w => stack.push([w, false])); - } - } - } -} - -function preOrderDfs(v, navigation, visited, acc) { - var stack = [v]; - while (stack.length > 0) { - var curr = stack.pop(); - if (!visited.hasOwnProperty(curr)) { - visited[curr] = true; - acc.push(curr); - forEachRight(navigation(curr), w => stack.push(w)); - } - } -} - -function forEachRight(array, iteratee) { - var length = array.length; - while (length--) { - iteratee(array[length], length, array); - } - - return array; -} diff --git a/old-lib/alg/dijkstra-all.js b/old-lib/alg/dijkstra-all.js deleted file mode 100644 index 6c5d4b3b..00000000 --- a/old-lib/alg/dijkstra-all.js +++ /dev/null @@ -1,10 +0,0 @@ -var dijkstra = require("./dijkstra"); - -module.exports = dijkstraAll; - -function dijkstraAll(g, weightFunc, edgeFunc) { - return g.nodes().reduce(function(acc, v) { - acc[v] = dijkstra(g, v, weightFunc, edgeFunc); - return acc; - }, {}); -} diff --git a/old-lib/alg/dijkstra.js b/old-lib/alg/dijkstra.js deleted file mode 100644 index 4b74a2dd..00000000 --- a/old-lib/alg/dijkstra.js +++ /dev/null @@ -1,53 +0,0 @@ -var PriorityQueue = require("../data/priority-queue"); - -module.exports = dijkstra; - -var DEFAULT_WEIGHT_FUNC = () => 1; - -function dijkstra(g, source, weightFn, edgeFn) { - return runDijkstra(g, String(source), - weightFn || DEFAULT_WEIGHT_FUNC, - edgeFn || function(v) { return g.outEdges(v); }); -} - -function runDijkstra(g, source, weightFn, edgeFn) { - var results = {}; - var pq = new PriorityQueue(); - var v, vEntry; - - var updateNeighbors = function(edge) { - var w = edge.v !== v ? edge.v : edge.w; - var wEntry = results[w]; - var weight = weightFn(edge); - var distance = vEntry.distance + weight; - - if (weight < 0) { - throw new Error("dijkstra does not allow negative edge weights. " + - "Bad edge: " + edge + " Weight: " + weight); - } - - if (distance < wEntry.distance) { - wEntry.distance = distance; - wEntry.predecessor = v; - pq.decrease(w, distance); - } - }; - - g.nodes().forEach(function(v) { - var distance = v === source ? 0 : Number.POSITIVE_INFINITY; - results[v] = { distance: distance }; - pq.add(v, distance); - }); - - while (pq.size() > 0) { - v = pq.removeMin(); - vEntry = results[v]; - if (vEntry.distance === Number.POSITIVE_INFINITY) { - break; - } - - edgeFn(v).forEach(updateNeighbors); - } - - return results; -} diff --git a/old-lib/alg/find-cycles.js b/old-lib/alg/find-cycles.js deleted file mode 100644 index 95df84f6..00000000 --- a/old-lib/alg/find-cycles.js +++ /dev/null @@ -1,9 +0,0 @@ -var tarjan = require("./tarjan"); - -module.exports = findCycles; - -function findCycles(g) { - return tarjan(g).filter(function(cmpt) { - return cmpt.length > 1 || (cmpt.length === 1 && g.hasEdge(cmpt[0], cmpt[0])); - }); -} diff --git a/old-lib/alg/floyd-warshall.js b/old-lib/alg/floyd-warshall.js deleted file mode 100644 index c2f3ae21..00000000 --- a/old-lib/alg/floyd-warshall.js +++ /dev/null @@ -1,48 +0,0 @@ -module.exports = floydWarshall; - -var DEFAULT_WEIGHT_FUNC = () => 1; - -function floydWarshall(g, weightFn, edgeFn) { - return runFloydWarshall(g, - weightFn || DEFAULT_WEIGHT_FUNC, - edgeFn || function(v) { return g.outEdges(v); }); -} - -function runFloydWarshall(g, weightFn, edgeFn) { - var results = {}; - var nodes = g.nodes(); - - nodes.forEach(function(v) { - results[v] = {}; - results[v][v] = { distance: 0 }; - nodes.forEach(function(w) { - if (v !== w) { - results[v][w] = { distance: Number.POSITIVE_INFINITY }; - } - }); - edgeFn(v).forEach(function(edge) { - var w = edge.v === v ? edge.w : edge.v; - var d = weightFn(edge); - results[v][w] = { distance: d, predecessor: v }; - }); - }); - - nodes.forEach(function(k) { - var rowK = results[k]; - nodes.forEach(function(i) { - var rowI = results[i]; - nodes.forEach(function(j) { - var ik = rowI[k]; - var kj = rowK[j]; - var ij = rowI[j]; - var altDistance = ik.distance + kj.distance; - if (altDistance < ij.distance) { - ij.distance = altDistance; - ij.predecessor = kj.predecessor; - } - }); - }); - }); - - return results; -} diff --git a/old-lib/alg/index.js b/old-lib/alg/index.js deleted file mode 100644 index 2c3d76f2..00000000 --- a/old-lib/alg/index.js +++ /dev/null @@ -1,13 +0,0 @@ -module.exports = { - components: require("./components"), - dijkstra: require("./dijkstra"), - dijkstraAll: require("./dijkstra-all"), - findCycles: require("./find-cycles"), - floydWarshall: require("./floyd-warshall"), - isAcyclic: require("./is-acyclic"), - postorder: require("./postorder"), - preorder: require("./preorder"), - prim: require("./prim"), - tarjan: require("./tarjan"), - topsort: require("./topsort") -}; diff --git a/old-lib/alg/is-acyclic.js b/old-lib/alg/is-acyclic.js deleted file mode 100644 index eff4ef0b..00000000 --- a/old-lib/alg/is-acyclic.js +++ /dev/null @@ -1,15 +0,0 @@ -var topsort = require("./topsort"); - -module.exports = isAcyclic; - -function isAcyclic(g) { - try { - topsort(g); - } catch (e) { - if (e instanceof topsort.CycleException) { - return false; - } - throw e; - } - return true; -} diff --git a/old-lib/alg/postorder.js b/old-lib/alg/postorder.js deleted file mode 100644 index 1d82313f..00000000 --- a/old-lib/alg/postorder.js +++ /dev/null @@ -1,7 +0,0 @@ -var dfs = require("./dfs"); - -module.exports = postorder; - -function postorder(g, vs) { - return dfs(g, vs, "post"); -} diff --git a/old-lib/alg/preorder.js b/old-lib/alg/preorder.js deleted file mode 100644 index cf333cd8..00000000 --- a/old-lib/alg/preorder.js +++ /dev/null @@ -1,7 +0,0 @@ -var dfs = require("./dfs"); - -module.exports = preorder; - -function preorder(g, vs) { - return dfs(g, vs, "pre"); -} diff --git a/old-lib/alg/prim.js b/old-lib/alg/prim.js deleted file mode 100644 index 72fcd841..00000000 --- a/old-lib/alg/prim.js +++ /dev/null @@ -1,51 +0,0 @@ -var Graph = require("../graph"); -var PriorityQueue = require("../data/priority-queue"); - -module.exports = prim; - -function prim(g, weightFunc) { - var result = new Graph(); - var parents = {}; - var pq = new PriorityQueue(); - var v; - - function updateNeighbors(edge) { - var w = edge.v === v ? edge.w : edge.v; - var pri = pq.priority(w); - if (pri !== undefined) { - var edgeWeight = weightFunc(edge); - if (edgeWeight < pri) { - parents[w] = v; - pq.decrease(w, edgeWeight); - } - } - } - - if (g.nodeCount() === 0) { - return result; - } - - g.nodes().forEach(function(v) { - pq.add(v, Number.POSITIVE_INFINITY); - result.setNode(v); - }); - - // Start from an arbitrary node - pq.decrease(g.nodes()[0], 0); - - var init = false; - while (pq.size() > 0) { - v = pq.removeMin(); - if (parents.hasOwnProperty(v)) { - result.setEdge(v, parents[v]); - } else if (init) { - throw new Error("Input graph is not connected: " + g); - } else { - init = true; - } - - g.nodeEdges(v).forEach(updateNeighbors); - } - - return result; -} diff --git a/old-lib/alg/tarjan.js b/old-lib/alg/tarjan.js deleted file mode 100644 index c00eeba7..00000000 --- a/old-lib/alg/tarjan.js +++ /dev/null @@ -1,45 +0,0 @@ -module.exports = tarjan; - -function tarjan(g) { - var index = 0; - var stack = []; - var visited = {}; // node id -> { onStack, lowlink, index } - var results = []; - - function dfs(v) { - var entry = visited[v] = { - onStack: true, - lowlink: index, - index: index++ - }; - stack.push(v); - - g.successors(v).forEach(function(w) { - if (!visited.hasOwnProperty(w)) { - dfs(w); - entry.lowlink = Math.min(entry.lowlink, visited[w].lowlink); - } else if (visited[w].onStack) { - entry.lowlink = Math.min(entry.lowlink, visited[w].index); - } - }); - - if (entry.lowlink === entry.index) { - var cmpt = []; - var w; - do { - w = stack.pop(); - visited[w].onStack = false; - cmpt.push(w); - } while (v !== w); - results.push(cmpt); - } - } - - g.nodes().forEach(function(v) { - if (!visited.hasOwnProperty(v)) { - dfs(v); - } - }); - - return results; -} diff --git a/old-lib/alg/topsort.js b/old-lib/alg/topsort.js deleted file mode 100644 index 5986ce02..00000000 --- a/old-lib/alg/topsort.js +++ /dev/null @@ -1,36 +0,0 @@ -function topsort(g) { - var visited = {}; - var stack = {}; - var results = []; - - function visit(node) { - if (stack.hasOwnProperty(node)) { - throw new CycleException(); - } - - if (!visited.hasOwnProperty(node)) { - stack[node] = true; - visited[node] = true; - g.predecessors(node).forEach(visit); - delete stack[node]; - results.push(node); - } - } - - g.sinks().forEach(visit); - - if (Object.keys(visited).length !== g.nodeCount()) { - throw new CycleException(); - } - - return results; -} - -class CycleException extends Error { - constructor() { - super(...arguments); - } -} - -module.exports = topsort; -topsort.CycleException = CycleException; diff --git a/old-lib/data/priority-queue.js b/old-lib/data/priority-queue.js deleted file mode 100644 index 1a411fff..00000000 --- a/old-lib/data/priority-queue.js +++ /dev/null @@ -1,150 +0,0 @@ -/** - * A min-priority queue data structure. This algorithm is derived from Cormen, - * et al., "Introduction to Algorithms". The basic idea of a min-priority - * queue is that you can efficiently (in O(1) time) get the smallest key in - * the queue. Adding and removing elements takes O(log n) time. A key can - * have its priority decreased in O(log n) time. - */ -class PriorityQueue { - #arr = []; - #keyIndices = {}; - - /** - * Returns the number of elements in the queue. Takes `O(1)` time. - */ - size() { - return this.#arr.length; - } - - /** - * Returns the keys that are in the queue. Takes `O(n)` time. - */ - keys() { - return this.#arr.map(function(x) { return x.key; }); - } - - /** - * Returns `true` if **key** is in the queue and `false` if not. - */ - has(key) { - return this.#keyIndices.hasOwnProperty(key); - } - - /** - * Returns the priority for **key**. If **key** is not present in the queue - * then this function returns `undefined`. Takes `O(1)` time. - * - * @param {Object} key - */ - priority(key) { - var index = this.#keyIndices[key]; - if (index !== undefined) { - return this.#arr[index].priority; - } - } - - /** - * Returns the key for the minimum element in this queue. If the queue is - * empty this function throws an Error. Takes `O(1)` time. - */ - min() { - if (this.size() === 0) { - throw new Error("Queue underflow"); - } - return this.#arr[0].key; - } - - /** - * Inserts a new key into the priority queue. If the key already exists in - * the queue this function returns `false`; otherwise it will return `true`. - * Takes `O(n)` time. - * - * @param {Object} key the key to add - * @param {Number} priority the initial priority for the key - */ - add(key, priority) { - var keyIndices = this.#keyIndices; - key = String(key); - if (!keyIndices.hasOwnProperty(key)) { - var arr = this.#arr; - var index = arr.length; - keyIndices[key] = index; - arr.push({key: key, priority: priority}); - this.#decrease(index); - return true; - } - return false; - } - - /** - * Removes and returns the smallest key in the queue. Takes `O(log n)` time. - */ - removeMin() { - this.#swap(0, this.#arr.length - 1); - var min = this.#arr.pop(); - delete this.#keyIndices[min.key]; - this.#heapify(0); - return min.key; - } - - /** - * Decreases the priority for **key** to **priority**. If the new priority is - * greater than the previous priority, this function will throw an Error. - * - * @param {Object} key the key for which to raise priority - * @param {Number} priority the new priority for the key - */ - decrease(key, priority) { - var index = this.#keyIndices[key]; - if (priority > this.#arr[index].priority) { - throw new Error("New priority is greater than current priority. " + - "Key: " + key + " Old: " + this.#arr[index].priority + " New: " + priority); - } - this.#arr[index].priority = priority; - this.#decrease(index); - } - - #heapify(i) { - var arr = this.#arr; - var l = 2 * i; - var r = l + 1; - var largest = i; - if (l < arr.length) { - largest = arr[l].priority < arr[largest].priority ? l : largest; - if (r < arr.length) { - largest = arr[r].priority < arr[largest].priority ? r : largest; - } - if (largest !== i) { - this.#swap(i, largest); - this.#heapify(largest); - } - } - } - - #decrease(index) { - var arr = this.#arr; - var priority = arr[index].priority; - var parent; - while (index !== 0) { - parent = index >> 1; - if (arr[parent].priority < priority) { - break; - } - this.#swap(index, parent); - index = parent; - } - } - - #swap(i, j) { - var arr = this.#arr; - var keyIndices = this.#keyIndices; - var origArrI = arr[i]; - var origArrJ = arr[j]; - arr[i] = origArrJ; - arr[j] = origArrI; - keyIndices[origArrJ.key] = i; - keyIndices[origArrI.key] = j; - } -} - -module.exports = PriorityQueue; diff --git a/old-lib/graph.js b/old-lib/graph.js deleted file mode 100644 index 0b466cd3..00000000 --- a/old-lib/graph.js +++ /dev/null @@ -1,696 +0,0 @@ -"use strict"; - -var DEFAULT_EDGE_NAME = "\x00"; -var GRAPH_NODE = "\x00"; -var EDGE_KEY_DELIM = "\x01"; - -// Implementation notes: -// -// * Node id query functions should return string ids for the nodes -// * Edge id query functions should return an "edgeObj", edge object, that is -// composed of enough information to uniquely identify an edge: {v, w, name}. -// * Internally we use an "edgeId", a stringified form of the edgeObj, to -// reference edges. This is because we need a performant way to look these -// edges up and, object properties, which have string keys, are the closest -// we're going to get to a performant hashtable in JavaScript. - -class Graph { - #isDirected = true; - #isMultigraph = false; - #isCompound = false; - - // Label for the graph itself - #label; - - // Defaults to be set when creating a new node - #defaultNodeLabelFn = () => undefined; - - // Defaults to be set when creating a new edge - #defaultEdgeLabelFn = () => undefined; - - // v -> label - #nodes = {}; - - // v -> edgeObj - #in = {}; - - // u -> v -> Number - #preds = {}; - - // v -> edgeObj - #out = {}; - - // v -> w -> Number - #sucs = {}; - - // e -> edgeObj - #edgeObjs = {}; - - // e -> label - #edgeLabels = {}; - - /* Number of nodes in the graph. Should only be changed by the implementation. */ - #nodeCount = 0; - - /* Number of edges in the graph. Should only be changed by the implementation. */ - #edgeCount = 0; - - #parent; - - #children; - - constructor(opts) { - if (opts) { - this.#isDirected = opts.hasOwnProperty("directed") ? opts.directed : true; - this.#isMultigraph = opts.hasOwnProperty("multigraph") ? opts.multigraph : false; - this.#isCompound = opts.hasOwnProperty("compound") ? opts.compound : false; - } - - if (this.#isCompound) { - // v -> parent - this.#parent = {}; - - // v -> children - this.#children = {}; - this.#children[GRAPH_NODE] = {}; - } - } - - /* === Graph functions ========= */ - - /** - * Whether graph was created with 'directed' flag set to true or not. - */ - isDirected() { - return this.#isDirected; - } - - /** - * Whether graph was created with 'multigraph' flag set to true or not. - */ - isMultigraph() { - return this.#isMultigraph; - } - - /** - * Whether graph was created with 'compound' flag set to true or not. - */ - isCompound() { - return this.#isCompound; - } - - /** - * Sets the label of the graph. - */ - setGraph(label) { - this.#label = label; - return this; - } - - /** - * Gets the graph label. - */ - graph() { - return this.#label; - } - - - /* === Node functions ========== */ - - /** - * Sets the default node label. If newDefault is a function, it will be - * invoked ach time when setting a label for a node. Otherwise, this label - * will be assigned as default label in case if no label was specified while - * setting a node. - * Complexity: O(1). - */ - setDefaultNodeLabel(newDefault) { - this.#defaultNodeLabelFn = newDefault; - if (typeof newDefault !== 'function') { - this.#defaultNodeLabelFn = () => newDefault; - } - - return this; - } - - /** - * Gets the number of nodes in the graph. - * Complexity: O(1). - */ - nodeCount() { - return this.#nodeCount; - } - - /** - * Gets all nodes of the graph. Note, the in case of compound graph subnodes are - * not included in list. - * Complexity: O(1). - */ - nodes() { - return Object.keys(this.#nodes); - } - - /** - * Gets list of nodes without in-edges. - * Complexity: O(|V|). - */ - sources() { - var self = this; - return this.nodes().filter(v => Object.keys(self.#in[v]).length === 0); - } - - /** - * Gets list of nodes without out-edges. - * Complexity: O(|V|). - */ - sinks() { - var self = this; - return this.nodes().filter(v => Object.keys(self.#out[v]).length === 0); - } - - /** - * Invokes setNode method for each node in names list. - * Complexity: O(|names|). - */ - setNodes(vs, value) { - var args = arguments; - var self = this; - vs.forEach(function(v) { - if (args.length > 1) { - self.setNode(v, value); - } else { - self.setNode(v); - } - }); - return this; - } - - /** - * Creates or updates the value for the node v in the graph. If label is supplied - * it is set as the value for the node. If label is not supplied and the node was - * created by this call then the default node label will be assigned. - * Complexity: O(1). - */ - setNode(v, value) { - if (this.#nodes.hasOwnProperty(v)) { - if (arguments.length > 1) { - this.#nodes[v] = value; - } - return this; - } - - this.#nodes[v] = arguments.length > 1 ? value : this.#defaultNodeLabelFn(v); - if (this.#isCompound) { - this.#parent[v] = GRAPH_NODE; - this.#children[v] = {}; - this.#children[GRAPH_NODE][v] = true; - } - this.#in[v] = {}; - this.#preds[v] = {}; - this.#out[v] = {}; - this.#sucs[v] = {}; - ++this.#nodeCount; - return this; - } - - /** - * Gets the label of node with specified name. - * Complexity: O(|V|). - */ - node(v) { - return this.#nodes[v]; - } - - /** - * Detects whether graph has a node with specified name or not. - */ - hasNode(v) { - return this.#nodes.hasOwnProperty(v); - } - - /** - * Remove the node with the name from the graph or do nothing if the node is not in - * the graph. If the node was removed this function also removes any incident - * edges. - * Complexity: O(1). - */ - removeNode(v) { - var self = this; - if (this.#nodes.hasOwnProperty(v)) { - var removeEdge = e => self.removeEdge(self.#edgeObjs[e]); - delete this.#nodes[v]; - if (this.#isCompound) { - this.#removeFromParentsChildList(v); - delete this.#parent[v]; - this.children(v).forEach(function(child) { - self.setParent(child); - }); - delete this.#children[v]; - } - Object.keys(this.#in[v]).forEach(removeEdge); - delete this.#in[v]; - delete this.#preds[v]; - Object.keys(this.#out[v]).forEach(removeEdge); - delete this.#out[v]; - delete this.#sucs[v]; - --this.#nodeCount; - } - return this; - } - - /** - * Sets node p as a parent for node v if it is defined, or removes the - * parent for v if p is undefined. Method throws an exception in case of - * invoking it in context of noncompound graph. - * Average-case complexity: O(1). - */ - setParent(v, parent) { - if (!this.#isCompound) { - throw new Error("Cannot set parent in a non-compound graph"); - } - - if (parent === undefined) { - parent = GRAPH_NODE; - } else { - // Coerce parent to string - parent += ""; - for (var ancestor = parent; ancestor !== undefined; ancestor = this.parent(ancestor)) { - if (ancestor === v) { - throw new Error("Setting " + parent+ " as parent of " + v + - " would create a cycle"); - } - } - - this.setNode(parent); - } - - this.setNode(v); - this.#removeFromParentsChildList(v); - this.#parent[v] = parent; - this.#children[parent][v] = true; - return this; - } - - #removeFromParentsChildList(v) { - delete this.#children[this.#parent[v]][v]; - } - - /** - * Gets parent node for node v. - * Complexity: O(1). - */ - parent(v) { - if (this.#isCompound) { - var parent = this.#parent[v]; - if (parent !== GRAPH_NODE) { - return parent; - } - } - } - - /** - * Gets list of direct children of node v. - * Complexity: O(1). - */ - children(v = GRAPH_NODE) { - if (this.#isCompound) { - var children = this.#children[v]; - if (children) { - return Object.keys(children); - } - } else if (v === GRAPH_NODE) { - return this.nodes(); - } else if (this.hasNode(v)) { - return []; - } - } - - /** - * Return all nodes that are predecessors of the specified node or undefined if node v is not in - * the graph. Behavior is undefined for undirected graphs - use neighbors instead. - * Complexity: O(|V|). - */ - predecessors(v) { - var predsV = this.#preds[v]; - if (predsV) { - return Object.keys(predsV); - } - } - - /** - * Return all nodes that are successors of the specified node or undefined if node v is not in - * the graph. Behavior is undefined for undirected graphs - use neighbors instead. - * Complexity: O(|V|). - */ - successors(v) { - var sucsV = this.#sucs[v]; - if (sucsV) { - return Object.keys(sucsV); - } - } - - /** - * Return all nodes that are predecessors or successors of the specified node or undefined if - * node v is not in the graph. - * Complexity: O(|V|). - */ - neighbors(v) { - var preds = this.predecessors(v); - if (preds) { - const union = new Set(preds); - for (var succ of this.successors(v)) { - union.add(succ); - } - - return Array.from(union.values()); - } - } - - isLeaf(v) { - var neighbors; - if (this.isDirected()) { - neighbors = this.successors(v); - } else { - neighbors = this.neighbors(v); - } - return neighbors.length === 0; - } - - /** - * Creates new graph with nodes filtered via filter. Edges incident to rejected node - * are also removed. In case of compound graph, if parent is rejected by filter, - * than all its children are rejected too. - * Average-case complexity: O(|E|+|V|). - */ - filterNodes(filter) { - var copy = new this.constructor({ - directed: this.#isDirected, - multigraph: this.#isMultigraph, - compound: this.#isCompound - }); - - copy.setGraph(this.graph()); - - var self = this; - Object.entries(this.#nodes).forEach(function([v, value]) { - if (filter(v)) { - copy.setNode(v, value); - } - }); - - Object.values(this.#edgeObjs).forEach(function(e) { - if (copy.hasNode(e.v) && copy.hasNode(e.w)) { - copy.setEdge(e, self.edge(e)); - } - }); - - var parents = {}; - function findParent(v) { - var parent = self.parent(v); - if (parent === undefined || copy.hasNode(parent)) { - parents[v] = parent; - return parent; - } else if (parent in parents) { - return parents[parent]; - } else { - return findParent(parent); - } - } - - if (this.#isCompound) { - copy.nodes().forEach(v => copy.setParent(v, findParent(v))); - } - - return copy; - } - - /* === Edge functions ========== */ - - /** - * Sets the default edge label or factory function. This label will be - * assigned as default label in case if no label was specified while setting - * an edge or this function will be invoked each time when setting an edge - * with no label specified and returned value * will be used as a label for edge. - * Complexity: O(1). - */ - setDefaultEdgeLabel(newDefault) { - this.#defaultEdgeLabelFn = newDefault; - if (typeof newDefault !== 'function') { - this.#defaultEdgeLabelFn = () => newDefault; - } - - return this; - } - - /** - * Gets the number of edges in the graph. - * Complexity: O(1). - */ - edgeCount() { - return this.#edgeCount; - } - - /** - * Gets edges of the graph. In case of compound graph subgraphs are not considered. - * Complexity: O(|E|). - */ - edges() { - return Object.values(this.#edgeObjs); - } - - /** - * Establish an edges path over the nodes in nodes list. If some edge is already - * exists, it will update its label, otherwise it will create an edge between pair - * of nodes with label provided or default label if no label provided. - * Complexity: O(|nodes|). - */ - setPath(vs, value) { - var self = this; - var args = arguments; - vs.reduce(function(v, w) { - if (args.length > 1) { - self.setEdge(v, w, value); - } else { - self.setEdge(v, w); - } - return w; - }); - return this; - } - - /** - * Creates or updates the label for the edge (v, w) with the optionally supplied - * name. If label is supplied it is set as the value for the edge. If label is not - * supplied and the edge was created by this call then the default edge label will - * be assigned. The name parameter is only useful with multigraphs. - */ - setEdge() { - var v, w, name, value; - var valueSpecified = false; - var arg0 = arguments[0]; - - if (typeof arg0 === "object" && arg0 !== null && "v" in arg0) { - v = arg0.v; - w = arg0.w; - name = arg0.name; - if (arguments.length === 2) { - value = arguments[1]; - valueSpecified = true; - } - } else { - v = arg0; - w = arguments[1]; - name = arguments[3]; - if (arguments.length > 2) { - value = arguments[2]; - valueSpecified = true; - } - } - - v = "" + v; - w = "" + w; - if (name !== undefined) { - name = "" + name; - } - - var e = edgeArgsToId(this.#isDirected, v, w, name); - if (this.#edgeLabels.hasOwnProperty(e)) { - if (valueSpecified) { - this.#edgeLabels[e] = value; - } - return this; - } - - if (name !== undefined && !this.#isMultigraph) { - throw new Error("Cannot set a named edge when isMultigraph = false"); - } - - // It didn't exist, so we need to create it. - // First ensure the nodes exist. - this.setNode(v); - this.setNode(w); - - this.#edgeLabels[e] = valueSpecified ? value : this.#defaultEdgeLabelFn(v, w, name); - - var edgeObj = edgeArgsToObj(this.#isDirected, v, w, name); - // Ensure we add undirected edges in a consistent way. - v = edgeObj.v; - w = edgeObj.w; - - Object.freeze(edgeObj); - this.#edgeObjs[e] = edgeObj; - incrementOrInitEntry(this.#preds[w], v); - incrementOrInitEntry(this.#sucs[v], w); - this.#in[w][e] = edgeObj; - this.#out[v][e] = edgeObj; - this.#edgeCount++; - return this; - } - - /** - * Gets the label for the specified edge. - * Complexity: O(1). - */ - edge(v, w, name) { - var e = (arguments.length === 1 - ? edgeObjToId(this.#isDirected, arguments[0]) - : edgeArgsToId(this.#isDirected, v, w, name)); - return this.#edgeLabels[e]; - } - - /** - * Gets the label for the specified edge and converts it to an object. - * Complexity: O(1) - */ - edgeAsObj() { - const edge = this.edge(...arguments); - if (typeof edge !== "object") { - return {label: edge}; - } - - return edge; - } - - /** - * Detects whether the graph contains specified edge or not. No subgraphs are considered. - * Complexity: O(1). - */ - hasEdge(v, w, name) { - var e = (arguments.length === 1 - ? edgeObjToId(this.#isDirected, arguments[0]) - : edgeArgsToId(this.#isDirected, v, w, name)); - return this.#edgeLabels.hasOwnProperty(e); - } - - /** - * Removes the specified edge from the graph. No subgraphs are considered. - * Complexity: O(1). - */ - removeEdge(v, w, name) { - var e = (arguments.length === 1 - ? edgeObjToId(this.#isDirected, arguments[0]) - : edgeArgsToId(this.#isDirected, v, w, name)); - var edge = this.#edgeObjs[e]; - if (edge) { - v = edge.v; - w = edge.w; - delete this.#edgeLabels[e]; - delete this.#edgeObjs[e]; - decrementOrRemoveEntry(this.#preds[w], v); - decrementOrRemoveEntry(this.#sucs[v], w); - delete this.#in[w][e]; - delete this.#out[v][e]; - this.#edgeCount--; - } - return this; - } - - /** - * Return all edges that point to the node v. Optionally filters those edges down to just those - * coming from node u. Behavior is undefined for undirected graphs - use nodeEdges instead. - * Complexity: O(|E|). - */ - inEdges(v, u) { - var inV = this.#in[v]; - if (inV) { - var edges = Object.values(inV); - if (!u) { - return edges; - } - return edges.filter(edge => edge.v === u); - } - } - - /** - * Return all edges that are pointed at by node v. Optionally filters those edges down to just - * those point to w. Behavior is undefined for undirected graphs - use nodeEdges instead. - * Complexity: O(|E|). - */ - outEdges(v, w) { - var outV = this.#out[v]; - if (outV) { - var edges = Object.values(outV); - if (!w) { - return edges; - } - return edges.filter(edge => edge.w === w); - } - } - - /** - * Returns all edges to or from node v regardless of direction. Optionally filters those edges - * down to just those between nodes v and w regardless of direction. - * Complexity: O(|E|). - */ - nodeEdges(v, w) { - var inEdges = this.inEdges(v, w); - if (inEdges) { - return inEdges.concat(this.outEdges(v, w)); - } - } -} - -function incrementOrInitEntry(map, k) { - if (map[k]) { - map[k]++; - } else { - map[k] = 1; - } -} - -function decrementOrRemoveEntry(map, k) { - if (!--map[k]) { delete map[k]; } -} - -function edgeArgsToId(isDirected, v_, w_, name) { - var v = "" + v_; - var w = "" + w_; - if (!isDirected && v > w) { - var tmp = v; - v = w; - w = tmp; - } - return v + EDGE_KEY_DELIM + w + EDGE_KEY_DELIM + - (name === undefined ? DEFAULT_EDGE_NAME : name); -} - -function edgeArgsToObj(isDirected, v_, w_, name) { - var v = "" + v_; - var w = "" + w_; - if (!isDirected && v > w) { - var tmp = v; - v = w; - w = tmp; - } - var edgeObj = { v: v, w: w }; - if (name) { - edgeObj.name = name; - } - return edgeObj; -} - -function edgeObjToId(isDirected, edgeObj) { - return edgeArgsToId(isDirected, edgeObj.v, edgeObj.w, edgeObj.name); -} - -module.exports = Graph; diff --git a/old-lib/index.js b/old-lib/index.js deleted file mode 100644 index 756e0ab6..00000000 --- a/old-lib/index.js +++ /dev/null @@ -1,5 +0,0 @@ -// Includes only the "core" of graphlib -module.exports = { - Graph: require("./graph"), - version: require("./version") -}; diff --git a/old-lib/json.js b/old-lib/json.js deleted file mode 100644 index ac0c2417..00000000 --- a/old-lib/json.js +++ /dev/null @@ -1,80 +0,0 @@ -var Graph = require("./graph"); - -module.exports = { - write: write, - read: read -}; - -/** - * Creates a JSON representation of the graph that can be serialized to a string with - * JSON.stringify. The graph can later be restored using json.read. - */ -function write(g) { - var json = { - options: { - directed: g.isDirected(), - multigraph: g.isMultigraph(), - compound: g.isCompound() - }, - nodes: writeNodes(g), - edges: writeEdges(g) - }; - - if (g.graph() !== undefined) { - json.value = structuredClone(g.graph()); - } - return json; -} - -function writeNodes(g) { - return g.nodes().map(function(v) { - var nodeValue = g.node(v); - var parent = g.parent(v); - var node = { v: v }; - if (nodeValue !== undefined) { - node.value = nodeValue; - } - if (parent !== undefined) { - node.parent = parent; - } - return node; - }); -} - -function writeEdges(g) { - return g.edges().map(function(e) { - var edgeValue = g.edge(e); - var edge = { v: e.v, w: e.w }; - if (e.name !== undefined) { - edge.name = e.name; - } - if (edgeValue !== undefined) { - edge.value = edgeValue; - } - return edge; - }); -} - -/** - * Takes JSON as input and returns the graph representation. - * - * @example - * var g2 = graphlib.json.read(JSON.parse(str)); - * g2.nodes(); - * // ['a', 'b'] - * g2.edges() - * // [ { v: 'a', w: 'b' } ] - */ -function read(json) { - var g = new Graph(json.options).setGraph(json.value); - json.nodes.forEach(function(entry) { - g.setNode(entry.v, entry.value); - if (entry.parent) { - g.setParent(entry.v, entry.parent); - } - }); - json.edges.forEach(function(entry) { - g.setEdge({ v: entry.v, w: entry.w, name: entry.name }, entry.value); - }); - return g; -} diff --git a/old-lib/version.js b/old-lib/version.js deleted file mode 100644 index 02120ec0..00000000 --- a/old-lib/version.js +++ /dev/null @@ -1 +0,0 @@ -module.exports = '2.1.14-pre'; diff --git a/package-lock.json b/package-lock.json index 648e03ca..29335b31 100644 --- a/package-lock.json +++ b/package-lock.json @@ -9,11 +9,6 @@ "version": "2.2.1-pre", "license": "MIT", "devDependencies": { - "@babel/cli": "^7.23.9", - "@babel/core": "^7.23.9", - "@babel/plugin-transform-modules-commonjs": "^7.23.3", - "@babel/preset-env": "^7.23.9", - "babel-plugin-add-module-exports": "^1.0.4", "benchmark": "2.1.4", "browserify": "16.5.1", "chai": "^4.3.6", @@ -50,70 +45,13 @@ "node": ">=6.0.0" } }, - "node_modules/@babel/cli": { - "version": "7.23.9", - "resolved": "https://registry.npmjs.org/@babel/cli/-/cli-7.23.9.tgz", - "integrity": "sha512-vB1UXmGDNEhcf1jNAHKT9IlYk1R+hehVTLFlCLHBi8gfuHQGP6uRjgXVYU0EVlI/qwAWpstqkBdf2aez3/z/5Q==", - "dev": true, - "dependencies": { - "@jridgewell/trace-mapping": "^0.3.17", - "commander": "^4.0.1", - "convert-source-map": "^2.0.0", - "fs-readdir-recursive": "^1.1.0", - "glob": "^7.2.0", - "make-dir": "^2.1.0", - "slash": "^2.0.0" - }, - "bin": { - "babel": "bin/babel.js", - "babel-external-helpers": "bin/babel-external-helpers.js" - }, - "engines": { - "node": ">=6.9.0" - }, - "optionalDependencies": { - "@nicolo-ribaudo/chokidar-2": "2.1.8-no-fsevents.3", - "chokidar": "^3.4.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/cli/node_modules/convert-source-map": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", - "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", - "dev": true - }, - "node_modules/@babel/cli/node_modules/make-dir": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz", - "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==", - "dev": true, - "dependencies": { - "pify": "^4.0.1", - "semver": "^5.6.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/@babel/cli/node_modules/semver": { - "version": "5.7.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", - "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", - "dev": true, - "bin": { - "semver": "bin/semver" - } - }, "node_modules/@babel/code-frame": { - "version": "7.23.5", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.23.5.tgz", - "integrity": "sha512-CgH3s1a96LipHCmSUmYFPwY7MNx8C3avkq7i4Wl3cfa662ldtUe4VM1TPXX70pfmrlWTb6jLqTYrZyT2ZTJBgA==", + "version": "7.22.13", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.22.13.tgz", + "integrity": "sha512-XktuhWlJ5g+3TJXc5upd9Ks1HutSArik6jf2eAjYFyIOf4ej3RN+184cZbzDvbPnuTJIUhPKKJE3cIsYTiAT3w==", "dev": true, "dependencies": { - "@babel/highlight": "^7.23.4", + "@babel/highlight": "^7.22.13", "chalk": "^2.4.2" }, "engines": { @@ -121,35 +59,33 @@ } }, "node_modules/@babel/compat-data": { - "version": "7.23.5", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.23.5.tgz", - "integrity": "sha512-uU27kfDRlhfKl+w1U6vp16IuvSLtjAxdArVXPa9BvLkrr7CYIsxH5adpHObeAGY/41+syctUWOZ140a2Rvkgjw==", + "version": "7.21.0", "dev": true, + "license": "MIT", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/core": { - "version": "7.23.9", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.23.9.tgz", - "integrity": "sha512-5q0175NOjddqpvvzU+kDiSOAk4PfdO6FvwCWoQ6RO7rTzEe8vlo+4HVfcnAREhD4npMs0e9uZypjTwzZPCf/cw==", + "version": "7.21.0", "dev": true, + "license": "MIT", "dependencies": { "@ampproject/remapping": "^2.2.0", - "@babel/code-frame": "^7.23.5", - "@babel/generator": "^7.23.6", - "@babel/helper-compilation-targets": "^7.23.6", - "@babel/helper-module-transforms": "^7.23.3", - "@babel/helpers": "^7.23.9", - "@babel/parser": "^7.23.9", - "@babel/template": "^7.23.9", - "@babel/traverse": "^7.23.9", - "@babel/types": "^7.23.9", - "convert-source-map": "^2.0.0", + "@babel/code-frame": "^7.18.6", + "@babel/generator": "^7.21.0", + "@babel/helper-compilation-targets": "^7.20.7", + "@babel/helper-module-transforms": "^7.21.0", + "@babel/helpers": "^7.21.0", + "@babel/parser": "^7.21.0", + "@babel/template": "^7.20.7", + "@babel/traverse": "^7.21.0", + "@babel/types": "^7.21.0", + "convert-source-map": "^1.7.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", - "json5": "^2.2.3", - "semver": "^6.3.1" + "json5": "^2.2.2", + "semver": "^6.3.0" }, "engines": { "node": ">=6.9.0" @@ -160,27 +96,25 @@ } }, "node_modules/@babel/core/node_modules/convert-source-map": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", - "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", - "dev": true + "version": "1.9.0", + "dev": true, + "license": "MIT" }, "node_modules/@babel/core/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "version": "6.3.0", "dev": true, + "license": "ISC", "bin": { "semver": "bin/semver.js" } }, "node_modules/@babel/generator": { - "version": "7.23.6", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.23.6.tgz", - "integrity": "sha512-qrSfCYxYQB5owCmGLbl8XRpX1ytXlpueOb0N0UmQwA073KZxejgQTzAmJezxvpwQD9uGtK2shHdi55QT+MbjIw==", + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.23.0.tgz", + "integrity": "sha512-lN85QRR+5IbYrMWM6Y4pE/noaQtg4pNiqeNGX60eqOfo6gtEj6uw/JagelB8vVztSd7R6M5n1+PQkDbHbBRU4g==", "dev": true, "dependencies": { - "@babel/types": "^7.23.6", + "@babel/types": "^7.23.0", "@jridgewell/gen-mapping": "^0.3.2", "@jridgewell/trace-mapping": "^0.3.17", "jsesc": "^2.5.1" @@ -190,10 +124,9 @@ } }, "node_modules/@babel/generator/node_modules/@jridgewell/gen-mapping": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz", - "integrity": "sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==", + "version": "0.3.2", "dev": true, + "license": "MIT", "dependencies": { "@jridgewell/set-array": "^1.0.1", "@jridgewell/sourcemap-codec": "^1.4.10", @@ -203,96 +136,16 @@ "node": ">=6.0.0" } }, - "node_modules/@babel/helper-annotate-as-pure": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.22.5.tgz", - "integrity": "sha512-LvBTxu8bQSQkcyKOU+a1btnNFQ1dMAd0R6PyW3arXes06F6QLWLIrd681bxRPIXlrMGR3XYnW9JyML7dP3qgxg==", - "dev": true, - "dependencies": { - "@babel/types": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-builder-binary-assignment-operator-visitor": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.22.15.tgz", - "integrity": "sha512-QkBXwGgaoC2GtGZRoma6kv7Szfv06khvhFav67ZExau2RaXzy8MpHSMO2PNoP2XtmQphJQRHFfg77Bq731Yizw==", - "dev": true, - "dependencies": { - "@babel/types": "^7.22.15" - }, - "engines": { - "node": ">=6.9.0" - } - }, "node_modules/@babel/helper-compilation-targets": { - "version": "7.23.6", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.23.6.tgz", - "integrity": "sha512-9JB548GZoQVmzrFgp8o7KxdgkTGm6xs9DW0o/Pim72UDjzr5ObUQ6ZzYPqA+g9OTS2bBQoctLJrky0RDCAWRgQ==", + "version": "7.20.7", "dev": true, + "license": "MIT", "dependencies": { - "@babel/compat-data": "^7.23.5", - "@babel/helper-validator-option": "^7.23.5", - "browserslist": "^4.22.2", + "@babel/compat-data": "^7.20.5", + "@babel/helper-validator-option": "^7.18.6", + "browserslist": "^4.21.3", "lru-cache": "^5.1.1", - "semver": "^6.3.1" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-compilation-targets/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true, - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/@babel/helper-create-class-features-plugin": { - "version": "7.23.9", - "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.23.9.tgz", - "integrity": "sha512-B2L9neXTIyPQoXDm+NtovPvG6VOLWnaXu3BIeVDWwdKFgG30oNa6CqVGiJPDWQwIAK49t9gnQI9c6K6RzabiKw==", - "dev": true, - "dependencies": { - "@babel/helper-annotate-as-pure": "^7.22.5", - "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-function-name": "^7.23.0", - "@babel/helper-member-expression-to-functions": "^7.23.0", - "@babel/helper-optimise-call-expression": "^7.22.5", - "@babel/helper-replace-supers": "^7.22.20", - "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5", - "@babel/helper-split-export-declaration": "^7.22.6", - "semver": "^6.3.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/helper-create-class-features-plugin/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true, - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/@babel/helper-create-regexp-features-plugin": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.22.15.tgz", - "integrity": "sha512-29FkPLFjn4TPEa3RE7GpW+qbE8tlsu3jntNYNfcGsc49LphF1PQIiD+vMZ1z1xVOKt+93khA9tc2JBs3kBjA7w==", - "dev": true, - "dependencies": { - "@babel/helper-annotate-as-pure": "^7.22.5", - "regexpu-core": "^5.3.1", - "semver": "^6.3.1" + "semver": "^6.3.0" }, "engines": { "node": ">=6.9.0" @@ -301,31 +154,14 @@ "@babel/core": "^7.0.0" } }, - "node_modules/@babel/helper-create-regexp-features-plugin/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "node_modules/@babel/helper-compilation-targets/node_modules/semver": { + "version": "6.3.0", "dev": true, + "license": "ISC", "bin": { "semver": "bin/semver.js" } }, - "node_modules/@babel/helper-define-polyfill-provider": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.5.0.tgz", - "integrity": "sha512-NovQquuQLAQ5HuyjCz7WQP9MjRj7dx++yspwiyUiGl9ZyadHRSql1HZh5ogRd8W8w6YM6EQ/NTB8rgjLt5W65Q==", - "dev": true, - "dependencies": { - "@babel/helper-compilation-targets": "^7.22.6", - "@babel/helper-plugin-utils": "^7.22.5", - "debug": "^4.1.1", - "lodash.debounce": "^4.0.8", - "resolve": "^1.14.2" - }, - "peerDependencies": { - "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" - } - }, "node_modules/@babel/helper-environment-visitor": { "version": "7.22.20", "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.20.tgz", @@ -360,123 +196,41 @@ "node": ">=6.9.0" } }, - "node_modules/@babel/helper-member-expression-to-functions": { - "version": "7.23.0", - "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.23.0.tgz", - "integrity": "sha512-6gfrPwh7OuT6gZyJZvd6WbTfrqAo7vm4xCzAXOusKqq/vWdKXphTpj5klHKNmRUU6/QRGlBsyU9mAIPaWHlqJA==", - "dev": true, - "dependencies": { - "@babel/types": "^7.23.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, "node_modules/@babel/helper-module-imports": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.22.15.tgz", - "integrity": "sha512-0pYVBnDKZO2fnSPCrgM/6WMc7eS20Fbok+0r88fp+YtWVLZrp4CkafFGIp+W0VKw4a22sgebPT99y+FDNMdP4w==", + "version": "7.18.6", "dev": true, + "license": "MIT", "dependencies": { - "@babel/types": "^7.22.15" + "@babel/types": "^7.18.6" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-module-transforms": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.23.3.tgz", - "integrity": "sha512-7bBs4ED9OmswdfDzpz4MpWgSrV7FXlc3zIagvLFjS5H+Mk7Snr21vQ6QwrsoCGMfNC4e4LQPdoULEt4ykz0SRQ==", - "dev": true, - "dependencies": { - "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-module-imports": "^7.22.15", - "@babel/helper-simple-access": "^7.22.5", - "@babel/helper-split-export-declaration": "^7.22.6", - "@babel/helper-validator-identifier": "^7.22.20" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/helper-optimise-call-expression": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.22.5.tgz", - "integrity": "sha512-HBwaojN0xFRx4yIvpwGqxiV2tUfl7401jlok564NgB9EHS1y6QT17FmKWm4ztqjeVdXLuC4fSvHc5ePpQjoTbw==", - "dev": true, - "dependencies": { - "@babel/types": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-plugin-utils": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.22.5.tgz", - "integrity": "sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg==", - "dev": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-remap-async-to-generator": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.22.20.tgz", - "integrity": "sha512-pBGyV4uBqOns+0UvhsTO8qgl8hO89PmiDYv+/COyp1aeMcmfrfruz+/nCMFiYyFF/Knn0yfrC85ZzNFjembFTw==", - "dev": true, - "dependencies": { - "@babel/helper-annotate-as-pure": "^7.22.5", - "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-wrap-function": "^7.22.20" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/helper-replace-supers": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.22.20.tgz", - "integrity": "sha512-qsW0In3dbwQUbK8kejJ4R7IHVGwHJlV6lpG6UA7a9hSa2YEiAib+N1T2kr6PEeUT+Fl7najmSOS6SmAwCHK6Tw==", + "version": "7.21.2", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-member-expression-to-functions": "^7.22.15", - "@babel/helper-optimise-call-expression": "^7.22.5" + "@babel/helper-environment-visitor": "^7.18.9", + "@babel/helper-module-imports": "^7.18.6", + "@babel/helper-simple-access": "^7.20.2", + "@babel/helper-split-export-declaration": "^7.18.6", + "@babel/helper-validator-identifier": "^7.19.1", + "@babel/template": "^7.20.7", + "@babel/traverse": "^7.21.2", + "@babel/types": "^7.21.2" }, "engines": { "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" } }, "node_modules/@babel/helper-simple-access": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.22.5.tgz", - "integrity": "sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w==", - "dev": true, - "dependencies": { - "@babel/types": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-skip-transparent-expression-wrappers": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.22.5.tgz", - "integrity": "sha512-tK14r66JZKiC43p8Ki33yLBVJKlQDFoA8GYN67lWCDCqoL6EMMSuM9b+Iff2jHaM/RRFYl7K+iiru7hbRqNx8Q==", + "version": "7.20.2", "dev": true, + "license": "MIT", "dependencies": { - "@babel/types": "^7.22.5" + "@babel/types": "^7.20.2" }, "engines": { "node": ">=6.9.0" @@ -495,9 +249,9 @@ } }, "node_modules/@babel/helper-string-parser": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.23.4.tgz", - "integrity": "sha512-803gmbQdqwdf4olxrX4AJyFBV/RTr3rSmOj0rKwesmzlfhYNDEs+/iOcznzpNWlJlIlTJC2QfPFcHB6DlzdVLQ==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.22.5.tgz", + "integrity": "sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw==", "dev": true, "engines": { "node": ">=6.9.0" @@ -513,46 +267,30 @@ } }, "node_modules/@babel/helper-validator-option": { - "version": "7.23.5", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.23.5.tgz", - "integrity": "sha512-85ttAOMLsr53VgXkTbkx8oA6YTfT4q7/HzXSLEYmjcSTJPMPQtvq1BD79Byep5xMUYbGRzEpDsjUf3dyp54IKw==", - "dev": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-wrap-function": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.22.20.tgz", - "integrity": "sha512-pms/UwkOpnQe/PDAEdV/d7dVCoBbB+R4FvYoHGZz+4VPcg7RtYy2KP7S2lbuWM6FCSgob5wshfGESbC/hzNXZw==", + "version": "7.21.0", "dev": true, - "dependencies": { - "@babel/helper-function-name": "^7.22.5", - "@babel/template": "^7.22.15", - "@babel/types": "^7.22.19" - }, + "license": "MIT", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helpers": { - "version": "7.23.9", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.23.9.tgz", - "integrity": "sha512-87ICKgU5t5SzOT7sBMfCOZQ2rHjRU+Pcb9BoILMYz600W6DkVRLFBPwQ18gwUVvggqXivaUakpnxWQGbpywbBQ==", + "version": "7.21.0", "dev": true, + "license": "MIT", "dependencies": { - "@babel/template": "^7.23.9", - "@babel/traverse": "^7.23.9", - "@babel/types": "^7.23.9" + "@babel/template": "^7.20.7", + "@babel/traverse": "^7.21.0", + "@babel/types": "^7.21.0" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/highlight": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.23.4.tgz", - "integrity": "sha512-acGdbYSfp2WheJoJm/EBBBLh/ID8KDc64ISZ9DYtBmC8/Q204PZJLHyzeB5qMzJ5trcOkybd78M4x2KWsUq++A==", + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.22.20.tgz", + "integrity": "sha512-dkdMCN3py0+ksCgYmGG8jKeGA/8Tk+gJwSYYlFGxG5lmhfKNoAy004YpLxpS1W2J8m/EK2Ew+yOs9pVRwO89mg==", "dev": true, "dependencies": { "@babel/helper-validator-identifier": "^7.22.20", @@ -564,9 +302,9 @@ } }, "node_modules/@babel/parser": { - "version": "7.23.9", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.23.9.tgz", - "integrity": "sha512-9tcKgqKbs3xGJ+NtKF2ndOBBLVwPjl1SHxPQkd36r3Dlirw3xWUeGaTbqr7uGZcTaxkVNwc+03SVP7aCdWrTlA==", + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.23.0.tgz", + "integrity": "sha512-vvPKKdMemU85V9WE/l5wZEmImpCtLqbnTvqDS2U1fJ96KrxoW7KrXhNsNCblQlg8Ck4b85yxdTyelsMUgFUXiw==", "dev": true, "bin": { "parser": "bin/babel-parser.js" @@ -575,2638 +313,2100 @@ "node": ">=6.0.0" } }, - "node_modules/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.23.3.tgz", - "integrity": "sha512-iRkKcCqb7iGnq9+3G6rZ+Ciz5VywC4XNRHe57lKM+jOeYAoR0lVqdeeDRfh0tQcTfw/+vBhHn926FmQhLtlFLQ==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.23.3.tgz", - "integrity": "sha512-WwlxbfMNdVEpQjZmK5mhm7oSwD3dS6eU+Iwsi4Knl9wAletWem7kaRsGOG+8UEbRyqxY4SS5zvtfXwX+jMxUwQ==", + "node_modules/@babel/template": { + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.22.15.tgz", + "integrity": "sha512-QPErUVm4uyJa60rkI73qneDacvdvzxshT3kksGqlGWYdOTIUOwJ7RDUL8sGqslY1uXWSL6xMFKEXDS3ox2uF0w==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5", - "@babel/plugin-transform-optional-chaining": "^7.23.3" + "@babel/code-frame": "^7.22.13", + "@babel/parser": "^7.22.15", + "@babel/types": "^7.22.15" }, "engines": { "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.13.0" } }, - "node_modules/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": { - "version": "7.23.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly/-/plugin-bugfix-v8-static-class-fields-redefine-readonly-7.23.7.tgz", - "integrity": "sha512-LlRT7HgaifEpQA1ZgLVOIJZZFVPWN5iReq/7/JixwBtwcoeVGDBD53ZV28rrsLYOZs1Y/EHhA8N/Z6aazHR8cw==", + "node_modules/@babel/traverse": { + "version": "7.23.2", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.23.2.tgz", + "integrity": "sha512-azpe59SQ48qG6nu2CzcMLbxUudtN+dOM9kDbUqGq3HXUJRlo7i8fvPoxQUzYgLZ4cMVmuZgm8vvBpNeRhd6XSw==", "dev": true, "dependencies": { + "@babel/code-frame": "^7.22.13", + "@babel/generator": "^7.23.0", "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-function-name": "^7.23.0", + "@babel/helper-hoist-variables": "^7.22.5", + "@babel/helper-split-export-declaration": "^7.22.6", + "@babel/parser": "^7.23.0", + "@babel/types": "^7.23.0", + "debug": "^4.1.0", + "globals": "^11.1.0" }, "engines": { "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" } }, - "node_modules/@babel/plugin-proposal-private-property-in-object": { - "version": "7.21.0-placeholder-for-preset-env.2", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.21.0-placeholder-for-preset-env.2.tgz", - "integrity": "sha512-SOSkfJDddaM7mak6cPEpswyTRnuRltl429hMraQEglW+OkovnCzsiszTmsrlY//qLFjCpQDFRvjdm2wA5pPm9w==", + "node_modules/@babel/traverse/node_modules/globals": { + "version": "11.12.0", "dev": true, + "license": "MIT", "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "node": ">=4" } }, - "node_modules/@babel/plugin-syntax-async-generators": { - "version": "7.8.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", - "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", + "node_modules/@babel/types": { + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.23.0.tgz", + "integrity": "sha512-0oIyUfKoI3mSqMvsxBdclDwxXKXAUA8v/apZbc+iSyARYou1o8ZGDxbUYyLFoW2arqS2jDGqJuZvv1d/io1axg==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" + "@babel/helper-string-parser": "^7.22.5", + "@babel/helper-validator-identifier": "^7.22.20", + "to-fast-properties": "^2.0.0" }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "engines": { + "node": ">=6.9.0" } }, - "node_modules/@babel/plugin-syntax-class-properties": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz", - "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==", + "node_modules/@colors/colors": { + "version": "1.5.0", "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.12.13" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "license": "MIT", + "engines": { + "node": ">=0.1.90" } }, - "node_modules/@babel/plugin-syntax-class-static-block": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz", - "integrity": "sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==", + "node_modules/@eslint/eslintrc": { + "version": "2.0.0", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.14.5" + "ajv": "^6.12.4", + "debug": "^4.3.2", + "espree": "^9.4.0", + "globals": "^13.19.0", + "ignore": "^5.2.0", + "import-fresh": "^3.2.1", + "js-yaml": "^4.1.0", + "minimatch": "^3.1.2", + "strip-json-comments": "^3.1.1" }, "engines": { - "node": ">=6.9.0" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "funding": { + "url": "https://opencollective.com/eslint" } }, - "node_modules/@babel/plugin-syntax-dynamic-import": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz", - "integrity": "sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==", + "node_modules/@eslint/eslintrc/node_modules/argparse": { + "version": "2.0.1", "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } + "license": "Python-2.0" }, - "node_modules/@babel/plugin-syntax-export-namespace-from": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-export-namespace-from/-/plugin-syntax-export-namespace-from-7.8.3.tgz", - "integrity": "sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q==", + "node_modules/@eslint/eslintrc/node_modules/js-yaml": { + "version": "4.1.0", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.8.3" + "argparse": "^2.0.1" }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "bin": { + "js-yaml": "bin/js-yaml.js" } }, - "node_modules/@babel/plugin-syntax-import-assertions": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.23.3.tgz", - "integrity": "sha512-lPgDSU+SJLK3xmFDTV2ZRQAiM7UuUjGidwBywFavObCiZc1BeAAcMtHJKUya92hPHO+at63JJPLygilZard8jw==", + "node_modules/@eslint/eslintrc/node_modules/minimatch": { + "version": "3.1.2", "dev": true, + "license": "ISC", "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" + "brace-expansion": "^1.1.7" }, "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "node": "*" } }, - "node_modules/@babel/plugin-syntax-import-attributes": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.23.3.tgz", - "integrity": "sha512-pawnE0P9g10xgoP7yKr6CK63K2FMsTE+FZidZO/1PwRdzmAPVs+HS1mAURUsgaoxammTJvULUdIkEK0gOcU2tA==", + "node_modules/@eslint/js": { + "version": "8.35.0", "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" - }, + "license": "MIT", "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" } }, - "node_modules/@babel/plugin-syntax-import-meta": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz", - "integrity": "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==", + "node_modules/@humanwhocodes/config-array": { + "version": "0.11.8", "dev": true, + "license": "Apache-2.0", "dependencies": { - "@babel/helper-plugin-utils": "^7.10.4" + "@humanwhocodes/object-schema": "^1.2.1", + "debug": "^4.1.1", + "minimatch": "^3.0.5" }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "engines": { + "node": ">=10.10.0" } }, - "node_modules/@babel/plugin-syntax-json-strings": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", - "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", + "node_modules/@humanwhocodes/config-array/node_modules/minimatch": { + "version": "3.1.2", "dev": true, + "license": "ISC", "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" + "brace-expansion": "^1.1.7" }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "engines": { + "node": "*" } }, - "node_modules/@babel/plugin-syntax-logical-assignment-operators": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz", - "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", + "node_modules/@humanwhocodes/module-importer": { + "version": "1.0.1", "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.10.4" + "license": "Apache-2.0", + "engines": { + "node": ">=12.22" }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" } }, - "node_modules/@babel/plugin-syntax-nullish-coalescing-operator": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", - "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", + "node_modules/@humanwhocodes/object-schema": { + "version": "1.2.1", "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } + "license": "BSD-3-Clause" }, - "node_modules/@babel/plugin-syntax-numeric-separator": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz", - "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", + "node_modules/@istanbuljs/load-nyc-config": { + "version": "1.1.0", "dev": true, + "license": "ISC", "dependencies": { - "@babel/helper-plugin-utils": "^7.10.4" + "camelcase": "^5.3.1", + "find-up": "^4.1.0", + "get-package-type": "^0.1.0", + "js-yaml": "^3.13.1", + "resolve-from": "^5.0.0" }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "engines": { + "node": ">=8" } }, - "node_modules/@babel/plugin-syntax-object-rest-spread": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", - "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", + "node_modules/@istanbuljs/load-nyc-config/node_modules/camelcase": { + "version": "5.3.1", "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "license": "MIT", + "engines": { + "node": ">=6" } }, - "node_modules/@babel/plugin-syntax-optional-catch-binding": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", - "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", + "node_modules/@istanbuljs/load-nyc-config/node_modules/find-up": { + "version": "4.1.0", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "engines": { + "node": ">=8" } }, - "node_modules/@babel/plugin-syntax-optional-chaining": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", - "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", + "node_modules/@istanbuljs/load-nyc-config/node_modules/locate-path": { + "version": "5.0.0", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" + "p-locate": "^4.1.0" }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "engines": { + "node": ">=8" } }, - "node_modules/@babel/plugin-syntax-private-property-in-object": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz", - "integrity": "sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==", + "node_modules/@istanbuljs/load-nyc-config/node_modules/p-limit": { + "version": "2.3.0", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.14.5" + "p-try": "^2.0.0" }, "engines": { - "node": ">=6.9.0" + "node": ">=6" }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@babel/plugin-syntax-top-level-await": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz", - "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==", + "node_modules/@istanbuljs/load-nyc-config/node_modules/p-locate": { + "version": "4.1.0", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.14.5" + "p-limit": "^2.2.0" }, "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "node": ">=8" } }, - "node_modules/@babel/plugin-syntax-unicode-sets-regex": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-unicode-sets-regex/-/plugin-syntax-unicode-sets-regex-7.18.6.tgz", - "integrity": "sha512-727YkEAPwSIQTv5im8QHz3upqp92JTWhidIC81Tdx4VJYIte/VndKf1qKrfnnhPLiPghStWfvC/iFaMCQu7Nqg==", + "node_modules/@istanbuljs/load-nyc-config/node_modules/resolve-from": { + "version": "5.0.0", "dev": true, - "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6" - }, + "license": "MIT", "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" + "node": ">=8" } }, - "node_modules/@babel/plugin-transform-arrow-functions": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.23.3.tgz", - "integrity": "sha512-NzQcQrzaQPkaEwoTm4Mhyl8jI1huEL/WWIEvudjTCMJ9aBZNpsJbMASx7EQECtQQPS/DcnFpo0FIh3LvEO9cxQ==", + "node_modules/@istanbuljs/schema": { + "version": "0.1.3", "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" - }, + "license": "MIT", "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "node": ">=8" } }, - "node_modules/@babel/plugin-transform-async-generator-functions": { - "version": "7.23.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.23.9.tgz", - "integrity": "sha512-8Q3veQEDGe14dTYuwagbRtwxQDnytyg1JFu4/HwEMETeofocrB0U0ejBJIXoeG/t2oXZ8kzCyI0ZZfbT80VFNQ==", + "node_modules/@jridgewell/gen-mapping": { + "version": "0.1.1", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/helper-remap-async-to-generator": "^7.22.20", - "@babel/plugin-syntax-async-generators": "^7.8.4" + "@jridgewell/set-array": "^1.0.0", + "@jridgewell/sourcemap-codec": "^1.4.10" }, "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "node": ">=6.0.0" } }, - "node_modules/@babel/plugin-transform-async-to-generator": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.23.3.tgz", - "integrity": "sha512-A7LFsKi4U4fomjqXJlZg/u0ft/n8/7n7lpffUP/ZULx/DtV9SGlNKZolHH6PE8Xl1ngCc0M11OaeZptXVkfKSw==", + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.0", "dev": true, - "dependencies": { - "@babel/helper-module-imports": "^7.22.15", - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/helper-remap-async-to-generator": "^7.22.20" - }, + "license": "MIT", "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "node": ">=6.0.0" } }, - "node_modules/@babel/plugin-transform-block-scoped-functions": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.23.3.tgz", - "integrity": "sha512-vI+0sIaPIO6CNuM9Kk5VmXcMVRiOpDh7w2zZt9GXzmE/9KD70CUEVhvPR/etAeNK/FAEkhxQtXOzVF3EuRL41A==", + "node_modules/@jridgewell/set-array": { + "version": "1.1.2", "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" - }, + "license": "MIT", "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "node": ">=6.0.0" } }, - "node_modules/@babel/plugin-transform-block-scoping": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.23.4.tgz", - "integrity": "sha512-0QqbP6B6HOh7/8iNR4CQU2Th/bbRtBp4KS9vcaZd1fZ0wSh5Fyssg0UCIHwxh+ka+pNDREbVLQnHCMHKZfPwfw==", + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.4.14", + "dev": true, + "license": "MIT" + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.17", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "@jridgewell/resolve-uri": "3.1.0", + "@jridgewell/sourcemap-codec": "1.4.14" } }, - "node_modules/@babel/plugin-transform-class-properties": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.23.3.tgz", - "integrity": "sha512-uM+AN8yCIjDPccsKGlw271xjJtGii+xQIF/uMPS8H15L12jZTsLfF4o5vNO7d/oUguOyfdikHGc/yi9ge4SGIg==", + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.22.15", - "@babel/helper-plugin-utils": "^7.22.5" + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" }, "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "node": ">= 8" } }, - "node_modules/@babel/plugin-transform-class-static-block": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.23.4.tgz", - "integrity": "sha512-nsWu/1M+ggti1SOALj3hfx5FXzAY06fwPJsUZD4/A5e1bWi46VUIWtD+kOX6/IdhXGsXBWllLFDSnqSCdUNydQ==", + "node_modules/@nodelib/fs.stat": { + "version": "2.0.5", "dev": true, - "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.22.15", - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/plugin-syntax-class-static-block": "^7.14.5" - }, + "license": "MIT", "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.12.0" + "node": ">= 8" } }, - "node_modules/@babel/plugin-transform-classes": { - "version": "7.23.8", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.23.8.tgz", - "integrity": "sha512-yAYslGsY1bX6Knmg46RjiCiNSwJKv2IUC8qOdYKqMMr0491SXFhcHqOdRDeCRohOOIzwN/90C6mQ9qAKgrP7dg==", + "node_modules/@nodelib/fs.walk": { + "version": "1.2.8", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-annotate-as-pure": "^7.22.5", - "@babel/helper-compilation-targets": "^7.23.6", - "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-function-name": "^7.23.0", - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/helper-replace-supers": "^7.22.20", - "@babel/helper-split-export-declaration": "^7.22.6", - "globals": "^11.1.0" + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" }, "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "node": ">= 8" } }, - "node_modules/@babel/plugin-transform-classes/node_modules/globals": { - "version": "11.12.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", - "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "node_modules/@socket.io/component-emitter": { + "version": "3.1.0", "dev": true, - "engines": { - "node": ">=4" - } + "license": "MIT" }, - "node_modules/@babel/plugin-transform-computed-properties": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.23.3.tgz", - "integrity": "sha512-dTj83UVTLw/+nbiHqQSFdwO9CbTtwq1DsDqm3CUEtDrZNET5rT5E6bIdTlOftDTDLMYxvxHNEYO4B9SLl8SLZw==", + "node_modules/@types/cookie": { + "version": "0.4.1", "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/template": "^7.22.15" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } + "license": "MIT" }, - "node_modules/@babel/plugin-transform-destructuring": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.23.3.tgz", - "integrity": "sha512-n225npDqjDIr967cMScVKHXJs7rout1q+tt50inyBCPkyZ8KxeI6d+GIbSBTT/w/9WdlWDOej3V9HE5Lgk57gw==", + "node_modules/@types/cors": { + "version": "2.8.13", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "@types/node": "*" } }, - "node_modules/@babel/plugin-transform-dotall-regex": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.23.3.tgz", - "integrity": "sha512-vgnFYDHAKzFaTVp+mneDsIEbnJ2Np/9ng9iviHw3P/KVcgONxpNULEW/51Z/BaFojG2GI2GwwXck5uV1+1NOYQ==", + "node_modules/@types/node": { + "version": "18.14.2", + "dev": true, + "license": "MIT" + }, + "node_modules/accepts": { + "version": "1.3.8", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.22.15", - "@babel/helper-plugin-utils": "^7.22.5" + "mime-types": "~2.1.34", + "negotiator": "0.6.3" }, "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "node": ">= 0.6" } }, - "node_modules/@babel/plugin-transform-duplicate-keys": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.23.3.tgz", - "integrity": "sha512-RrqQ+BQmU3Oyav3J+7/myfvRCq7Tbz+kKLLshUmMwNlDHExbGL7ARhajvoBJEvc+fCguPPu887N+3RRXBVKZUA==", + "node_modules/acorn": { + "version": "7.4.1", "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" + "license": "MIT", + "bin": { + "acorn": "bin/acorn" }, "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "node": ">=0.4.0" } }, - "node_modules/@babel/plugin-transform-dynamic-import": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.23.4.tgz", - "integrity": "sha512-V6jIbLhdJK86MaLh4Jpghi8ho5fGzt3imHOBu/x0jlBaPYqDoWz4RDXjmMOfnh+JWNaQleEAByZLV0QzBT4YQQ==", + "node_modules/acorn-jsx": { + "version": "5.3.2", "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/plugin-syntax-dynamic-import": "^7.8.3" - }, - "engines": { - "node": ">=6.9.0" - }, + "license": "MIT", "peerDependencies": { - "@babel/core": "^7.0.0-0" + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" } }, - "node_modules/@babel/plugin-transform-exponentiation-operator": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.23.3.tgz", - "integrity": "sha512-5fhCsl1odX96u7ILKHBj4/Y8vipoqwsJMh4csSA8qFfxrZDEA4Ssku2DyNvMJSmZNOEBT750LfFPbtrnTP90BQ==", + "node_modules/acorn-node": { + "version": "1.8.2", "dev": true, + "license": "Apache-2.0", "dependencies": { - "@babel/helper-builder-binary-assignment-operator-visitor": "^7.22.15", - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "acorn": "^7.0.0", + "acorn-walk": "^7.0.0", + "xtend": "^4.0.2" } }, - "node_modules/@babel/plugin-transform-export-namespace-from": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.23.4.tgz", - "integrity": "sha512-GzuSBcKkx62dGzZI1WVgTWvkkz84FZO5TC5T8dl/Tht/rAla6Dg/Mz9Yhypg+ezVACf/rgDuQt3kbWEv7LdUDQ==", + "node_modules/acorn-walk": { + "version": "7.0.0", "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/plugin-syntax-export-namespace-from": "^7.8.3" - }, + "license": "MIT", "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "node": ">=0.4.0" } }, - "node_modules/@babel/plugin-transform-for-of": { - "version": "7.23.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.23.6.tgz", - "integrity": "sha512-aYH4ytZ0qSuBbpfhuofbg/e96oQ7U2w1Aw/UQmKT+1l39uEhUPoFS3fHevDc1G0OvewyDudfMKY1OulczHzWIw==", + "node_modules/aggregate-error": { + "version": "3.1.0", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5" + "clean-stack": "^2.0.0", + "indent-string": "^4.0.0" }, "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "node": ">=8" } }, - "node_modules/@babel/plugin-transform-function-name": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.23.3.tgz", - "integrity": "sha512-I1QXp1LxIvt8yLaib49dRW5Okt7Q4oaxao6tFVKS/anCdEOMtYwWVKoiOA1p34GOWIZjUK0E+zCp7+l1pfQyiw==", + "node_modules/ajv": { + "version": "6.12.6", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-compilation-targets": "^7.22.15", - "@babel/helper-function-name": "^7.23.0", - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" } }, - "node_modules/@babel/plugin-transform-json-strings": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.23.4.tgz", - "integrity": "sha512-81nTOqM1dMwZ/aRXQ59zVubN9wHGqk6UtqRK+/q+ciXmRy8fSolhGVvG09HHRGo4l6fr/c4ZhXUQH0uFW7PZbg==", + "node_modules/ansi-regex": { + "version": "5.0.1", "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/plugin-syntax-json-strings": "^7.8.3" - }, + "license": "MIT", "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "node": ">=8" } }, - "node_modules/@babel/plugin-transform-literals": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.23.3.tgz", - "integrity": "sha512-wZ0PIXRxnwZvl9AYpqNUxpZ5BiTGrYt7kueGQ+N5FiQ7RCOD4cm8iShd6S6ggfVIWaJf2EMk8eRzAh52RfP4rQ==", + "node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" + "color-convert": "^1.9.0" }, "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "node": ">=4" } }, - "node_modules/@babel/plugin-transform-logical-assignment-operators": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.23.4.tgz", - "integrity": "sha512-Mc/ALf1rmZTP4JKKEhUwiORU+vcfarFVLfcFiolKUo6sewoxSEgl36ak5t+4WamRsNr6nzjZXQjM35WsU+9vbg==", + "node_modules/anymatch": { + "version": "3.1.3", "dev": true, + "license": "ISC", "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4" + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" }, "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "node": ">= 8" } }, - "node_modules/@babel/plugin-transform-member-expression-literals": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.23.3.tgz", - "integrity": "sha512-sC3LdDBDi5x96LA+Ytekz2ZPk8i/Ck+DEuDbRAll5rknJ5XRTSaPKEYwomLcs1AA8wg9b3KjIQRsnApj+q51Ag==", + "node_modules/append-transform": { + "version": "2.0.0", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" + "default-require-extensions": "^3.0.0" }, "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "node": ">=8" } }, - "node_modules/@babel/plugin-transform-modules-amd": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.23.3.tgz", - "integrity": "sha512-vJYQGxeKM4t8hYCKVBlZX/gtIY2I7mRGFNcm85sgXGMTBcoV3QdVtdpbcWEbzbfUIUZKwvgFT82mRvaQIebZzw==", + "node_modules/archy": { + "version": "1.0.0", "dev": true, - "dependencies": { - "@babel/helper-module-transforms": "^7.23.3", - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } + "license": "MIT" }, - "node_modules/@babel/plugin-transform-modules-commonjs": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.23.3.tgz", - "integrity": "sha512-aVS0F65LKsdNOtcz6FRCpE4OgsP2OFnW46qNxNIX9h3wuzaNcSQsJysuMwqSibC98HPrf2vCgtxKNwS0DAlgcA==", + "node_modules/argparse": { + "version": "1.0.10", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-module-transforms": "^7.23.3", - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/helper-simple-access": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "sprintf-js": "~1.0.2" } }, - "node_modules/@babel/plugin-transform-modules-systemjs": { - "version": "7.23.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.23.9.tgz", - "integrity": "sha512-KDlPRM6sLo4o1FkiSlXoAa8edLXFsKKIda779fbLrvmeuc3itnjCtaO6RrtoaANsIJANj+Vk1zqbZIMhkCAHVw==", + "node_modules/asn1.js": { + "version": "5.4.1", + "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-5.4.1.tgz", + "integrity": "sha512-+I//4cYPccV8LdmBLiX8CYvf9Sp3vQsrqu2QNXRcrbiWvcx/UdlFiqUJJzxRQxgsZmvhXhn4cSKeSmoFjVdupA==", "dev": true, "dependencies": { - "@babel/helper-hoist-variables": "^7.22.5", - "@babel/helper-module-transforms": "^7.23.3", - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/helper-validator-identifier": "^7.22.20" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "bn.js": "^4.0.0", + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0", + "safer-buffer": "^2.1.0" } }, - "node_modules/@babel/plugin-transform-modules-umd": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.23.3.tgz", - "integrity": "sha512-zHsy9iXX2nIsCBFPud3jKn1IRPWg3Ing1qOZgeKV39m1ZgIdpJqvlWVeiHBZC6ITRG0MfskhYe9cLgntfSFPIg==", + "node_modules/assert": { + "version": "1.5.0", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-module-transforms": "^7.23.3", - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "object-assign": "^4.1.1", + "util": "0.10.3" } }, - "node_modules/@babel/plugin-transform-named-capturing-groups-regex": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.22.5.tgz", - "integrity": "sha512-YgLLKmS3aUBhHaxp5hi1WJTgOUb/NCuDHzGT9z9WTt3YG+CPRhJs6nprbStx6DnWM4dh6gt7SU3sZodbZ08adQ==", + "node_modules/assert/node_modules/inherits": { + "version": "2.0.1", "dev": true, - "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.22.5", - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } + "license": "ISC" }, - "node_modules/@babel/plugin-transform-new-target": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.23.3.tgz", - "integrity": "sha512-YJ3xKqtJMAT5/TIZnpAR3I+K+WaDowYbN3xyxI8zxx/Gsypwf9B9h0VB+1Nh6ACAAPRS5NSRje0uVv5i79HYGQ==", + "node_modules/assert/node_modules/util": { + "version": "0.10.3", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "inherits": "2.0.1" } }, - "node_modules/@babel/plugin-transform-nullish-coalescing-operator": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.23.4.tgz", - "integrity": "sha512-jHE9EVVqHKAQx+VePv5LLGHjmHSJR76vawFPTdlxR/LVJPfOEGxREQwQfjuZEOPTwG92X3LINSh3M40Rv4zpVA==", + "node_modules/assertion-error": { + "version": "1.1.0", "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3" - }, + "license": "MIT", "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "node": "*" } }, - "node_modules/@babel/plugin-transform-numeric-separator": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.23.4.tgz", - "integrity": "sha512-mps6auzgwjRrwKEZA05cOwuDc9FAzoyFS4ZsG/8F43bTLf/TgkJg7QXOrPO1JO599iA3qgK9MXdMGOEC8O1h6Q==", + "node_modules/balanced-match": { + "version": "1.0.0", + "dev": true, + "license": "MIT" + }, + "node_modules/base64-js": { + "version": "1.5.1", "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/plugin-syntax-numeric-separator": "^7.10.4" - }, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/base64id": { + "version": "2.0.0", + "dev": true, + "license": "MIT", "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "node": "^4.5.0 || >= 5.9" } }, - "node_modules/@babel/plugin-transform-object-rest-spread": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.23.4.tgz", - "integrity": "sha512-9x9K1YyeQVw0iOXJlIzwm8ltobIIv7j2iLyP2jIhEbqPRQ7ScNgwQufU2I0Gq11VjyG4gI4yMXt2VFags+1N3g==", + "node_modules/beeper": { + "version": "1.1.1", "dev": true, - "dependencies": { - "@babel/compat-data": "^7.23.3", - "@babel/helper-compilation-targets": "^7.22.15", - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/plugin-syntax-object-rest-spread": "^7.8.3", - "@babel/plugin-transform-parameters": "^7.23.3" - }, + "license": "MIT", "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "node": ">=0.10.0" } }, - "node_modules/@babel/plugin-transform-object-super": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.23.3.tgz", - "integrity": "sha512-BwQ8q0x2JG+3lxCVFohg+KbQM7plfpBwThdW9A6TMtWwLsbDA01Ek2Zb/AgDN39BiZsExm4qrXxjk+P1/fzGrA==", + "node_modules/benchmark": { + "version": "2.1.4", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/helper-replace-supers": "^7.22.20" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "lodash": "^4.17.4", + "platform": "^1.3.3" } }, - "node_modules/@babel/plugin-transform-optional-catch-binding": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.23.4.tgz", - "integrity": "sha512-XIq8t0rJPHf6Wvmbn9nFxU6ao4c7WhghTR5WyV8SrJfUFzyxhCm4nhC+iAp3HFhbAKLfYpgzhJ6t4XCtVwqO5A==", + "node_modules/binary-extensions": { + "version": "2.2.0", "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/plugin-syntax-optional-catch-binding": "^7.8.3" - }, + "license": "MIT", "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "node": ">=8" } }, - "node_modules/@babel/plugin-transform-optional-chaining": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.23.4.tgz", - "integrity": "sha512-ZU8y5zWOfjM5vZ+asjgAPwDaBjJzgufjES89Rs4Lpq63O300R/kOz30WCLo6BxxX6QVEilwSlpClnG5cZaikTA==", + "node_modules/bn.js": { + "version": "4.12.0", + "dev": true, + "license": "MIT" + }, + "node_modules/body-parser": { + "version": "1.20.2", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5", - "@babel/plugin-syntax-optional-chaining": "^7.8.3" + "bytes": "3.1.2", + "content-type": "~1.0.5", + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "on-finished": "2.4.1", + "qs": "6.11.0", + "raw-body": "2.5.2", + "type-is": "~1.6.18", + "unpipe": "1.0.0" }, "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" } }, - "node_modules/@babel/plugin-transform-parameters": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.23.3.tgz", - "integrity": "sha512-09lMt6UsUb3/34BbECKVbVwrT9bO6lILWln237z7sLaWnMsTi7Yc9fhX5DLpkJzAGfaReXI22wP41SZmnAA3Vw==", + "node_modules/body-parser/node_modules/debug": { + "version": "2.6.9", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "ms": "2.0.0" } }, - "node_modules/@babel/plugin-transform-private-methods": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.23.3.tgz", - "integrity": "sha512-UzqRcRtWsDMTLrRWFvUBDwmw06tCQH9Rl1uAjfh6ijMSmGYQ+fpdB+cnqRC8EMh5tuuxSv0/TejGL+7vyj+50g==", + "node_modules/body-parser/node_modules/ms": { + "version": "2.0.0", "dev": true, - "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.22.15", - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } + "license": "MIT" }, - "node_modules/@babel/plugin-transform-private-property-in-object": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.23.4.tgz", - "integrity": "sha512-9G3K1YqTq3F4Vt88Djx1UZ79PDyj+yKRnUy7cZGSMe+a7jkwD259uKKuUzQlPkGam7R+8RJwh5z4xO27fA1o2A==", + "node_modules/body-parser/node_modules/on-finished": { + "version": "2.4.1", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-annotate-as-pure": "^7.22.5", - "@babel/helper-create-class-features-plugin": "^7.22.15", - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/plugin-syntax-private-property-in-object": "^7.14.5" + "ee-first": "1.1.1" }, "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "node": ">= 0.8" } }, - "node_modules/@babel/plugin-transform-property-literals": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.23.3.tgz", - "integrity": "sha512-jR3Jn3y7cZp4oEWPFAlRsSWjxKe4PZILGBSd4nis1TsC5qeSpb+nrtihJuDhNI7QHiVbUaiXa0X2RZY3/TI6Nw==", + "node_modules/brace-expansion": { + "version": "1.1.11", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" } }, - "node_modules/@babel/plugin-transform-regenerator": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.23.3.tgz", - "integrity": "sha512-KP+75h0KghBMcVpuKisx3XTu9Ncut8Q8TuvGO4IhY+9D5DFEckQefOuIsB/gQ2tG71lCke4NMrtIPS8pOj18BQ==", + "node_modules/braces": { + "version": "3.0.2", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5", - "regenerator-transform": "^0.15.2" + "fill-range": "^7.0.1" }, "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "node": ">=8" } }, - "node_modules/@babel/plugin-transform-reserved-words": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.23.3.tgz", - "integrity": "sha512-QnNTazY54YqgGxwIexMZva9gqbPa15t/x9VS+0fsEFWplwVpXYZivtgl43Z1vMpc1bdPP2PP8siFeVcnFvA3Cg==", + "node_modules/brorand": { + "version": "1.1.0", "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } + "license": "MIT" }, - "node_modules/@babel/plugin-transform-shorthand-properties": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.23.3.tgz", - "integrity": "sha512-ED2fgqZLmexWiN+YNFX26fx4gh5qHDhn1O2gvEhreLW2iI63Sqm4llRLCXALKrCnbN4Jy0VcMQZl/SAzqug/jg==", + "node_modules/browser-pack": { + "version": "6.1.0", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" + "combine-source-map": "~0.8.0", + "defined": "^1.0.0", + "JSONStream": "^1.0.3", + "safe-buffer": "^5.1.1", + "through2": "^2.0.0", + "umd": "^3.0.0" }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "bin": { + "browser-pack": "bin/cmd.js" } }, - "node_modules/@babel/plugin-transform-spread": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.23.3.tgz", - "integrity": "sha512-VvfVYlrlBVu+77xVTOAoxQ6mZbnIq5FM0aGBSFEcIh03qHf+zNqA4DC/3XMUozTg7bZV3e3mZQ0i13VB6v5yUg==", + "node_modules/browser-resolve": { + "version": "1.11.3", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "resolve": "1.1.7" } }, - "node_modules/@babel/plugin-transform-sticky-regex": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.23.3.tgz", - "integrity": "sha512-HZOyN9g+rtvnOU3Yh7kSxXrKbzgrm5X4GncPY1QOquu7epga5MxKHVpYu2hvQnry/H+JjckSYRb93iNfsioAGg==", + "node_modules/browser-resolve/node_modules/resolve": { + "version": "1.1.7", "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } + "license": "MIT" }, - "node_modules/@babel/plugin-transform-template-literals": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.23.3.tgz", - "integrity": "sha512-Flok06AYNp7GV2oJPZZcP9vZdszev6vPBkHLwxwSpaIqx75wn6mUd3UFWsSsA0l8nXAKkyCmL/sR02m8RYGeHg==", + "node_modules/browser-stdout": { + "version": "1.3.1", "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } + "license": "ISC" }, - "node_modules/@babel/plugin-transform-typeof-symbol": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.23.3.tgz", - "integrity": "sha512-4t15ViVnaFdrPC74be1gXBSMzXk3B4Us9lP7uLRQHTFpV5Dvt33pn+2MyyNxmN3VTTm3oTrZVMUmuw3oBnQ2oQ==", + "node_modules/browserify": { + "version": "16.5.1", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" + "assert": "^1.4.0", + "browser-pack": "^6.0.1", + "browser-resolve": "^1.11.0", + "browserify-zlib": "~0.2.0", + "buffer": "~5.2.1", + "cached-path-relative": "^1.0.0", + "concat-stream": "^1.6.0", + "console-browserify": "^1.1.0", + "constants-browserify": "~1.0.0", + "crypto-browserify": "^3.0.0", + "defined": "^1.0.0", + "deps-sort": "^2.0.0", + "domain-browser": "^1.2.0", + "duplexer2": "~0.1.2", + "events": "^2.0.0", + "glob": "^7.1.0", + "has": "^1.0.0", + "htmlescape": "^1.1.0", + "https-browserify": "^1.0.0", + "inherits": "~2.0.1", + "insert-module-globals": "^7.0.0", + "JSONStream": "^1.0.3", + "labeled-stream-splicer": "^2.0.0", + "mkdirp-classic": "^0.5.2", + "module-deps": "^6.0.0", + "os-browserify": "~0.3.0", + "parents": "^1.0.1", + "path-browserify": "~0.0.0", + "process": "~0.11.0", + "punycode": "^1.3.2", + "querystring-es3": "~0.2.0", + "read-only-stream": "^2.0.0", + "readable-stream": "^2.0.2", + "resolve": "^1.1.4", + "shasum": "^1.0.0", + "shell-quote": "^1.6.1", + "stream-browserify": "^2.0.0", + "stream-http": "^3.0.0", + "string_decoder": "^1.1.1", + "subarg": "^1.0.0", + "syntax-error": "^1.1.1", + "through2": "^2.0.0", + "timers-browserify": "^1.0.1", + "tty-browserify": "0.0.1", + "url": "~0.11.0", + "util": "~0.10.1", + "vm-browserify": "^1.0.0", + "xtend": "^4.0.0" }, - "engines": { - "node": ">=6.9.0" + "bin": { + "browserify": "bin/cmd.js" }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "engines": { + "node": ">= 0.8" } }, - "node_modules/@babel/plugin-transform-unicode-escapes": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.23.3.tgz", - "integrity": "sha512-OMCUx/bU6ChE3r4+ZdylEqAjaQgHAgipgW8nsCfu5pGqDcFytVd91AwRvUJSBZDz0exPGgnjoqhgRYLRjFZc9Q==", + "node_modules/browserify-aes": { + "version": "1.2.0", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "buffer-xor": "^1.0.3", + "cipher-base": "^1.0.0", + "create-hash": "^1.1.0", + "evp_bytestokey": "^1.0.3", + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" } }, - "node_modules/@babel/plugin-transform-unicode-property-regex": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.23.3.tgz", - "integrity": "sha512-KcLIm+pDZkWZQAFJ9pdfmh89EwVfmNovFBcXko8szpBeF8z68kWIPeKlmSOkT9BXJxs2C0uk+5LxoxIv62MROA==", + "node_modules/browserify-cipher": { + "version": "1.0.1", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.22.15", - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "browserify-aes": "^1.0.4", + "browserify-des": "^1.0.0", + "evp_bytestokey": "^1.0.0" } }, - "node_modules/@babel/plugin-transform-unicode-regex": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.23.3.tgz", - "integrity": "sha512-wMHpNA4x2cIA32b/ci3AfwNgheiva2W0WUKWTK7vBHBhDKfPsc5cFGNWm69WBqpwd86u1qwZ9PWevKqm1A3yAw==", + "node_modules/browserify-des": { + "version": "1.0.2", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.22.15", - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "cipher-base": "^1.0.1", + "des.js": "^1.0.0", + "inherits": "^2.0.1", + "safe-buffer": "^5.1.2" } }, - "node_modules/@babel/plugin-transform-unicode-sets-regex": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.23.3.tgz", - "integrity": "sha512-W7lliA/v9bNR83Qc3q1ip9CQMZ09CcHDbHfbLRDNuAhn1Mvkr1ZNF7hPmztMQvtTGVLJ9m8IZqWsTkXOml8dbw==", + "node_modules/browserify-rsa": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.1.0.tgz", + "integrity": "sha512-AdEER0Hkspgno2aR97SAf6vi0y0k8NuOpGnVH3O99rcA5Q6sh8QxcngtHuJ6uXwnfAXNM4Gn1Gb7/MV1+Ymbog==", "dev": true, "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.22.15", - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/preset-env": { - "version": "7.23.9", - "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.23.9.tgz", - "integrity": "sha512-3kBGTNBBk9DQiPoXYS0g0BYlwTQYUTifqgKTjxUwEUkduRT2QOa0FPGBJ+NROQhGyYO5BuTJwGvBnqKDykac6A==", - "dev": true, - "dependencies": { - "@babel/compat-data": "^7.23.5", - "@babel/helper-compilation-targets": "^7.23.6", - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/helper-validator-option": "^7.23.5", - "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.23.3", - "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.23.3", - "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": "^7.23.7", - "@babel/plugin-proposal-private-property-in-object": "7.21.0-placeholder-for-preset-env.2", - "@babel/plugin-syntax-async-generators": "^7.8.4", - "@babel/plugin-syntax-class-properties": "^7.12.13", - "@babel/plugin-syntax-class-static-block": "^7.14.5", - "@babel/plugin-syntax-dynamic-import": "^7.8.3", - "@babel/plugin-syntax-export-namespace-from": "^7.8.3", - "@babel/plugin-syntax-import-assertions": "^7.23.3", - "@babel/plugin-syntax-import-attributes": "^7.23.3", - "@babel/plugin-syntax-import-meta": "^7.10.4", - "@babel/plugin-syntax-json-strings": "^7.8.3", - "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4", - "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", - "@babel/plugin-syntax-numeric-separator": "^7.10.4", - "@babel/plugin-syntax-object-rest-spread": "^7.8.3", - "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", - "@babel/plugin-syntax-optional-chaining": "^7.8.3", - "@babel/plugin-syntax-private-property-in-object": "^7.14.5", - "@babel/plugin-syntax-top-level-await": "^7.14.5", - "@babel/plugin-syntax-unicode-sets-regex": "^7.18.6", - "@babel/plugin-transform-arrow-functions": "^7.23.3", - "@babel/plugin-transform-async-generator-functions": "^7.23.9", - "@babel/plugin-transform-async-to-generator": "^7.23.3", - "@babel/plugin-transform-block-scoped-functions": "^7.23.3", - "@babel/plugin-transform-block-scoping": "^7.23.4", - "@babel/plugin-transform-class-properties": "^7.23.3", - "@babel/plugin-transform-class-static-block": "^7.23.4", - "@babel/plugin-transform-classes": "^7.23.8", - "@babel/plugin-transform-computed-properties": "^7.23.3", - "@babel/plugin-transform-destructuring": "^7.23.3", - "@babel/plugin-transform-dotall-regex": "^7.23.3", - "@babel/plugin-transform-duplicate-keys": "^7.23.3", - "@babel/plugin-transform-dynamic-import": "^7.23.4", - "@babel/plugin-transform-exponentiation-operator": "^7.23.3", - "@babel/plugin-transform-export-namespace-from": "^7.23.4", - "@babel/plugin-transform-for-of": "^7.23.6", - "@babel/plugin-transform-function-name": "^7.23.3", - "@babel/plugin-transform-json-strings": "^7.23.4", - "@babel/plugin-transform-literals": "^7.23.3", - "@babel/plugin-transform-logical-assignment-operators": "^7.23.4", - "@babel/plugin-transform-member-expression-literals": "^7.23.3", - "@babel/plugin-transform-modules-amd": "^7.23.3", - "@babel/plugin-transform-modules-commonjs": "^7.23.3", - "@babel/plugin-transform-modules-systemjs": "^7.23.9", - "@babel/plugin-transform-modules-umd": "^7.23.3", - "@babel/plugin-transform-named-capturing-groups-regex": "^7.22.5", - "@babel/plugin-transform-new-target": "^7.23.3", - "@babel/plugin-transform-nullish-coalescing-operator": "^7.23.4", - "@babel/plugin-transform-numeric-separator": "^7.23.4", - "@babel/plugin-transform-object-rest-spread": "^7.23.4", - "@babel/plugin-transform-object-super": "^7.23.3", - "@babel/plugin-transform-optional-catch-binding": "^7.23.4", - "@babel/plugin-transform-optional-chaining": "^7.23.4", - "@babel/plugin-transform-parameters": "^7.23.3", - "@babel/plugin-transform-private-methods": "^7.23.3", - "@babel/plugin-transform-private-property-in-object": "^7.23.4", - "@babel/plugin-transform-property-literals": "^7.23.3", - "@babel/plugin-transform-regenerator": "^7.23.3", - "@babel/plugin-transform-reserved-words": "^7.23.3", - "@babel/plugin-transform-shorthand-properties": "^7.23.3", - "@babel/plugin-transform-spread": "^7.23.3", - "@babel/plugin-transform-sticky-regex": "^7.23.3", - "@babel/plugin-transform-template-literals": "^7.23.3", - "@babel/plugin-transform-typeof-symbol": "^7.23.3", - "@babel/plugin-transform-unicode-escapes": "^7.23.3", - "@babel/plugin-transform-unicode-property-regex": "^7.23.3", - "@babel/plugin-transform-unicode-regex": "^7.23.3", - "@babel/plugin-transform-unicode-sets-regex": "^7.23.3", - "@babel/preset-modules": "0.1.6-no-external-plugins", - "babel-plugin-polyfill-corejs2": "^0.4.8", - "babel-plugin-polyfill-corejs3": "^0.9.0", - "babel-plugin-polyfill-regenerator": "^0.5.5", - "core-js-compat": "^3.31.0", - "semver": "^6.3.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "bn.js": "^5.0.0", + "randombytes": "^2.0.1" } }, - "node_modules/@babel/preset-env/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true, - "bin": { - "semver": "bin/semver.js" - } + "node_modules/browserify-rsa/node_modules/bn.js": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.1.tgz", + "integrity": "sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ==", + "dev": true }, - "node_modules/@babel/preset-modules": { - "version": "0.1.6-no-external-plugins", - "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.6-no-external-plugins.tgz", - "integrity": "sha512-HrcgcIESLm9aIR842yhJ5RWan/gebQUJ6E/E5+rf0y9o6oj7w0Br+sWuL6kEQ/o/AdfvR1Je9jG18/gnpwjEyA==", + "node_modules/browserify-sign": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.2.2.tgz", + "integrity": "sha512-1rudGyeYY42Dk6texmv7c4VcQ0EsvVbLwZkA+AQB7SxvXxmcD93jcHie8bzecJ+ChDlmAm2Qyu0+Ccg5uhZXCg==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.0.0", - "@babel/types": "^7.4.4", - "esutils": "^2.0.2" + "bn.js": "^5.2.1", + "browserify-rsa": "^4.1.0", + "create-hash": "^1.2.0", + "create-hmac": "^1.1.7", + "elliptic": "^6.5.4", + "inherits": "^2.0.4", + "parse-asn1": "^5.1.6", + "readable-stream": "^3.6.2", + "safe-buffer": "^5.2.1" }, - "peerDependencies": { - "@babel/core": "^7.0.0-0 || ^8.0.0-0 <8.0.0" + "engines": { + "node": ">= 4" } }, - "node_modules/@babel/regjsgen": { - "version": "0.8.0", - "resolved": "https://registry.npmjs.org/@babel/regjsgen/-/regjsgen-0.8.0.tgz", - "integrity": "sha512-x/rqGMdzj+fWZvCOYForTghzbtqPDZ5gPwaoNGHdgDfF2QA/XZbCBp4Moo5scrkAMPhB7z26XM/AaHuIJdgauA==", + "node_modules/browserify-sign/node_modules/bn.js": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.1.tgz", + "integrity": "sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ==", "dev": true }, - "node_modules/@babel/runtime": { - "version": "7.23.9", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.23.9.tgz", - "integrity": "sha512-0CX6F+BI2s9dkUqr08KFrAIZgNFj75rdBU/DjCyYLIaV/quFjkk6T+EJ2LkZHyZTbEV4L5p97mNkUsHl2wLFAw==", + "node_modules/browserify-sign/node_modules/readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", "dev": true, "dependencies": { - "regenerator-runtime": "^0.14.0" + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" }, "engines": { - "node": ">=6.9.0" + "node": ">= 6" } }, - "node_modules/@babel/template": { - "version": "7.23.9", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.23.9.tgz", - "integrity": "sha512-+xrD2BWLpvHKNmX2QbpdpsBaWnRxahMwJjO+KZk2JOElj5nSmKezyS1B4u+QbHMTX69t4ukm6hh9lsYQ7GHCKA==", + "node_modules/browserify-zlib": { + "version": "0.2.0", "dev": true, + "license": "MIT", "dependencies": { - "@babel/code-frame": "^7.23.5", - "@babel/parser": "^7.23.9", - "@babel/types": "^7.23.9" - }, - "engines": { - "node": ">=6.9.0" + "pako": "~1.0.5" } }, - "node_modules/@babel/traverse": { - "version": "7.23.9", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.23.9.tgz", - "integrity": "sha512-I/4UJ9vs90OkBtY6iiiTORVMyIhJ4kAVmsKo9KFc8UOxMeUfi2hvtIBsET5u9GizXE6/GFSuKCTNfgCswuEjRg==", + "node_modules/browserslist": { + "version": "4.21.5", "dev": true, - "dependencies": { - "@babel/code-frame": "^7.23.5", - "@babel/generator": "^7.23.6", - "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-function-name": "^7.23.0", - "@babel/helper-hoist-variables": "^7.22.5", - "@babel/helper-split-export-declaration": "^7.22.6", - "@babel/parser": "^7.23.9", - "@babel/types": "^7.23.9", - "debug": "^4.3.1", - "globals": "^11.1.0" + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + } + ], + "license": "MIT", + "dependencies": { + "caniuse-lite": "^1.0.30001449", + "electron-to-chromium": "^1.4.284", + "node-releases": "^2.0.8", + "update-browserslist-db": "^1.0.10" + }, + "bin": { + "browserslist": "cli.js" }, "engines": { - "node": ">=6.9.0" + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" } }, - "node_modules/@babel/traverse/node_modules/globals": { - "version": "11.12.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", - "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "node_modules/buffer": { + "version": "5.2.1", "dev": true, - "engines": { - "node": ">=4" + "license": "MIT", + "dependencies": { + "base64-js": "^1.0.2", + "ieee754": "^1.1.4" } }, - "node_modules/@babel/types": { - "version": "7.23.9", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.23.9.tgz", - "integrity": "sha512-dQjSq/7HaSjRM43FFGnv5keM2HsxpmyV1PfaSVm0nzzjwwTmjOe6J4bC8e3+pTEIgHaHj+1ZlLThRJ2auc/w1Q==", + "node_modules/buffer-from": { + "version": "1.1.1", "dev": true, - "dependencies": { - "@babel/helper-string-parser": "^7.23.4", - "@babel/helper-validator-identifier": "^7.22.20", - "to-fast-properties": "^2.0.0" - }, - "engines": { - "node": ">=6.9.0" - } + "license": "MIT" }, - "node_modules/@colors/colors": { - "version": "1.5.0", + "node_modules/buffer-xor": { + "version": "1.0.3", "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.1.90" - } + "license": "MIT" }, - "node_modules/@eslint/eslintrc": { - "version": "2.0.0", + "node_modules/builtin-status-codes": { + "version": "3.0.0", + "dev": true, + "license": "MIT" + }, + "node_modules/bytes": { + "version": "3.1.2", "dev": true, "license": "MIT", - "dependencies": { - "ajv": "^6.12.4", - "debug": "^4.3.2", - "espree": "^9.4.0", - "globals": "^13.19.0", - "ignore": "^5.2.0", - "import-fresh": "^3.2.1", - "js-yaml": "^4.1.0", - "minimatch": "^3.1.2", - "strip-json-comments": "^3.1.1" - }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" + "node": ">= 0.8" } }, - "node_modules/@eslint/eslintrc/node_modules/argparse": { - "version": "2.0.1", + "node_modules/cached-path-relative": { + "version": "1.1.0", "dev": true, - "license": "Python-2.0" + "license": "MIT" }, - "node_modules/@eslint/eslintrc/node_modules/js-yaml": { - "version": "4.1.0", + "node_modules/caching-transform": { + "version": "4.0.0", "dev": true, "license": "MIT", "dependencies": { - "argparse": "^2.0.1" + "hasha": "^5.0.0", + "make-dir": "^3.0.0", + "package-hash": "^4.0.0", + "write-file-atomic": "^3.0.0" }, - "bin": { - "js-yaml": "bin/js-yaml.js" + "engines": { + "node": ">=8" } }, - "node_modules/@eslint/eslintrc/node_modules/minimatch": { - "version": "3.1.2", + "node_modules/call-bind": { + "version": "1.0.2", "dev": true, - "license": "ISC", + "license": "MIT", "dependencies": { - "brace-expansion": "^1.1.7" + "function-bind": "^1.1.1", + "get-intrinsic": "^1.0.2" }, - "engines": { - "node": "*" + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/@eslint/js": { - "version": "8.35.0", + "node_modules/callsites": { + "version": "3.1.0", "dev": true, "license": "MIT", "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": ">=6" } }, - "node_modules/@humanwhocodes/config-array": { - "version": "0.11.8", + "node_modules/camelcase": { + "version": "6.3.0", "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@humanwhocodes/object-schema": "^1.2.1", - "debug": "^4.1.1", - "minimatch": "^3.0.5" - }, + "license": "MIT", "engines": { - "node": ">=10.10.0" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@humanwhocodes/config-array/node_modules/minimatch": { - "version": "3.1.2", + "node_modules/caniuse-lite": { + "version": "1.0.30001460", "dev": true, - "license": "ISC", - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + } + ], + "license": "CC-BY-4.0" }, - "node_modules/@humanwhocodes/module-importer": { - "version": "1.0.1", + "node_modules/chai": { + "version": "4.3.7", "dev": true, - "license": "Apache-2.0", - "engines": { - "node": ">=12.22" + "license": "MIT", + "dependencies": { + "assertion-error": "^1.1.0", + "check-error": "^1.0.2", + "deep-eql": "^4.1.2", + "get-func-name": "^2.0.0", + "loupe": "^2.3.1", + "pathval": "^1.1.1", + "type-detect": "^4.0.5" }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/nzakas" + "engines": { + "node": ">=4" } }, - "node_modules/@humanwhocodes/object-schema": { - "version": "1.2.1", - "dev": true, - "license": "BSD-3-Clause" - }, - "node_modules/@istanbuljs/load-nyc-config": { - "version": "1.1.0", + "node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", "dev": true, - "license": "ISC", "dependencies": { - "camelcase": "^5.3.1", - "find-up": "^4.1.0", - "get-package-type": "^0.1.0", - "js-yaml": "^3.13.1", - "resolve-from": "^5.0.0" + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" }, "engines": { - "node": ">=8" + "node": ">=4" } }, - "node_modules/@istanbuljs/load-nyc-config/node_modules/camelcase": { - "version": "5.3.1", + "node_modules/check-error": { + "version": "1.0.2", "dev": true, "license": "MIT", "engines": { - "node": ">=6" + "node": "*" } }, - "node_modules/@istanbuljs/load-nyc-config/node_modules/find-up": { - "version": "4.1.0", + "node_modules/chokidar": { + "version": "3.5.3", "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + ], "license": "MIT", "dependencies": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" }, "engines": { - "node": ">=8" + "node": ">= 8.10.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" } }, - "node_modules/@istanbuljs/load-nyc-config/node_modules/locate-path": { - "version": "5.0.0", + "node_modules/cipher-base": { + "version": "1.0.4", "dev": true, "license": "MIT", "dependencies": { - "p-locate": "^4.1.0" - }, - "engines": { - "node": ">=8" + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" } }, - "node_modules/@istanbuljs/load-nyc-config/node_modules/p-limit": { - "version": "2.3.0", + "node_modules/clean-stack": { + "version": "2.2.0", "dev": true, "license": "MIT", - "dependencies": { - "p-try": "^2.0.0" - }, "engines": { "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@istanbuljs/load-nyc-config/node_modules/p-locate": { - "version": "4.1.0", + "node_modules/cli": { + "version": "1.0.1", "dev": true, "license": "MIT", "dependencies": { - "p-limit": "^2.2.0" + "exit": "0.1.2", + "glob": "^7.1.1" }, "engines": { - "node": ">=8" + "node": ">=0.2.5" } }, - "node_modules/@istanbuljs/load-nyc-config/node_modules/resolve-from": { - "version": "5.0.0", + "node_modules/cliui": { + "version": "7.0.4", "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/@istanbuljs/schema": { - "version": "0.1.3", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" + "license": "ISC", + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^7.0.0" } }, - "node_modules/@jridgewell/gen-mapping": { - "version": "0.1.1", + "node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", "dev": true, - "license": "MIT", "dependencies": { - "@jridgewell/set-array": "^1.0.0", - "@jridgewell/sourcemap-codec": "^1.4.10" - }, - "engines": { - "node": ">=6.0.0" + "color-name": "1.1.3" } }, - "node_modules/@jridgewell/resolve-uri": { - "version": "3.1.0", + "node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "dev": true + }, + "node_modules/combine-source-map": { + "version": "0.8.0", "dev": true, "license": "MIT", - "engines": { - "node": ">=6.0.0" + "dependencies": { + "convert-source-map": "~1.1.0", + "inline-source-map": "~0.6.0", + "lodash.memoize": "~3.0.3", + "source-map": "~0.5.3" } }, - "node_modules/@jridgewell/set-array": { - "version": "1.1.2", + "node_modules/commondir": { + "version": "1.0.1", "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.0.0" - } + "license": "MIT" }, - "node_modules/@jridgewell/sourcemap-codec": { - "version": "1.4.14", + "node_modules/concat-map": { + "version": "0.0.1", "dev": true, "license": "MIT" }, - "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.17", + "node_modules/concat-stream": { + "version": "1.6.2", "dev": true, + "engines": [ + "node >= 0.8" + ], "license": "MIT", "dependencies": { - "@jridgewell/resolve-uri": "3.1.0", - "@jridgewell/sourcemap-codec": "1.4.14" + "buffer-from": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^2.2.2", + "typedarray": "^0.0.6" } }, - "node_modules/@nicolo-ribaudo/chokidar-2": { - "version": "2.1.8-no-fsevents.3", - "resolved": "https://registry.npmjs.org/@nicolo-ribaudo/chokidar-2/-/chokidar-2-2.1.8-no-fsevents.3.tgz", - "integrity": "sha512-s88O1aVtXftvp5bCPB7WnmXc5IwOZZ7YPuwNPt+GtOOXpPvad1LfbmjYv+qII7zP6RU2QGnqve27dnLycEnyEQ==", - "dev": true, - "optional": true - }, - "node_modules/@nodelib/fs.scandir": { - "version": "2.1.5", + "node_modules/connect": { + "version": "3.7.0", "dev": true, "license": "MIT", "dependencies": { - "@nodelib/fs.stat": "2.0.5", - "run-parallel": "^1.1.9" + "debug": "2.6.9", + "finalhandler": "1.1.2", + "parseurl": "~1.3.3", + "utils-merge": "1.0.1" }, "engines": { - "node": ">= 8" - } - }, - "node_modules/@nodelib/fs.stat": { - "version": "2.0.5", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 8" + "node": ">= 0.10.0" } }, - "node_modules/@nodelib/fs.walk": { - "version": "1.2.8", + "node_modules/connect/node_modules/debug": { + "version": "2.6.9", "dev": true, "license": "MIT", "dependencies": { - "@nodelib/fs.scandir": "2.1.5", - "fastq": "^1.6.0" - }, - "engines": { - "node": ">= 8" + "ms": "2.0.0" } }, - "node_modules/@socket.io/component-emitter": { - "version": "3.1.0", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/cookie": { - "version": "0.4.1", + "node_modules/connect/node_modules/ms": { + "version": "2.0.0", "dev": true, "license": "MIT" }, - "node_modules/@types/cors": { - "version": "2.8.13", + "node_modules/console-browserify": { + "version": "1.1.0", "dev": true, - "license": "MIT", "dependencies": { - "@types/node": "*" + "date-now": "^0.1.4" } }, - "node_modules/@types/node": { - "version": "18.14.2", + "node_modules/constants-browserify": { + "version": "1.0.0", "dev": true, "license": "MIT" }, - "node_modules/accepts": { - "version": "1.3.8", + "node_modules/content-type": { + "version": "1.0.5", "dev": true, "license": "MIT", - "dependencies": { - "mime-types": "~2.1.34", - "negotiator": "0.6.3" - }, "engines": { "node": ">= 0.6" } }, - "node_modules/acorn": { - "version": "7.4.1", + "node_modules/convert-source-map": { + "version": "1.1.3", "dev": true, - "license": "MIT", - "bin": { - "acorn": "bin/acorn" - }, - "engines": { - "node": ">=0.4.0" - } + "license": "MIT" }, - "node_modules/acorn-jsx": { - "version": "5.3.2", + "node_modules/cookie": { + "version": "0.4.2", "dev": true, "license": "MIT", - "peerDependencies": { - "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" + "engines": { + "node": ">= 0.6" } }, - "node_modules/acorn-node": { - "version": "1.8.2", + "node_modules/core-util-is": { + "version": "1.0.2", "dev": true, - "license": "Apache-2.0", - "dependencies": { - "acorn": "^7.0.0", - "acorn-walk": "^7.0.0", - "xtend": "^4.0.2" - } + "license": "MIT" }, - "node_modules/acorn-walk": { - "version": "7.0.0", + "node_modules/cors": { + "version": "2.8.5", "dev": true, "license": "MIT", + "dependencies": { + "object-assign": "^4", + "vary": "^1" + }, "engines": { - "node": ">=0.4.0" + "node": ">= 0.10" } }, - "node_modules/aggregate-error": { - "version": "3.1.0", + "node_modules/create-ecdh": { + "version": "4.0.3", "dev": true, "license": "MIT", "dependencies": { - "clean-stack": "^2.0.0", - "indent-string": "^4.0.0" - }, - "engines": { - "node": ">=8" + "bn.js": "^4.1.0", + "elliptic": "^6.0.0" } }, - "node_modules/ajv": { - "version": "6.12.6", + "node_modules/create-hash": { + "version": "1.2.0", "dev": true, "license": "MIT", "dependencies": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" + "cipher-base": "^1.0.1", + "inherits": "^2.0.1", + "md5.js": "^1.3.4", + "ripemd160": "^2.0.1", + "sha.js": "^2.4.0" } }, - "node_modules/ansi-regex": { - "version": "5.0.1", + "node_modules/create-hmac": { + "version": "1.1.7", "dev": true, "license": "MIT", - "engines": { - "node": ">=8" + "dependencies": { + "cipher-base": "^1.0.3", + "create-hash": "^1.1.0", + "inherits": "^2.0.1", + "ripemd160": "^2.0.0", + "safe-buffer": "^5.0.1", + "sha.js": "^2.4.8" } }, - "node_modules/ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "node_modules/cross-spawn": { + "version": "7.0.3", "dev": true, + "license": "MIT", "dependencies": { - "color-convert": "^1.9.0" + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" }, "engines": { - "node": ">=4" + "node": ">= 8" } }, - "node_modules/anymatch": { - "version": "3.1.3", + "node_modules/cross-spawn/node_modules/which": { + "version": "2.0.2", "dev": true, "license": "ISC", "dependencies": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" }, "engines": { "node": ">= 8" } }, - "node_modules/append-transform": { - "version": "2.0.0", + "node_modules/crypto-browserify": { + "version": "3.12.0", "dev": true, "license": "MIT", "dependencies": { - "default-require-extensions": "^3.0.0" + "browserify-cipher": "^1.0.0", + "browserify-sign": "^4.0.0", + "create-ecdh": "^4.0.0", + "create-hash": "^1.1.0", + "create-hmac": "^1.1.0", + "diffie-hellman": "^5.0.0", + "inherits": "^2.0.1", + "pbkdf2": "^3.0.3", + "public-encrypt": "^4.0.0", + "randombytes": "^2.0.0", + "randomfill": "^1.0.3" }, "engines": { - "node": ">=8" + "node": "*" } }, - "node_modules/archy": { - "version": "1.0.0", + "node_modules/custom-event": { + "version": "1.0.1", "dev": true, "license": "MIT" }, - "node_modules/argparse": { - "version": "1.0.10", - "dev": true, - "license": "MIT", - "dependencies": { - "sprintf-js": "~1.0.2" - } - }, - "node_modules/asn1.js": { - "version": "5.4.1", - "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-5.4.1.tgz", - "integrity": "sha512-+I//4cYPccV8LdmBLiX8CYvf9Sp3vQsrqu2QNXRcrbiWvcx/UdlFiqUJJzxRQxgsZmvhXhn4cSKeSmoFjVdupA==", + "node_modules/dash-ast": { + "version": "1.0.0", "dev": true, - "dependencies": { - "bn.js": "^4.0.0", - "inherits": "^2.0.1", - "minimalistic-assert": "^1.0.0", - "safer-buffer": "^2.1.0" - } + "license": "Apache-2.0" }, - "node_modules/assert": { - "version": "1.5.0", + "node_modules/date-format": { + "version": "4.0.14", "dev": true, "license": "MIT", - "dependencies": { - "object-assign": "^4.1.1", - "util": "0.10.3" + "engines": { + "node": ">=4.0" } }, - "node_modules/assert/node_modules/inherits": { - "version": "2.0.1", - "dev": true, - "license": "ISC" + "node_modules/date-now": { + "version": "0.1.4", + "dev": true }, - "node_modules/assert/node_modules/util": { - "version": "0.10.3", + "node_modules/debug": { + "version": "4.3.4", "dev": true, "license": "MIT", "dependencies": { - "inherits": "2.0.1" + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } } }, - "node_modules/assertion-error": { - "version": "1.1.0", + "node_modules/decamelize": { + "version": "4.0.0", "dev": true, "license": "MIT", "engines": { - "node": "*" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/babel-plugin-add-module-exports": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/babel-plugin-add-module-exports/-/babel-plugin-add-module-exports-1.0.4.tgz", - "integrity": "sha512-g+8yxHUZ60RcyaUpfNzy56OtWW+x9cyEe9j+CranqLiqbju2yf/Cy6ZtYK40EZxtrdHllzlVZgLmcOUCTlJ7Jg==", - "dev": true - }, - "node_modules/babel-plugin-polyfill-corejs2": { - "version": "0.4.8", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.8.tgz", - "integrity": "sha512-OtIuQfafSzpo/LhnJaykc0R/MMnuLSSVjVYy9mHArIZ9qTCSZ6TpWCuEKZYVoN//t8HqBNScHrOtCrIK5IaGLg==", + "node_modules/deep-eql": { + "version": "4.1.3", "dev": true, + "license": "MIT", "dependencies": { - "@babel/compat-data": "^7.22.6", - "@babel/helper-define-polyfill-provider": "^0.5.0", - "semver": "^6.3.1" + "type-detect": "^4.0.0" }, - "peerDependencies": { - "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" + "engines": { + "node": ">=6" } }, - "node_modules/babel-plugin-polyfill-corejs2/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "node_modules/deep-is": { + "version": "0.1.3", "dev": true, - "bin": { - "semver": "bin/semver.js" - } + "license": "MIT" }, - "node_modules/babel-plugin-polyfill-corejs3": { - "version": "0.9.0", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.9.0.tgz", - "integrity": "sha512-7nZPG1uzK2Ymhy/NbaOWTg3uibM2BmGASS4vHS4szRZAIR8R6GwA/xAujpdrXU5iyklrimWnLWU+BLF9suPTqg==", + "node_modules/default-require-extensions": { + "version": "3.0.1", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-define-polyfill-provider": "^0.5.0", - "core-js-compat": "^3.34.0" + "strip-bom": "^4.0.0" }, - "peerDependencies": { - "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" - } - }, - "node_modules/babel-plugin-polyfill-regenerator": { - "version": "0.5.5", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.5.5.tgz", - "integrity": "sha512-OJGYZlhLqBh2DDHeqAxWB1XIvr49CxiJ2gIt61/PU55CQK4Z58OzMqjDe1zwQdQk+rBYsRc+1rJmdajM3gimHg==", - "dev": true, - "dependencies": { - "@babel/helper-define-polyfill-provider": "^0.5.0" + "engines": { + "node": ">=8" }, - "peerDependencies": { - "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/balanced-match": { + "node_modules/defined": { "version": "1.0.0", "dev": true, "license": "MIT" }, - "node_modules/base64-js": { - "version": "1.5.1", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT" - }, - "node_modules/base64id": { + "node_modules/depd": { "version": "2.0.0", "dev": true, "license": "MIT", "engines": { - "node": "^4.5.0 || >= 5.9" - } - }, - "node_modules/beeper": { - "version": "1.1.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" + "node": ">= 0.8" } }, - "node_modules/benchmark": { - "version": "2.1.4", + "node_modules/deps-sort": { + "version": "2.0.0", "dev": true, "license": "MIT", "dependencies": { - "lodash": "^4.17.4", - "platform": "^1.3.3" + "JSONStream": "^1.0.3", + "shasum": "^1.0.0", + "subarg": "^1.0.0", + "through2": "^2.0.0" + }, + "bin": { + "deps-sort": "bin/cmd.js" } }, - "node_modules/binary-extensions": { - "version": "2.2.0", + "node_modules/des.js": { + "version": "1.0.0", "dev": true, "license": "MIT", - "engines": { - "node": ">=8" + "dependencies": { + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0" } }, - "node_modules/bn.js": { - "version": "4.12.0", - "dev": true, - "license": "MIT" - }, - "node_modules/body-parser": { - "version": "1.20.2", + "node_modules/destroy": { + "version": "1.2.0", "dev": true, "license": "MIT", - "dependencies": { - "bytes": "3.1.2", - "content-type": "~1.0.5", - "debug": "2.6.9", - "depd": "2.0.0", - "destroy": "1.2.0", - "http-errors": "2.0.0", - "iconv-lite": "0.4.24", - "on-finished": "2.4.1", - "qs": "6.11.0", - "raw-body": "2.5.2", - "type-is": "~1.6.18", - "unpipe": "1.0.0" - }, "engines": { "node": ">= 0.8", "npm": "1.2.8000 || >= 1.4.16" } }, - "node_modules/body-parser/node_modules/debug": { - "version": "2.6.9", + "node_modules/detective": { + "version": "5.2.0", "dev": true, "license": "MIT", "dependencies": { - "ms": "2.0.0" + "acorn-node": "^1.6.1", + "defined": "^1.0.0", + "minimist": "^1.1.1" + }, + "bin": { + "detective": "bin/detective.js" + }, + "engines": { + "node": ">=0.8.0" } }, - "node_modules/body-parser/node_modules/ms": { - "version": "2.0.0", + "node_modules/di": { + "version": "0.0.1", "dev": true, "license": "MIT" }, - "node_modules/body-parser/node_modules/on-finished": { - "version": "2.4.1", + "node_modules/diff": { + "version": "5.0.0", "dev": true, - "license": "MIT", - "dependencies": { - "ee-first": "1.1.1" - }, + "license": "BSD-3-Clause", "engines": { - "node": ">= 0.8" + "node": ">=0.3.1" } }, - "node_modules/brace-expansion": { - "version": "1.1.11", + "node_modules/diffie-hellman": { + "version": "5.0.3", "dev": true, "license": "MIT", "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" + "bn.js": "^4.1.0", + "miller-rabin": "^4.0.0", + "randombytes": "^2.0.0" } }, - "node_modules/braces": { - "version": "3.0.2", + "node_modules/doctrine": { + "version": "3.0.0", "dev": true, - "license": "MIT", + "license": "Apache-2.0", "dependencies": { - "fill-range": "^7.0.1" + "esutils": "^2.0.2" }, "engines": { - "node": ">=8" + "node": ">=6.0.0" } }, - "node_modules/brorand": { - "version": "1.1.0", - "dev": true, - "license": "MIT" - }, - "node_modules/browser-pack": { - "version": "6.1.0", + "node_modules/dom-serialize": { + "version": "2.2.1", "dev": true, "license": "MIT", "dependencies": { - "combine-source-map": "~0.8.0", - "defined": "^1.0.0", - "JSONStream": "^1.0.3", - "safe-buffer": "^5.1.1", - "through2": "^2.0.0", - "umd": "^3.0.0" - }, - "bin": { - "browser-pack": "bin/cmd.js" + "custom-event": "~1.0.0", + "ent": "~2.2.0", + "extend": "^3.0.0", + "void-elements": "^2.0.0" } }, - "node_modules/browser-resolve": { - "version": "1.11.3", + "node_modules/dom-serializer": { + "version": "0.2.1", "dev": true, "license": "MIT", "dependencies": { - "resolve": "1.1.7" + "domelementtype": "^2.0.1", + "entities": "^2.0.0" } }, - "node_modules/browser-resolve/node_modules/resolve": { - "version": "1.1.7", + "node_modules/dom-serializer/node_modules/domelementtype": { + "version": "2.0.1", "dev": true, - "license": "MIT" + "license": "BSD-2-Clause" }, - "node_modules/browser-stdout": { - "version": "1.3.1", - "dev": true, - "license": "ISC" + "node_modules/dom-serializer/node_modules/entities": { + "version": "2.0.0", + "dev": true, + "license": "BSD-2-Clause" }, - "node_modules/browserify": { - "version": "16.5.1", + "node_modules/domain-browser": { + "version": "1.2.0", "dev": true, "license": "MIT", - "dependencies": { - "assert": "^1.4.0", - "browser-pack": "^6.0.1", - "browser-resolve": "^1.11.0", - "browserify-zlib": "~0.2.0", - "buffer": "~5.2.1", - "cached-path-relative": "^1.0.0", - "concat-stream": "^1.6.0", - "console-browserify": "^1.1.0", - "constants-browserify": "~1.0.0", - "crypto-browserify": "^3.0.0", - "defined": "^1.0.0", - "deps-sort": "^2.0.0", - "domain-browser": "^1.2.0", - "duplexer2": "~0.1.2", - "events": "^2.0.0", - "glob": "^7.1.0", - "has": "^1.0.0", - "htmlescape": "^1.1.0", - "https-browserify": "^1.0.0", - "inherits": "~2.0.1", - "insert-module-globals": "^7.0.0", - "JSONStream": "^1.0.3", - "labeled-stream-splicer": "^2.0.0", - "mkdirp-classic": "^0.5.2", - "module-deps": "^6.0.0", - "os-browserify": "~0.3.0", - "parents": "^1.0.1", - "path-browserify": "~0.0.0", - "process": "~0.11.0", - "punycode": "^1.3.2", - "querystring-es3": "~0.2.0", - "read-only-stream": "^2.0.0", - "readable-stream": "^2.0.2", - "resolve": "^1.1.4", - "shasum": "^1.0.0", - "shell-quote": "^1.6.1", - "stream-browserify": "^2.0.0", - "stream-http": "^3.0.0", - "string_decoder": "^1.1.1", - "subarg": "^1.0.0", - "syntax-error": "^1.1.1", - "through2": "^2.0.0", - "timers-browserify": "^1.0.1", - "tty-browserify": "0.0.1", - "url": "~0.11.0", - "util": "~0.10.1", - "vm-browserify": "^1.0.0", - "xtend": "^4.0.0" - }, - "bin": { - "browserify": "bin/cmd.js" - }, "engines": { - "node": ">= 0.8" + "node": ">=0.4", + "npm": ">=1.2" } }, - "node_modules/browserify-aes": { - "version": "1.2.0", + "node_modules/domelementtype": { + "version": "1.3.1", "dev": true, - "license": "MIT", - "dependencies": { - "buffer-xor": "^1.0.3", - "cipher-base": "^1.0.0", - "create-hash": "^1.1.0", - "evp_bytestokey": "^1.0.3", - "inherits": "^2.0.1", - "safe-buffer": "^5.0.1" - } + "license": "BSD-2-Clause" }, - "node_modules/browserify-cipher": { - "version": "1.0.1", + "node_modules/domhandler": { + "version": "2.3.0", "dev": true, - "license": "MIT", "dependencies": { - "browserify-aes": "^1.0.4", - "browserify-des": "^1.0.0", - "evp_bytestokey": "^1.0.0" + "domelementtype": "1" } }, - "node_modules/browserify-des": { - "version": "1.0.2", + "node_modules/domutils": { + "version": "1.5.1", "dev": true, - "license": "MIT", "dependencies": { - "cipher-base": "^1.0.1", - "des.js": "^1.0.0", - "inherits": "^2.0.1", - "safe-buffer": "^5.1.2" + "dom-serializer": "0", + "domelementtype": "1" } }, - "node_modules/browserify-rsa": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.1.0.tgz", - "integrity": "sha512-AdEER0Hkspgno2aR97SAf6vi0y0k8NuOpGnVH3O99rcA5Q6sh8QxcngtHuJ6uXwnfAXNM4Gn1Gb7/MV1+Ymbog==", + "node_modules/duplexer2": { + "version": "0.1.4", "dev": true, + "license": "BSD-3-Clause", "dependencies": { - "bn.js": "^5.0.0", - "randombytes": "^2.0.1" + "readable-stream": "^2.0.2" } }, - "node_modules/browserify-rsa/node_modules/bn.js": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.1.tgz", - "integrity": "sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ==", - "dev": true - }, - "node_modules/browserify-sign": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.2.2.tgz", - "integrity": "sha512-1rudGyeYY42Dk6texmv7c4VcQ0EsvVbLwZkA+AQB7SxvXxmcD93jcHie8bzecJ+ChDlmAm2Qyu0+Ccg5uhZXCg==", + "node_modules/ee-first": { + "version": "1.1.1", "dev": true, - "dependencies": { - "bn.js": "^5.2.1", - "browserify-rsa": "^4.1.0", - "create-hash": "^1.2.0", - "create-hmac": "^1.1.7", - "elliptic": "^6.5.4", - "inherits": "^2.0.4", - "parse-asn1": "^5.1.6", - "readable-stream": "^3.6.2", - "safe-buffer": "^5.2.1" - }, - "engines": { - "node": ">= 4" - } + "license": "MIT" }, - "node_modules/browserify-sign/node_modules/bn.js": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.1.tgz", - "integrity": "sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ==", - "dev": true + "node_modules/electron-to-chromium": { + "version": "1.4.317", + "dev": true, + "license": "ISC" }, - "node_modules/browserify-sign/node_modules/readable-stream": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", - "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "node_modules/elliptic": { + "version": "6.5.4", "dev": true, + "license": "MIT", "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - }, - "engines": { - "node": ">= 6" + "bn.js": "^4.11.9", + "brorand": "^1.1.0", + "hash.js": "^1.0.0", + "hmac-drbg": "^1.0.1", + "inherits": "^2.0.4", + "minimalistic-assert": "^1.0.1", + "minimalistic-crypto-utils": "^1.0.1" } }, - "node_modules/browserify-zlib": { - "version": "0.2.0", + "node_modules/encodeurl": { + "version": "1.0.2", "dev": true, "license": "MIT", - "dependencies": { - "pako": "~1.0.5" + "engines": { + "node": ">= 0.8" } }, - "node_modules/browserslist": { - "version": "4.22.3", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.22.3.tgz", - "integrity": "sha512-UAp55yfwNv0klWNapjs/ktHoguxuQNGnOzxYmfnXIS+8AsRDZkSDxg7R1AX3GKzn078SBI5dzwzj/Yx0Or0e3A==", + "node_modules/engine.io": { + "version": "6.4.2", + "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-6.4.2.tgz", + "integrity": "sha512-FKn/3oMiJjrOEOeUub2WCox6JhxBXq/Zn3fZOMCBxKnNYtsdKjxhl7yR3fZhM9PV+rdE75SU5SYMc+2PGzo+Tg==", "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/browserslist" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], "dependencies": { - "caniuse-lite": "^1.0.30001580", - "electron-to-chromium": "^1.4.648", - "node-releases": "^2.0.14", - "update-browserslist-db": "^1.0.13" - }, - "bin": { - "browserslist": "cli.js" + "@types/cookie": "^0.4.1", + "@types/cors": "^2.8.12", + "@types/node": ">=10.0.0", + "accepts": "~1.3.4", + "base64id": "2.0.0", + "cookie": "~0.4.1", + "cors": "~2.8.5", + "debug": "~4.3.1", + "engine.io-parser": "~5.0.3", + "ws": "~8.11.0" }, "engines": { - "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + "node": ">=10.0.0" } }, - "node_modules/buffer": { - "version": "5.2.1", + "node_modules/engine.io-parser": { + "version": "5.0.6", "dev": true, "license": "MIT", - "dependencies": { - "base64-js": "^1.0.2", - "ieee754": "^1.1.4" + "engines": { + "node": ">=10.0.0" } }, - "node_modules/buffer-from": { - "version": "1.1.1", + "node_modules/ent": { + "version": "2.2.0", "dev": true, "license": "MIT" }, - "node_modules/buffer-xor": { - "version": "1.0.3", + "node_modules/entities": { + "version": "1.0.0", "dev": true, - "license": "MIT" + "license": "BSD-like" }, - "node_modules/builtin-status-codes": { - "version": "3.0.0", + "node_modules/es6-error": { + "version": "4.1.1", "dev": true, "license": "MIT" }, - "node_modules/bytes": { - "version": "3.1.2", + "node_modules/escalade": { + "version": "3.1.1", "dev": true, "license": "MIT", "engines": { - "node": ">= 0.8" + "node": ">=6" } }, - "node_modules/cached-path-relative": { - "version": "1.1.0", + "node_modules/escape-html": { + "version": "1.0.3", "dev": true, "license": "MIT" }, - "node_modules/caching-transform": { - "version": "4.0.0", + "node_modules/escape-string-regexp": { + "version": "1.0.5", "dev": true, "license": "MIT", - "dependencies": { - "hasha": "^5.0.0", - "make-dir": "^3.0.0", - "package-hash": "^4.0.0", - "write-file-atomic": "^3.0.0" - }, "engines": { - "node": ">=8" + "node": ">=0.8.0" } }, - "node_modules/call-bind": { - "version": "1.0.2", + "node_modules/eslint": { + "version": "8.35.0", "dev": true, "license": "MIT", "dependencies": { - "function-bind": "^1.1.1", - "get-intrinsic": "^1.0.2" + "@eslint/eslintrc": "^2.0.0", + "@eslint/js": "8.35.0", + "@humanwhocodes/config-array": "^0.11.8", + "@humanwhocodes/module-importer": "^1.0.1", + "@nodelib/fs.walk": "^1.2.8", + "ajv": "^6.10.0", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.2", + "debug": "^4.3.2", + "doctrine": "^3.0.0", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^7.1.1", + "eslint-utils": "^3.0.0", + "eslint-visitor-keys": "^3.3.0", + "espree": "^9.4.0", + "esquery": "^1.4.2", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^6.0.1", + "find-up": "^5.0.0", + "glob-parent": "^6.0.2", + "globals": "^13.19.0", + "grapheme-splitter": "^1.0.4", + "ignore": "^5.2.0", + "import-fresh": "^3.0.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "is-path-inside": "^3.0.3", + "js-sdsl": "^4.1.4", + "js-yaml": "^4.1.0", + "json-stable-stringify-without-jsonify": "^1.0.1", + "levn": "^0.4.1", + "lodash.merge": "^4.6.2", + "minimatch": "^3.1.2", + "natural-compare": "^1.4.0", + "optionator": "^0.9.1", + "regexpp": "^3.2.0", + "strip-ansi": "^6.0.1", + "strip-json-comments": "^3.1.0", + "text-table": "^0.2.0" + }, + "bin": { + "eslint": "bin/eslint.js" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "url": "https://opencollective.com/eslint" } }, - "node_modules/callsites": { - "version": "3.1.0", + "node_modules/eslint-scope": { + "version": "7.1.1", "dev": true, - "license": "MIT", + "license": "BSD-2-Clause", + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + }, "engines": { - "node": ">=6" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" } }, - "node_modules/camelcase": { - "version": "6.3.0", + "node_modules/eslint-utils": { + "version": "3.0.0", "dev": true, "license": "MIT", + "dependencies": { + "eslint-visitor-keys": "^2.0.0" + }, "engines": { - "node": ">=10" + "node": "^10.0.0 || ^12.0.0 || >= 14.0.0" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/sponsors/mysticatea" + }, + "peerDependencies": { + "eslint": ">=5" } }, - "node_modules/caniuse-lite": { - "version": "1.0.30001581", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001581.tgz", - "integrity": "sha512-whlTkwhqV2tUmP3oYhtNfaWGYHDdS3JYFQBKXxcUR9qqPWsRhFHhoISO2Xnl/g0xyKzht9mI1LZpiNWfMzHixQ==", + "node_modules/eslint-utils/node_modules/eslint-visitor-keys": { + "version": "2.1.0", "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/caniuse-lite" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ] + "license": "Apache-2.0", + "engines": { + "node": ">=10" + } }, - "node_modules/chai": { - "version": "4.3.7", + "node_modules/eslint-visitor-keys": { + "version": "3.3.0", "dev": true, - "license": "MIT", - "dependencies": { - "assertion-error": "^1.1.0", - "check-error": "^1.0.2", - "deep-eql": "^4.1.2", - "get-func-name": "^2.0.0", - "loupe": "^2.3.1", - "pathval": "^1.1.1", - "type-detect": "^4.0.5" - }, + "license": "Apache-2.0", "engines": { - "node": ">=4" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" } }, - "node_modules/chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "node_modules/eslint/node_modules/ansi-styles": { + "version": "4.3.0", "dev": true, + "license": "MIT", "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" + "color-convert": "^2.0.1" }, "engines": { - "node": ">=4" + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/check-error": { - "version": "1.0.2", + "node_modules/eslint/node_modules/argparse": { + "version": "2.0.1", "dev": true, - "license": "MIT", - "engines": { - "node": "*" - } + "license": "Python-2.0" }, - "node_modules/chokidar": { - "version": "3.5.3", + "node_modules/eslint/node_modules/chalk": { + "version": "4.1.2", "dev": true, - "funding": [ - { - "type": "individual", - "url": "https://paulmillr.com/funding/" - } - ], "license": "MIT", "dependencies": { - "anymatch": "~3.1.2", - "braces": "~3.0.2", - "glob-parent": "~5.1.2", - "is-binary-path": "~2.1.0", - "is-glob": "~4.0.1", - "normalize-path": "~3.0.0", - "readdirp": "~3.6.0" + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" }, "engines": { - "node": ">= 8.10.0" + "node": ">=10" }, - "optionalDependencies": { - "fsevents": "~2.3.2" + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/cipher-base": { - "version": "1.0.4", + "node_modules/eslint/node_modules/color-convert": { + "version": "2.0.1", "dev": true, "license": "MIT", "dependencies": { - "inherits": "^2.0.1", - "safe-buffer": "^5.0.1" + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" } }, - "node_modules/clean-stack": { - "version": "2.2.0", + "node_modules/eslint/node_modules/color-name": { + "version": "1.1.4", + "dev": true, + "license": "MIT" + }, + "node_modules/eslint/node_modules/escape-string-regexp": { + "version": "4.0.0", "dev": true, "license": "MIT", "engines": { - "node": ">=6" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/cli": { - "version": "1.0.1", + "node_modules/eslint/node_modules/glob-parent": { + "version": "6.0.2", "dev": true, - "license": "MIT", + "license": "ISC", "dependencies": { - "exit": "0.1.2", - "glob": "^7.1.1" + "is-glob": "^4.0.3" }, "engines": { - "node": ">=0.2.5" + "node": ">=10.13.0" } }, - "node_modules/cliui": { - "version": "7.0.4", + "node_modules/eslint/node_modules/has-flag": { + "version": "4.0.0", "dev": true, - "license": "ISC", - "dependencies": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", - "wrap-ansi": "^7.0.0" + "license": "MIT", + "engines": { + "node": ">=8" } }, - "node_modules/color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "node_modules/eslint/node_modules/js-yaml": { + "version": "4.1.0", "dev": true, + "license": "MIT", "dependencies": { - "color-name": "1.1.3" + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" } }, - "node_modules/color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", - "dev": true - }, - "node_modules/combine-source-map": { - "version": "0.8.0", + "node_modules/eslint/node_modules/levn": { + "version": "0.4.1", "dev": true, "license": "MIT", "dependencies": { - "convert-source-map": "~1.1.0", - "inline-source-map": "~0.6.0", - "lodash.memoize": "~3.0.3", - "source-map": "~0.5.3" + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + }, + "engines": { + "node": ">= 0.8.0" } }, - "node_modules/commander": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz", - "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==", + "node_modules/eslint/node_modules/minimatch": { + "version": "3.1.2", "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, "engines": { - "node": ">= 6" + "node": "*" } }, - "node_modules/commondir": { - "version": "1.0.1", + "node_modules/eslint/node_modules/optionator": { + "version": "0.9.1", "dev": true, - "license": "MIT" - }, - "node_modules/concat-map": { - "version": "0.0.1", - "dev": true, - "license": "MIT" + "license": "MIT", + "dependencies": { + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0", + "word-wrap": "^1.2.3" + }, + "engines": { + "node": ">= 0.8.0" + } }, - "node_modules/concat-stream": { - "version": "1.6.2", + "node_modules/eslint/node_modules/prelude-ls": { + "version": "1.2.1", "dev": true, - "engines": [ - "node >= 0.8" - ], "license": "MIT", - "dependencies": { - "buffer-from": "^1.0.0", - "inherits": "^2.0.3", - "readable-stream": "^2.2.2", - "typedarray": "^0.0.6" + "engines": { + "node": ">= 0.8.0" } }, - "node_modules/connect": { - "version": "3.7.0", + "node_modules/eslint/node_modules/supports-color": { + "version": "7.2.0", "dev": true, "license": "MIT", "dependencies": { - "debug": "2.6.9", - "finalhandler": "1.1.2", - "parseurl": "~1.3.3", - "utils-merge": "1.0.1" + "has-flag": "^4.0.0" }, "engines": { - "node": ">= 0.10.0" + "node": ">=8" } }, - "node_modules/connect/node_modules/debug": { - "version": "2.6.9", + "node_modules/eslint/node_modules/type-check": { + "version": "0.4.0", "dev": true, "license": "MIT", "dependencies": { - "ms": "2.0.0" + "prelude-ls": "^1.2.1" + }, + "engines": { + "node": ">= 0.8.0" } }, - "node_modules/connect/node_modules/ms": { - "version": "2.0.0", - "dev": true, - "license": "MIT" - }, - "node_modules/console-browserify": { - "version": "1.1.0", + "node_modules/espree": { + "version": "9.4.1", "dev": true, + "license": "BSD-2-Clause", "dependencies": { - "date-now": "^0.1.4" + "acorn": "^8.8.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^3.3.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" } }, - "node_modules/constants-browserify": { - "version": "1.0.0", - "dev": true, - "license": "MIT" - }, - "node_modules/content-type": { - "version": "1.0.5", + "node_modules/espree/node_modules/acorn": { + "version": "8.8.2", "dev": true, "license": "MIT", + "bin": { + "acorn": "bin/acorn" + }, "engines": { - "node": ">= 0.6" + "node": ">=0.4.0" } }, - "node_modules/convert-source-map": { - "version": "1.1.3", + "node_modules/esprima": { + "version": "4.0.1", "dev": true, - "license": "MIT" + "license": "BSD-2-Clause", + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" + }, + "engines": { + "node": ">=4" + } }, - "node_modules/cookie": { - "version": "0.4.2", + "node_modules/esquery": { + "version": "1.4.2", "dev": true, - "license": "MIT", + "license": "BSD-3-Clause", + "dependencies": { + "estraverse": "^5.1.0" + }, "engines": { - "node": ">= 0.6" + "node": ">=0.10" } }, - "node_modules/core-js-compat": { - "version": "3.35.1", - "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.35.1.tgz", - "integrity": "sha512-sftHa5qUJY3rs9Zht1WEnmkvXputCyDBczPnr7QDgL8n3qrF3CMXY4VPSYtOLLiOUJcah2WNXREd48iOl6mQIw==", + "node_modules/esrecurse": { + "version": "4.3.0", "dev": true, + "license": "BSD-2-Clause", "dependencies": { - "browserslist": "^4.22.2" + "estraverse": "^5.2.0" }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/core-js" + "engines": { + "node": ">=4.0" } }, - "node_modules/core-util-is": { - "version": "1.0.2", + "node_modules/estraverse": { + "version": "5.3.0", "dev": true, - "license": "MIT" + "license": "BSD-2-Clause", + "engines": { + "node": ">=4.0" + } }, - "node_modules/cors": { - "version": "2.8.5", + "node_modules/esutils": { + "version": "2.0.3", "dev": true, - "license": "MIT", - "dependencies": { - "object-assign": "^4", - "vary": "^1" - }, + "license": "BSD-2-Clause", "engines": { - "node": ">= 0.10" + "node": ">=0.10.0" } }, - "node_modules/create-ecdh": { - "version": "4.0.3", + "node_modules/eventemitter3": { + "version": "4.0.0", + "dev": true, + "license": "MIT" + }, + "node_modules/events": { + "version": "2.1.0", "dev": true, "license": "MIT", - "dependencies": { - "bn.js": "^4.1.0", - "elliptic": "^6.0.0" + "engines": { + "node": ">=0.4.x" } }, - "node_modules/create-hash": { - "version": "1.2.0", + "node_modules/evp_bytestokey": { + "version": "1.0.3", "dev": true, "license": "MIT", "dependencies": { - "cipher-base": "^1.0.1", - "inherits": "^2.0.1", "md5.js": "^1.3.4", - "ripemd160": "^2.0.1", - "sha.js": "^2.4.0" + "safe-buffer": "^5.1.1" } }, - "node_modules/create-hmac": { - "version": "1.1.7", + "node_modules/exit": { + "version": "0.1.2", "dev": true, - "license": "MIT", + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/extend": { + "version": "3.0.2", + "dev": true, + "license": "MIT" + }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "dev": true, + "license": "MIT" + }, + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "dev": true, + "license": "MIT" + }, + "node_modules/fast-levenshtein": { + "version": "2.0.6", + "dev": true, + "license": "MIT" + }, + "node_modules/fastq": { + "version": "1.15.0", + "dev": true, + "license": "ISC", "dependencies": { - "cipher-base": "^1.0.3", - "create-hash": "^1.1.0", - "inherits": "^2.0.1", - "ripemd160": "^2.0.0", - "safe-buffer": "^5.0.1", - "sha.js": "^2.4.8" + "reusify": "^1.0.4" } }, - "node_modules/cross-spawn": { - "version": "7.0.3", + "node_modules/file-entry-cache": { + "version": "6.0.1", "dev": true, "license": "MIT", "dependencies": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" + "flat-cache": "^3.0.4" }, "engines": { - "node": ">= 8" + "node": "^10.12.0 || >=12.0.0" } }, - "node_modules/cross-spawn/node_modules/which": { - "version": "2.0.2", + "node_modules/fill-range": { + "version": "7.0.1", "dev": true, - "license": "ISC", + "license": "MIT", "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "node-which": "bin/node-which" + "to-regex-range": "^5.0.1" }, "engines": { - "node": ">= 8" + "node": ">=8" } }, - "node_modules/crypto-browserify": { - "version": "3.12.0", + "node_modules/finalhandler": { + "version": "1.1.2", "dev": true, "license": "MIT", "dependencies": { - "browserify-cipher": "^1.0.0", - "browserify-sign": "^4.0.0", - "create-ecdh": "^4.0.0", - "create-hash": "^1.1.0", - "create-hmac": "^1.1.0", - "diffie-hellman": "^5.0.0", - "inherits": "^2.0.1", - "pbkdf2": "^3.0.3", - "public-encrypt": "^4.0.0", - "randombytes": "^2.0.0", - "randomfill": "^1.0.3" + "debug": "2.6.9", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "on-finished": "~2.3.0", + "parseurl": "~1.3.3", + "statuses": "~1.5.0", + "unpipe": "~1.0.0" }, "engines": { - "node": "*" + "node": ">= 0.8" } }, - "node_modules/custom-event": { - "version": "1.0.1", + "node_modules/finalhandler/node_modules/debug": { + "version": "2.6.9", "dev": true, - "license": "MIT" + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + } }, - "node_modules/dash-ast": { - "version": "1.0.0", - "dev": true, - "license": "Apache-2.0" - }, - "node_modules/date-format": { - "version": "4.0.14", + "node_modules/finalhandler/node_modules/ms": { + "version": "2.0.0", "dev": true, - "license": "MIT", - "engines": { - "node": ">=4.0" - } - }, - "node_modules/date-now": { - "version": "0.1.4", - "dev": true + "license": "MIT" }, - "node_modules/debug": { - "version": "4.3.4", + "node_modules/find-cache-dir": { + "version": "3.3.2", "dev": true, "license": "MIT", "dependencies": { - "ms": "2.1.2" + "commondir": "^1.0.1", + "make-dir": "^3.0.2", + "pkg-dir": "^4.1.0" }, "engines": { - "node": ">=6.0" + "node": ">=8" }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } + "funding": { + "url": "https://github.com/avajs/find-cache-dir?sponsor=1" } }, - "node_modules/decamelize": { - "version": "4.0.0", + "node_modules/find-up": { + "version": "5.0.0", "dev": true, "license": "MIT", + "dependencies": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + }, "engines": { "node": ">=10" }, @@ -3214,1543 +2414,1449 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/deep-eql": { - "version": "4.1.3", + "node_modules/flat": { + "version": "5.0.2", "dev": true, - "license": "MIT", - "dependencies": { - "type-detect": "^4.0.0" - }, - "engines": { - "node": ">=6" + "license": "BSD-3-Clause", + "bin": { + "flat": "cli.js" } }, - "node_modules/deep-is": { - "version": "0.1.3", - "dev": true, - "license": "MIT" - }, - "node_modules/default-require-extensions": { - "version": "3.0.1", + "node_modules/flat-cache": { + "version": "3.0.4", "dev": true, "license": "MIT", "dependencies": { - "strip-bom": "^4.0.0" + "flatted": "^3.1.0", + "rimraf": "^3.0.2" }, "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": "^10.12.0 || >=12.0.0" } }, - "node_modules/defined": { - "version": "1.0.0", + "node_modules/flatted": { + "version": "3.2.7", "dev": true, - "license": "MIT" + "license": "ISC" }, - "node_modules/depd": { - "version": "2.0.0", + "node_modules/follow-redirects": { + "version": "1.15.4", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.4.tgz", + "integrity": "sha512-Cr4D/5wlrb0z9dgERpUL3LrmPKVDsETIJhaCMeDfuFYcqa5bldGV6wBsAN6X/vxlXQtFBMrXdXxdL8CbDTGniw==", "dev": true, - "license": "MIT", + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/RubenVerborgh" + } + ], "engines": { - "node": ">= 0.8" + "node": ">=4.0" + }, + "peerDependenciesMeta": { + "debug": { + "optional": true + } } }, - "node_modules/deps-sort": { + "node_modules/foreground-child": { "version": "2.0.0", "dev": true, - "license": "MIT", + "license": "ISC", "dependencies": { - "JSONStream": "^1.0.3", - "shasum": "^1.0.0", - "subarg": "^1.0.0", - "through2": "^2.0.0" + "cross-spawn": "^7.0.0", + "signal-exit": "^3.0.2" }, - "bin": { - "deps-sort": "bin/cmd.js" + "engines": { + "node": ">=8.0.0" } }, - "node_modules/des.js": { - "version": "1.0.0", + "node_modules/fromentries": { + "version": "1.3.2", "dev": true, - "license": "MIT", - "dependencies": { - "inherits": "^2.0.1", - "minimalistic-assert": "^1.0.0" - } + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" }, - "node_modules/destroy": { - "version": "1.2.0", + "node_modules/fs-extra": { + "version": "8.1.0", "dev": true, "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + }, "engines": { - "node": ">= 0.8", - "npm": "1.2.8000 || >= 1.4.16" + "node": ">=6 <7 || >=8" } }, - "node_modules/detective": { - "version": "5.2.0", + "node_modules/fs.realpath": { + "version": "1.0.0", + "dev": true, + "license": "ISC" + }, + "node_modules/fsevents": { + "version": "2.3.2", "dev": true, "license": "MIT", - "dependencies": { - "acorn-node": "^1.6.1", - "defined": "^1.0.0", - "minimist": "^1.1.1" - }, - "bin": { - "detective": "bin/detective.js" - }, + "optional": true, + "os": [ + "darwin" + ], "engines": { - "node": ">=0.8.0" + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" } }, - "node_modules/di": { - "version": "0.0.1", + "node_modules/function-bind": { + "version": "1.1.1", "dev": true, "license": "MIT" }, - "node_modules/diff": { - "version": "5.0.0", + "node_modules/gensync": { + "version": "1.0.0-beta.2", "dev": true, - "license": "BSD-3-Clause", + "license": "MIT", "engines": { - "node": ">=0.3.1" + "node": ">=6.9.0" } }, - "node_modules/diffie-hellman": { - "version": "5.0.3", + "node_modules/get-assigned-identifiers": { + "version": "1.2.0", "dev": true, - "license": "MIT", - "dependencies": { - "bn.js": "^4.1.0", - "miller-rabin": "^4.0.0", - "randombytes": "^2.0.0" - } + "license": "Apache-2.0" }, - "node_modules/doctrine": { - "version": "3.0.0", + "node_modules/get-caller-file": { + "version": "2.0.5", "dev": true, - "license": "Apache-2.0", - "dependencies": { - "esutils": "^2.0.2" - }, + "license": "ISC", "engines": { - "node": ">=6.0.0" + "node": "6.* || 8.* || >= 10.*" } }, - "node_modules/dom-serialize": { - "version": "2.2.1", + "node_modules/get-func-name": { + "version": "2.0.0", "dev": true, "license": "MIT", - "dependencies": { - "custom-event": "~1.0.0", - "ent": "~2.2.0", - "extend": "^3.0.0", - "void-elements": "^2.0.0" + "engines": { + "node": "*" } }, - "node_modules/dom-serializer": { - "version": "0.2.1", + "node_modules/get-intrinsic": { + "version": "1.2.0", "dev": true, "license": "MIT", "dependencies": { - "domelementtype": "^2.0.1", - "entities": "^2.0.0" + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/dom-serializer/node_modules/domelementtype": { - "version": "2.0.1", - "dev": true, - "license": "BSD-2-Clause" - }, - "node_modules/dom-serializer/node_modules/entities": { - "version": "2.0.0", - "dev": true, - "license": "BSD-2-Clause" - }, - "node_modules/domain-browser": { - "version": "1.2.0", + "node_modules/get-package-type": { + "version": "0.1.0", "dev": true, "license": "MIT", "engines": { - "node": ">=0.4", - "npm": ">=1.2" + "node": ">=8.0.0" } }, - "node_modules/domelementtype": { - "version": "1.3.1", - "dev": true, - "license": "BSD-2-Clause" - }, - "node_modules/domhandler": { - "version": "2.3.0", + "node_modules/glob": { + "version": "7.2.0", "dev": true, + "license": "ISC", "dependencies": { - "domelementtype": "1" - } - }, - "node_modules/domutils": { - "version": "1.5.1", + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/glob-parent": { + "version": "5.1.2", "dev": true, + "license": "ISC", "dependencies": { - "dom-serializer": "0", - "domelementtype": "1" + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" } }, - "node_modules/duplexer2": { - "version": "0.1.4", + "node_modules/globals": { + "version": "13.20.0", "dev": true, - "license": "BSD-3-Clause", + "license": "MIT", "dependencies": { - "readable-stream": "^2.0.2" + "type-fest": "^0.20.2" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/ee-first": { - "version": "1.1.1", + "node_modules/graceful-fs": { + "version": "4.2.10", "dev": true, - "license": "MIT" - }, - "node_modules/electron-to-chromium": { - "version": "1.4.651", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.651.tgz", - "integrity": "sha512-jjks7Xx+4I7dslwsbaFocSwqBbGHQmuXBJUK9QBZTIrzPq3pzn6Uf2szFSP728FtLYE3ldiccmlkOM/zhGKCpA==", - "dev": true + "license": "ISC" }, - "node_modules/elliptic": { - "version": "6.5.4", + "node_modules/grapheme-splitter": { + "version": "1.0.4", "dev": true, - "license": "MIT", - "dependencies": { - "bn.js": "^4.11.9", - "brorand": "^1.1.0", - "hash.js": "^1.0.0", - "hmac-drbg": "^1.0.1", - "inherits": "^2.0.4", - "minimalistic-assert": "^1.0.1", - "minimalistic-crypto-utils": "^1.0.1" - } + "license": "MIT" }, - "node_modules/encodeurl": { - "version": "1.0.2", + "node_modules/has": { + "version": "1.0.3", "dev": true, "license": "MIT", + "dependencies": { + "function-bind": "^1.1.1" + }, "engines": { - "node": ">= 0.8" + "node": ">= 0.4.0" } }, - "node_modules/engine.io": { - "version": "6.4.2", - "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-6.4.2.tgz", - "integrity": "sha512-FKn/3oMiJjrOEOeUub2WCox6JhxBXq/Zn3fZOMCBxKnNYtsdKjxhl7yR3fZhM9PV+rdE75SU5SYMc+2PGzo+Tg==", + "node_modules/has-ansi": { + "version": "2.0.0", "dev": true, + "license": "MIT", "dependencies": { - "@types/cookie": "^0.4.1", - "@types/cors": "^2.8.12", - "@types/node": ">=10.0.0", - "accepts": "~1.3.4", - "base64id": "2.0.0", - "cookie": "~0.4.1", - "cors": "~2.8.5", - "debug": "~4.3.1", - "engine.io-parser": "~5.0.3", - "ws": "~8.11.0" + "ansi-regex": "^2.0.0" }, "engines": { - "node": ">=10.0.0" + "node": ">=0.10.0" } }, - "node_modules/engine.io-parser": { - "version": "5.0.6", + "node_modules/has-ansi/node_modules/ansi-regex": { + "version": "2.1.1", "dev": true, "license": "MIT", "engines": { - "node": ">=10.0.0" + "node": ">=0.10.0" } }, - "node_modules/ent": { - "version": "2.2.0", - "dev": true, - "license": "MIT" - }, - "node_modules/entities": { - "version": "1.0.0", - "dev": true, - "license": "BSD-like" - }, - "node_modules/es6-error": { - "version": "4.1.1", - "dev": true, - "license": "MIT" - }, - "node_modules/escalade": { - "version": "3.1.1", + "node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", "dev": true, - "license": "MIT", "engines": { - "node": ">=6" + "node": ">=4" } }, - "node_modules/escape-html": { + "node_modules/has-symbols": { "version": "1.0.3", "dev": true, - "license": "MIT" - }, - "node_modules/escape-string-regexp": { - "version": "1.0.5", - "dev": true, "license": "MIT", "engines": { - "node": ">=0.8.0" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/eslint": { - "version": "8.35.0", + "node_modules/hash-base": { + "version": "3.0.4", "dev": true, "license": "MIT", "dependencies": { - "@eslint/eslintrc": "^2.0.0", - "@eslint/js": "8.35.0", - "@humanwhocodes/config-array": "^0.11.8", - "@humanwhocodes/module-importer": "^1.0.1", - "@nodelib/fs.walk": "^1.2.8", - "ajv": "^6.10.0", - "chalk": "^4.0.0", - "cross-spawn": "^7.0.2", - "debug": "^4.3.2", - "doctrine": "^3.0.0", - "escape-string-regexp": "^4.0.0", - "eslint-scope": "^7.1.1", - "eslint-utils": "^3.0.0", - "eslint-visitor-keys": "^3.3.0", - "espree": "^9.4.0", - "esquery": "^1.4.2", - "esutils": "^2.0.2", - "fast-deep-equal": "^3.1.3", - "file-entry-cache": "^6.0.1", - "find-up": "^5.0.0", - "glob-parent": "^6.0.2", - "globals": "^13.19.0", - "grapheme-splitter": "^1.0.4", - "ignore": "^5.2.0", - "import-fresh": "^3.0.0", - "imurmurhash": "^0.1.4", - "is-glob": "^4.0.0", - "is-path-inside": "^3.0.3", - "js-sdsl": "^4.1.4", - "js-yaml": "^4.1.0", - "json-stable-stringify-without-jsonify": "^1.0.1", - "levn": "^0.4.1", - "lodash.merge": "^4.6.2", - "minimatch": "^3.1.2", - "natural-compare": "^1.4.0", - "optionator": "^0.9.1", - "regexpp": "^3.2.0", - "strip-ansi": "^6.0.1", - "strip-json-comments": "^3.1.0", - "text-table": "^0.2.0" - }, - "bin": { - "eslint": "bin/eslint.js" + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" + "node": ">=4" } }, - "node_modules/eslint-scope": { - "version": "7.1.1", + "node_modules/hash.js": { + "version": "1.1.7", "dev": true, - "license": "BSD-2-Clause", + "license": "MIT", "dependencies": { - "esrecurse": "^4.3.0", - "estraverse": "^5.2.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "inherits": "^2.0.3", + "minimalistic-assert": "^1.0.1" } }, - "node_modules/eslint-utils": { - "version": "3.0.0", + "node_modules/hasha": { + "version": "5.2.2", "dev": true, "license": "MIT", "dependencies": { - "eslint-visitor-keys": "^2.0.0" + "is-stream": "^2.0.0", + "type-fest": "^0.8.0" }, "engines": { - "node": "^10.0.0 || ^12.0.0 || >= 14.0.0" + "node": ">=8" }, "funding": { - "url": "https://github.com/sponsors/mysticatea" - }, - "peerDependencies": { - "eslint": ">=5" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/eslint-utils/node_modules/eslint-visitor-keys": { - "version": "2.1.0", + "node_modules/hasha/node_modules/type-fest": { + "version": "0.8.1", "dev": true, - "license": "Apache-2.0", + "license": "(MIT OR CC0-1.0)", "engines": { - "node": ">=10" + "node": ">=8" } }, - "node_modules/eslint-visitor-keys": { - "version": "3.3.0", + "node_modules/he": { + "version": "1.2.0", "dev": true, - "license": "Apache-2.0", - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "license": "MIT", + "bin": { + "he": "bin/he" } }, - "node_modules/eslint/node_modules/ansi-styles": { - "version": "4.3.0", + "node_modules/hmac-drbg": { + "version": "1.0.1", "dev": true, "license": "MIT", "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" + "hash.js": "^1.0.3", + "minimalistic-assert": "^1.0.0", + "minimalistic-crypto-utils": "^1.0.1" } }, - "node_modules/eslint/node_modules/argparse": { - "version": "2.0.1", + "node_modules/html-escaper": { + "version": "2.0.2", "dev": true, - "license": "Python-2.0" + "license": "MIT" }, - "node_modules/eslint/node_modules/chalk": { - "version": "4.1.2", - "dev": true, + "node_modules/htmlescape": { + "version": "1.1.1", + "dev": true, "license": "MIT", - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" + "node": ">=0.10" } }, - "node_modules/eslint/node_modules/color-convert": { - "version": "2.0.1", + "node_modules/htmlparser2": { + "version": "3.8.3", "dev": true, "license": "MIT", "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" + "domelementtype": "1", + "domhandler": "2.3", + "domutils": "1.5", + "entities": "1.0", + "readable-stream": "1.1" } }, - "node_modules/eslint/node_modules/color-name": { - "version": "1.1.4", + "node_modules/htmlparser2/node_modules/isarray": { + "version": "0.0.1", "dev": true, "license": "MIT" }, - "node_modules/eslint/node_modules/escape-string-regexp": { - "version": "4.0.0", + "node_modules/htmlparser2/node_modules/readable-stream": { + "version": "1.1.14", "dev": true, "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", + "isarray": "0.0.1", + "string_decoder": "~0.10.x" } }, - "node_modules/eslint/node_modules/glob-parent": { - "version": "6.0.2", + "node_modules/htmlparser2/node_modules/string_decoder": { + "version": "0.10.31", "dev": true, - "license": "ISC", + "license": "MIT" + }, + "node_modules/http-errors": { + "version": "2.0.0", + "dev": true, + "license": "MIT", "dependencies": { - "is-glob": "^4.0.3" + "depd": "2.0.0", + "inherits": "2.0.4", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "toidentifier": "1.0.1" }, "engines": { - "node": ">=10.13.0" + "node": ">= 0.8" } }, - "node_modules/eslint/node_modules/has-flag": { - "version": "4.0.0", + "node_modules/http-errors/node_modules/statuses": { + "version": "2.0.1", "dev": true, "license": "MIT", "engines": { - "node": ">=8" + "node": ">= 0.8" } }, - "node_modules/eslint/node_modules/js-yaml": { - "version": "4.1.0", + "node_modules/http-proxy": { + "version": "1.18.1", "dev": true, "license": "MIT", "dependencies": { - "argparse": "^2.0.1" + "eventemitter3": "^4.0.0", + "follow-redirects": "^1.0.0", + "requires-port": "^1.0.0" }, - "bin": { - "js-yaml": "bin/js-yaml.js" + "engines": { + "node": ">=8.0.0" } }, - "node_modules/eslint/node_modules/levn": { - "version": "0.4.1", + "node_modules/https-browserify": { + "version": "1.0.0", + "dev": true, + "license": "MIT" + }, + "node_modules/iconv-lite": { + "version": "0.4.24", "dev": true, "license": "MIT", "dependencies": { - "prelude-ls": "^1.2.1", - "type-check": "~0.4.0" + "safer-buffer": ">= 2.1.2 < 3" }, "engines": { - "node": ">= 0.8.0" + "node": ">=0.10.0" } }, - "node_modules/eslint/node_modules/minimatch": { - "version": "3.1.2", + "node_modules/ieee754": { + "version": "1.2.1", "dev": true, - "license": "ISC", - "dependencies": { - "brace-expansion": "^1.1.7" - }, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "BSD-3-Clause" + }, + "node_modules/ignore": { + "version": "5.2.4", + "dev": true, + "license": "MIT", "engines": { - "node": "*" + "node": ">= 4" } }, - "node_modules/eslint/node_modules/optionator": { - "version": "0.9.1", + "node_modules/import-fresh": { + "version": "3.3.0", "dev": true, "license": "MIT", "dependencies": { - "deep-is": "^0.1.3", - "fast-levenshtein": "^2.0.6", - "levn": "^0.4.1", - "prelude-ls": "^1.2.1", - "type-check": "^0.4.0", - "word-wrap": "^1.2.3" + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" }, "engines": { - "node": ">= 0.8.0" + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/eslint/node_modules/prelude-ls": { - "version": "1.2.1", + "node_modules/imurmurhash": { + "version": "0.1.4", "dev": true, "license": "MIT", "engines": { - "node": ">= 0.8.0" + "node": ">=0.8.19" } }, - "node_modules/eslint/node_modules/supports-color": { - "version": "7.2.0", + "node_modules/indent-string": { + "version": "4.0.0", "dev": true, "license": "MIT", - "dependencies": { - "has-flag": "^4.0.0" - }, "engines": { "node": ">=8" } }, - "node_modules/eslint/node_modules/type-check": { - "version": "0.4.0", + "node_modules/inflight": { + "version": "1.0.6", "dev": true, - "license": "MIT", + "license": "ISC", "dependencies": { - "prelude-ls": "^1.2.1" - }, - "engines": { - "node": ">= 0.8.0" + "once": "^1.3.0", + "wrappy": "1" } }, - "node_modules/espree": { - "version": "9.4.1", + "node_modules/inherits": { + "version": "2.0.4", "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "acorn": "^8.8.0", - "acorn-jsx": "^5.3.2", - "eslint-visitor-keys": "^3.3.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } + "license": "ISC" }, - "node_modules/espree/node_modules/acorn": { - "version": "8.8.2", + "node_modules/inline-source-map": { + "version": "0.6.2", "dev": true, "license": "MIT", - "bin": { - "acorn": "bin/acorn" - }, - "engines": { - "node": ">=0.4.0" + "dependencies": { + "source-map": "~0.5.3" } }, - "node_modules/esprima": { - "version": "4.0.1", + "node_modules/insert-module-globals": { + "version": "7.2.0", "dev": true, - "license": "BSD-2-Clause", - "bin": { - "esparse": "bin/esparse.js", - "esvalidate": "bin/esvalidate.js" + "license": "MIT", + "dependencies": { + "acorn-node": "^1.5.2", + "combine-source-map": "^0.8.0", + "concat-stream": "^1.6.1", + "is-buffer": "^1.1.0", + "JSONStream": "^1.0.3", + "path-is-absolute": "^1.0.1", + "process": "~0.11.0", + "through2": "^2.0.0", + "undeclared-identifiers": "^1.1.2", + "xtend": "^4.0.0" }, - "engines": { - "node": ">=4" + "bin": { + "insert-module-globals": "bin/cmd.js" } }, - "node_modules/esquery": { - "version": "1.4.2", + "node_modules/irregular-plurals": { + "version": "1.4.0", "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "estraverse": "^5.1.0" - }, + "license": "MIT", "engines": { - "node": ">=0.10" + "node": ">=0.10.0" } }, - "node_modules/esrecurse": { - "version": "4.3.0", + "node_modules/is-binary-path": { + "version": "2.1.0", "dev": true, - "license": "BSD-2-Clause", + "license": "MIT", "dependencies": { - "estraverse": "^5.2.0" + "binary-extensions": "^2.0.0" }, "engines": { - "node": ">=4.0" + "node": ">=8" } }, - "node_modules/estraverse": { - "version": "5.3.0", + "node_modules/is-buffer": { + "version": "1.1.6", "dev": true, - "license": "BSD-2-Clause", - "engines": { - "node": ">=4.0" - } + "license": "MIT" }, - "node_modules/esutils": { - "version": "2.0.3", + "node_modules/is-extglob": { + "version": "2.1.1", "dev": true, - "license": "BSD-2-Clause", + "license": "MIT", "engines": { "node": ">=0.10.0" } }, - "node_modules/eventemitter3": { - "version": "4.0.0", - "dev": true, - "license": "MIT" - }, - "node_modules/events": { - "version": "2.1.0", + "node_modules/is-glob": { + "version": "4.0.3", "dev": true, "license": "MIT", + "dependencies": { + "is-extglob": "^2.1.1" + }, "engines": { - "node": ">=0.4.x" + "node": ">=0.10.0" } }, - "node_modules/evp_bytestokey": { - "version": "1.0.3", + "node_modules/is-number": { + "version": "7.0.0", "dev": true, "license": "MIT", - "dependencies": { - "md5.js": "^1.3.4", - "safe-buffer": "^5.1.1" + "engines": { + "node": ">=0.12.0" } }, - "node_modules/exit": { - "version": "0.1.2", + "node_modules/is-path-inside": { + "version": "3.0.3", "dev": true, + "license": "MIT", "engines": { - "node": ">= 0.8.0" + "node": ">=8" } }, - "node_modules/extend": { - "version": "3.0.2", + "node_modules/is-plain-obj": { + "version": "2.1.0", "dev": true, - "license": "MIT" + "license": "MIT", + "engines": { + "node": ">=8" + } }, - "node_modules/fast-deep-equal": { - "version": "3.1.3", + "node_modules/is-stream": { + "version": "2.0.1", "dev": true, - "license": "MIT" + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } }, - "node_modules/fast-json-stable-stringify": { - "version": "2.1.0", + "node_modules/is-typedarray": { + "version": "1.0.0", "dev": true, "license": "MIT" }, - "node_modules/fast-levenshtein": { - "version": "2.0.6", + "node_modules/is-unicode-supported": { + "version": "0.1.0", "dev": true, - "license": "MIT" + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } }, - "node_modules/fastq": { - "version": "1.15.0", + "node_modules/is-windows": { + "version": "1.0.2", "dev": true, - "license": "ISC", - "dependencies": { - "reusify": "^1.0.4" + "license": "MIT", + "engines": { + "node": ">=0.10.0" } }, - "node_modules/file-entry-cache": { - "version": "6.0.1", + "node_modules/is-wsl": { + "version": "2.1.0", "dev": true, "license": "MIT", - "dependencies": { - "flat-cache": "^3.0.4" - }, "engines": { - "node": "^10.12.0 || >=12.0.0" + "node": ">=8" } }, - "node_modules/fill-range": { - "version": "7.0.1", + "node_modules/isarray": { + "version": "1.0.0", + "dev": true, + "license": "MIT" + }, + "node_modules/isbinaryfile": { + "version": "4.0.10", "dev": true, "license": "MIT", - "dependencies": { - "to-regex-range": "^5.0.1" + "engines": { + "node": ">= 8.0.0" }, + "funding": { + "url": "https://github.com/sponsors/gjtorikian/" + } + }, + "node_modules/isexe": { + "version": "2.0.0", + "dev": true, + "license": "ISC" + }, + "node_modules/istanbul-lib-coverage": { + "version": "3.2.0", + "dev": true, + "license": "BSD-3-Clause", "engines": { "node": ">=8" } }, - "node_modules/finalhandler": { - "version": "1.1.2", + "node_modules/istanbul-lib-hook": { + "version": "3.0.0", "dev": true, - "license": "MIT", + "license": "BSD-3-Clause", "dependencies": { - "debug": "2.6.9", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "on-finished": "~2.3.0", - "parseurl": "~1.3.3", - "statuses": "~1.5.0", - "unpipe": "~1.0.0" + "append-transform": "^2.0.0" }, "engines": { - "node": ">= 0.8" + "node": ">=8" } }, - "node_modules/finalhandler/node_modules/debug": { - "version": "2.6.9", + "node_modules/istanbul-lib-instrument": { + "version": "4.0.3", "dev": true, - "license": "MIT", + "license": "BSD-3-Clause", "dependencies": { - "ms": "2.0.0" + "@babel/core": "^7.7.5", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-coverage": "^3.0.0", + "semver": "^6.3.0" + }, + "engines": { + "node": ">=8" } }, - "node_modules/finalhandler/node_modules/ms": { - "version": "2.0.0", + "node_modules/istanbul-lib-instrument/node_modules/semver": { + "version": "6.3.0", "dev": true, - "license": "MIT" + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } }, - "node_modules/find-cache-dir": { - "version": "3.3.2", + "node_modules/istanbul-lib-processinfo": { + "version": "2.0.3", "dev": true, - "license": "MIT", + "license": "ISC", "dependencies": { - "commondir": "^1.0.1", - "make-dir": "^3.0.2", - "pkg-dir": "^4.1.0" + "archy": "^1.0.0", + "cross-spawn": "^7.0.3", + "istanbul-lib-coverage": "^3.2.0", + "p-map": "^3.0.0", + "rimraf": "^3.0.0", + "uuid": "^8.3.2" }, "engines": { "node": ">=8" - }, - "funding": { - "url": "https://github.com/avajs/find-cache-dir?sponsor=1" } }, - "node_modules/find-up": { - "version": "5.0.0", + "node_modules/istanbul-lib-report": { + "version": "3.0.0", "dev": true, - "license": "MIT", + "license": "BSD-3-Clause", "dependencies": { - "locate-path": "^6.0.0", - "path-exists": "^4.0.0" + "istanbul-lib-coverage": "^3.0.0", + "make-dir": "^3.0.0", + "supports-color": "^7.1.0" }, "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=8" } }, - "node_modules/flat": { - "version": "5.0.2", + "node_modules/istanbul-lib-report/node_modules/has-flag": { + "version": "4.0.0", "dev": true, - "license": "BSD-3-Clause", - "bin": { - "flat": "cli.js" + "license": "MIT", + "engines": { + "node": ">=8" } }, - "node_modules/flat-cache": { - "version": "3.0.4", + "node_modules/istanbul-lib-report/node_modules/supports-color": { + "version": "7.2.0", "dev": true, "license": "MIT", "dependencies": { - "flatted": "^3.1.0", - "rimraf": "^3.0.2" + "has-flag": "^4.0.0" }, "engines": { - "node": "^10.12.0 || >=12.0.0" + "node": ">=8" } }, - "node_modules/flatted": { - "version": "3.2.7", + "node_modules/istanbul-lib-source-maps": { + "version": "4.0.1", "dev": true, - "license": "ISC" + "license": "BSD-3-Clause", + "dependencies": { + "debug": "^4.1.1", + "istanbul-lib-coverage": "^3.0.0", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=10" + } }, - "node_modules/follow-redirects": { - "version": "1.15.4", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.4.tgz", - "integrity": "sha512-Cr4D/5wlrb0z9dgERpUL3LrmPKVDsETIJhaCMeDfuFYcqa5bldGV6wBsAN6X/vxlXQtFBMrXdXxdL8CbDTGniw==", + "node_modules/istanbul-lib-source-maps/node_modules/source-map": { + "version": "0.6.1", "dev": true, - "funding": [ - { - "type": "individual", - "url": "https://github.com/sponsors/RubenVerborgh" - } - ], + "license": "BSD-3-Clause", "engines": { - "node": ">=4.0" - }, - "peerDependenciesMeta": { - "debug": { - "optional": true - } + "node": ">=0.10.0" } }, - "node_modules/foreground-child": { - "version": "2.0.0", + "node_modules/istanbul-reports": { + "version": "3.1.5", "dev": true, - "license": "ISC", + "license": "BSD-3-Clause", "dependencies": { - "cross-spawn": "^7.0.0", - "signal-exit": "^3.0.2" + "html-escaper": "^2.0.0", + "istanbul-lib-report": "^3.0.0" }, "engines": { - "node": ">=8.0.0" + "node": ">=8" } }, - "node_modules/fromentries": { - "version": "1.3.2", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT" - }, - "node_modules/fs-extra": { - "version": "8.1.0", + "node_modules/js-sdsl": { + "version": "4.3.0", "dev": true, "license": "MIT", - "dependencies": { - "graceful-fs": "^4.2.0", - "jsonfile": "^4.0.0", - "universalify": "^0.1.0" - }, - "engines": { - "node": ">=6 <7 || >=8" + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/js-sdsl" } }, - "node_modules/fs-readdir-recursive": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/fs-readdir-recursive/-/fs-readdir-recursive-1.1.0.tgz", - "integrity": "sha512-GNanXlVr2pf02+sPN40XN8HG+ePaNcvM0q5mZBd668Obwb0yD5GiUbZOFgwn8kGMY6I3mdyDJzieUy3PTYyTRA==", + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", "dev": true }, - "node_modules/fs.realpath": { - "version": "1.0.0", + "node_modules/js-yaml": { + "version": "3.13.1", "dev": true, - "license": "ISC" + "license": "MIT", + "dependencies": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } }, - "node_modules/fsevents": { - "version": "2.3.2", + "node_modules/jsesc": { + "version": "2.5.2", "dev": true, "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], + "bin": { + "jsesc": "bin/jsesc" + }, "engines": { - "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + "node": ">=4" } }, - "node_modules/function-bind": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", - "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "node_modules/jshint": { + "version": "2.13.5", "dev": true, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "license": "MIT", + "dependencies": { + "cli": "~1.0.0", + "console-browserify": "1.1.x", + "exit": "0.1.x", + "htmlparser2": "3.8.x", + "lodash": "~4.17.21", + "minimatch": "~3.0.2", + "strip-json-comments": "1.0.x" + }, + "bin": { + "jshint": "bin/jshint" } }, - "node_modules/gensync": { - "version": "1.0.0-beta.2", + "node_modules/jshint-stylish": { + "version": "2.2.1", "dev": true, "license": "MIT", + "dependencies": { + "beeper": "^1.1.0", + "chalk": "^1.0.0", + "log-symbols": "^1.0.0", + "plur": "^2.1.0", + "string-length": "^1.0.0", + "text-table": "^0.2.0" + }, "engines": { - "node": ">=6.9.0" + "node": ">=0.10.0" } }, - "node_modules/get-assigned-identifiers": { - "version": "1.2.0", - "dev": true, - "license": "Apache-2.0" - }, - "node_modules/get-caller-file": { - "version": "2.0.5", + "node_modules/jshint-stylish/node_modules/ansi-regex": { + "version": "2.1.1", "dev": true, - "license": "ISC", + "license": "MIT", "engines": { - "node": "6.* || 8.* || >= 10.*" + "node": ">=0.10.0" } }, - "node_modules/get-func-name": { - "version": "2.0.0", + "node_modules/jshint-stylish/node_modules/ansi-styles": { + "version": "2.2.1", "dev": true, "license": "MIT", "engines": { - "node": "*" + "node": ">=0.10.0" } }, - "node_modules/get-intrinsic": { - "version": "1.2.0", + "node_modules/jshint-stylish/node_modules/chalk": { + "version": "1.1.3", "dev": true, "license": "MIT", "dependencies": { - "function-bind": "^1.1.1", - "has": "^1.0.3", - "has-symbols": "^1.0.3" + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/get-package-type": { - "version": "0.1.0", - "dev": true, - "license": "MIT", "engines": { - "node": ">=8.0.0" + "node": ">=0.10.0" } }, - "node_modules/glob": { - "version": "7.2.0", + "node_modules/jshint-stylish/node_modules/strip-ansi": { + "version": "3.0.1", "dev": true, - "license": "ISC", + "license": "MIT", "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" + "ansi-regex": "^2.0.0" }, "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" + "node": ">=0.10.0" } }, - "node_modules/glob-parent": { - "version": "5.1.2", + "node_modules/jshint-stylish/node_modules/supports-color": { + "version": "2.0.0", "dev": true, - "license": "ISC", - "dependencies": { - "is-glob": "^4.0.1" - }, + "license": "MIT", "engines": { - "node": ">= 6" + "node": ">=0.8.0" } }, - "node_modules/globals": { - "version": "13.20.0", + "node_modules/jshint/node_modules/strip-json-comments": { + "version": "1.0.4", "dev": true, "license": "MIT", - "dependencies": { - "type-fest": "^0.20.2" + "bin": { + "strip-json-comments": "cli.js" }, "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=0.8.0" } }, - "node_modules/graceful-fs": { - "version": "4.2.10", - "dev": true, - "license": "ISC" - }, - "node_modules/grapheme-splitter": { - "version": "1.0.4", + "node_modules/json-schema-traverse": { + "version": "0.4.1", "dev": true, "license": "MIT" }, - "node_modules/has": { - "version": "1.0.3", + "node_modules/json-stable-stringify": { + "version": "0.0.1", "dev": true, "license": "MIT", "dependencies": { - "function-bind": "^1.1.1" - }, - "engines": { - "node": ">= 0.4.0" + "jsonify": "~0.0.0" } }, - "node_modules/has-ansi": { - "version": "2.0.0", + "node_modules/json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "dev": true, + "license": "MIT" + }, + "node_modules/json5": { + "version": "2.2.3", "dev": true, "license": "MIT", - "dependencies": { - "ansi-regex": "^2.0.0" + "bin": { + "json5": "lib/cli.js" }, "engines": { - "node": ">=0.10.0" + "node": ">=6" } }, - "node_modules/has-ansi/node_modules/ansi-regex": { - "version": "2.1.1", + "node_modules/jsonfile": { + "version": "4.0.0", "dev": true, "license": "MIT", - "engines": { - "node": ">=0.10.0" + "optionalDependencies": { + "graceful-fs": "^4.1.6" } }, - "node_modules/has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "node_modules/jsonify": { + "version": "0.0.0", "dev": true, - "engines": { - "node": ">=4" - } + "license": "Public Domain" }, - "node_modules/has-symbols": { - "version": "1.0.3", + "node_modules/jsonparse": { + "version": "1.3.1", "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } + "engines": [ + "node >= 0.2.0" + ], + "license": "MIT" }, - "node_modules/hash-base": { - "version": "3.0.4", + "node_modules/JSONStream": { + "version": "1.3.5", "dev": true, - "license": "MIT", + "license": "(MIT OR Apache-2.0)", "dependencies": { - "inherits": "^2.0.1", - "safe-buffer": "^5.0.1" + "jsonparse": "^1.2.0", + "through": ">=2.2.7 <3" + }, + "bin": { + "JSONStream": "bin.js" }, "engines": { - "node": ">=4" + "node": "*" } }, - "node_modules/hash.js": { - "version": "1.1.7", + "node_modules/karma": { + "version": "6.4.1", "dev": true, "license": "MIT", "dependencies": { - "inherits": "^2.0.3", - "minimalistic-assert": "^1.0.1" + "@colors/colors": "1.5.0", + "body-parser": "^1.19.0", + "braces": "^3.0.2", + "chokidar": "^3.5.1", + "connect": "^3.7.0", + "di": "^0.0.1", + "dom-serialize": "^2.2.1", + "glob": "^7.1.7", + "graceful-fs": "^4.2.6", + "http-proxy": "^1.18.1", + "isbinaryfile": "^4.0.8", + "lodash": "^4.17.21", + "log4js": "^6.4.1", + "mime": "^2.5.2", + "minimatch": "^3.0.4", + "mkdirp": "^0.5.5", + "qjobs": "^1.2.0", + "range-parser": "^1.2.1", + "rimraf": "^3.0.2", + "socket.io": "^4.4.1", + "source-map": "^0.6.1", + "tmp": "^0.2.1", + "ua-parser-js": "^0.7.30", + "yargs": "^16.1.1" + }, + "bin": { + "karma": "bin/karma" + }, + "engines": { + "node": ">= 10" } }, - "node_modules/hasha": { - "version": "5.2.2", + "node_modules/karma-chrome-launcher": { + "version": "3.1.0", "dev": true, "license": "MIT", "dependencies": { - "is-stream": "^2.0.0", - "type-fest": "^0.8.0" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "which": "^1.2.1" } }, - "node_modules/hasha/node_modules/type-fest": { - "version": "0.8.1", + "node_modules/karma-firefox-launcher": { + "version": "1.3.0", "dev": true, - "license": "(MIT OR CC0-1.0)", - "engines": { - "node": ">=8" + "license": "MIT", + "dependencies": { + "is-wsl": "^2.1.0" } }, - "node_modules/hasown": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.0.tgz", - "integrity": "sha512-vUptKVTpIJhcczKBbgnS+RtcuYMB8+oNzPK2/Hp3hanz8JmpATdmmgLgSaadVREkDm+e2giHwY3ZRkyjSIDDFA==", + "node_modules/karma-mocha": { + "version": "2.0.1", "dev": true, + "license": "MIT", "dependencies": { - "function-bind": "^1.1.2" - }, - "engines": { - "node": ">= 0.4" + "minimist": "^1.2.3" } }, - "node_modules/he": { - "version": "1.2.0", + "node_modules/karma-requirejs": { + "version": "1.1.0", "dev": true, "license": "MIT", - "bin": { - "he": "bin/he" + "peerDependencies": { + "karma": ">=0.9", + "requirejs": "^2.1.0" } }, - "node_modules/hmac-drbg": { - "version": "1.0.1", + "node_modules/karma-safari-launcher": { + "version": "1.0.0", "dev": true, "license": "MIT", - "dependencies": { - "hash.js": "^1.0.3", - "minimalistic-assert": "^1.0.0", - "minimalistic-crypto-utils": "^1.0.1" + "peerDependencies": { + "karma": ">=0.9" } }, - "node_modules/html-escaper": { - "version": "2.0.2", - "dev": true, - "license": "MIT" - }, - "node_modules/htmlescape": { - "version": "1.1.1", + "node_modules/karma/node_modules/glob": { + "version": "7.2.3", "dev": true, - "license": "MIT", + "license": "ISC", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, "engines": { - "node": ">=0.10" + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/htmlparser2": { - "version": "3.8.3", + "node_modules/karma/node_modules/minimatch": { + "version": "3.1.2", "dev": true, - "license": "MIT", + "license": "ISC", "dependencies": { - "domelementtype": "1", - "domhandler": "2.3", - "domutils": "1.5", - "entities": "1.0", - "readable-stream": "1.1" + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" } }, - "node_modules/htmlparser2/node_modules/isarray": { - "version": "0.0.1", + "node_modules/karma/node_modules/source-map": { + "version": "0.6.1", "dev": true, - "license": "MIT" + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } }, - "node_modules/htmlparser2/node_modules/readable-stream": { - "version": "1.1.14", + "node_modules/labeled-stream-splicer": { + "version": "2.0.2", "dev": true, "license": "MIT", "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.1", - "isarray": "0.0.1", - "string_decoder": "~0.10.x" + "inherits": "^2.0.1", + "stream-splicer": "^2.0.0" } }, - "node_modules/htmlparser2/node_modules/string_decoder": { - "version": "0.10.31", - "dev": true, - "license": "MIT" - }, - "node_modules/http-errors": { - "version": "2.0.0", + "node_modules/locate-path": { + "version": "6.0.0", "dev": true, "license": "MIT", "dependencies": { - "depd": "2.0.0", - "inherits": "2.0.4", - "setprototypeof": "1.2.0", - "statuses": "2.0.1", - "toidentifier": "1.0.1" + "p-locate": "^5.0.0" }, "engines": { - "node": ">= 0.8" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/http-errors/node_modules/statuses": { - "version": "2.0.1", + "node_modules/lodash": { + "version": "4.17.21", "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.8" - } + "license": "MIT" }, - "node_modules/http-proxy": { - "version": "1.18.1", + "node_modules/lodash.flattendeep": { + "version": "4.4.0", "dev": true, - "license": "MIT", - "dependencies": { - "eventemitter3": "^4.0.0", - "follow-redirects": "^1.0.0", - "requires-port": "^1.0.0" - }, - "engines": { - "node": ">=8.0.0" - } + "license": "MIT" }, - "node_modules/https-browserify": { - "version": "1.0.0", + "node_modules/lodash.memoize": { + "version": "3.0.4", "dev": true, "license": "MIT" }, - "node_modules/iconv-lite": { - "version": "0.4.24", + "node_modules/lodash.merge": { + "version": "4.6.2", + "dev": true, + "license": "MIT" + }, + "node_modules/log-symbols": { + "version": "1.0.2", "dev": true, "license": "MIT", "dependencies": { - "safer-buffer": ">= 2.1.2 < 3" + "chalk": "^1.0.0" }, "engines": { "node": ">=0.10.0" } }, - "node_modules/ieee754": { - "version": "1.2.1", + "node_modules/log-symbols/node_modules/ansi-regex": { + "version": "2.1.1", "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "BSD-3-Clause" + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } }, - "node_modules/ignore": { - "version": "5.2.4", + "node_modules/log-symbols/node_modules/ansi-styles": { + "version": "2.2.1", "dev": true, "license": "MIT", "engines": { - "node": ">= 4" + "node": ">=0.10.0" } }, - "node_modules/import-fresh": { - "version": "3.3.0", + "node_modules/log-symbols/node_modules/chalk": { + "version": "1.1.3", "dev": true, "license": "MIT", "dependencies": { - "parent-module": "^1.0.0", - "resolve-from": "^4.0.0" + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" }, "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=0.10.0" } }, - "node_modules/imurmurhash": { - "version": "0.1.4", + "node_modules/log-symbols/node_modules/strip-ansi": { + "version": "3.0.1", "dev": true, "license": "MIT", + "dependencies": { + "ansi-regex": "^2.0.0" + }, "engines": { - "node": ">=0.8.19" + "node": ">=0.10.0" } }, - "node_modules/indent-string": { - "version": "4.0.0", + "node_modules/log-symbols/node_modules/supports-color": { + "version": "2.0.0", "dev": true, "license": "MIT", "engines": { - "node": ">=8" + "node": ">=0.8.0" } }, - "node_modules/inflight": { - "version": "1.0.6", + "node_modules/log4js": { + "version": "6.8.0", "dev": true, - "license": "ISC", + "license": "Apache-2.0", "dependencies": { - "once": "^1.3.0", - "wrappy": "1" + "date-format": "^4.0.14", + "debug": "^4.3.4", + "flatted": "^3.2.7", + "rfdc": "^1.3.0", + "streamroller": "^3.1.5" + }, + "engines": { + "node": ">=8.0" } }, - "node_modules/inherits": { - "version": "2.0.4", - "dev": true, - "license": "ISC" - }, - "node_modules/inline-source-map": { - "version": "0.6.2", + "node_modules/loupe": { + "version": "2.3.6", "dev": true, "license": "MIT", "dependencies": { - "source-map": "~0.5.3" + "get-func-name": "^2.0.0" } }, - "node_modules/insert-module-globals": { - "version": "7.2.0", + "node_modules/lru-cache": { + "version": "5.1.1", "dev": true, - "license": "MIT", + "license": "ISC", "dependencies": { - "acorn-node": "^1.5.2", - "combine-source-map": "^0.8.0", - "concat-stream": "^1.6.1", - "is-buffer": "^1.1.0", - "JSONStream": "^1.0.3", - "path-is-absolute": "^1.0.1", - "process": "~0.11.0", - "through2": "^2.0.0", - "undeclared-identifiers": "^1.1.2", - "xtend": "^4.0.0" - }, - "bin": { - "insert-module-globals": "bin/cmd.js" - } - }, - "node_modules/irregular-plurals": { - "version": "1.4.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" + "yallist": "^3.0.2" } }, - "node_modules/is-binary-path": { - "version": "2.1.0", + "node_modules/make-dir": { + "version": "3.1.0", "dev": true, "license": "MIT", "dependencies": { - "binary-extensions": "^2.0.0" + "semver": "^6.0.0" }, "engines": { "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/is-buffer": { - "version": "1.1.6", + "node_modules/make-dir/node_modules/semver": { + "version": "6.3.0", "dev": true, - "license": "MIT" + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } }, - "node_modules/is-core-module": { - "version": "2.13.1", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.1.tgz", - "integrity": "sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==", + "node_modules/md5.js": { + "version": "1.3.5", "dev": true, + "license": "MIT", "dependencies": { - "hasown": "^2.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "hash-base": "^3.0.0", + "inherits": "^2.0.1", + "safe-buffer": "^5.1.2" } }, - "node_modules/is-extglob": { - "version": "2.1.1", + "node_modules/media-typer": { + "version": "0.3.0", "dev": true, "license": "MIT", "engines": { - "node": ">=0.10.0" + "node": ">= 0.6" } }, - "node_modules/is-glob": { - "version": "4.0.3", + "node_modules/miller-rabin": { + "version": "4.0.1", "dev": true, "license": "MIT", "dependencies": { - "is-extglob": "^2.1.1" + "bn.js": "^4.0.0", + "brorand": "^1.0.1" }, - "engines": { - "node": ">=0.10.0" + "bin": { + "miller-rabin": "bin/miller-rabin" } }, - "node_modules/is-number": { - "version": "7.0.0", + "node_modules/mime": { + "version": "2.6.0", "dev": true, "license": "MIT", + "bin": { + "mime": "cli.js" + }, "engines": { - "node": ">=0.12.0" + "node": ">=4.0.0" } }, - "node_modules/is-path-inside": { - "version": "3.0.3", + "node_modules/mime-db": { + "version": "1.52.0", "dev": true, "license": "MIT", "engines": { - "node": ">=8" + "node": ">= 0.6" } }, - "node_modules/is-plain-obj": { - "version": "2.1.0", + "node_modules/mime-types": { + "version": "2.1.35", "dev": true, "license": "MIT", + "dependencies": { + "mime-db": "1.52.0" + }, "engines": { - "node": ">=8" + "node": ">= 0.6" } }, - "node_modules/is-stream": { - "version": "2.0.1", + "node_modules/minimalistic-assert": { + "version": "1.0.1", "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } + "license": "ISC" }, - "node_modules/is-typedarray": { - "version": "1.0.0", + "node_modules/minimalistic-crypto-utils": { + "version": "1.0.1", "dev": true, "license": "MIT" }, - "node_modules/is-unicode-supported": { - "version": "0.1.0", + "node_modules/minimatch": { + "version": "3.0.8", "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "engines": { + "node": "*" } }, - "node_modules/is-windows": { - "version": "1.0.2", + "node_modules/minimist": { + "version": "1.2.8", "dev": true, "license": "MIT", - "engines": { - "node": ">=0.10.0" + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/is-wsl": { - "version": "2.1.0", + "node_modules/mkdirp": { + "version": "0.5.6", "dev": true, "license": "MIT", - "engines": { - "node": ">=8" + "dependencies": { + "minimist": "^1.2.6" + }, + "bin": { + "mkdirp": "bin/cmd.js" } }, - "node_modules/isarray": { - "version": "1.0.0", + "node_modules/mkdirp-classic": { + "version": "0.5.3", "dev": true, "license": "MIT" }, - "node_modules/isbinaryfile": { - "version": "4.0.10", + "node_modules/mocha": { + "version": "10.1.0", "dev": true, "license": "MIT", + "dependencies": { + "ansi-colors": "4.1.1", + "browser-stdout": "1.3.1", + "chokidar": "3.5.3", + "debug": "4.3.4", + "diff": "5.0.0", + "escape-string-regexp": "4.0.0", + "find-up": "5.0.0", + "glob": "7.2.0", + "he": "1.2.0", + "js-yaml": "4.1.0", + "log-symbols": "4.1.0", + "minimatch": "5.0.1", + "ms": "2.1.3", + "nanoid": "3.3.3", + "serialize-javascript": "6.0.0", + "strip-json-comments": "3.1.1", + "supports-color": "8.1.1", + "workerpool": "6.2.1", + "yargs": "16.2.0", + "yargs-parser": "20.2.4", + "yargs-unparser": "2.0.0" + }, + "bin": { + "_mocha": "bin/_mocha", + "mocha": "bin/mocha.js" + }, "engines": { - "node": ">= 8.0.0" + "node": ">= 14.0.0" }, "funding": { - "url": "https://github.com/sponsors/gjtorikian/" + "type": "opencollective", + "url": "https://opencollective.com/mochajs" } }, - "node_modules/isexe": { - "version": "2.0.0", - "dev": true, - "license": "ISC" - }, - "node_modules/istanbul-lib-coverage": { - "version": "3.2.0", + "node_modules/mocha/node_modules/ansi-colors": { + "version": "4.1.1", "dev": true, - "license": "BSD-3-Clause", + "license": "MIT", "engines": { - "node": ">=8" + "node": ">=6" } }, - "node_modules/istanbul-lib-hook": { - "version": "3.0.0", + "node_modules/mocha/node_modules/ansi-styles": { + "version": "4.3.0", "dev": true, - "license": "BSD-3-Clause", + "license": "MIT", "dependencies": { - "append-transform": "^2.0.0" + "color-convert": "^2.0.1" }, "engines": { "node": ">=8" - } - }, - "node_modules/istanbul-lib-instrument": { - "version": "4.0.3", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "@babel/core": "^7.7.5", - "@istanbuljs/schema": "^0.1.2", - "istanbul-lib-coverage": "^3.0.0", - "semver": "^6.3.0" }, - "engines": { - "node": ">=8" + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/istanbul-lib-instrument/node_modules/semver": { - "version": "6.3.0", + "node_modules/mocha/node_modules/argparse": { + "version": "2.0.1", "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - } + "license": "Python-2.0" }, - "node_modules/istanbul-lib-processinfo": { - "version": "2.0.3", + "node_modules/mocha/node_modules/brace-expansion": { + "version": "2.0.1", "dev": true, - "license": "ISC", + "license": "MIT", "dependencies": { - "archy": "^1.0.0", - "cross-spawn": "^7.0.3", - "istanbul-lib-coverage": "^3.2.0", - "p-map": "^3.0.0", - "rimraf": "^3.0.0", - "uuid": "^8.3.2" - }, - "engines": { - "node": ">=8" + "balanced-match": "^1.0.0" } }, - "node_modules/istanbul-lib-report": { - "version": "3.0.0", + "node_modules/mocha/node_modules/chalk": { + "version": "4.1.2", "dev": true, - "license": "BSD-3-Clause", + "license": "MIT", "dependencies": { - "istanbul-lib-coverage": "^3.0.0", - "make-dir": "^3.0.0", + "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" }, "engines": { - "node": ">=8" - } - }, - "node_modules/istanbul-lib-report/node_modules/has-flag": { - "version": "4.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/istanbul-lib-report/node_modules/supports-color": { + "node_modules/mocha/node_modules/chalk/node_modules/supports-color": { "version": "7.2.0", "dev": true, "license": "MIT", @@ -4761,4056 +3867,2162 @@ "node": ">=8" } }, - "node_modules/istanbul-lib-source-maps": { - "version": "4.0.1", + "node_modules/mocha/node_modules/color-convert": { + "version": "2.0.1", "dev": true, - "license": "BSD-3-Clause", + "license": "MIT", "dependencies": { - "debug": "^4.1.1", - "istanbul-lib-coverage": "^3.0.0", - "source-map": "^0.6.1" + "color-name": "~1.1.4" }, "engines": { - "node": ">=10" - } - }, - "node_modules/istanbul-lib-source-maps/node_modules/source-map": { - "version": "0.6.1", - "dev": true, - "license": "BSD-3-Clause", - "engines": { - "node": ">=0.10.0" + "node": ">=7.0.0" } }, - "node_modules/istanbul-reports": { - "version": "3.1.5", + "node_modules/mocha/node_modules/color-name": { + "version": "1.1.4", "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "html-escaper": "^2.0.0", - "istanbul-lib-report": "^3.0.0" - }, - "engines": { - "node": ">=8" - } + "license": "MIT" }, - "node_modules/js-sdsl": { - "version": "4.3.0", + "node_modules/mocha/node_modules/escape-string-regexp": { + "version": "4.0.0", "dev": true, "license": "MIT", + "engines": { + "node": ">=10" + }, "funding": { - "type": "opencollective", - "url": "https://opencollective.com/js-sdsl" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/js-tokens": { + "node_modules/mocha/node_modules/has-flag": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", - "dev": true - }, - "node_modules/js-yaml": { - "version": "3.13.1", "dev": true, "license": "MIT", - "dependencies": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, - "node_modules/jsesc": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", - "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", - "dev": true, - "bin": { - "jsesc": "bin/jsesc" - }, "engines": { - "node": ">=4" + "node": ">=8" } }, - "node_modules/jshint": { - "version": "2.13.5", + "node_modules/mocha/node_modules/js-yaml": { + "version": "4.1.0", "dev": true, "license": "MIT", "dependencies": { - "cli": "~1.0.0", - "console-browserify": "1.1.x", - "exit": "0.1.x", - "htmlparser2": "3.8.x", - "lodash": "~4.17.21", - "minimatch": "~3.0.2", - "strip-json-comments": "1.0.x" + "argparse": "^2.0.1" }, "bin": { - "jshint": "bin/jshint" + "js-yaml": "bin/js-yaml.js" } }, - "node_modules/jshint-stylish": { - "version": "2.2.1", + "node_modules/mocha/node_modules/log-symbols": { + "version": "4.1.0", "dev": true, "license": "MIT", "dependencies": { - "beeper": "^1.1.0", - "chalk": "^1.0.0", - "log-symbols": "^1.0.0", - "plur": "^2.1.0", - "string-length": "^1.0.0", - "text-table": "^0.2.0" + "chalk": "^4.1.0", + "is-unicode-supported": "^0.1.0" }, "engines": { - "node": ">=0.10.0" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/jshint-stylish/node_modules/ansi-regex": { - "version": "2.1.1", + "node_modules/mocha/node_modules/minimatch": { + "version": "5.0.1", "dev": true, - "license": "MIT", + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, "engines": { - "node": ">=0.10.0" + "node": ">=10" } }, - "node_modules/jshint-stylish/node_modules/ansi-styles": { - "version": "2.2.1", + "node_modules/mocha/node_modules/ms": { + "version": "2.1.3", "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } + "license": "MIT" }, - "node_modules/jshint-stylish/node_modules/chalk": { - "version": "1.1.3", + "node_modules/mocha/node_modules/supports-color": { + "version": "8.1.1", "dev": true, "license": "MIT", "dependencies": { - "ansi-styles": "^2.2.1", - "escape-string-regexp": "^1.0.2", - "has-ansi": "^2.0.0", - "strip-ansi": "^3.0.0", - "supports-color": "^2.0.0" + "has-flag": "^4.0.0" }, "engines": { - "node": ">=0.10.0" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" } }, - "node_modules/jshint-stylish/node_modules/strip-ansi": { - "version": "3.0.1", + "node_modules/module-deps": { + "version": "6.2.1", "dev": true, "license": "MIT", "dependencies": { - "ansi-regex": "^2.0.0" + "browser-resolve": "^1.7.0", + "cached-path-relative": "^1.0.2", + "concat-stream": "~1.6.0", + "defined": "^1.0.0", + "detective": "^5.0.2", + "duplexer2": "^0.1.2", + "inherits": "^2.0.1", + "JSONStream": "^1.0.3", + "parents": "^1.0.0", + "readable-stream": "^2.0.2", + "resolve": "^1.4.0", + "stream-combiner2": "^1.1.1", + "subarg": "^1.0.0", + "through2": "^2.0.0", + "xtend": "^4.0.0" + }, + "bin": { + "module-deps": "bin/cmd.js" }, "engines": { - "node": ">=0.10.0" + "node": ">= 0.8.0" } }, - "node_modules/jshint-stylish/node_modules/supports-color": { - "version": "2.0.0", + "node_modules/ms": { + "version": "2.1.2", "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.8.0" - } + "license": "MIT" }, - "node_modules/jshint/node_modules/strip-json-comments": { - "version": "1.0.4", + "node_modules/nanoid": { + "version": "3.3.3", "dev": true, "license": "MIT", "bin": { - "strip-json-comments": "cli.js" + "nanoid": "bin/nanoid.cjs" }, "engines": { - "node": ">=0.8.0" + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" } }, - "node_modules/json-schema-traverse": { - "version": "0.4.1", + "node_modules/natural-compare": { + "version": "1.4.0", "dev": true, "license": "MIT" }, - "node_modules/json-stable-stringify": { - "version": "0.0.1", + "node_modules/negotiator": { + "version": "0.6.3", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/node-preload": { + "version": "0.2.1", "dev": true, "license": "MIT", "dependencies": { - "jsonify": "~0.0.0" + "process-on-spawn": "^1.0.0" + }, + "engines": { + "node": ">=8" } }, - "node_modules/json-stable-stringify-without-jsonify": { - "version": "1.0.1", + "node_modules/node-releases": { + "version": "2.0.10", "dev": true, "license": "MIT" }, - "node_modules/json5": { - "version": "2.2.3", + "node_modules/normalize-path": { + "version": "3.0.0", "dev": true, "license": "MIT", - "bin": { - "json5": "lib/cli.js" - }, "engines": { - "node": ">=6" + "node": ">=0.10.0" } }, - "node_modules/jsonfile": { - "version": "4.0.0", + "node_modules/nyc": { + "version": "15.1.0", "dev": true, - "license": "MIT", - "optionalDependencies": { - "graceful-fs": "^4.1.6" - } - }, - "node_modules/jsonify": { - "version": "0.0.0", - "dev": true, - "license": "Public Domain" - }, - "node_modules/jsonparse": { - "version": "1.3.1", - "dev": true, - "engines": [ - "node >= 0.2.0" - ], - "license": "MIT" - }, - "node_modules/JSONStream": { - "version": "1.3.5", - "dev": true, - "license": "(MIT OR Apache-2.0)", + "license": "ISC", "dependencies": { - "jsonparse": "^1.2.0", - "through": ">=2.2.7 <3" + "@istanbuljs/load-nyc-config": "^1.0.0", + "@istanbuljs/schema": "^0.1.2", + "caching-transform": "^4.0.0", + "convert-source-map": "^1.7.0", + "decamelize": "^1.2.0", + "find-cache-dir": "^3.2.0", + "find-up": "^4.1.0", + "foreground-child": "^2.0.0", + "get-package-type": "^0.1.0", + "glob": "^7.1.6", + "istanbul-lib-coverage": "^3.0.0", + "istanbul-lib-hook": "^3.0.0", + "istanbul-lib-instrument": "^4.0.0", + "istanbul-lib-processinfo": "^2.0.2", + "istanbul-lib-report": "^3.0.0", + "istanbul-lib-source-maps": "^4.0.0", + "istanbul-reports": "^3.0.2", + "make-dir": "^3.0.0", + "node-preload": "^0.2.1", + "p-map": "^3.0.0", + "process-on-spawn": "^1.0.0", + "resolve-from": "^5.0.0", + "rimraf": "^3.0.0", + "signal-exit": "^3.0.2", + "spawn-wrap": "^2.0.0", + "test-exclude": "^6.0.0", + "yargs": "^15.0.2" }, "bin": { - "JSONStream": "bin.js" + "nyc": "bin/nyc.js" }, "engines": { - "node": "*" + "node": ">=8.9" } }, - "node_modules/karma": { - "version": "6.4.1", + "node_modules/nyc/node_modules/ansi-styles": { + "version": "4.3.0", "dev": true, "license": "MIT", "dependencies": { - "@colors/colors": "1.5.0", - "body-parser": "^1.19.0", - "braces": "^3.0.2", - "chokidar": "^3.5.1", - "connect": "^3.7.0", - "di": "^0.0.1", - "dom-serialize": "^2.2.1", - "glob": "^7.1.7", - "graceful-fs": "^4.2.6", - "http-proxy": "^1.18.1", - "isbinaryfile": "^4.0.8", - "lodash": "^4.17.21", - "log4js": "^6.4.1", - "mime": "^2.5.2", - "minimatch": "^3.0.4", - "mkdirp": "^0.5.5", - "qjobs": "^1.2.0", - "range-parser": "^1.2.1", - "rimraf": "^3.0.2", - "socket.io": "^4.4.1", - "source-map": "^0.6.1", - "tmp": "^0.2.1", - "ua-parser-js": "^0.7.30", - "yargs": "^16.1.1" - }, - "bin": { - "karma": "bin/karma" + "color-convert": "^2.0.1" }, "engines": { - "node": ">= 10" + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/karma-chrome-launcher": { - "version": "3.1.0", + "node_modules/nyc/node_modules/camelcase": { + "version": "5.3.1", "dev": true, "license": "MIT", - "dependencies": { - "which": "^1.2.1" + "engines": { + "node": ">=6" } }, - "node_modules/karma-firefox-launcher": { - "version": "1.3.0", + "node_modules/nyc/node_modules/cliui": { + "version": "6.0.0", "dev": true, - "license": "MIT", + "license": "ISC", "dependencies": { - "is-wsl": "^2.1.0" + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^6.2.0" } }, - "node_modules/karma-mocha": { + "node_modules/nyc/node_modules/color-convert": { "version": "2.0.1", "dev": true, "license": "MIT", "dependencies": { - "minimist": "^1.2.3" + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" } }, - "node_modules/karma-requirejs": { - "version": "1.1.0", + "node_modules/nyc/node_modules/color-name": { + "version": "1.1.4", "dev": true, - "license": "MIT", - "peerDependencies": { - "karma": ">=0.9", - "requirejs": "^2.1.0" - } + "license": "MIT" }, - "node_modules/karma-safari-launcher": { - "version": "1.0.0", + "node_modules/nyc/node_modules/convert-source-map": { + "version": "1.9.0", "dev": true, - "license": "MIT", - "peerDependencies": { - "karma": ">=0.9" - } + "license": "MIT" }, - "node_modules/karma/node_modules/glob": { - "version": "7.2.3", + "node_modules/nyc/node_modules/decamelize": { + "version": "1.2.0", "dev": true, - "license": "ISC", - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, + "license": "MIT", "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" + "node": ">=0.10.0" } }, - "node_modules/karma/node_modules/minimatch": { - "version": "3.1.2", + "node_modules/nyc/node_modules/find-up": { + "version": "4.1.0", "dev": true, - "license": "ISC", + "license": "MIT", "dependencies": { - "brace-expansion": "^1.1.7" + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" }, "engines": { - "node": "*" - } - }, - "node_modules/karma/node_modules/source-map": { - "version": "0.6.1", - "dev": true, - "license": "BSD-3-Clause", - "engines": { - "node": ">=0.10.0" + "node": ">=8" } }, - "node_modules/labeled-stream-splicer": { - "version": "2.0.2", + "node_modules/nyc/node_modules/locate-path": { + "version": "5.0.0", "dev": true, "license": "MIT", "dependencies": { - "inherits": "^2.0.1", - "stream-splicer": "^2.0.0" + "p-locate": "^4.1.0" + }, + "engines": { + "node": ">=8" } }, - "node_modules/locate-path": { - "version": "6.0.0", + "node_modules/nyc/node_modules/p-limit": { + "version": "2.3.0", "dev": true, "license": "MIT", "dependencies": { - "p-locate": "^5.0.0" + "p-try": "^2.0.0" }, "engines": { - "node": ">=10" + "node": ">=6" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/lodash": { - "version": "4.17.21", - "dev": true, - "license": "MIT" - }, - "node_modules/lodash.debounce": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", - "integrity": "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==", - "dev": true - }, - "node_modules/lodash.flattendeep": { - "version": "4.4.0", - "dev": true, - "license": "MIT" - }, - "node_modules/lodash.memoize": { - "version": "3.0.4", - "dev": true, - "license": "MIT" - }, - "node_modules/lodash.merge": { - "version": "4.6.2", - "dev": true, - "license": "MIT" - }, - "node_modules/log-symbols": { - "version": "1.0.2", + "node_modules/nyc/node_modules/p-locate": { + "version": "4.1.0", "dev": true, "license": "MIT", "dependencies": { - "chalk": "^1.0.0" + "p-limit": "^2.2.0" }, "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/log-symbols/node_modules/ansi-regex": { - "version": "2.1.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" + "node": ">=8" } }, - "node_modules/log-symbols/node_modules/ansi-styles": { - "version": "2.2.1", + "node_modules/nyc/node_modules/resolve-from": { + "version": "5.0.0", "dev": true, "license": "MIT", "engines": { - "node": ">=0.10.0" + "node": ">=8" } }, - "node_modules/log-symbols/node_modules/chalk": { - "version": "1.1.3", + "node_modules/nyc/node_modules/wrap-ansi": { + "version": "6.2.0", "dev": true, "license": "MIT", "dependencies": { - "ansi-styles": "^2.2.1", - "escape-string-regexp": "^1.0.2", - "has-ansi": "^2.0.0", - "strip-ansi": "^3.0.0", - "supports-color": "^2.0.0" + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" }, "engines": { - "node": ">=0.10.0" + "node": ">=8" } }, - "node_modules/log-symbols/node_modules/strip-ansi": { - "version": "3.0.1", + "node_modules/nyc/node_modules/y18n": { + "version": "4.0.3", "dev": true, - "license": "MIT", - "dependencies": { - "ansi-regex": "^2.0.0" - }, - "engines": { - "node": ">=0.10.0" - } + "license": "ISC" }, - "node_modules/log-symbols/node_modules/supports-color": { - "version": "2.0.0", + "node_modules/nyc/node_modules/yargs": { + "version": "15.4.1", "dev": true, "license": "MIT", + "dependencies": { + "cliui": "^6.0.0", + "decamelize": "^1.2.0", + "find-up": "^4.1.0", + "get-caller-file": "^2.0.1", + "require-directory": "^2.1.1", + "require-main-filename": "^2.0.0", + "set-blocking": "^2.0.0", + "string-width": "^4.2.0", + "which-module": "^2.0.0", + "y18n": "^4.0.0", + "yargs-parser": "^18.1.2" + }, "engines": { - "node": ">=0.8.0" + "node": ">=8" } }, - "node_modules/log4js": { - "version": "6.8.0", + "node_modules/nyc/node_modules/yargs-parser": { + "version": "18.1.3", "dev": true, - "license": "Apache-2.0", + "license": "ISC", "dependencies": { - "date-format": "^4.0.14", - "debug": "^4.3.4", - "flatted": "^3.2.7", - "rfdc": "^1.3.0", - "streamroller": "^3.1.5" + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" }, "engines": { - "node": ">=8.0" + "node": ">=6" } }, - "node_modules/loupe": { - "version": "2.3.6", + "node_modules/object-assign": { + "version": "4.1.1", "dev": true, "license": "MIT", - "dependencies": { - "get-func-name": "^2.0.0" + "engines": { + "node": ">=0.10.0" } }, - "node_modules/lru-cache": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", - "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "node_modules/object-inspect": { + "version": "1.12.3", "dev": true, - "dependencies": { - "yallist": "^3.0.2" + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/make-dir": { - "version": "3.1.0", + "node_modules/on-finished": { + "version": "2.3.0", "dev": true, "license": "MIT", "dependencies": { - "semver": "^6.0.0" + "ee-first": "1.1.1" }, "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">= 0.8" } }, - "node_modules/make-dir/node_modules/semver": { - "version": "6.3.0", + "node_modules/once": { + "version": "1.4.0", "dev": true, "license": "ISC", - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/md5.js": { - "version": "1.3.5", - "dev": true, - "license": "MIT", "dependencies": { - "hash-base": "^3.0.0", - "inherits": "^2.0.1", - "safe-buffer": "^5.1.2" + "wrappy": "1" } }, - "node_modules/media-typer": { + "node_modules/os-browserify": { "version": "0.3.0", "dev": true, + "license": "MIT" + }, + "node_modules/p-limit": { + "version": "3.1.0", + "dev": true, "license": "MIT", + "dependencies": { + "yocto-queue": "^0.1.0" + }, "engines": { - "node": ">= 0.6" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/miller-rabin": { - "version": "4.0.1", + "node_modules/p-locate": { + "version": "5.0.0", "dev": true, "license": "MIT", "dependencies": { - "bn.js": "^4.0.0", - "brorand": "^1.0.1" + "p-limit": "^3.0.2" }, - "bin": { - "miller-rabin": "bin/miller-rabin" + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/mime": { - "version": "2.6.0", + "node_modules/p-map": { + "version": "3.0.0", "dev": true, "license": "MIT", - "bin": { - "mime": "cli.js" + "dependencies": { + "aggregate-error": "^3.0.0" }, "engines": { - "node": ">=4.0.0" + "node": ">=8" } }, - "node_modules/mime-db": { - "version": "1.52.0", + "node_modules/p-try": { + "version": "2.2.0", "dev": true, "license": "MIT", "engines": { - "node": ">= 0.6" + "node": ">=6" } }, - "node_modules/mime-types": { - "version": "2.1.35", + "node_modules/package-hash": { + "version": "4.0.0", "dev": true, - "license": "MIT", + "license": "ISC", "dependencies": { - "mime-db": "1.52.0" + "graceful-fs": "^4.1.15", + "hasha": "^5.0.0", + "lodash.flattendeep": "^4.4.0", + "release-zalgo": "^1.0.0" }, "engines": { - "node": ">= 0.6" + "node": ">=8" } }, - "node_modules/minimalistic-assert": { - "version": "1.0.1", + "node_modules/pako": { + "version": "1.0.10", "dev": true, - "license": "ISC" + "license": "(MIT AND Zlib)" }, - "node_modules/minimalistic-crypto-utils": { + "node_modules/parent-module": { "version": "1.0.1", "dev": true, - "license": "MIT" - }, - "node_modules/minimatch": { - "version": "3.0.8", - "dev": true, - "license": "ISC", + "license": "MIT", "dependencies": { - "brace-expansion": "^1.1.7" + "callsites": "^3.0.0" }, "engines": { - "node": "*" + "node": ">=6" } }, - "node_modules/minimist": { - "version": "1.2.8", + "node_modules/parents": { + "version": "1.0.1", "dev": true, "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/ljharb" + "dependencies": { + "path-platform": "~0.11.15" } }, - "node_modules/mkdirp": { - "version": "0.5.6", + "node_modules/parse-asn1": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.6.tgz", + "integrity": "sha512-RnZRo1EPU6JBnra2vGHj0yhp6ebyjBZpmUCLHWiFhxlzvBCCpAuZ7elsBp1PVAbQN0/04VD/19rfzlBSwLstMw==", "dev": true, - "license": "MIT", "dependencies": { - "minimist": "^1.2.6" - }, - "bin": { - "mkdirp": "bin/cmd.js" + "asn1.js": "^5.2.0", + "browserify-aes": "^1.0.0", + "evp_bytestokey": "^1.0.0", + "pbkdf2": "^3.0.3", + "safe-buffer": "^5.1.1" } }, - "node_modules/mkdirp-classic": { - "version": "0.5.3", + "node_modules/parseurl": { + "version": "1.3.3", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/path-browserify": { + "version": "0.0.1", "dev": true, "license": "MIT" }, - "node_modules/mocha": { - "version": "10.1.0", + "node_modules/path-exists": { + "version": "4.0.0", "dev": true, "license": "MIT", - "dependencies": { - "ansi-colors": "4.1.1", - "browser-stdout": "1.3.1", - "chokidar": "3.5.3", - "debug": "4.3.4", - "diff": "5.0.0", - "escape-string-regexp": "4.0.0", - "find-up": "5.0.0", - "glob": "7.2.0", - "he": "1.2.0", - "js-yaml": "4.1.0", - "log-symbols": "4.1.0", - "minimatch": "5.0.1", - "ms": "2.1.3", - "nanoid": "3.3.3", - "serialize-javascript": "6.0.0", - "strip-json-comments": "3.1.1", - "supports-color": "8.1.1", - "workerpool": "6.2.1", - "yargs": "16.2.0", - "yargs-parser": "20.2.4", - "yargs-unparser": "2.0.0" - }, - "bin": { - "_mocha": "bin/_mocha", - "mocha": "bin/mocha.js" - }, "engines": { - "node": ">= 14.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/mochajs" + "node": ">=8" } }, - "node_modules/mocha/node_modules/ansi-colors": { - "version": "4.1.1", + "node_modules/path-is-absolute": { + "version": "1.0.1", "dev": true, "license": "MIT", "engines": { - "node": ">=6" + "node": ">=0.10.0" } }, - "node_modules/mocha/node_modules/ansi-styles": { - "version": "4.3.0", + "node_modules/path-key": { + "version": "3.1.1", "dev": true, "license": "MIT", - "dependencies": { - "color-convert": "^2.0.1" - }, "engines": { "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/mocha/node_modules/argparse": { - "version": "2.0.1", + "node_modules/path-parse": { + "version": "1.0.7", "dev": true, - "license": "Python-2.0" - }, - "node_modules/mocha/node_modules/brace-expansion": { - "version": "2.0.1", - "dev": true, - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0" - } + "license": "MIT" }, - "node_modules/mocha/node_modules/chalk": { - "version": "4.1.2", + "node_modules/path-platform": { + "version": "0.11.15", "dev": true, "license": "MIT", - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" + "node": ">= 0.8.0" } }, - "node_modules/mocha/node_modules/chalk/node_modules/supports-color": { - "version": "7.2.0", + "node_modules/pathval": { + "version": "1.1.1", "dev": true, "license": "MIT", - "dependencies": { - "has-flag": "^4.0.0" - }, "engines": { - "node": ">=8" + "node": "*" } }, - "node_modules/mocha/node_modules/color-convert": { - "version": "2.0.1", + "node_modules/pbkdf2": { + "version": "3.0.17", "dev": true, "license": "MIT", "dependencies": { - "color-name": "~1.1.4" + "create-hash": "^1.1.2", + "create-hmac": "^1.1.4", + "ripemd160": "^2.0.1", + "safe-buffer": "^5.0.1", + "sha.js": "^2.4.8" }, "engines": { - "node": ">=7.0.0" + "node": ">=0.12" } }, - "node_modules/mocha/node_modules/color-name": { - "version": "1.1.4", + "node_modules/picocolors": { + "version": "1.0.0", "dev": true, - "license": "MIT" + "license": "ISC" }, - "node_modules/mocha/node_modules/escape-string-regexp": { - "version": "4.0.0", + "node_modules/picomatch": { + "version": "2.3.1", "dev": true, "license": "MIT", "engines": { - "node": ">=10" + "node": ">=8.6" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/mocha/node_modules/has-flag": { - "version": "4.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" + "url": "https://github.com/sponsors/jonschlinkert" } }, - "node_modules/mocha/node_modules/js-yaml": { - "version": "4.1.0", + "node_modules/pkg-dir": { + "version": "4.2.0", "dev": true, "license": "MIT", "dependencies": { - "argparse": "^2.0.1" + "find-up": "^4.0.0" }, - "bin": { - "js-yaml": "bin/js-yaml.js" + "engines": { + "node": ">=8" } }, - "node_modules/mocha/node_modules/log-symbols": { + "node_modules/pkg-dir/node_modules/find-up": { "version": "4.1.0", "dev": true, "license": "MIT", "dependencies": { - "chalk": "^4.1.0", - "is-unicode-supported": "^0.1.0" + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" }, "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=8" } }, - "node_modules/mocha/node_modules/minimatch": { - "version": "5.0.1", + "node_modules/pkg-dir/node_modules/locate-path": { + "version": "5.0.0", "dev": true, - "license": "ISC", + "license": "MIT", "dependencies": { - "brace-expansion": "^2.0.1" + "p-locate": "^4.1.0" }, "engines": { - "node": ">=10" + "node": ">=8" } }, - "node_modules/mocha/node_modules/ms": { - "version": "2.1.3", - "dev": true, - "license": "MIT" - }, - "node_modules/mocha/node_modules/supports-color": { - "version": "8.1.1", + "node_modules/pkg-dir/node_modules/p-limit": { + "version": "2.3.0", "dev": true, "license": "MIT", "dependencies": { - "has-flag": "^4.0.0" + "p-try": "^2.0.0" }, "engines": { - "node": ">=10" + "node": ">=6" }, "funding": { - "url": "https://github.com/chalk/supports-color?sponsor=1" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/module-deps": { - "version": "6.2.1", + "node_modules/pkg-dir/node_modules/p-locate": { + "version": "4.1.0", "dev": true, "license": "MIT", "dependencies": { - "browser-resolve": "^1.7.0", - "cached-path-relative": "^1.0.2", - "concat-stream": "~1.6.0", - "defined": "^1.0.0", - "detective": "^5.0.2", - "duplexer2": "^0.1.2", - "inherits": "^2.0.1", - "JSONStream": "^1.0.3", - "parents": "^1.0.0", - "readable-stream": "^2.0.2", - "resolve": "^1.4.0", - "stream-combiner2": "^1.1.1", - "subarg": "^1.0.0", - "through2": "^2.0.0", - "xtend": "^4.0.0" - }, - "bin": { - "module-deps": "bin/cmd.js" + "p-limit": "^2.2.0" }, "engines": { - "node": ">= 0.8.0" + "node": ">=8" } }, - "node_modules/ms": { - "version": "2.1.2", + "node_modules/platform": { + "version": "1.3.5", "dev": true, "license": "MIT" }, - "node_modules/nanoid": { - "version": "3.3.3", + "node_modules/plur": { + "version": "2.1.2", "dev": true, "license": "MIT", - "bin": { - "nanoid": "bin/nanoid.cjs" + "dependencies": { + "irregular-plurals": "^1.0.0" }, "engines": { - "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + "node": ">=0.10.0" } }, - "node_modules/natural-compare": { - "version": "1.4.0", - "dev": true, - "license": "MIT" - }, - "node_modules/negotiator": { - "version": "0.6.3", + "node_modules/process": { + "version": "0.11.10", "dev": true, "license": "MIT", "engines": { - "node": ">= 0.6" + "node": ">= 0.6.0" } }, - "node_modules/node-preload": { - "version": "0.2.1", + "node_modules/process-nextick-args": { + "version": "2.0.1", + "dev": true, + "license": "MIT" + }, + "node_modules/process-on-spawn": { + "version": "1.0.0", "dev": true, "license": "MIT", "dependencies": { - "process-on-spawn": "^1.0.0" + "fromentries": "^1.2.0" }, "engines": { "node": ">=8" } }, - "node_modules/node-releases": { - "version": "2.0.14", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.14.tgz", - "integrity": "sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==", - "dev": true - }, - "node_modules/normalize-path": { - "version": "3.0.0", + "node_modules/public-encrypt": { + "version": "4.0.3", "dev": true, "license": "MIT", - "engines": { - "node": ">=0.10.0" + "dependencies": { + "bn.js": "^4.1.0", + "browserify-rsa": "^4.0.0", + "create-hash": "^1.1.0", + "parse-asn1": "^5.0.0", + "randombytes": "^2.0.1", + "safe-buffer": "^5.1.2" } }, - "node_modules/nyc": { - "version": "15.1.0", + "node_modules/punycode": { + "version": "1.4.1", "dev": true, - "license": "ISC", - "dependencies": { - "@istanbuljs/load-nyc-config": "^1.0.0", - "@istanbuljs/schema": "^0.1.2", - "caching-transform": "^4.0.0", - "convert-source-map": "^1.7.0", - "decamelize": "^1.2.0", - "find-cache-dir": "^3.2.0", - "find-up": "^4.1.0", - "foreground-child": "^2.0.0", - "get-package-type": "^0.1.0", - "glob": "^7.1.6", - "istanbul-lib-coverage": "^3.0.0", - "istanbul-lib-hook": "^3.0.0", - "istanbul-lib-instrument": "^4.0.0", - "istanbul-lib-processinfo": "^2.0.2", - "istanbul-lib-report": "^3.0.0", - "istanbul-lib-source-maps": "^4.0.0", - "istanbul-reports": "^3.0.2", - "make-dir": "^3.0.0", - "node-preload": "^0.2.1", - "p-map": "^3.0.0", - "process-on-spawn": "^1.0.0", - "resolve-from": "^5.0.0", - "rimraf": "^3.0.0", - "signal-exit": "^3.0.2", - "spawn-wrap": "^2.0.0", - "test-exclude": "^6.0.0", - "yargs": "^15.0.2" - }, - "bin": { - "nyc": "bin/nyc.js" - }, + "license": "MIT" + }, + "node_modules/qjobs": { + "version": "1.2.0", + "dev": true, + "license": "MIT", "engines": { - "node": ">=8.9" + "node": ">=0.9" } }, - "node_modules/nyc/node_modules/ansi-styles": { - "version": "4.3.0", + "node_modules/qs": { + "version": "6.11.0", "dev": true, - "license": "MIT", + "license": "BSD-3-Clause", "dependencies": { - "color-convert": "^2.0.1" + "side-channel": "^1.0.4" }, "engines": { - "node": ">=8" + "node": ">=0.6" }, "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/nyc/node_modules/camelcase": { - "version": "5.3.1", + "node_modules/querystring": { + "version": "0.2.0", "dev": true, - "license": "MIT", "engines": { - "node": ">=6" + "node": ">=0.4.x" } }, - "node_modules/nyc/node_modules/cliui": { - "version": "6.0.0", + "node_modules/querystring-es3": { + "version": "0.2.1", "dev": true, - "license": "ISC", - "dependencies": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", - "wrap-ansi": "^6.2.0" - } - }, - "node_modules/nyc/node_modules/color-convert": { - "version": "2.0.1", - "dev": true, - "license": "MIT", - "dependencies": { - "color-name": "~1.1.4" - }, "engines": { - "node": ">=7.0.0" + "node": ">=0.4.x" } }, - "node_modules/nyc/node_modules/color-name": { - "version": "1.1.4", + "node_modules/queue-microtask": { + "version": "1.2.3", "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], "license": "MIT" }, - "node_modules/nyc/node_modules/convert-source-map": { - "version": "1.9.0", + "node_modules/randombytes": { + "version": "2.1.0", "dev": true, - "license": "MIT" + "license": "MIT", + "dependencies": { + "safe-buffer": "^5.1.0" + } }, - "node_modules/nyc/node_modules/decamelize": { - "version": "1.2.0", + "node_modules/randomfill": { + "version": "1.0.4", "dev": true, "license": "MIT", - "engines": { - "node": ">=0.10.0" + "dependencies": { + "randombytes": "^2.0.5", + "safe-buffer": "^5.1.0" } }, - "node_modules/nyc/node_modules/find-up": { - "version": "4.1.0", + "node_modules/range-parser": { + "version": "1.2.1", "dev": true, "license": "MIT", - "dependencies": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - }, "engines": { - "node": ">=8" + "node": ">= 0.6" } }, - "node_modules/nyc/node_modules/locate-path": { - "version": "5.0.0", + "node_modules/raw-body": { + "version": "2.5.2", "dev": true, "license": "MIT", "dependencies": { - "p-locate": "^4.1.0" + "bytes": "3.1.2", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "unpipe": "1.0.0" }, "engines": { - "node": ">=8" + "node": ">= 0.8" } }, - "node_modules/nyc/node_modules/p-limit": { - "version": "2.3.0", + "node_modules/read-only-stream": { + "version": "2.0.0", "dev": true, "license": "MIT", "dependencies": { - "p-try": "^2.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "readable-stream": "^2.0.2" } }, - "node_modules/nyc/node_modules/p-locate": { - "version": "4.1.0", + "node_modules/readable-stream": { + "version": "2.3.6", "dev": true, "license": "MIT", "dependencies": { - "p-limit": "^2.2.0" - }, - "engines": { - "node": ">=8" + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" } }, - "node_modules/nyc/node_modules/resolve-from": { - "version": "5.0.0", + "node_modules/readable-stream/node_modules/safe-buffer": { + "version": "5.1.2", + "dev": true, + "license": "MIT" + }, + "node_modules/readable-stream/node_modules/string_decoder": { + "version": "1.1.1", "dev": true, "license": "MIT", - "engines": { - "node": ">=8" + "dependencies": { + "safe-buffer": "~5.1.0" } }, - "node_modules/nyc/node_modules/wrap-ansi": { - "version": "6.2.0", + "node_modules/readdirp": { + "version": "3.6.0", "dev": true, "license": "MIT", "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" + "picomatch": "^2.2.1" }, "engines": { - "node": ">=8" + "node": ">=8.10.0" } }, - "node_modules/nyc/node_modules/y18n": { - "version": "4.0.3", - "dev": true, - "license": "ISC" - }, - "node_modules/nyc/node_modules/yargs": { - "version": "15.4.1", + "node_modules/regexpp": { + "version": "3.2.0", "dev": true, "license": "MIT", - "dependencies": { - "cliui": "^6.0.0", - "decamelize": "^1.2.0", - "find-up": "^4.1.0", - "get-caller-file": "^2.0.1", - "require-directory": "^2.1.1", - "require-main-filename": "^2.0.0", - "set-blocking": "^2.0.0", - "string-width": "^4.2.0", - "which-module": "^2.0.0", - "y18n": "^4.0.0", - "yargs-parser": "^18.1.2" - }, "engines": { "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/mysticatea" } }, - "node_modules/nyc/node_modules/yargs-parser": { - "version": "18.1.3", + "node_modules/release-zalgo": { + "version": "1.0.0", "dev": true, "license": "ISC", "dependencies": { - "camelcase": "^5.0.0", - "decamelize": "^1.2.0" + "es6-error": "^4.0.1" }, "engines": { - "node": ">=6" + "node": ">=4" } }, - "node_modules/object-assign": { - "version": "4.1.1", + "node_modules/require-directory": { + "version": "2.1.1", "dev": true, "license": "MIT", "engines": { "node": ">=0.10.0" } }, - "node_modules/object-inspect": { - "version": "1.12.3", + "node_modules/require-main-filename": { + "version": "2.0.0", "dev": true, - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } + "license": "ISC" }, - "node_modules/on-finished": { - "version": "2.3.0", + "node_modules/requirejs": { + "version": "2.3.6", "dev": true, "license": "MIT", - "dependencies": { - "ee-first": "1.1.1" + "bin": { + "r_js": "bin/r.js", + "r.js": "bin/r.js" }, "engines": { - "node": ">= 0.8" - } - }, - "node_modules/once": { - "version": "1.4.0", - "dev": true, - "license": "ISC", - "dependencies": { - "wrappy": "1" + "node": ">=0.4.0" } }, - "node_modules/os-browserify": { - "version": "0.3.0", + "node_modules/requires-port": { + "version": "1.0.0", "dev": true, "license": "MIT" }, - "node_modules/p-limit": { - "version": "3.1.0", + "node_modules/resolve": { + "version": "1.12.0", "dev": true, "license": "MIT", "dependencies": { - "yocto-queue": "^0.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "path-parse": "^1.0.6" } }, - "node_modules/p-locate": { - "version": "5.0.0", + "node_modules/resolve-from": { + "version": "4.0.0", "dev": true, "license": "MIT", - "dependencies": { - "p-limit": "^3.0.2" - }, "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=4" } }, - "node_modules/p-map": { - "version": "3.0.0", + "node_modules/reusify": { + "version": "1.0.4", "dev": true, "license": "MIT", - "dependencies": { - "aggregate-error": "^3.0.0" - }, "engines": { - "node": ">=8" + "iojs": ">=1.0.0", + "node": ">=0.10.0" } }, - "node_modules/p-try": { - "version": "2.2.0", + "node_modules/rfdc": { + "version": "1.3.0", "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } + "license": "MIT" }, - "node_modules/package-hash": { - "version": "4.0.0", + "node_modules/rimraf": { + "version": "3.0.2", "dev": true, "license": "ISC", "dependencies": { - "graceful-fs": "^4.1.15", - "hasha": "^5.0.0", - "lodash.flattendeep": "^4.4.0", - "release-zalgo": "^1.0.0" + "glob": "^7.1.3" }, - "engines": { - "node": ">=8" + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/pako": { - "version": "1.0.10", - "dev": true, - "license": "(MIT AND Zlib)" - }, - "node_modules/parent-module": { - "version": "1.0.1", + "node_modules/ripemd160": { + "version": "2.0.2", "dev": true, "license": "MIT", "dependencies": { - "callsites": "^3.0.0" - }, - "engines": { - "node": ">=6" + "hash-base": "^3.0.0", + "inherits": "^2.0.1" } }, - "node_modules/parents": { - "version": "1.0.1", + "node_modules/run-parallel": { + "version": "1.2.0", "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], "license": "MIT", "dependencies": { - "path-platform": "~0.11.15" + "queue-microtask": "^1.2.2" } }, - "node_modules/parse-asn1": { - "version": "5.1.6", - "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.6.tgz", - "integrity": "sha512-RnZRo1EPU6JBnra2vGHj0yhp6ebyjBZpmUCLHWiFhxlzvBCCpAuZ7elsBp1PVAbQN0/04VD/19rfzlBSwLstMw==", + "node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", "dev": true, - "dependencies": { - "asn1.js": "^5.2.0", - "browserify-aes": "^1.0.0", - "evp_bytestokey": "^1.0.0", - "pbkdf2": "^3.0.3", - "safe-buffer": "^5.1.1" - } + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] }, - "node_modules/parseurl": { - "version": "1.3.3", + "node_modules/safer-buffer": { + "version": "2.1.2", "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.8" - } + "license": "MIT" }, - "node_modules/path-browserify": { - "version": "0.0.1", + "node_modules/seedrandom": { + "version": "3.0.5", "dev": true, "license": "MIT" }, - "node_modules/path-exists": { - "version": "4.0.0", + "node_modules/semver": { + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", "dev": true, - "license": "MIT", + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, "engines": { - "node": ">=8" + "node": ">=10" } }, - "node_modules/path-is-absolute": { - "version": "1.0.1", + "node_modules/semver/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", "dev": true, - "license": "MIT", + "dependencies": { + "yallist": "^4.0.0" + }, "engines": { - "node": ">=0.10.0" + "node": ">=10" } }, - "node_modules/path-key": { - "version": "3.1.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } + "node_modules/semver/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true }, - "node_modules/path-parse": { - "version": "1.0.7", + "node_modules/serialize-javascript": { + "version": "6.0.0", "dev": true, - "license": "MIT" + "license": "BSD-3-Clause", + "dependencies": { + "randombytes": "^2.1.0" + } }, - "node_modules/path-platform": { - "version": "0.11.15", + "node_modules/set-blocking": { + "version": "2.0.0", "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.8.0" - } + "license": "ISC" }, - "node_modules/pathval": { - "version": "1.1.1", + "node_modules/setprototypeof": { + "version": "1.2.0", "dev": true, - "license": "MIT", - "engines": { - "node": "*" - } + "license": "ISC" }, - "node_modules/pbkdf2": { - "version": "3.0.17", + "node_modules/sha.js": { + "version": "2.4.11", "dev": true, - "license": "MIT", + "license": "(MIT AND BSD-3-Clause)", "dependencies": { - "create-hash": "^1.1.2", - "create-hmac": "^1.1.4", - "ripemd160": "^2.0.1", - "safe-buffer": "^5.0.1", - "sha.js": "^2.4.8" + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" }, - "engines": { - "node": ">=0.12" + "bin": { + "sha.js": "bin.js" } }, - "node_modules/picocolors": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", - "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", - "dev": true - }, - "node_modules/picomatch": { - "version": "2.3.1", + "node_modules/shasum": { + "version": "1.0.2", "dev": true, "license": "MIT", - "engines": { - "node": ">=8.6" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/pify": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", - "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", - "dev": true, - "engines": { - "node": ">=6" + "dependencies": { + "json-stable-stringify": "~0.0.0", + "sha.js": "~2.4.4" } }, - "node_modules/pkg-dir": { - "version": "4.2.0", + "node_modules/shebang-command": { + "version": "2.0.0", "dev": true, "license": "MIT", "dependencies": { - "find-up": "^4.0.0" + "shebang-regex": "^3.0.0" }, "engines": { "node": ">=8" } }, - "node_modules/pkg-dir/node_modules/find-up": { - "version": "4.1.0", + "node_modules/shebang-regex": { + "version": "3.0.0", "dev": true, "license": "MIT", - "dependencies": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - }, "engines": { "node": ">=8" } }, - "node_modules/pkg-dir/node_modules/locate-path": { - "version": "5.0.0", + "node_modules/shell-quote": { + "version": "1.8.0", "dev": true, "license": "MIT", - "dependencies": { - "p-locate": "^4.1.0" - }, - "engines": { - "node": ">=8" + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/pkg-dir/node_modules/p-limit": { - "version": "2.3.0", + "node_modules/side-channel": { + "version": "1.0.4", "dev": true, "license": "MIT", "dependencies": { - "p-try": "^2.0.0" - }, - "engines": { - "node": ">=6" + "call-bind": "^1.0.0", + "get-intrinsic": "^1.0.2", + "object-inspect": "^1.9.0" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/pkg-dir/node_modules/p-locate": { - "version": "4.1.0", + "node_modules/signal-exit": { + "version": "3.0.7", "dev": true, - "license": "MIT", - "dependencies": { - "p-limit": "^2.2.0" - }, - "engines": { - "node": ">=8" - } + "license": "ISC" }, - "node_modules/platform": { - "version": "1.3.5", + "node_modules/simple-concat": { + "version": "1.0.0", "dev": true, "license": "MIT" }, - "node_modules/plur": { - "version": "2.1.2", + "node_modules/socket.io": { + "version": "4.6.1", "dev": true, "license": "MIT", "dependencies": { - "irregular-plurals": "^1.0.0" + "accepts": "~1.3.4", + "base64id": "~2.0.0", + "debug": "~4.3.2", + "engine.io": "~6.4.1", + "socket.io-adapter": "~2.5.2", + "socket.io-parser": "~4.2.1" }, "engines": { - "node": ">=0.10.0" + "node": ">=10.0.0" } }, - "node_modules/process": { - "version": "0.11.10", + "node_modules/socket.io-adapter": { + "version": "2.5.2", "dev": true, "license": "MIT", - "engines": { - "node": ">= 0.6.0" + "dependencies": { + "ws": "~8.11.0" } }, - "node_modules/process-nextick-args": { - "version": "2.0.1", - "dev": true, - "license": "MIT" - }, - "node_modules/process-on-spawn": { - "version": "1.0.0", + "node_modules/socket.io-parser": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-4.2.3.tgz", + "integrity": "sha512-JMafRntWVO2DCJimKsRTh/wnqVvO4hrfwOqtO7f+uzwsQMuxO6VwImtYxaQ+ieoyshWOTJyV0fA21lccEXRPpQ==", "dev": true, - "license": "MIT", "dependencies": { - "fromentries": "^1.2.0" + "@socket.io/component-emitter": "~3.1.0", + "debug": "~4.3.1" }, "engines": { - "node": ">=8" - } - }, - "node_modules/public-encrypt": { - "version": "4.0.3", - "dev": true, - "license": "MIT", - "dependencies": { - "bn.js": "^4.1.0", - "browserify-rsa": "^4.0.0", - "create-hash": "^1.1.0", - "parse-asn1": "^5.0.0", - "randombytes": "^2.0.1", - "safe-buffer": "^5.1.2" + "node": ">=10.0.0" } }, - "node_modules/punycode": { - "version": "1.4.1", - "dev": true, - "license": "MIT" - }, - "node_modules/qjobs": { - "version": "1.2.0", + "node_modules/source-map": { + "version": "0.5.7", "dev": true, - "license": "MIT", + "license": "BSD-3-Clause", "engines": { - "node": ">=0.9" + "node": ">=0.10.0" } }, - "node_modules/qs": { - "version": "6.11.0", + "node_modules/spawn-wrap": { + "version": "2.0.0", "dev": true, - "license": "BSD-3-Clause", + "license": "ISC", "dependencies": { - "side-channel": "^1.0.4" + "foreground-child": "^2.0.0", + "is-windows": "^1.0.2", + "make-dir": "^3.0.0", + "rimraf": "^3.0.0", + "signal-exit": "^3.0.2", + "which": "^2.0.1" }, "engines": { - "node": ">=0.6" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": ">=8" } }, - "node_modules/querystring": { - "version": "0.2.0", + "node_modules/spawn-wrap/node_modules/which": { + "version": "2.0.2", "dev": true, + "license": "ISC", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, "engines": { - "node": ">=0.4.x" + "node": ">= 8" } }, - "node_modules/querystring-es3": { - "version": "0.2.1", + "node_modules/sprintf": { + "version": "0.1.5", "dev": true, + "license": "BSD-3-Clause", "engines": { - "node": ">=0.4.x" - } - }, - "node_modules/queue-microtask": { - "version": "1.2.3", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT" - }, - "node_modules/randombytes": { - "version": "2.1.0", - "dev": true, - "license": "MIT", - "dependencies": { - "safe-buffer": "^5.1.0" + "node": ">=0.2.4" } }, - "node_modules/randomfill": { - "version": "1.0.4", + "node_modules/sprintf-js": { + "version": "1.0.3", "dev": true, - "license": "MIT", - "dependencies": { - "randombytes": "^2.0.5", - "safe-buffer": "^5.1.0" - } + "license": "BSD-3-Clause" }, - "node_modules/range-parser": { - "version": "1.2.1", + "node_modules/statuses": { + "version": "1.5.0", "dev": true, "license": "MIT", "engines": { "node": ">= 0.6" } }, - "node_modules/raw-body": { - "version": "2.5.2", - "dev": true, - "license": "MIT", - "dependencies": { - "bytes": "3.1.2", - "http-errors": "2.0.0", - "iconv-lite": "0.4.24", - "unpipe": "1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/read-only-stream": { - "version": "2.0.0", + "node_modules/stream-browserify": { + "version": "2.0.2", "dev": true, "license": "MIT", "dependencies": { + "inherits": "~2.0.1", "readable-stream": "^2.0.2" } }, - "node_modules/readable-stream": { - "version": "2.3.6", - "dev": true, - "license": "MIT", - "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "node_modules/readable-stream/node_modules/safe-buffer": { - "version": "5.1.2", - "dev": true, - "license": "MIT" - }, - "node_modules/readable-stream/node_modules/string_decoder": { + "node_modules/stream-combiner2": { "version": "1.1.1", "dev": true, "license": "MIT", "dependencies": { - "safe-buffer": "~5.1.0" + "duplexer2": "~0.1.0", + "readable-stream": "^2.0.2" } }, - "node_modules/readdirp": { - "version": "3.6.0", + "node_modules/stream-http": { + "version": "3.1.0", "dev": true, "license": "MIT", "dependencies": { - "picomatch": "^2.2.1" - }, - "engines": { - "node": ">=8.10.0" + "builtin-status-codes": "^3.0.0", + "inherits": "^2.0.1", + "readable-stream": "^3.0.6", + "xtend": "^4.0.0" } }, - "node_modules/regenerate": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz", - "integrity": "sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==", - "dev": true - }, - "node_modules/regenerate-unicode-properties": { - "version": "10.1.1", - "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-10.1.1.tgz", - "integrity": "sha512-X007RyZLsCJVVrjgEFVpLUTZwyOZk3oiL75ZcuYjlIWd6rNJtOjkBwQc5AsRrpbKVkxN6sklw/k/9m2jJYOf8Q==", + "node_modules/stream-http/node_modules/readable-stream": { + "version": "3.4.0", "dev": true, + "license": "MIT", "dependencies": { - "regenerate": "^1.4.2" + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" }, "engines": { - "node": ">=4" + "node": ">= 6" } }, - "node_modules/regenerator-runtime": { - "version": "0.14.1", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz", - "integrity": "sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==", - "dev": true - }, - "node_modules/regenerator-transform": { - "version": "0.15.2", - "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.15.2.tgz", - "integrity": "sha512-hfMp2BoF0qOk3uc5V20ALGDS2ddjQaLrdl7xrGXvAIow7qeWRM2VA2HuCHkUKk9slq3VwEwLNK3DFBqDfPGYtg==", + "node_modules/stream-splicer": { + "version": "2.0.1", "dev": true, + "license": "MIT", "dependencies": { - "@babel/runtime": "^7.8.4" + "inherits": "^2.0.1", + "readable-stream": "^2.0.2" } }, - "node_modules/regexpp": { - "version": "3.2.0", + "node_modules/streamroller": { + "version": "3.1.5", "dev": true, "license": "MIT", - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/mysticatea" - } - }, - "node_modules/regexpu-core": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-5.3.2.tgz", - "integrity": "sha512-RAM5FlZz+Lhmo7db9L298p2vHP5ZywrVXmVXpmAD9GuL5MPH6t9ROw1iA/wfHkQ76Qe7AaPF0nGuim96/IrQMQ==", - "dev": true, "dependencies": { - "@babel/regjsgen": "^0.8.0", - "regenerate": "^1.4.2", - "regenerate-unicode-properties": "^10.1.0", - "regjsparser": "^0.9.1", - "unicode-match-property-ecmascript": "^2.0.0", - "unicode-match-property-value-ecmascript": "^2.1.0" + "date-format": "^4.0.14", + "debug": "^4.3.4", + "fs-extra": "^8.1.0" }, "engines": { - "node": ">=4" + "node": ">=8.0" } }, - "node_modules/regjsparser": { - "version": "0.9.1", - "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.9.1.tgz", - "integrity": "sha512-dQUtn90WanSNl+7mQKcXAgZxvUe7Z0SqXlgzv0za4LwiUhyzBC58yQO3liFoUgu8GiJVInAhJjkj1N0EtQ5nkQ==", + "node_modules/string_decoder": { + "version": "1.3.0", "dev": true, + "license": "MIT", "dependencies": { - "jsesc": "~0.5.0" - }, - "bin": { - "regjsparser": "bin/parser" - } - }, - "node_modules/regjsparser/node_modules/jsesc": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", - "integrity": "sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA==", - "dev": true, - "bin": { - "jsesc": "bin/jsesc" + "safe-buffer": "~5.2.0" } }, - "node_modules/release-zalgo": { - "version": "1.0.0", + "node_modules/string-length": { + "version": "1.0.1", "dev": true, - "license": "ISC", + "license": "MIT", "dependencies": { - "es6-error": "^4.0.1" + "strip-ansi": "^3.0.0" }, - "engines": { - "node": ">=4" - } - }, - "node_modules/require-directory": { - "version": "2.1.1", - "dev": true, - "license": "MIT", "engines": { "node": ">=0.10.0" } }, - "node_modules/require-main-filename": { - "version": "2.0.0", - "dev": true, - "license": "ISC" - }, - "node_modules/requirejs": { - "version": "2.3.6", - "dev": true, - "license": "MIT", - "bin": { - "r_js": "bin/r.js", - "r.js": "bin/r.js" - }, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/requires-port": { - "version": "1.0.0", - "dev": true, - "license": "MIT" - }, - "node_modules/resolve": { - "version": "1.22.8", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", - "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==", - "dev": true, - "dependencies": { - "is-core-module": "^2.13.0", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" - }, - "bin": { - "resolve": "bin/resolve" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/resolve-from": { - "version": "4.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/reusify": { - "version": "1.0.4", - "dev": true, - "license": "MIT", - "engines": { - "iojs": ">=1.0.0", - "node": ">=0.10.0" - } - }, - "node_modules/rfdc": { - "version": "1.3.0", - "dev": true, - "license": "MIT" - }, - "node_modules/rimraf": { - "version": "3.0.2", - "dev": true, - "license": "ISC", - "dependencies": { - "glob": "^7.1.3" - }, - "bin": { - "rimraf": "bin.js" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/ripemd160": { - "version": "2.0.2", - "dev": true, - "license": "MIT", - "dependencies": { - "hash-base": "^3.0.0", - "inherits": "^2.0.1" - } - }, - "node_modules/run-parallel": { - "version": "1.2.0", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT", - "dependencies": { - "queue-microtask": "^1.2.2" - } - }, - "node_modules/safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, - "node_modules/safer-buffer": { - "version": "2.1.2", - "dev": true, - "license": "MIT" - }, - "node_modules/seedrandom": { - "version": "3.0.5", - "dev": true, - "license": "MIT" - }, - "node_modules/semver": { - "version": "7.5.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", - "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", - "dev": true, - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/semver/node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/semver/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - }, - "node_modules/serialize-javascript": { - "version": "6.0.0", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "randombytes": "^2.1.0" - } - }, - "node_modules/set-blocking": { - "version": "2.0.0", - "dev": true, - "license": "ISC" - }, - "node_modules/setprototypeof": { - "version": "1.2.0", - "dev": true, - "license": "ISC" - }, - "node_modules/sha.js": { - "version": "2.4.11", - "dev": true, - "license": "(MIT AND BSD-3-Clause)", - "dependencies": { - "inherits": "^2.0.1", - "safe-buffer": "^5.0.1" - }, - "bin": { - "sha.js": "bin.js" - } - }, - "node_modules/shasum": { - "version": "1.0.2", - "dev": true, - "license": "MIT", - "dependencies": { - "json-stable-stringify": "~0.0.0", - "sha.js": "~2.4.4" - } - }, - "node_modules/shebang-command": { - "version": "2.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "shebang-regex": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/shebang-regex": { - "version": "3.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/shell-quote": { - "version": "1.8.0", - "dev": true, - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/side-channel": { - "version": "1.0.4", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.0", - "get-intrinsic": "^1.0.2", - "object-inspect": "^1.9.0" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/signal-exit": { - "version": "3.0.7", - "dev": true, - "license": "ISC" - }, - "node_modules/simple-concat": { - "version": "1.0.0", - "dev": true, - "license": "MIT" - }, - "node_modules/slash": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-2.0.0.tgz", - "integrity": "sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/socket.io": { - "version": "4.6.1", - "dev": true, - "license": "MIT", - "dependencies": { - "accepts": "~1.3.4", - "base64id": "~2.0.0", - "debug": "~4.3.2", - "engine.io": "~6.4.1", - "socket.io-adapter": "~2.5.2", - "socket.io-parser": "~4.2.1" - }, - "engines": { - "node": ">=10.0.0" - } - }, - "node_modules/socket.io-adapter": { - "version": "2.5.2", - "dev": true, - "license": "MIT", - "dependencies": { - "ws": "~8.11.0" - } - }, - "node_modules/socket.io-parser": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-4.2.3.tgz", - "integrity": "sha512-JMafRntWVO2DCJimKsRTh/wnqVvO4hrfwOqtO7f+uzwsQMuxO6VwImtYxaQ+ieoyshWOTJyV0fA21lccEXRPpQ==", - "dev": true, - "dependencies": { - "@socket.io/component-emitter": "~3.1.0", - "debug": "~4.3.1" - }, - "engines": { - "node": ">=10.0.0" - } - }, - "node_modules/source-map": { - "version": "0.5.7", - "dev": true, - "license": "BSD-3-Clause", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/spawn-wrap": { - "version": "2.0.0", - "dev": true, - "license": "ISC", - "dependencies": { - "foreground-child": "^2.0.0", - "is-windows": "^1.0.2", - "make-dir": "^3.0.0", - "rimraf": "^3.0.0", - "signal-exit": "^3.0.2", - "which": "^2.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/spawn-wrap/node_modules/which": { - "version": "2.0.2", - "dev": true, - "license": "ISC", - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "node-which": "bin/node-which" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/sprintf": { - "version": "0.1.5", - "dev": true, - "license": "BSD-3-Clause", - "engines": { - "node": ">=0.2.4" - } - }, - "node_modules/sprintf-js": { - "version": "1.0.3", - "dev": true, - "license": "BSD-3-Clause" - }, - "node_modules/statuses": { - "version": "1.5.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/stream-browserify": { - "version": "2.0.2", - "dev": true, - "license": "MIT", - "dependencies": { - "inherits": "~2.0.1", - "readable-stream": "^2.0.2" - } - }, - "node_modules/stream-combiner2": { - "version": "1.1.1", - "dev": true, - "license": "MIT", - "dependencies": { - "duplexer2": "~0.1.0", - "readable-stream": "^2.0.2" - } - }, - "node_modules/stream-http": { - "version": "3.1.0", - "dev": true, - "license": "MIT", - "dependencies": { - "builtin-status-codes": "^3.0.0", - "inherits": "^2.0.1", - "readable-stream": "^3.0.6", - "xtend": "^4.0.0" - } - }, - "node_modules/stream-http/node_modules/readable-stream": { - "version": "3.4.0", - "dev": true, - "license": "MIT", - "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/stream-splicer": { - "version": "2.0.1", - "dev": true, - "license": "MIT", - "dependencies": { - "inherits": "^2.0.1", - "readable-stream": "^2.0.2" - } - }, - "node_modules/streamroller": { - "version": "3.1.5", - "dev": true, - "license": "MIT", - "dependencies": { - "date-format": "^4.0.14", - "debug": "^4.3.4", - "fs-extra": "^8.1.0" - }, - "engines": { - "node": ">=8.0" - } - }, - "node_modules/string_decoder": { - "version": "1.3.0", - "dev": true, - "license": "MIT", - "dependencies": { - "safe-buffer": "~5.2.0" - } - }, - "node_modules/string-length": { - "version": "1.0.1", - "dev": true, - "license": "MIT", - "dependencies": { - "strip-ansi": "^3.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/string-length/node_modules/ansi-regex": { - "version": "2.1.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/string-length/node_modules/strip-ansi": { - "version": "3.0.1", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-regex": "^2.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/string-width": { - "version": "4.2.3", - "dev": true, - "license": "MIT", - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/string-width/node_modules/emoji-regex": { - "version": "8.0.0", - "dev": true, - "license": "MIT" - }, - "node_modules/string-width/node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/strip-ansi": { - "version": "6.0.1", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/strip-bom": { - "version": "4.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/strip-json-comments": { - "version": "3.1.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/subarg": { - "version": "1.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "minimist": "^1.1.0" - } - }, - "node_modules/supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/supports-preserve-symlinks-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", - "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", - "dev": true, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/syntax-error": { - "version": "1.4.0", - "dev": true, - "license": "MIT", - "dependencies": { - "acorn-node": "^1.2.0" - } - }, - "node_modules/test-exclude": { - "version": "6.0.0", - "dev": true, - "license": "ISC", - "dependencies": { - "@istanbuljs/schema": "^0.1.2", - "glob": "^7.1.4", - "minimatch": "^3.0.4" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/text-table": { - "version": "0.2.0", - "dev": true, - "license": "MIT" - }, - "node_modules/through": { - "version": "2.3.8", - "dev": true, - "license": "MIT" - }, - "node_modules/through2": { - "version": "2.0.5", - "dev": true, - "license": "MIT", - "dependencies": { - "readable-stream": "~2.3.6", - "xtend": "~4.0.1" - } - }, - "node_modules/timers-browserify": { - "version": "1.4.2", - "dev": true, - "dependencies": { - "process": "~0.11.0" - }, - "engines": { - "node": ">=0.6.0" - } - }, - "node_modules/tmp": { - "version": "0.2.1", - "dev": true, - "license": "MIT", - "dependencies": { - "rimraf": "^3.0.0" - }, - "engines": { - "node": ">=8.17.0" - } - }, - "node_modules/to-fast-properties": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", - "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/to-regex-range": { - "version": "5.0.1", - "dev": true, - "license": "MIT", - "dependencies": { - "is-number": "^7.0.0" - }, - "engines": { - "node": ">=8.0" - } - }, - "node_modules/toidentifier": { - "version": "1.0.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.6" - } - }, - "node_modules/tty-browserify": { - "version": "0.0.1", - "dev": true, - "license": "MIT" - }, - "node_modules/type-detect": { - "version": "4.0.8", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/type-fest": { - "version": "0.20.2", - "dev": true, - "license": "(MIT OR CC0-1.0)", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/type-is": { - "version": "1.6.18", - "dev": true, - "license": "MIT", - "dependencies": { - "media-typer": "0.3.0", - "mime-types": "~2.1.24" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/typedarray": { - "version": "0.0.6", - "dev": true, - "license": "MIT" - }, - "node_modules/typedarray-to-buffer": { - "version": "3.1.5", - "dev": true, - "license": "MIT", - "dependencies": { - "is-typedarray": "^1.0.0" - } - }, - "node_modules/ua-parser-js": { - "version": "0.7.33", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/ua-parser-js" - }, - { - "type": "paypal", - "url": "https://paypal.me/faisalman" - } - ], - "license": "MIT", - "engines": { - "node": "*" - } - }, - "node_modules/uglify-js": { - "version": "3.17.4", - "dev": true, - "license": "BSD-2-Clause", - "bin": { - "uglifyjs": "bin/uglifyjs" - }, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/umd": { - "version": "3.0.3", - "dev": true, - "license": "MIT", - "bin": { - "umd": "bin/cli.js" - } - }, - "node_modules/undeclared-identifiers": { - "version": "1.1.3", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "acorn-node": "^1.3.0", - "dash-ast": "^1.0.0", - "get-assigned-identifiers": "^1.2.0", - "simple-concat": "^1.0.0", - "xtend": "^4.0.1" - }, - "bin": { - "undeclared-identifiers": "bin.js" - } - }, - "node_modules/unicode-canonical-property-names-ecmascript": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.0.tgz", - "integrity": "sha512-yY5PpDlfVIU5+y/BSCxAJRBIS1Zc2dDG3Ujq+sR0U+JjUevW2JhocOF+soROYDSaAezOzOKuyyixhD6mBknSmQ==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/unicode-match-property-ecmascript": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-2.0.0.tgz", - "integrity": "sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==", - "dev": true, - "dependencies": { - "unicode-canonical-property-names-ecmascript": "^2.0.0", - "unicode-property-aliases-ecmascript": "^2.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/unicode-match-property-value-ecmascript": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.1.0.tgz", - "integrity": "sha512-qxkjQt6qjg/mYscYMC0XKRn3Rh0wFPlfxB0xkt9CfyTvpX1Ra0+rAmdX2QyAobptSEvuy4RtpPRui6XkV+8wjA==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/unicode-property-aliases-ecmascript": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.1.0.tgz", - "integrity": "sha512-6t3foTQI9qne+OZoVQB/8x8rk2k1eVy1gRXhV3oFQ5T6R1dqQ1xtin3XqSlx3+ATBkliTaR/hHyJBm+LVPNM8w==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/universalify": { - "version": "0.1.2", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 4.0.0" - } - }, - "node_modules/unpipe": { - "version": "1.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/update-browserslist-db": { - "version": "1.0.13", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.13.tgz", - "integrity": "sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/browserslist" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "dependencies": { - "escalade": "^3.1.1", - "picocolors": "^1.0.0" - }, - "bin": { - "update-browserslist-db": "cli.js" - }, - "peerDependencies": { - "browserslist": ">= 4.21.0" - } - }, - "node_modules/uri-js": { - "version": "4.4.1", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "punycode": "^2.1.0" - } - }, - "node_modules/uri-js/node_modules/punycode": { - "version": "2.3.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/url": { - "version": "0.11.0", - "dev": true, - "license": "MIT", - "dependencies": { - "punycode": "1.3.2", - "querystring": "0.2.0" - } - }, - "node_modules/url/node_modules/punycode": { - "version": "1.3.2", - "dev": true, - "license": "MIT" - }, - "node_modules/util": { - "version": "0.10.4", - "dev": true, - "license": "MIT", - "dependencies": { - "inherits": "2.0.3" - } - }, - "node_modules/util-deprecate": { - "version": "1.0.2", - "dev": true, - "license": "MIT" - }, - "node_modules/util/node_modules/inherits": { - "version": "2.0.3", - "dev": true, - "license": "ISC" - }, - "node_modules/utils-merge": { - "version": "1.0.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.4.0" - } - }, - "node_modules/uuid": { - "version": "8.3.2", - "dev": true, - "license": "MIT", - "bin": { - "uuid": "dist/bin/uuid" - } - }, - "node_modules/vary": { - "version": "1.1.2", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/vm-browserify": { - "version": "1.1.0", - "dev": true, - "license": "MIT" - }, - "node_modules/void-elements": { - "version": "2.0.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/which": { - "version": "1.3.1", - "dev": true, - "license": "ISC", - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "which": "bin/which" - } - }, - "node_modules/which-module": { - "version": "2.0.0", - "dev": true, - "license": "ISC" - }, - "node_modules/word-wrap": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.4.tgz", - "integrity": "sha512-2V81OA4ugVo5pRo46hAoD2ivUJx8jXmWXfUkY4KFNw0hEptvN0QfH3K4nHiwzGeKl5rFKedV48QVoqYavy4YpA==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/workerpool": { - "version": "6.2.1", - "dev": true, - "license": "Apache-2.0" - }, - "node_modules/wrap-ansi": { - "version": "7.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - } - }, - "node_modules/wrap-ansi/node_modules/ansi-styles": { - "version": "4.3.0", - "dev": true, - "license": "MIT", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/wrap-ansi/node_modules/color-convert": { - "version": "2.0.1", - "dev": true, - "license": "MIT", - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/wrap-ansi/node_modules/color-name": { - "version": "1.1.4", - "dev": true, - "license": "MIT" - }, - "node_modules/wrappy": { - "version": "1.0.2", - "dev": true, - "license": "ISC" - }, - "node_modules/write-file-atomic": { - "version": "3.0.3", - "dev": true, - "license": "ISC", - "dependencies": { - "imurmurhash": "^0.1.4", - "is-typedarray": "^1.0.0", - "signal-exit": "^3.0.2", - "typedarray-to-buffer": "^3.1.5" - } - }, - "node_modules/ws": { - "version": "8.11.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10.0.0" - }, - "peerDependencies": { - "bufferutil": "^4.0.1", - "utf-8-validate": "^5.0.2" - }, - "peerDependenciesMeta": { - "bufferutil": { - "optional": true - }, - "utf-8-validate": { - "optional": true - } - } - }, - "node_modules/xtend": { - "version": "4.0.2", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.4" - } - }, - "node_modules/y18n": { - "version": "5.0.8", - "dev": true, - "license": "ISC", - "engines": { - "node": ">=10" - } - }, - "node_modules/yallist": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", - "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", - "dev": true - }, - "node_modules/yargs": { - "version": "16.2.0", - "dev": true, - "license": "MIT", - "dependencies": { - "cliui": "^7.0.2", - "escalade": "^3.1.1", - "get-caller-file": "^2.0.5", - "require-directory": "^2.1.1", - "string-width": "^4.2.0", - "y18n": "^5.0.5", - "yargs-parser": "^20.2.2" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/yargs-parser": { - "version": "20.2.4", - "dev": true, - "license": "ISC", - "engines": { - "node": ">=10" - } - }, - "node_modules/yargs-unparser": { - "version": "2.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "camelcase": "^6.0.0", - "decamelize": "^4.0.0", - "flat": "^5.0.2", - "is-plain-obj": "^2.1.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/yocto-queue": { - "version": "0.1.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - } - }, - "dependencies": { - "@ampproject/remapping": { - "version": "2.2.0", - "dev": true, - "requires": { - "@jridgewell/gen-mapping": "^0.1.0", - "@jridgewell/trace-mapping": "^0.3.9" - } - }, - "@babel/cli": { - "version": "7.23.9", - "resolved": "https://registry.npmjs.org/@babel/cli/-/cli-7.23.9.tgz", - "integrity": "sha512-vB1UXmGDNEhcf1jNAHKT9IlYk1R+hehVTLFlCLHBi8gfuHQGP6uRjgXVYU0EVlI/qwAWpstqkBdf2aez3/z/5Q==", - "dev": true, - "requires": { - "@jridgewell/trace-mapping": "^0.3.17", - "@nicolo-ribaudo/chokidar-2": "2.1.8-no-fsevents.3", - "chokidar": "^3.4.0", - "commander": "^4.0.1", - "convert-source-map": "^2.0.0", - "fs-readdir-recursive": "^1.1.0", - "glob": "^7.2.0", - "make-dir": "^2.1.0", - "slash": "^2.0.0" - }, - "dependencies": { - "convert-source-map": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", - "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", - "dev": true - }, - "make-dir": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz", - "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==", - "dev": true, - "requires": { - "pify": "^4.0.1", - "semver": "^5.6.0" - } - }, - "semver": { - "version": "5.7.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", - "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", - "dev": true - } - } - }, - "@babel/code-frame": { - "version": "7.23.5", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.23.5.tgz", - "integrity": "sha512-CgH3s1a96LipHCmSUmYFPwY7MNx8C3avkq7i4Wl3cfa662ldtUe4VM1TPXX70pfmrlWTb6jLqTYrZyT2ZTJBgA==", - "dev": true, - "requires": { - "@babel/highlight": "^7.23.4", - "chalk": "^2.4.2" - } - }, - "@babel/compat-data": { - "version": "7.23.5", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.23.5.tgz", - "integrity": "sha512-uU27kfDRlhfKl+w1U6vp16IuvSLtjAxdArVXPa9BvLkrr7CYIsxH5adpHObeAGY/41+syctUWOZ140a2Rvkgjw==", - "dev": true - }, - "@babel/core": { - "version": "7.23.9", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.23.9.tgz", - "integrity": "sha512-5q0175NOjddqpvvzU+kDiSOAk4PfdO6FvwCWoQ6RO7rTzEe8vlo+4HVfcnAREhD4npMs0e9uZypjTwzZPCf/cw==", - "dev": true, - "requires": { - "@ampproject/remapping": "^2.2.0", - "@babel/code-frame": "^7.23.5", - "@babel/generator": "^7.23.6", - "@babel/helper-compilation-targets": "^7.23.6", - "@babel/helper-module-transforms": "^7.23.3", - "@babel/helpers": "^7.23.9", - "@babel/parser": "^7.23.9", - "@babel/template": "^7.23.9", - "@babel/traverse": "^7.23.9", - "@babel/types": "^7.23.9", - "convert-source-map": "^2.0.0", - "debug": "^4.1.0", - "gensync": "^1.0.0-beta.2", - "json5": "^2.2.3", - "semver": "^6.3.1" - }, - "dependencies": { - "convert-source-map": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", - "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", - "dev": true - }, - "semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true - } - } - }, - "@babel/generator": { - "version": "7.23.6", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.23.6.tgz", - "integrity": "sha512-qrSfCYxYQB5owCmGLbl8XRpX1ytXlpueOb0N0UmQwA073KZxejgQTzAmJezxvpwQD9uGtK2shHdi55QT+MbjIw==", - "dev": true, - "requires": { - "@babel/types": "^7.23.6", - "@jridgewell/gen-mapping": "^0.3.2", - "@jridgewell/trace-mapping": "^0.3.17", - "jsesc": "^2.5.1" - }, - "dependencies": { - "@jridgewell/gen-mapping": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz", - "integrity": "sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==", - "dev": true, - "requires": { - "@jridgewell/set-array": "^1.0.1", - "@jridgewell/sourcemap-codec": "^1.4.10", - "@jridgewell/trace-mapping": "^0.3.9" - } - } - } - }, - "@babel/helper-annotate-as-pure": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.22.5.tgz", - "integrity": "sha512-LvBTxu8bQSQkcyKOU+a1btnNFQ1dMAd0R6PyW3arXes06F6QLWLIrd681bxRPIXlrMGR3XYnW9JyML7dP3qgxg==", - "dev": true, - "requires": { - "@babel/types": "^7.22.5" - } - }, - "@babel/helper-builder-binary-assignment-operator-visitor": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.22.15.tgz", - "integrity": "sha512-QkBXwGgaoC2GtGZRoma6kv7Szfv06khvhFav67ZExau2RaXzy8MpHSMO2PNoP2XtmQphJQRHFfg77Bq731Yizw==", - "dev": true, - "requires": { - "@babel/types": "^7.22.15" - } - }, - "@babel/helper-compilation-targets": { - "version": "7.23.6", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.23.6.tgz", - "integrity": "sha512-9JB548GZoQVmzrFgp8o7KxdgkTGm6xs9DW0o/Pim72UDjzr5ObUQ6ZzYPqA+g9OTS2bBQoctLJrky0RDCAWRgQ==", - "dev": true, - "requires": { - "@babel/compat-data": "^7.23.5", - "@babel/helper-validator-option": "^7.23.5", - "browserslist": "^4.22.2", - "lru-cache": "^5.1.1", - "semver": "^6.3.1" - }, - "dependencies": { - "semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true - } - } - }, - "@babel/helper-create-class-features-plugin": { - "version": "7.23.9", - "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.23.9.tgz", - "integrity": "sha512-B2L9neXTIyPQoXDm+NtovPvG6VOLWnaXu3BIeVDWwdKFgG30oNa6CqVGiJPDWQwIAK49t9gnQI9c6K6RzabiKw==", - "dev": true, - "requires": { - "@babel/helper-annotate-as-pure": "^7.22.5", - "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-function-name": "^7.23.0", - "@babel/helper-member-expression-to-functions": "^7.23.0", - "@babel/helper-optimise-call-expression": "^7.22.5", - "@babel/helper-replace-supers": "^7.22.20", - "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5", - "@babel/helper-split-export-declaration": "^7.22.6", - "semver": "^6.3.1" - }, - "dependencies": { - "semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true - } - } - }, - "@babel/helper-create-regexp-features-plugin": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.22.15.tgz", - "integrity": "sha512-29FkPLFjn4TPEa3RE7GpW+qbE8tlsu3jntNYNfcGsc49LphF1PQIiD+vMZ1z1xVOKt+93khA9tc2JBs3kBjA7w==", - "dev": true, - "requires": { - "@babel/helper-annotate-as-pure": "^7.22.5", - "regexpu-core": "^5.3.1", - "semver": "^6.3.1" - }, - "dependencies": { - "semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true - } - } - }, - "@babel/helper-define-polyfill-provider": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.5.0.tgz", - "integrity": "sha512-NovQquuQLAQ5HuyjCz7WQP9MjRj7dx++yspwiyUiGl9ZyadHRSql1HZh5ogRd8W8w6YM6EQ/NTB8rgjLt5W65Q==", - "dev": true, - "requires": { - "@babel/helper-compilation-targets": "^7.22.6", - "@babel/helper-plugin-utils": "^7.22.5", - "debug": "^4.1.1", - "lodash.debounce": "^4.0.8", - "resolve": "^1.14.2" - } - }, - "@babel/helper-environment-visitor": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.20.tgz", - "integrity": "sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA==", - "dev": true - }, - "@babel/helper-function-name": { - "version": "7.23.0", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.23.0.tgz", - "integrity": "sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw==", - "dev": true, - "requires": { - "@babel/template": "^7.22.15", - "@babel/types": "^7.23.0" - } - }, - "@babel/helper-hoist-variables": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz", - "integrity": "sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==", - "dev": true, - "requires": { - "@babel/types": "^7.22.5" - } - }, - "@babel/helper-member-expression-to-functions": { - "version": "7.23.0", - "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.23.0.tgz", - "integrity": "sha512-6gfrPwh7OuT6gZyJZvd6WbTfrqAo7vm4xCzAXOusKqq/vWdKXphTpj5klHKNmRUU6/QRGlBsyU9mAIPaWHlqJA==", - "dev": true, - "requires": { - "@babel/types": "^7.23.0" - } - }, - "@babel/helper-module-imports": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.22.15.tgz", - "integrity": "sha512-0pYVBnDKZO2fnSPCrgM/6WMc7eS20Fbok+0r88fp+YtWVLZrp4CkafFGIp+W0VKw4a22sgebPT99y+FDNMdP4w==", - "dev": true, - "requires": { - "@babel/types": "^7.22.15" - } - }, - "@babel/helper-module-transforms": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.23.3.tgz", - "integrity": "sha512-7bBs4ED9OmswdfDzpz4MpWgSrV7FXlc3zIagvLFjS5H+Mk7Snr21vQ6QwrsoCGMfNC4e4LQPdoULEt4ykz0SRQ==", - "dev": true, - "requires": { - "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-module-imports": "^7.22.15", - "@babel/helper-simple-access": "^7.22.5", - "@babel/helper-split-export-declaration": "^7.22.6", - "@babel/helper-validator-identifier": "^7.22.20" - } - }, - "@babel/helper-optimise-call-expression": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.22.5.tgz", - "integrity": "sha512-HBwaojN0xFRx4yIvpwGqxiV2tUfl7401jlok564NgB9EHS1y6QT17FmKWm4ztqjeVdXLuC4fSvHc5ePpQjoTbw==", - "dev": true, - "requires": { - "@babel/types": "^7.22.5" - } - }, - "@babel/helper-plugin-utils": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.22.5.tgz", - "integrity": "sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg==", - "dev": true - }, - "@babel/helper-remap-async-to-generator": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.22.20.tgz", - "integrity": "sha512-pBGyV4uBqOns+0UvhsTO8qgl8hO89PmiDYv+/COyp1aeMcmfrfruz+/nCMFiYyFF/Knn0yfrC85ZzNFjembFTw==", + "node_modules/string-length/node_modules/ansi-regex": { + "version": "2.1.1", "dev": true, - "requires": { - "@babel/helper-annotate-as-pure": "^7.22.5", - "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-wrap-function": "^7.22.20" + "license": "MIT", + "engines": { + "node": ">=0.10.0" } }, - "@babel/helper-replace-supers": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.22.20.tgz", - "integrity": "sha512-qsW0In3dbwQUbK8kejJ4R7IHVGwHJlV6lpG6UA7a9hSa2YEiAib+N1T2kr6PEeUT+Fl7najmSOS6SmAwCHK6Tw==", + "node_modules/string-length/node_modules/strip-ansi": { + "version": "3.0.1", "dev": true, - "requires": { - "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-member-expression-to-functions": "^7.22.15", - "@babel/helper-optimise-call-expression": "^7.22.5" + "license": "MIT", + "dependencies": { + "ansi-regex": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" } }, - "@babel/helper-simple-access": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.22.5.tgz", - "integrity": "sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w==", + "node_modules/string-width": { + "version": "4.2.3", "dev": true, - "requires": { - "@babel/types": "^7.22.5" + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" } }, - "@babel/helper-skip-transparent-expression-wrappers": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.22.5.tgz", - "integrity": "sha512-tK14r66JZKiC43p8Ki33yLBVJKlQDFoA8GYN67lWCDCqoL6EMMSuM9b+Iff2jHaM/RRFYl7K+iiru7hbRqNx8Q==", + "node_modules/string-width/node_modules/emoji-regex": { + "version": "8.0.0", "dev": true, - "requires": { - "@babel/types": "^7.22.5" - } + "license": "MIT" }, - "@babel/helper-split-export-declaration": { - "version": "7.22.6", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz", - "integrity": "sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==", + "node_modules/string-width/node_modules/is-fullwidth-code-point": { + "version": "3.0.0", "dev": true, - "requires": { - "@babel/types": "^7.22.5" + "license": "MIT", + "engines": { + "node": ">=8" } }, - "@babel/helper-string-parser": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.23.4.tgz", - "integrity": "sha512-803gmbQdqwdf4olxrX4AJyFBV/RTr3rSmOj0rKwesmzlfhYNDEs+/iOcznzpNWlJlIlTJC2QfPFcHB6DlzdVLQ==", - "dev": true - }, - "@babel/helper-validator-identifier": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz", - "integrity": "sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==", - "dev": true - }, - "@babel/helper-validator-option": { - "version": "7.23.5", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.23.5.tgz", - "integrity": "sha512-85ttAOMLsr53VgXkTbkx8oA6YTfT4q7/HzXSLEYmjcSTJPMPQtvq1BD79Byep5xMUYbGRzEpDsjUf3dyp54IKw==", - "dev": true - }, - "@babel/helper-wrap-function": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.22.20.tgz", - "integrity": "sha512-pms/UwkOpnQe/PDAEdV/d7dVCoBbB+R4FvYoHGZz+4VPcg7RtYy2KP7S2lbuWM6FCSgob5wshfGESbC/hzNXZw==", + "node_modules/strip-ansi": { + "version": "6.0.1", "dev": true, - "requires": { - "@babel/helper-function-name": "^7.22.5", - "@babel/template": "^7.22.15", - "@babel/types": "^7.22.19" + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" } }, - "@babel/helpers": { - "version": "7.23.9", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.23.9.tgz", - "integrity": "sha512-87ICKgU5t5SzOT7sBMfCOZQ2rHjRU+Pcb9BoILMYz600W6DkVRLFBPwQ18gwUVvggqXivaUakpnxWQGbpywbBQ==", + "node_modules/strip-bom": { + "version": "4.0.0", "dev": true, - "requires": { - "@babel/template": "^7.23.9", - "@babel/traverse": "^7.23.9", - "@babel/types": "^7.23.9" + "license": "MIT", + "engines": { + "node": ">=8" } }, - "@babel/highlight": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.23.4.tgz", - "integrity": "sha512-acGdbYSfp2WheJoJm/EBBBLh/ID8KDc64ISZ9DYtBmC8/Q204PZJLHyzeB5qMzJ5trcOkybd78M4x2KWsUq++A==", + "node_modules/strip-json-comments": { + "version": "3.1.1", "dev": true, - "requires": { - "@babel/helper-validator-identifier": "^7.22.20", - "chalk": "^2.4.2", - "js-tokens": "^4.0.0" + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "@babel/parser": { - "version": "7.23.9", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.23.9.tgz", - "integrity": "sha512-9tcKgqKbs3xGJ+NtKF2ndOBBLVwPjl1SHxPQkd36r3Dlirw3xWUeGaTbqr7uGZcTaxkVNwc+03SVP7aCdWrTlA==", - "dev": true + "node_modules/subarg": { + "version": "1.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "minimist": "^1.1.0" + } }, - "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.23.3.tgz", - "integrity": "sha512-iRkKcCqb7iGnq9+3G6rZ+Ciz5VywC4XNRHe57lKM+jOeYAoR0lVqdeeDRfh0tQcTfw/+vBhHn926FmQhLtlFLQ==", + "node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.22.5" + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" } }, - "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.23.3.tgz", - "integrity": "sha512-WwlxbfMNdVEpQjZmK5mhm7oSwD3dS6eU+Iwsi4Knl9wAletWem7kaRsGOG+8UEbRyqxY4SS5zvtfXwX+jMxUwQ==", + "node_modules/syntax-error": { + "version": "1.4.0", "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5", - "@babel/plugin-transform-optional-chaining": "^7.23.3" + "license": "MIT", + "dependencies": { + "acorn-node": "^1.2.0" } }, - "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": { - "version": "7.23.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly/-/plugin-bugfix-v8-static-class-fields-redefine-readonly-7.23.7.tgz", - "integrity": "sha512-LlRT7HgaifEpQA1ZgLVOIJZZFVPWN5iReq/7/JixwBtwcoeVGDBD53ZV28rrsLYOZs1Y/EHhA8N/Z6aazHR8cw==", + "node_modules/test-exclude": { + "version": "6.0.0", "dev": true, - "requires": { - "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-plugin-utils": "^7.22.5" + "license": "ISC", + "dependencies": { + "@istanbuljs/schema": "^0.1.2", + "glob": "^7.1.4", + "minimatch": "^3.0.4" + }, + "engines": { + "node": ">=8" } }, - "@babel/plugin-proposal-private-property-in-object": { - "version": "7.21.0-placeholder-for-preset-env.2", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.21.0-placeholder-for-preset-env.2.tgz", - "integrity": "sha512-SOSkfJDddaM7mak6cPEpswyTRnuRltl429hMraQEglW+OkovnCzsiszTmsrlY//qLFjCpQDFRvjdm2wA5pPm9w==", + "node_modules/text-table": { + "version": "0.2.0", "dev": true, - "requires": {} + "license": "MIT" }, - "@babel/plugin-syntax-async-generators": { - "version": "7.8.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", - "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", + "node_modules/through": { + "version": "2.3.8", "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } + "license": "MIT" }, - "@babel/plugin-syntax-class-properties": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz", - "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==", + "node_modules/through2": { + "version": "2.0.5", "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.12.13" + "license": "MIT", + "dependencies": { + "readable-stream": "~2.3.6", + "xtend": "~4.0.1" } }, - "@babel/plugin-syntax-class-static-block": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz", - "integrity": "sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==", + "node_modules/timers-browserify": { + "version": "1.4.2", "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.14.5" + "dependencies": { + "process": "~0.11.0" + }, + "engines": { + "node": ">=0.6.0" } }, - "@babel/plugin-syntax-dynamic-import": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz", - "integrity": "sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==", + "node_modules/tmp": { + "version": "0.2.1", "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" + "license": "MIT", + "dependencies": { + "rimraf": "^3.0.0" + }, + "engines": { + "node": ">=8.17.0" } }, - "@babel/plugin-syntax-export-namespace-from": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-export-namespace-from/-/plugin-syntax-export-namespace-from-7.8.3.tgz", - "integrity": "sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q==", + "node_modules/to-fast-properties": { + "version": "2.0.0", "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.3" + "license": "MIT", + "engines": { + "node": ">=4" } }, - "@babel/plugin-syntax-import-assertions": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.23.3.tgz", - "integrity": "sha512-lPgDSU+SJLK3xmFDTV2ZRQAiM7UuUjGidwBywFavObCiZc1BeAAcMtHJKUya92hPHO+at63JJPLygilZard8jw==", + "node_modules/to-regex-range": { + "version": "5.0.1", "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.22.5" + "license": "MIT", + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" } }, - "@babel/plugin-syntax-import-attributes": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.23.3.tgz", - "integrity": "sha512-pawnE0P9g10xgoP7yKr6CK63K2FMsTE+FZidZO/1PwRdzmAPVs+HS1mAURUsgaoxammTJvULUdIkEK0gOcU2tA==", + "node_modules/toidentifier": { + "version": "1.0.1", "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.22.5" + "license": "MIT", + "engines": { + "node": ">=0.6" } }, - "@babel/plugin-syntax-import-meta": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz", - "integrity": "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==", + "node_modules/tty-browserify": { + "version": "0.0.1", "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.10.4" - } + "license": "MIT" }, - "@babel/plugin-syntax-json-strings": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", - "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", + "node_modules/type-detect": { + "version": "4.0.8", "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" + "license": "MIT", + "engines": { + "node": ">=4" } }, - "@babel/plugin-syntax-logical-assignment-operators": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz", - "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", + "node_modules/type-fest": { + "version": "0.20.2", "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.10.4" + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "@babel/plugin-syntax-nullish-coalescing-operator": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", - "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", + "node_modules/type-is": { + "version": "1.6.18", "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" + "license": "MIT", + "dependencies": { + "media-typer": "0.3.0", + "mime-types": "~2.1.24" + }, + "engines": { + "node": ">= 0.6" } }, - "@babel/plugin-syntax-numeric-separator": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz", - "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", + "node_modules/typedarray": { + "version": "0.0.6", "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.10.4" - } + "license": "MIT" }, - "@babel/plugin-syntax-object-rest-spread": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", - "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", + "node_modules/typedarray-to-buffer": { + "version": "3.1.5", "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" + "license": "MIT", + "dependencies": { + "is-typedarray": "^1.0.0" } }, - "@babel/plugin-syntax-optional-catch-binding": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", - "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", + "node_modules/ua-parser-js": { + "version": "0.7.33", "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/ua-parser-js" + }, + { + "type": "paypal", + "url": "https://paypal.me/faisalman" + } + ], + "license": "MIT", + "engines": { + "node": "*" } }, - "@babel/plugin-syntax-optional-chaining": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", - "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", + "node_modules/uglify-js": { + "version": "3.17.4", "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" + "license": "BSD-2-Clause", + "bin": { + "uglifyjs": "bin/uglifyjs" + }, + "engines": { + "node": ">=0.8.0" } }, - "@babel/plugin-syntax-private-property-in-object": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz", - "integrity": "sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==", + "node_modules/umd": { + "version": "3.0.3", "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.14.5" + "license": "MIT", + "bin": { + "umd": "bin/cli.js" } }, - "@babel/plugin-syntax-top-level-await": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz", - "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==", + "node_modules/undeclared-identifiers": { + "version": "1.1.3", "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.14.5" + "license": "Apache-2.0", + "dependencies": { + "acorn-node": "^1.3.0", + "dash-ast": "^1.0.0", + "get-assigned-identifiers": "^1.2.0", + "simple-concat": "^1.0.0", + "xtend": "^4.0.1" + }, + "bin": { + "undeclared-identifiers": "bin.js" } }, - "@babel/plugin-syntax-unicode-sets-regex": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-unicode-sets-regex/-/plugin-syntax-unicode-sets-regex-7.18.6.tgz", - "integrity": "sha512-727YkEAPwSIQTv5im8QHz3upqp92JTWhidIC81Tdx4VJYIte/VndKf1qKrfnnhPLiPghStWfvC/iFaMCQu7Nqg==", + "node_modules/universalify": { + "version": "0.1.2", "dev": true, - "requires": { - "@babel/helper-create-regexp-features-plugin": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6" + "license": "MIT", + "engines": { + "node": ">= 4.0.0" } }, - "@babel/plugin-transform-arrow-functions": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.23.3.tgz", - "integrity": "sha512-NzQcQrzaQPkaEwoTm4Mhyl8jI1huEL/WWIEvudjTCMJ9aBZNpsJbMASx7EQECtQQPS/DcnFpo0FIh3LvEO9cxQ==", + "node_modules/unpipe": { + "version": "1.0.0", "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.22.5" + "license": "MIT", + "engines": { + "node": ">= 0.8" } }, - "@babel/plugin-transform-async-generator-functions": { - "version": "7.23.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.23.9.tgz", - "integrity": "sha512-8Q3veQEDGe14dTYuwagbRtwxQDnytyg1JFu4/HwEMETeofocrB0U0ejBJIXoeG/t2oXZ8kzCyI0ZZfbT80VFNQ==", + "node_modules/update-browserslist-db": { + "version": "1.0.10", "dev": true, - "requires": { - "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/helper-remap-async-to-generator": "^7.22.20", - "@babel/plugin-syntax-async-generators": "^7.8.4" + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + } + ], + "license": "MIT", + "dependencies": { + "escalade": "^3.1.1", + "picocolors": "^1.0.0" + }, + "bin": { + "browserslist-lint": "cli.js" + }, + "peerDependencies": { + "browserslist": ">= 4.21.0" } }, - "@babel/plugin-transform-async-to-generator": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.23.3.tgz", - "integrity": "sha512-A7LFsKi4U4fomjqXJlZg/u0ft/n8/7n7lpffUP/ZULx/DtV9SGlNKZolHH6PE8Xl1ngCc0M11OaeZptXVkfKSw==", + "node_modules/uri-js": { + "version": "4.4.1", "dev": true, - "requires": { - "@babel/helper-module-imports": "^7.22.15", - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/helper-remap-async-to-generator": "^7.22.20" + "license": "BSD-2-Clause", + "dependencies": { + "punycode": "^2.1.0" } }, - "@babel/plugin-transform-block-scoped-functions": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.23.3.tgz", - "integrity": "sha512-vI+0sIaPIO6CNuM9Kk5VmXcMVRiOpDh7w2zZt9GXzmE/9KD70CUEVhvPR/etAeNK/FAEkhxQtXOzVF3EuRL41A==", + "node_modules/uri-js/node_modules/punycode": { + "version": "2.3.0", "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.22.5" + "license": "MIT", + "engines": { + "node": ">=6" } }, - "@babel/plugin-transform-block-scoping": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.23.4.tgz", - "integrity": "sha512-0QqbP6B6HOh7/8iNR4CQU2Th/bbRtBp4KS9vcaZd1fZ0wSh5Fyssg0UCIHwxh+ka+pNDREbVLQnHCMHKZfPwfw==", + "node_modules/url": { + "version": "0.11.0", "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.22.5" + "license": "MIT", + "dependencies": { + "punycode": "1.3.2", + "querystring": "0.2.0" } }, - "@babel/plugin-transform-class-properties": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.23.3.tgz", - "integrity": "sha512-uM+AN8yCIjDPccsKGlw271xjJtGii+xQIF/uMPS8H15L12jZTsLfF4o5vNO7d/oUguOyfdikHGc/yi9ge4SGIg==", + "node_modules/url/node_modules/punycode": { + "version": "1.3.2", "dev": true, - "requires": { - "@babel/helper-create-class-features-plugin": "^7.22.15", - "@babel/helper-plugin-utils": "^7.22.5" - } + "license": "MIT" }, - "@babel/plugin-transform-class-static-block": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.23.4.tgz", - "integrity": "sha512-nsWu/1M+ggti1SOALj3hfx5FXzAY06fwPJsUZD4/A5e1bWi46VUIWtD+kOX6/IdhXGsXBWllLFDSnqSCdUNydQ==", + "node_modules/util": { + "version": "0.10.4", "dev": true, - "requires": { - "@babel/helper-create-class-features-plugin": "^7.22.15", - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/plugin-syntax-class-static-block": "^7.14.5" + "license": "MIT", + "dependencies": { + "inherits": "2.0.3" } }, - "@babel/plugin-transform-classes": { - "version": "7.23.8", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.23.8.tgz", - "integrity": "sha512-yAYslGsY1bX6Knmg46RjiCiNSwJKv2IUC8qOdYKqMMr0491SXFhcHqOdRDeCRohOOIzwN/90C6mQ9qAKgrP7dg==", + "node_modules/util-deprecate": { + "version": "1.0.2", "dev": true, - "requires": { - "@babel/helper-annotate-as-pure": "^7.22.5", - "@babel/helper-compilation-targets": "^7.23.6", - "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-function-name": "^7.23.0", - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/helper-replace-supers": "^7.22.20", - "@babel/helper-split-export-declaration": "^7.22.6", - "globals": "^11.1.0" - }, - "dependencies": { - "globals": { - "version": "11.12.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", - "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", - "dev": true - } - } + "license": "MIT" }, - "@babel/plugin-transform-computed-properties": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.23.3.tgz", - "integrity": "sha512-dTj83UVTLw/+nbiHqQSFdwO9CbTtwq1DsDqm3CUEtDrZNET5rT5E6bIdTlOftDTDLMYxvxHNEYO4B9SLl8SLZw==", + "node_modules/util/node_modules/inherits": { + "version": "2.0.3", "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/template": "^7.22.15" - } + "license": "ISC" }, - "@babel/plugin-transform-destructuring": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.23.3.tgz", - "integrity": "sha512-n225npDqjDIr967cMScVKHXJs7rout1q+tt50inyBCPkyZ8KxeI6d+GIbSBTT/w/9WdlWDOej3V9HE5Lgk57gw==", + "node_modules/utils-merge": { + "version": "1.0.1", "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.22.5" + "license": "MIT", + "engines": { + "node": ">= 0.4.0" } }, - "@babel/plugin-transform-dotall-regex": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.23.3.tgz", - "integrity": "sha512-vgnFYDHAKzFaTVp+mneDsIEbnJ2Np/9ng9iviHw3P/KVcgONxpNULEW/51Z/BaFojG2GI2GwwXck5uV1+1NOYQ==", + "node_modules/uuid": { + "version": "8.3.2", "dev": true, - "requires": { - "@babel/helper-create-regexp-features-plugin": "^7.22.15", - "@babel/helper-plugin-utils": "^7.22.5" + "license": "MIT", + "bin": { + "uuid": "dist/bin/uuid" } }, - "@babel/plugin-transform-duplicate-keys": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.23.3.tgz", - "integrity": "sha512-RrqQ+BQmU3Oyav3J+7/myfvRCq7Tbz+kKLLshUmMwNlDHExbGL7ARhajvoBJEvc+fCguPPu887N+3RRXBVKZUA==", + "node_modules/vary": { + "version": "1.1.2", "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.22.5" + "license": "MIT", + "engines": { + "node": ">= 0.8" } }, - "@babel/plugin-transform-dynamic-import": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.23.4.tgz", - "integrity": "sha512-V6jIbLhdJK86MaLh4Jpghi8ho5fGzt3imHOBu/x0jlBaPYqDoWz4RDXjmMOfnh+JWNaQleEAByZLV0QzBT4YQQ==", + "node_modules/vm-browserify": { + "version": "1.1.0", "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/plugin-syntax-dynamic-import": "^7.8.3" - } + "license": "MIT" }, - "@babel/plugin-transform-exponentiation-operator": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.23.3.tgz", - "integrity": "sha512-5fhCsl1odX96u7ILKHBj4/Y8vipoqwsJMh4csSA8qFfxrZDEA4Ssku2DyNvMJSmZNOEBT750LfFPbtrnTP90BQ==", + "node_modules/void-elements": { + "version": "2.0.1", "dev": true, - "requires": { - "@babel/helper-builder-binary-assignment-operator-visitor": "^7.22.15", - "@babel/helper-plugin-utils": "^7.22.5" + "license": "MIT", + "engines": { + "node": ">=0.10.0" } }, - "@babel/plugin-transform-export-namespace-from": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.23.4.tgz", - "integrity": "sha512-GzuSBcKkx62dGzZI1WVgTWvkkz84FZO5TC5T8dl/Tht/rAla6Dg/Mz9Yhypg+ezVACf/rgDuQt3kbWEv7LdUDQ==", + "node_modules/which": { + "version": "1.3.1", "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/plugin-syntax-export-namespace-from": "^7.8.3" + "license": "ISC", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "which": "bin/which" } }, - "@babel/plugin-transform-for-of": { - "version": "7.23.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.23.6.tgz", - "integrity": "sha512-aYH4ytZ0qSuBbpfhuofbg/e96oQ7U2w1Aw/UQmKT+1l39uEhUPoFS3fHevDc1G0OvewyDudfMKY1OulczHzWIw==", + "node_modules/which-module": { + "version": "2.0.0", "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5" - } + "license": "ISC" }, - "@babel/plugin-transform-function-name": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.23.3.tgz", - "integrity": "sha512-I1QXp1LxIvt8yLaib49dRW5Okt7Q4oaxao6tFVKS/anCdEOMtYwWVKoiOA1p34GOWIZjUK0E+zCp7+l1pfQyiw==", + "node_modules/word-wrap": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.4.tgz", + "integrity": "sha512-2V81OA4ugVo5pRo46hAoD2ivUJx8jXmWXfUkY4KFNw0hEptvN0QfH3K4nHiwzGeKl5rFKedV48QVoqYavy4YpA==", "dev": true, - "requires": { - "@babel/helper-compilation-targets": "^7.22.15", - "@babel/helper-function-name": "^7.23.0", - "@babel/helper-plugin-utils": "^7.22.5" + "engines": { + "node": ">=0.10.0" } }, - "@babel/plugin-transform-json-strings": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.23.4.tgz", - "integrity": "sha512-81nTOqM1dMwZ/aRXQ59zVubN9wHGqk6UtqRK+/q+ciXmRy8fSolhGVvG09HHRGo4l6fr/c4ZhXUQH0uFW7PZbg==", + "node_modules/workerpool": { + "version": "6.2.1", "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/plugin-syntax-json-strings": "^7.8.3" - } + "license": "Apache-2.0" }, - "@babel/plugin-transform-literals": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.23.3.tgz", - "integrity": "sha512-wZ0PIXRxnwZvl9AYpqNUxpZ5BiTGrYt7kueGQ+N5FiQ7RCOD4cm8iShd6S6ggfVIWaJf2EMk8eRzAh52RfP4rQ==", + "node_modules/wrap-ansi": { + "version": "7.0.0", "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.22.5" + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" } }, - "@babel/plugin-transform-logical-assignment-operators": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.23.4.tgz", - "integrity": "sha512-Mc/ALf1rmZTP4JKKEhUwiORU+vcfarFVLfcFiolKUo6sewoxSEgl36ak5t+4WamRsNr6nzjZXQjM35WsU+9vbg==", + "node_modules/wrap-ansi/node_modules/ansi-styles": { + "version": "4.3.0", "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4" + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "@babel/plugin-transform-member-expression-literals": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.23.3.tgz", - "integrity": "sha512-sC3LdDBDi5x96LA+Ytekz2ZPk8i/Ck+DEuDbRAll5rknJ5XRTSaPKEYwomLcs1AA8wg9b3KjIQRsnApj+q51Ag==", + "node_modules/wrap-ansi/node_modules/color-convert": { + "version": "2.0.1", "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.22.5" + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" } }, - "@babel/plugin-transform-modules-amd": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.23.3.tgz", - "integrity": "sha512-vJYQGxeKM4t8hYCKVBlZX/gtIY2I7mRGFNcm85sgXGMTBcoV3QdVtdpbcWEbzbfUIUZKwvgFT82mRvaQIebZzw==", + "node_modules/wrap-ansi/node_modules/color-name": { + "version": "1.1.4", "dev": true, - "requires": { - "@babel/helper-module-transforms": "^7.23.3", - "@babel/helper-plugin-utils": "^7.22.5" - } + "license": "MIT" }, - "@babel/plugin-transform-modules-commonjs": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.23.3.tgz", - "integrity": "sha512-aVS0F65LKsdNOtcz6FRCpE4OgsP2OFnW46qNxNIX9h3wuzaNcSQsJysuMwqSibC98HPrf2vCgtxKNwS0DAlgcA==", + "node_modules/wrappy": { + "version": "1.0.2", "dev": true, - "requires": { - "@babel/helper-module-transforms": "^7.23.3", - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/helper-simple-access": "^7.22.5" - } + "license": "ISC" }, - "@babel/plugin-transform-modules-systemjs": { - "version": "7.23.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.23.9.tgz", - "integrity": "sha512-KDlPRM6sLo4o1FkiSlXoAa8edLXFsKKIda779fbLrvmeuc3itnjCtaO6RrtoaANsIJANj+Vk1zqbZIMhkCAHVw==", + "node_modules/write-file-atomic": { + "version": "3.0.3", "dev": true, - "requires": { - "@babel/helper-hoist-variables": "^7.22.5", - "@babel/helper-module-transforms": "^7.23.3", - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/helper-validator-identifier": "^7.22.20" + "license": "ISC", + "dependencies": { + "imurmurhash": "^0.1.4", + "is-typedarray": "^1.0.0", + "signal-exit": "^3.0.2", + "typedarray-to-buffer": "^3.1.5" } }, - "@babel/plugin-transform-modules-umd": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.23.3.tgz", - "integrity": "sha512-zHsy9iXX2nIsCBFPud3jKn1IRPWg3Ing1qOZgeKV39m1ZgIdpJqvlWVeiHBZC6ITRG0MfskhYe9cLgntfSFPIg==", + "node_modules/ws": { + "version": "8.11.0", "dev": true, - "requires": { - "@babel/helper-module-transforms": "^7.23.3", - "@babel/helper-plugin-utils": "^7.22.5" + "license": "MIT", + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": "^5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } } }, - "@babel/plugin-transform-named-capturing-groups-regex": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.22.5.tgz", - "integrity": "sha512-YgLLKmS3aUBhHaxp5hi1WJTgOUb/NCuDHzGT9z9WTt3YG+CPRhJs6nprbStx6DnWM4dh6gt7SU3sZodbZ08adQ==", + "node_modules/xtend": { + "version": "4.0.2", "dev": true, - "requires": { - "@babel/helper-create-regexp-features-plugin": "^7.22.5", - "@babel/helper-plugin-utils": "^7.22.5" + "license": "MIT", + "engines": { + "node": ">=0.4" } }, - "@babel/plugin-transform-new-target": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.23.3.tgz", - "integrity": "sha512-YJ3xKqtJMAT5/TIZnpAR3I+K+WaDowYbN3xyxI8zxx/Gsypwf9B9h0VB+1Nh6ACAAPRS5NSRje0uVv5i79HYGQ==", + "node_modules/y18n": { + "version": "5.0.8", "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.22.5" + "license": "ISC", + "engines": { + "node": ">=10" } }, - "@babel/plugin-transform-nullish-coalescing-operator": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.23.4.tgz", - "integrity": "sha512-jHE9EVVqHKAQx+VePv5LLGHjmHSJR76vawFPTdlxR/LVJPfOEGxREQwQfjuZEOPTwG92X3LINSh3M40Rv4zpVA==", + "node_modules/yallist": { + "version": "3.1.1", "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3" - } + "license": "ISC" }, - "@babel/plugin-transform-numeric-separator": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.23.4.tgz", - "integrity": "sha512-mps6auzgwjRrwKEZA05cOwuDc9FAzoyFS4ZsG/8F43bTLf/TgkJg7QXOrPO1JO599iA3qgK9MXdMGOEC8O1h6Q==", + "node_modules/yargs": { + "version": "16.2.0", "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/plugin-syntax-numeric-separator": "^7.10.4" + "license": "MIT", + "dependencies": { + "cliui": "^7.0.2", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.0", + "y18n": "^5.0.5", + "yargs-parser": "^20.2.2" + }, + "engines": { + "node": ">=10" } }, - "@babel/plugin-transform-object-rest-spread": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.23.4.tgz", - "integrity": "sha512-9x9K1YyeQVw0iOXJlIzwm8ltobIIv7j2iLyP2jIhEbqPRQ7ScNgwQufU2I0Gq11VjyG4gI4yMXt2VFags+1N3g==", + "node_modules/yargs-parser": { + "version": "20.2.4", "dev": true, - "requires": { - "@babel/compat-data": "^7.23.3", - "@babel/helper-compilation-targets": "^7.22.15", - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/plugin-syntax-object-rest-spread": "^7.8.3", - "@babel/plugin-transform-parameters": "^7.23.3" + "license": "ISC", + "engines": { + "node": ">=10" } }, - "@babel/plugin-transform-object-super": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.23.3.tgz", - "integrity": "sha512-BwQ8q0x2JG+3lxCVFohg+KbQM7plfpBwThdW9A6TMtWwLsbDA01Ek2Zb/AgDN39BiZsExm4qrXxjk+P1/fzGrA==", + "node_modules/yargs-unparser": { + "version": "2.0.0", "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/helper-replace-supers": "^7.22.20" + "license": "MIT", + "dependencies": { + "camelcase": "^6.0.0", + "decamelize": "^4.0.0", + "flat": "^5.0.2", + "is-plain-obj": "^2.1.0" + }, + "engines": { + "node": ">=10" } }, - "@babel/plugin-transform-optional-catch-binding": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.23.4.tgz", - "integrity": "sha512-XIq8t0rJPHf6Wvmbn9nFxU6ao4c7WhghTR5WyV8SrJfUFzyxhCm4nhC+iAp3HFhbAKLfYpgzhJ6t4XCtVwqO5A==", + "node_modules/yocto-queue": { + "version": "0.1.0", "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/plugin-syntax-optional-catch-binding": "^7.8.3" + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } - }, - "@babel/plugin-transform-optional-chaining": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.23.4.tgz", - "integrity": "sha512-ZU8y5zWOfjM5vZ+asjgAPwDaBjJzgufjES89Rs4Lpq63O300R/kOz30WCLo6BxxX6QVEilwSlpClnG5cZaikTA==", + } + }, + "dependencies": { + "@ampproject/remapping": { + "version": "2.2.0", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5", - "@babel/plugin-syntax-optional-chaining": "^7.8.3" + "@jridgewell/gen-mapping": "^0.1.0", + "@jridgewell/trace-mapping": "^0.3.9" } }, - "@babel/plugin-transform-parameters": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.23.3.tgz", - "integrity": "sha512-09lMt6UsUb3/34BbECKVbVwrT9bO6lILWln237z7sLaWnMsTi7Yc9fhX5DLpkJzAGfaReXI22wP41SZmnAA3Vw==", + "@babel/code-frame": { + "version": "7.22.13", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.22.13.tgz", + "integrity": "sha512-XktuhWlJ5g+3TJXc5upd9Ks1HutSArik6jf2eAjYFyIOf4ej3RN+184cZbzDvbPnuTJIUhPKKJE3cIsYTiAT3w==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/highlight": "^7.22.13", + "chalk": "^2.4.2" } }, - "@babel/plugin-transform-private-methods": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.23.3.tgz", - "integrity": "sha512-UzqRcRtWsDMTLrRWFvUBDwmw06tCQH9Rl1uAjfh6ijMSmGYQ+fpdB+cnqRC8EMh5tuuxSv0/TejGL+7vyj+50g==", - "dev": true, - "requires": { - "@babel/helper-create-class-features-plugin": "^7.22.15", - "@babel/helper-plugin-utils": "^7.22.5" - } + "@babel/compat-data": { + "version": "7.21.0", + "dev": true }, - "@babel/plugin-transform-private-property-in-object": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.23.4.tgz", - "integrity": "sha512-9G3K1YqTq3F4Vt88Djx1UZ79PDyj+yKRnUy7cZGSMe+a7jkwD259uKKuUzQlPkGam7R+8RJwh5z4xO27fA1o2A==", + "@babel/core": { + "version": "7.21.0", "dev": true, "requires": { - "@babel/helper-annotate-as-pure": "^7.22.5", - "@babel/helper-create-class-features-plugin": "^7.22.15", - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/plugin-syntax-private-property-in-object": "^7.14.5" + "@ampproject/remapping": "^2.2.0", + "@babel/code-frame": "^7.18.6", + "@babel/generator": "^7.21.0", + "@babel/helper-compilation-targets": "^7.20.7", + "@babel/helper-module-transforms": "^7.21.0", + "@babel/helpers": "^7.21.0", + "@babel/parser": "^7.21.0", + "@babel/template": "^7.20.7", + "@babel/traverse": "^7.21.0", + "@babel/types": "^7.21.0", + "convert-source-map": "^1.7.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.2", + "semver": "^6.3.0" + }, + "dependencies": { + "convert-source-map": { + "version": "1.9.0", + "dev": true + }, + "semver": { + "version": "6.3.0", + "dev": true + } } }, - "@babel/plugin-transform-property-literals": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.23.3.tgz", - "integrity": "sha512-jR3Jn3y7cZp4oEWPFAlRsSWjxKe4PZILGBSd4nis1TsC5qeSpb+nrtihJuDhNI7QHiVbUaiXa0X2RZY3/TI6Nw==", + "@babel/generator": { + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.23.0.tgz", + "integrity": "sha512-lN85QRR+5IbYrMWM6Y4pE/noaQtg4pNiqeNGX60eqOfo6gtEj6uw/JagelB8vVztSd7R6M5n1+PQkDbHbBRU4g==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/types": "^7.23.0", + "@jridgewell/gen-mapping": "^0.3.2", + "@jridgewell/trace-mapping": "^0.3.17", + "jsesc": "^2.5.1" + }, + "dependencies": { + "@jridgewell/gen-mapping": { + "version": "0.3.2", + "dev": true, + "requires": { + "@jridgewell/set-array": "^1.0.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.9" + } + } } }, - "@babel/plugin-transform-regenerator": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.23.3.tgz", - "integrity": "sha512-KP+75h0KghBMcVpuKisx3XTu9Ncut8Q8TuvGO4IhY+9D5DFEckQefOuIsB/gQ2tG71lCke4NMrtIPS8pOj18BQ==", + "@babel/helper-compilation-targets": { + "version": "7.20.7", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.22.5", - "regenerator-transform": "^0.15.2" + "@babel/compat-data": "^7.20.5", + "@babel/helper-validator-option": "^7.18.6", + "browserslist": "^4.21.3", + "lru-cache": "^5.1.1", + "semver": "^6.3.0" + }, + "dependencies": { + "semver": { + "version": "6.3.0", + "dev": true + } } }, - "@babel/plugin-transform-reserved-words": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.23.3.tgz", - "integrity": "sha512-QnNTazY54YqgGxwIexMZva9gqbPa15t/x9VS+0fsEFWplwVpXYZivtgl43Z1vMpc1bdPP2PP8siFeVcnFvA3Cg==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.22.5" - } + "@babel/helper-environment-visitor": { + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.20.tgz", + "integrity": "sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA==", + "dev": true }, - "@babel/plugin-transform-shorthand-properties": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.23.3.tgz", - "integrity": "sha512-ED2fgqZLmexWiN+YNFX26fx4gh5qHDhn1O2gvEhreLW2iI63Sqm4llRLCXALKrCnbN4Jy0VcMQZl/SAzqug/jg==", + "@babel/helper-function-name": { + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.23.0.tgz", + "integrity": "sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/template": "^7.22.15", + "@babel/types": "^7.23.0" } }, - "@babel/plugin-transform-spread": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.23.3.tgz", - "integrity": "sha512-VvfVYlrlBVu+77xVTOAoxQ6mZbnIq5FM0aGBSFEcIh03qHf+zNqA4DC/3XMUozTg7bZV3e3mZQ0i13VB6v5yUg==", + "@babel/helper-hoist-variables": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz", + "integrity": "sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5" + "@babel/types": "^7.22.5" } }, - "@babel/plugin-transform-sticky-regex": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.23.3.tgz", - "integrity": "sha512-HZOyN9g+rtvnOU3Yh7kSxXrKbzgrm5X4GncPY1QOquu7epga5MxKHVpYu2hvQnry/H+JjckSYRb93iNfsioAGg==", + "@babel/helper-module-imports": { + "version": "7.18.6", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/types": "^7.18.6" } }, - "@babel/plugin-transform-template-literals": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.23.3.tgz", - "integrity": "sha512-Flok06AYNp7GV2oJPZZcP9vZdszev6vPBkHLwxwSpaIqx75wn6mUd3UFWsSsA0l8nXAKkyCmL/sR02m8RYGeHg==", + "@babel/helper-module-transforms": { + "version": "7.21.2", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-environment-visitor": "^7.18.9", + "@babel/helper-module-imports": "^7.18.6", + "@babel/helper-simple-access": "^7.20.2", + "@babel/helper-split-export-declaration": "^7.18.6", + "@babel/helper-validator-identifier": "^7.19.1", + "@babel/template": "^7.20.7", + "@babel/traverse": "^7.21.2", + "@babel/types": "^7.21.2" } }, - "@babel/plugin-transform-typeof-symbol": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.23.3.tgz", - "integrity": "sha512-4t15ViVnaFdrPC74be1gXBSMzXk3B4Us9lP7uLRQHTFpV5Dvt33pn+2MyyNxmN3VTTm3oTrZVMUmuw3oBnQ2oQ==", + "@babel/helper-simple-access": { + "version": "7.20.2", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/types": "^7.20.2" } }, - "@babel/plugin-transform-unicode-escapes": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.23.3.tgz", - "integrity": "sha512-OMCUx/bU6ChE3r4+ZdylEqAjaQgHAgipgW8nsCfu5pGqDcFytVd91AwRvUJSBZDz0exPGgnjoqhgRYLRjFZc9Q==", + "@babel/helper-split-export-declaration": { + "version": "7.22.6", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz", + "integrity": "sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/types": "^7.22.5" } }, - "@babel/plugin-transform-unicode-property-regex": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.23.3.tgz", - "integrity": "sha512-KcLIm+pDZkWZQAFJ9pdfmh89EwVfmNovFBcXko8szpBeF8z68kWIPeKlmSOkT9BXJxs2C0uk+5LxoxIv62MROA==", - "dev": true, - "requires": { - "@babel/helper-create-regexp-features-plugin": "^7.22.15", - "@babel/helper-plugin-utils": "^7.22.5" - } + "@babel/helper-string-parser": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.22.5.tgz", + "integrity": "sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw==", + "dev": true }, - "@babel/plugin-transform-unicode-regex": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.23.3.tgz", - "integrity": "sha512-wMHpNA4x2cIA32b/ci3AfwNgheiva2W0WUKWTK7vBHBhDKfPsc5cFGNWm69WBqpwd86u1qwZ9PWevKqm1A3yAw==", - "dev": true, - "requires": { - "@babel/helper-create-regexp-features-plugin": "^7.22.15", - "@babel/helper-plugin-utils": "^7.22.5" - } + "@babel/helper-validator-identifier": { + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz", + "integrity": "sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==", + "dev": true }, - "@babel/plugin-transform-unicode-sets-regex": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.23.3.tgz", - "integrity": "sha512-W7lliA/v9bNR83Qc3q1ip9CQMZ09CcHDbHfbLRDNuAhn1Mvkr1ZNF7hPmztMQvtTGVLJ9m8IZqWsTkXOml8dbw==", - "dev": true, - "requires": { - "@babel/helper-create-regexp-features-plugin": "^7.22.15", - "@babel/helper-plugin-utils": "^7.22.5" - } + "@babel/helper-validator-option": { + "version": "7.21.0", + "dev": true }, - "@babel/preset-env": { - "version": "7.23.9", - "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.23.9.tgz", - "integrity": "sha512-3kBGTNBBk9DQiPoXYS0g0BYlwTQYUTifqgKTjxUwEUkduRT2QOa0FPGBJ+NROQhGyYO5BuTJwGvBnqKDykac6A==", + "@babel/helpers": { + "version": "7.21.0", "dev": true, "requires": { - "@babel/compat-data": "^7.23.5", - "@babel/helper-compilation-targets": "^7.23.6", - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/helper-validator-option": "^7.23.5", - "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.23.3", - "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.23.3", - "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": "^7.23.7", - "@babel/plugin-proposal-private-property-in-object": "7.21.0-placeholder-for-preset-env.2", - "@babel/plugin-syntax-async-generators": "^7.8.4", - "@babel/plugin-syntax-class-properties": "^7.12.13", - "@babel/plugin-syntax-class-static-block": "^7.14.5", - "@babel/plugin-syntax-dynamic-import": "^7.8.3", - "@babel/plugin-syntax-export-namespace-from": "^7.8.3", - "@babel/plugin-syntax-import-assertions": "^7.23.3", - "@babel/plugin-syntax-import-attributes": "^7.23.3", - "@babel/plugin-syntax-import-meta": "^7.10.4", - "@babel/plugin-syntax-json-strings": "^7.8.3", - "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4", - "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", - "@babel/plugin-syntax-numeric-separator": "^7.10.4", - "@babel/plugin-syntax-object-rest-spread": "^7.8.3", - "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", - "@babel/plugin-syntax-optional-chaining": "^7.8.3", - "@babel/plugin-syntax-private-property-in-object": "^7.14.5", - "@babel/plugin-syntax-top-level-await": "^7.14.5", - "@babel/plugin-syntax-unicode-sets-regex": "^7.18.6", - "@babel/plugin-transform-arrow-functions": "^7.23.3", - "@babel/plugin-transform-async-generator-functions": "^7.23.9", - "@babel/plugin-transform-async-to-generator": "^7.23.3", - "@babel/plugin-transform-block-scoped-functions": "^7.23.3", - "@babel/plugin-transform-block-scoping": "^7.23.4", - "@babel/plugin-transform-class-properties": "^7.23.3", - "@babel/plugin-transform-class-static-block": "^7.23.4", - "@babel/plugin-transform-classes": "^7.23.8", - "@babel/plugin-transform-computed-properties": "^7.23.3", - "@babel/plugin-transform-destructuring": "^7.23.3", - "@babel/plugin-transform-dotall-regex": "^7.23.3", - "@babel/plugin-transform-duplicate-keys": "^7.23.3", - "@babel/plugin-transform-dynamic-import": "^7.23.4", - "@babel/plugin-transform-exponentiation-operator": "^7.23.3", - "@babel/plugin-transform-export-namespace-from": "^7.23.4", - "@babel/plugin-transform-for-of": "^7.23.6", - "@babel/plugin-transform-function-name": "^7.23.3", - "@babel/plugin-transform-json-strings": "^7.23.4", - "@babel/plugin-transform-literals": "^7.23.3", - "@babel/plugin-transform-logical-assignment-operators": "^7.23.4", - "@babel/plugin-transform-member-expression-literals": "^7.23.3", - "@babel/plugin-transform-modules-amd": "^7.23.3", - "@babel/plugin-transform-modules-commonjs": "^7.23.3", - "@babel/plugin-transform-modules-systemjs": "^7.23.9", - "@babel/plugin-transform-modules-umd": "^7.23.3", - "@babel/plugin-transform-named-capturing-groups-regex": "^7.22.5", - "@babel/plugin-transform-new-target": "^7.23.3", - "@babel/plugin-transform-nullish-coalescing-operator": "^7.23.4", - "@babel/plugin-transform-numeric-separator": "^7.23.4", - "@babel/plugin-transform-object-rest-spread": "^7.23.4", - "@babel/plugin-transform-object-super": "^7.23.3", - "@babel/plugin-transform-optional-catch-binding": "^7.23.4", - "@babel/plugin-transform-optional-chaining": "^7.23.4", - "@babel/plugin-transform-parameters": "^7.23.3", - "@babel/plugin-transform-private-methods": "^7.23.3", - "@babel/plugin-transform-private-property-in-object": "^7.23.4", - "@babel/plugin-transform-property-literals": "^7.23.3", - "@babel/plugin-transform-regenerator": "^7.23.3", - "@babel/plugin-transform-reserved-words": "^7.23.3", - "@babel/plugin-transform-shorthand-properties": "^7.23.3", - "@babel/plugin-transform-spread": "^7.23.3", - "@babel/plugin-transform-sticky-regex": "^7.23.3", - "@babel/plugin-transform-template-literals": "^7.23.3", - "@babel/plugin-transform-typeof-symbol": "^7.23.3", - "@babel/plugin-transform-unicode-escapes": "^7.23.3", - "@babel/plugin-transform-unicode-property-regex": "^7.23.3", - "@babel/plugin-transform-unicode-regex": "^7.23.3", - "@babel/plugin-transform-unicode-sets-regex": "^7.23.3", - "@babel/preset-modules": "0.1.6-no-external-plugins", - "babel-plugin-polyfill-corejs2": "^0.4.8", - "babel-plugin-polyfill-corejs3": "^0.9.0", - "babel-plugin-polyfill-regenerator": "^0.5.5", - "core-js-compat": "^3.31.0", - "semver": "^6.3.1" - }, - "dependencies": { - "semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true - } + "@babel/template": "^7.20.7", + "@babel/traverse": "^7.21.0", + "@babel/types": "^7.21.0" } }, - "@babel/preset-modules": { - "version": "0.1.6-no-external-plugins", - "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.6-no-external-plugins.tgz", - "integrity": "sha512-HrcgcIESLm9aIR842yhJ5RWan/gebQUJ6E/E5+rf0y9o6oj7w0Br+sWuL6kEQ/o/AdfvR1Je9jG18/gnpwjEyA==", + "@babel/highlight": { + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.22.20.tgz", + "integrity": "sha512-dkdMCN3py0+ksCgYmGG8jKeGA/8Tk+gJwSYYlFGxG5lmhfKNoAy004YpLxpS1W2J8m/EK2Ew+yOs9pVRwO89mg==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.0.0", - "@babel/types": "^7.4.4", - "esutils": "^2.0.2" + "@babel/helper-validator-identifier": "^7.22.20", + "chalk": "^2.4.2", + "js-tokens": "^4.0.0" } }, - "@babel/regjsgen": { - "version": "0.8.0", - "resolved": "https://registry.npmjs.org/@babel/regjsgen/-/regjsgen-0.8.0.tgz", - "integrity": "sha512-x/rqGMdzj+fWZvCOYForTghzbtqPDZ5gPwaoNGHdgDfF2QA/XZbCBp4Moo5scrkAMPhB7z26XM/AaHuIJdgauA==", + "@babel/parser": { + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.23.0.tgz", + "integrity": "sha512-vvPKKdMemU85V9WE/l5wZEmImpCtLqbnTvqDS2U1fJ96KrxoW7KrXhNsNCblQlg8Ck4b85yxdTyelsMUgFUXiw==", "dev": true }, - "@babel/runtime": { - "version": "7.23.9", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.23.9.tgz", - "integrity": "sha512-0CX6F+BI2s9dkUqr08KFrAIZgNFj75rdBU/DjCyYLIaV/quFjkk6T+EJ2LkZHyZTbEV4L5p97mNkUsHl2wLFAw==", - "dev": true, - "requires": { - "regenerator-runtime": "^0.14.0" - } - }, "@babel/template": { - "version": "7.23.9", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.23.9.tgz", - "integrity": "sha512-+xrD2BWLpvHKNmX2QbpdpsBaWnRxahMwJjO+KZk2JOElj5nSmKezyS1B4u+QbHMTX69t4ukm6hh9lsYQ7GHCKA==", + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.22.15.tgz", + "integrity": "sha512-QPErUVm4uyJa60rkI73qneDacvdvzxshT3kksGqlGWYdOTIUOwJ7RDUL8sGqslY1uXWSL6xMFKEXDS3ox2uF0w==", "dev": true, "requires": { - "@babel/code-frame": "^7.23.5", - "@babel/parser": "^7.23.9", - "@babel/types": "^7.23.9" + "@babel/code-frame": "^7.22.13", + "@babel/parser": "^7.22.15", + "@babel/types": "^7.22.15" } }, "@babel/traverse": { - "version": "7.23.9", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.23.9.tgz", - "integrity": "sha512-I/4UJ9vs90OkBtY6iiiTORVMyIhJ4kAVmsKo9KFc8UOxMeUfi2hvtIBsET5u9GizXE6/GFSuKCTNfgCswuEjRg==", + "version": "7.23.2", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.23.2.tgz", + "integrity": "sha512-azpe59SQ48qG6nu2CzcMLbxUudtN+dOM9kDbUqGq3HXUJRlo7i8fvPoxQUzYgLZ4cMVmuZgm8vvBpNeRhd6XSw==", "dev": true, "requires": { - "@babel/code-frame": "^7.23.5", - "@babel/generator": "^7.23.6", + "@babel/code-frame": "^7.22.13", + "@babel/generator": "^7.23.0", "@babel/helper-environment-visitor": "^7.22.20", "@babel/helper-function-name": "^7.23.0", "@babel/helper-hoist-variables": "^7.22.5", "@babel/helper-split-export-declaration": "^7.22.6", - "@babel/parser": "^7.23.9", - "@babel/types": "^7.23.9", - "debug": "^4.3.1", + "@babel/parser": "^7.23.0", + "@babel/types": "^7.23.0", + "debug": "^4.1.0", "globals": "^11.1.0" }, "dependencies": { "globals": { "version": "11.12.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", - "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", "dev": true } } }, "@babel/types": { - "version": "7.23.9", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.23.9.tgz", - "integrity": "sha512-dQjSq/7HaSjRM43FFGnv5keM2HsxpmyV1PfaSVm0nzzjwwTmjOe6J4bC8e3+pTEIgHaHj+1ZlLThRJ2auc/w1Q==", + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.23.0.tgz", + "integrity": "sha512-0oIyUfKoI3mSqMvsxBdclDwxXKXAUA8v/apZbc+iSyARYou1o8ZGDxbUYyLFoW2arqS2jDGqJuZvv1d/io1axg==", "dev": true, "requires": { - "@babel/helper-string-parser": "^7.23.4", + "@babel/helper-string-parser": "^7.22.5", "@babel/helper-validator-identifier": "^7.22.20", "to-fast-properties": "^2.0.0" } @@ -8966,13 +6178,6 @@ "@jridgewell/sourcemap-codec": "1.4.14" } }, - "@nicolo-ribaudo/chokidar-2": { - "version": "2.1.8-no-fsevents.3", - "resolved": "https://registry.npmjs.org/@nicolo-ribaudo/chokidar-2/-/chokidar-2-2.1.8-no-fsevents.3.tgz", - "integrity": "sha512-s88O1aVtXftvp5bCPB7WnmXc5IwOZZ7YPuwNPt+GtOOXpPvad1LfbmjYv+qII7zP6RU2QGnqve27dnLycEnyEQ==", - "dev": true, - "optional": true - }, "@nodelib/fs.scandir": { "version": "2.1.5", "dev": true, @@ -9136,50 +6341,6 @@ "version": "1.1.0", "dev": true }, - "babel-plugin-add-module-exports": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/babel-plugin-add-module-exports/-/babel-plugin-add-module-exports-1.0.4.tgz", - "integrity": "sha512-g+8yxHUZ60RcyaUpfNzy56OtWW+x9cyEe9j+CranqLiqbju2yf/Cy6ZtYK40EZxtrdHllzlVZgLmcOUCTlJ7Jg==", - "dev": true - }, - "babel-plugin-polyfill-corejs2": { - "version": "0.4.8", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.8.tgz", - "integrity": "sha512-OtIuQfafSzpo/LhnJaykc0R/MMnuLSSVjVYy9mHArIZ9qTCSZ6TpWCuEKZYVoN//t8HqBNScHrOtCrIK5IaGLg==", - "dev": true, - "requires": { - "@babel/compat-data": "^7.22.6", - "@babel/helper-define-polyfill-provider": "^0.5.0", - "semver": "^6.3.1" - }, - "dependencies": { - "semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true - } - } - }, - "babel-plugin-polyfill-corejs3": { - "version": "0.9.0", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.9.0.tgz", - "integrity": "sha512-7nZPG1uzK2Ymhy/NbaOWTg3uibM2BmGASS4vHS4szRZAIR8R6GwA/xAujpdrXU5iyklrimWnLWU+BLF9suPTqg==", - "dev": true, - "requires": { - "@babel/helper-define-polyfill-provider": "^0.5.0", - "core-js-compat": "^3.34.0" - } - }, - "babel-plugin-polyfill-regenerator": { - "version": "0.5.5", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.5.5.tgz", - "integrity": "sha512-OJGYZlhLqBh2DDHeqAxWB1XIvr49CxiJ2gIt61/PU55CQK4Z58OzMqjDe1zwQdQk+rBYsRc+1rJmdajM3gimHg==", - "dev": true, - "requires": { - "@babel/helper-define-polyfill-provider": "^0.5.0" - } - }, "balanced-match": { "version": "1.0.0", "dev": true @@ -9445,15 +6606,13 @@ } }, "browserslist": { - "version": "4.22.3", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.22.3.tgz", - "integrity": "sha512-UAp55yfwNv0klWNapjs/ktHoguxuQNGnOzxYmfnXIS+8AsRDZkSDxg7R1AX3GKzn078SBI5dzwzj/Yx0Or0e3A==", + "version": "4.21.5", "dev": true, "requires": { - "caniuse-lite": "^1.0.30001580", - "electron-to-chromium": "^1.4.648", - "node-releases": "^2.0.14", - "update-browserslist-db": "^1.0.13" + "caniuse-lite": "^1.0.30001449", + "electron-to-chromium": "^1.4.284", + "node-releases": "^2.0.8", + "update-browserslist-db": "^1.0.10" } }, "buffer": { @@ -9511,9 +6670,7 @@ "dev": true }, "caniuse-lite": { - "version": "1.0.30001581", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001581.tgz", - "integrity": "sha512-whlTkwhqV2tUmP3oYhtNfaWGYHDdS3JYFQBKXxcUR9qqPWsRhFHhoISO2Xnl/g0xyKzht9mI1LZpiNWfMzHixQ==", + "version": "1.0.30001460", "dev": true }, "chai": { @@ -9612,12 +6769,6 @@ "source-map": "~0.5.3" } }, - "commander": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz", - "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==", - "dev": true - }, "commondir": { "version": "1.0.1", "dev": true @@ -9682,15 +6833,6 @@ "version": "0.4.2", "dev": true }, - "core-js-compat": { - "version": "3.35.1", - "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.35.1.tgz", - "integrity": "sha512-sftHa5qUJY3rs9Zht1WEnmkvXputCyDBczPnr7QDgL8n3qrF3CMXY4VPSYtOLLiOUJcah2WNXREd48iOl6mQIw==", - "dev": true, - "requires": { - "browserslist": "^4.22.2" - } - }, "core-util-is": { "version": "1.0.2", "dev": true @@ -9940,9 +7082,7 @@ "dev": true }, "electron-to-chromium": { - "version": "1.4.651", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.651.tgz", - "integrity": "sha512-jjks7Xx+4I7dslwsbaFocSwqBbGHQmuXBJUK9QBZTIrzPq3pzn6Uf2szFSP728FtLYE3ldiccmlkOM/zhGKCpA==", + "version": "1.4.317", "dev": true }, "elliptic": { @@ -10362,12 +7502,6 @@ "universalify": "^0.1.0" } }, - "fs-readdir-recursive": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/fs-readdir-recursive/-/fs-readdir-recursive-1.1.0.tgz", - "integrity": "sha512-GNanXlVr2pf02+sPN40XN8HG+ePaNcvM0q5mZBd668Obwb0yD5GiUbZOFgwn8kGMY6I3mdyDJzieUy3PTYyTRA==", - "dev": true - }, "fs.realpath": { "version": "1.0.0", "dev": true @@ -10378,9 +7512,7 @@ "optional": true }, "function-bind": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", - "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "version": "1.1.1", "dev": true }, "gensync": { @@ -10506,15 +7638,6 @@ } } }, - "hasown": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.0.tgz", - "integrity": "sha512-vUptKVTpIJhcczKBbgnS+RtcuYMB8+oNzPK2/Hp3hanz8JmpATdmmgLgSaadVREkDm+e2giHwY3ZRkyjSIDDFA==", - "dev": true, - "requires": { - "function-bind": "^1.1.2" - } - }, "he": { "version": "1.2.0", "dev": true @@ -10678,15 +7801,6 @@ "version": "1.1.6", "dev": true }, - "is-core-module": { - "version": "2.13.1", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.1.tgz", - "integrity": "sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==", - "dev": true, - "requires": { - "hasown": "^2.0.0" - } - }, "is-extglob": { "version": "2.1.1", "dev": true @@ -10846,8 +7960,6 @@ }, "jsesc": { "version": "2.5.2", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", - "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", "dev": true }, "jshint": { @@ -11060,12 +8172,6 @@ "version": "4.17.21", "dev": true }, - "lodash.debounce": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", - "integrity": "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==", - "dev": true - }, "lodash.flattendeep": { "version": "4.4.0", "dev": true @@ -11137,8 +8243,6 @@ }, "lru-cache": { "version": "5.1.1", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", - "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", "dev": true, "requires": { "yallist": "^3.0.2" @@ -11388,9 +8492,7 @@ } }, "node-releases": { - "version": "2.0.14", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.14.tgz", - "integrity": "sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==", + "version": "2.0.10", "dev": true }, "normalize-path": { @@ -11679,20 +8781,12 @@ }, "picocolors": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", - "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", "dev": true }, "picomatch": { "version": "2.3.1", "dev": true }, - "pify": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", - "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", - "dev": true - }, "pkg-dir": { "version": "4.2.0", "dev": true, @@ -11865,71 +8959,10 @@ "picomatch": "^2.2.1" } }, - "regenerate": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz", - "integrity": "sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==", - "dev": true - }, - "regenerate-unicode-properties": { - "version": "10.1.1", - "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-10.1.1.tgz", - "integrity": "sha512-X007RyZLsCJVVrjgEFVpLUTZwyOZk3oiL75ZcuYjlIWd6rNJtOjkBwQc5AsRrpbKVkxN6sklw/k/9m2jJYOf8Q==", - "dev": true, - "requires": { - "regenerate": "^1.4.2" - } - }, - "regenerator-runtime": { - "version": "0.14.1", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz", - "integrity": "sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==", - "dev": true - }, - "regenerator-transform": { - "version": "0.15.2", - "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.15.2.tgz", - "integrity": "sha512-hfMp2BoF0qOk3uc5V20ALGDS2ddjQaLrdl7xrGXvAIow7qeWRM2VA2HuCHkUKk9slq3VwEwLNK3DFBqDfPGYtg==", - "dev": true, - "requires": { - "@babel/runtime": "^7.8.4" - } - }, "regexpp": { "version": "3.2.0", "dev": true }, - "regexpu-core": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-5.3.2.tgz", - "integrity": "sha512-RAM5FlZz+Lhmo7db9L298p2vHP5ZywrVXmVXpmAD9GuL5MPH6t9ROw1iA/wfHkQ76Qe7AaPF0nGuim96/IrQMQ==", - "dev": true, - "requires": { - "@babel/regjsgen": "^0.8.0", - "regenerate": "^1.4.2", - "regenerate-unicode-properties": "^10.1.0", - "regjsparser": "^0.9.1", - "unicode-match-property-ecmascript": "^2.0.0", - "unicode-match-property-value-ecmascript": "^2.1.0" - } - }, - "regjsparser": { - "version": "0.9.1", - "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.9.1.tgz", - "integrity": "sha512-dQUtn90WanSNl+7mQKcXAgZxvUe7Z0SqXlgzv0za4LwiUhyzBC58yQO3liFoUgu8GiJVInAhJjkj1N0EtQ5nkQ==", - "dev": true, - "requires": { - "jsesc": "~0.5.0" - }, - "dependencies": { - "jsesc": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", - "integrity": "sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA==", - "dev": true - } - } - }, "release-zalgo": { "version": "1.0.0", "dev": true, @@ -11954,14 +8987,10 @@ "dev": true }, "resolve": { - "version": "1.22.8", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", - "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==", + "version": "1.12.0", "dev": true, "requires": { - "is-core-module": "^2.13.0", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" + "path-parse": "^1.0.6" } }, "resolve-from": { @@ -12101,12 +9130,6 @@ "version": "1.0.0", "dev": true }, - "slash": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-2.0.0.tgz", - "integrity": "sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A==", - "dev": true - }, "socket.io": { "version": "4.6.1", "dev": true, @@ -12304,12 +9327,6 @@ "has-flag": "^3.0.0" } }, - "supports-preserve-symlinks-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", - "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", - "dev": true - }, "syntax-error": { "version": "1.4.0", "dev": true, @@ -12358,8 +9375,6 @@ }, "to-fast-properties": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", - "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==", "dev": true }, "to-regex-range": { @@ -12427,34 +9442,6 @@ "xtend": "^4.0.1" } }, - "unicode-canonical-property-names-ecmascript": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.0.tgz", - "integrity": "sha512-yY5PpDlfVIU5+y/BSCxAJRBIS1Zc2dDG3Ujq+sR0U+JjUevW2JhocOF+soROYDSaAezOzOKuyyixhD6mBknSmQ==", - "dev": true - }, - "unicode-match-property-ecmascript": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-2.0.0.tgz", - "integrity": "sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==", - "dev": true, - "requires": { - "unicode-canonical-property-names-ecmascript": "^2.0.0", - "unicode-property-aliases-ecmascript": "^2.0.0" - } - }, - "unicode-match-property-value-ecmascript": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.1.0.tgz", - "integrity": "sha512-qxkjQt6qjg/mYscYMC0XKRn3Rh0wFPlfxB0xkt9CfyTvpX1Ra0+rAmdX2QyAobptSEvuy4RtpPRui6XkV+8wjA==", - "dev": true - }, - "unicode-property-aliases-ecmascript": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.1.0.tgz", - "integrity": "sha512-6t3foTQI9qne+OZoVQB/8x8rk2k1eVy1gRXhV3oFQ5T6R1dqQ1xtin3XqSlx3+ATBkliTaR/hHyJBm+LVPNM8w==", - "dev": true - }, "universalify": { "version": "0.1.2", "dev": true @@ -12464,9 +9451,7 @@ "dev": true }, "update-browserslist-db": { - "version": "1.0.13", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.13.tgz", - "integrity": "sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==", + "version": "1.0.10", "dev": true, "requires": { "escalade": "^3.1.1", @@ -12616,8 +9601,6 @@ }, "yallist": { "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", - "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", "dev": true }, "yargs": { diff --git a/package.json b/package.json index 71064c4d..196d6b02 100644 --- a/package.json +++ b/package.json @@ -9,17 +9,11 @@ "lint": "make lint", "test": "make test" }, - "module": "./mjs-lib/index.js", - "exports": { - "import": "./mjs-lib/index.js", - "require": "./index.js" - }, "files": [ "index.js", "index.d.ts", "dist/", - "lib/", - "mjs-lib/" + "lib/" ], "engines": { "node": ">17.0.0" @@ -30,11 +24,6 @@ "algorithms" ], "devDependencies": { - "@babel/cli": "^7.23.9", - "@babel/core": "^7.23.9", - "@babel/plugin-transform-modules-commonjs": "^7.23.3", - "@babel/preset-env": "^7.23.9", - "babel-plugin-add-module-exports": "^1.0.4", "benchmark": "2.1.4", "browserify": "16.5.1", "chai": "^4.3.6", diff --git a/src/release/make-bower.json.js b/src/release/make-bower.json.js index 7b327c90..6fcf4b20 100755 --- a/src/release/make-bower.json.js +++ b/src/release/make-bower.json.js @@ -21,8 +21,6 @@ var template = { "index.js", "karma*", "lib/**", - "mjs-lib/**", - "old-lib/**", "package.json", "src/**", "test/**" diff --git a/src/release/make-version.js b/src/release/make-version.js index fdbc92ca..39f2642b 100755 --- a/src/release/make-version.js +++ b/src/release/make-version.js @@ -1,4 +1,4 @@ #!/usr/bin/env node var package = require('../../package.json'); -console.log('export default \'' + package.version + '\';'); +console.log('module.exports = \'' + package.version + '\';'); diff --git a/src/release/release.sh b/src/release/release.sh index 9ea41554..f098194f 100755 --- a/src/release/release.sh +++ b/src/release/release.sh @@ -59,7 +59,7 @@ echo Published to npm # Update patch level version + commit ./src/release/bump-version.js -make mjs-lib/version.js +make lib/version.js git commit package.json lib/version.js -m "Bump version and set as pre-release" git push origin echo Updated patch version From fbeef3a46d3e06b04bcdc9491d1628ecd008cd84 Mon Sep 17 00:00:00 2001 From: David Newell Date: Fri, 15 Mar 2024 14:38:41 +0000 Subject: [PATCH 61/85] Bumping the version to revert the import/export merge --- lib/version.js | 2 +- package.json | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/lib/version.js b/lib/version.js index cf694a31..d810b945 100644 --- a/lib/version.js +++ b/lib/version.js @@ -1 +1 @@ -module.exports = '2.2.1-pre'; +module.exports = '2.2.1'; diff --git a/package.json b/package.json index 196d6b02..6e25765b 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@dagrejs/graphlib", - "version": "2.2.1-pre", + "version": "2.2.1", "description": "A directed and undirected multi-graph library", "author": "Chris Pettitt ", "license": "MIT", @@ -48,4 +48,4 @@ "type": "git", "url": "https://github.com/dagrejs/graphlib.git" } -} \ No newline at end of file +} From b2f1920466ef1ee15f960ef47ff875c498b6b42c Mon Sep 17 00:00:00 2001 From: David Newell Date: Fri, 15 Mar 2024 14:40:19 +0000 Subject: [PATCH 62/85] package lock --- package-lock.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/package-lock.json b/package-lock.json index 29335b31..cc01a46b 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "@dagrejs/graphlib", - "version": "2.2.1-pre", + "version": "2.2.1", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "@dagrejs/graphlib", - "version": "2.2.1-pre", + "version": "2.2.1", "license": "MIT", "devDependencies": { "benchmark": "2.1.4", From a221a33f3de21132d562e30000cff671d81c850a Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 15 Mar 2024 14:40:51 +0000 Subject: [PATCH 63/85] Bump follow-redirects from 1.15.4 to 1.15.6 Bumps [follow-redirects](https://github.com/follow-redirects/follow-redirects) from 1.15.4 to 1.15.6. - [Release notes](https://github.com/follow-redirects/follow-redirects/releases) - [Commits](https://github.com/follow-redirects/follow-redirects/compare/v1.15.4...v1.15.6) --- updated-dependencies: - dependency-name: follow-redirects dependency-type: indirect ... Signed-off-by: dependabot[bot] --- package-lock.json | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/package-lock.json b/package-lock.json index cc01a46b..87b2633e 100644 --- a/package-lock.json +++ b/package-lock.json @@ -2440,9 +2440,9 @@ "license": "ISC" }, "node_modules/follow-redirects": { - "version": "1.15.4", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.4.tgz", - "integrity": "sha512-Cr4D/5wlrb0z9dgERpUL3LrmPKVDsETIJhaCMeDfuFYcqa5bldGV6wBsAN6X/vxlXQtFBMrXdXxdL8CbDTGniw==", + "version": "1.15.6", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.6.tgz", + "integrity": "sha512-wWN62YITEaOpSK584EZXJafH1AGpO8RVgElfkuXbTOrPX4fIfOyEpW/CsiNd8JdYrAoOvafRTOEnvsO++qCqFA==", "dev": true, "funding": [ { @@ -7476,9 +7476,9 @@ "dev": true }, "follow-redirects": { - "version": "1.15.4", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.4.tgz", - "integrity": "sha512-Cr4D/5wlrb0z9dgERpUL3LrmPKVDsETIJhaCMeDfuFYcqa5bldGV6wBsAN6X/vxlXQtFBMrXdXxdL8CbDTGniw==", + "version": "1.15.6", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.6.tgz", + "integrity": "sha512-wWN62YITEaOpSK584EZXJafH1AGpO8RVgElfkuXbTOrPX4fIfOyEpW/CsiNd8JdYrAoOvafRTOEnvsO++qCqFA==", "dev": true }, "foreground-child": { From 6a32e2f2cf512242b0faf1d4dc95ed6ff7c80159 Mon Sep 17 00:00:00 2001 From: David Newell Date: Fri, 15 Mar 2024 15:49:34 +0100 Subject: [PATCH 64/85] Removing firefox since it's not working and karma is deprecated --- karma.conf.js | 2 +- karma.core.conf.js | 2 +- package-lock.json | 28 ---------------------------- package.json | 1 - 4 files changed, 2 insertions(+), 31 deletions(-) diff --git a/karma.conf.js b/karma.conf.js index 4bb265f4..fc038e37 100644 --- a/karma.conf.js +++ b/karma.conf.js @@ -58,7 +58,7 @@ module.exports = function(config) { // start these browsers // available browser launchers: https://npmjs.org/browse/keyword/karma-launcher - browsers: ['Chrome', 'Firefox'], + browsers: ['Chrome'], // Continuous Integration mode diff --git a/karma.core.conf.js b/karma.core.conf.js index 8b81f68e..745c954a 100644 --- a/karma.core.conf.js +++ b/karma.core.conf.js @@ -58,7 +58,7 @@ module.exports = function(config) { // start these browsers // available browser launchers: https://npmjs.org/browse/keyword/karma-launcher - browsers: ['Chrome', 'Firefox'], + browsers: ['Chrome'], // Continuous Integration mode diff --git a/package-lock.json b/package-lock.json index cc01a46b..b3c5ca34 100644 --- a/package-lock.json +++ b/package-lock.json @@ -17,7 +17,6 @@ "jshint-stylish": "2.2.1", "karma": "6.4.1", "karma-chrome-launcher": "3.1.0", - "karma-firefox-launcher": "1.3.0", "karma-mocha": "2.0.1", "karma-requirejs": "1.1.0", "karma-safari-launcher": "1.0.0", @@ -3041,14 +3040,6 @@ "node": ">=0.10.0" } }, - "node_modules/is-wsl": { - "version": "2.1.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, "node_modules/isarray": { "version": "1.0.0", "dev": true, @@ -3434,14 +3425,6 @@ "which": "^1.2.1" } }, - "node_modules/karma-firefox-launcher": { - "version": "1.3.0", - "dev": true, - "license": "MIT", - "dependencies": { - "is-wsl": "^2.1.0" - } - }, "node_modules/karma-mocha": { "version": "2.0.1", "dev": true, @@ -7840,10 +7823,6 @@ "version": "1.0.2", "dev": true }, - "is-wsl": { - "version": "2.1.0", - "dev": true - }, "isarray": { "version": "1.0.0", "dev": true @@ -8129,13 +8108,6 @@ "which": "^1.2.1" } }, - "karma-firefox-launcher": { - "version": "1.3.0", - "dev": true, - "requires": { - "is-wsl": "^2.1.0" - } - }, "karma-mocha": { "version": "2.0.1", "dev": true, diff --git a/package.json b/package.json index 6e25765b..a772d994 100644 --- a/package.json +++ b/package.json @@ -32,7 +32,6 @@ "jshint-stylish": "2.2.1", "karma": "6.4.1", "karma-chrome-launcher": "3.1.0", - "karma-firefox-launcher": "1.3.0", "karma-mocha": "2.0.1", "karma-requirejs": "1.1.0", "karma-safari-launcher": "1.0.0", From 754498591148bd84c7e10a9b34e6452914f1a968 Mon Sep 17 00:00:00 2001 From: David Newell Date: Fri, 15 Mar 2024 15:50:14 +0100 Subject: [PATCH 65/85] Building dist --- bower.json | 4 +- dist/graphlib.core.js | 542 +++++++++++++++----------------------- dist/graphlib.core.min.js | 19 +- dist/graphlib.js | 542 +++++++++++++++----------------------- dist/graphlib.min.js | 19 +- 5 files changed, 455 insertions(+), 671 deletions(-) diff --git a/bower.json b/bower.json index 233672ef..229def72 100644 --- a/bower.json +++ b/bower.json @@ -1,6 +1,6 @@ { "name": "graphlib", - "version": "2.2.0", + "version": "2.2.1", "main": [ "dist/graphlib.core.js" ], @@ -15,8 +15,6 @@ "index.js", "karma*", "lib/**", - "mjs-lib/**", - "old-lib/**", "package.json", "src/**", "test/**" diff --git a/dist/graphlib.core.js b/dist/graphlib.core.js index 6d12a675..1ed4f81f 100644 --- a/dist/graphlib.core.js +++ b/dist/graphlib.core.js @@ -39,16 +39,13 @@ module.exports = { }; },{"./lib":17,"./lib/alg":8,"./lib/json":18}],2:[function(require,module,exports){ -"use strict"; +module.exports = components; -Object.defineProperty(exports, "__esModule", { - value: true -}); -exports.default = components; function components(g) { var visited = {}; var cmpts = []; var cmpt; + function dfs(v) { if (visited.hasOwnProperty(v)) return; visited[v] = true; @@ -56,24 +53,21 @@ function components(g) { g.successors(v).forEach(dfs); g.predecessors(v).forEach(dfs); } - g.nodes().forEach(function (v) { + + g.nodes().forEach(function(v) { cmpt = []; dfs(v); if (cmpt.length) { cmpts.push(cmpt); } }); + return cmpts; } -module.exports = exports.default; },{}],3:[function(require,module,exports){ -"use strict"; +module.exports = dfs; -Object.defineProperty(exports, "__esModule", { - value: true -}); -exports.default = dfs; /* * A helper that preforms a pre- or post-order traversal on the input graph * and returns the nodes in the order they were visited. If the graph is @@ -86,18 +80,23 @@ function dfs(g, vs, order) { if (!Array.isArray(vs)) { vs = [vs]; } + var navigation = g.isDirected() ? v => g.successors(v) : v => g.neighbors(v); var orderFunc = order === "post" ? postOrderDfs : preOrderDfs; + var acc = []; var visited = {}; vs.forEach(v => { if (!g.hasNode(v)) { throw new Error("Graph does not have node: " + v); } + orderFunc(v, navigation, visited, acc); }); + return acc; } + function postOrderDfs(v, navigation, visited, acc) { var stack = [[v, false]]; while (stack.length > 0) { @@ -113,6 +112,7 @@ function postOrderDfs(v, navigation, visited, acc) { } } } + function preOrderDfs(v, navigation, visited, acc) { var stack = [v]; while (stack.length > 0) { @@ -124,142 +124,129 @@ function preOrderDfs(v, navigation, visited, acc) { } } } + function forEachRight(array, iteratee) { var length = array.length; while (length--) { iteratee(array[length], length, array); } + return array; } -module.exports = exports.default; },{}],4:[function(require,module,exports){ -"use strict"; +var dijkstra = require("./dijkstra"); + +module.exports = dijkstraAll; -Object.defineProperty(exports, "__esModule", { - value: true -}); -exports.default = dijkstraAll; -var _dijkstra = _interopRequireDefault(require("./dijkstra.js")); -function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function dijkstraAll(g, weightFunc, edgeFunc) { - return g.nodes().reduce(function (acc, v) { - acc[v] = (0, _dijkstra.default)(g, v, weightFunc, edgeFunc); + return g.nodes().reduce(function(acc, v) { + acc[v] = dijkstra(g, v, weightFunc, edgeFunc); return acc; }, {}); } -module.exports = exports.default; -},{"./dijkstra.js":5}],5:[function(require,module,exports){ -"use strict"; +},{"./dijkstra":5}],5:[function(require,module,exports){ +var PriorityQueue = require("../data/priority-queue"); + +module.exports = dijkstra; -Object.defineProperty(exports, "__esModule", { - value: true -}); -exports.default = dijkstra; -var _priorityQueue = _interopRequireDefault(require("../data/priority-queue.js")); -function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } var DEFAULT_WEIGHT_FUNC = () => 1; + function dijkstra(g, source, weightFn, edgeFn) { - return runDijkstra(g, String(source), weightFn || DEFAULT_WEIGHT_FUNC, edgeFn || function (v) { - return g.outEdges(v); - }); + return runDijkstra(g, String(source), + weightFn || DEFAULT_WEIGHT_FUNC, + edgeFn || function(v) { return g.outEdges(v); }); } + function runDijkstra(g, source, weightFn, edgeFn) { var results = {}; - var pq = new _priorityQueue.default(); + var pq = new PriorityQueue(); var v, vEntry; - var updateNeighbors = function (edge) { + + var updateNeighbors = function(edge) { var w = edge.v !== v ? edge.v : edge.w; var wEntry = results[w]; var weight = weightFn(edge); var distance = vEntry.distance + weight; + if (weight < 0) { - throw new Error("dijkstra does not allow negative edge weights. " + "Bad edge: " + edge + " Weight: " + weight); + throw new Error("dijkstra does not allow negative edge weights. " + + "Bad edge: " + edge + " Weight: " + weight); } + if (distance < wEntry.distance) { wEntry.distance = distance; wEntry.predecessor = v; pq.decrease(w, distance); } }; - g.nodes().forEach(function (v) { + + g.nodes().forEach(function(v) { var distance = v === source ? 0 : Number.POSITIVE_INFINITY; - results[v] = { - distance: distance - }; + results[v] = { distance: distance }; pq.add(v, distance); }); + while (pq.size() > 0) { v = pq.removeMin(); vEntry = results[v]; if (vEntry.distance === Number.POSITIVE_INFINITY) { break; } + edgeFn(v).forEach(updateNeighbors); } + return results; } -module.exports = exports.default; -},{"../data/priority-queue.js":15}],6:[function(require,module,exports){ -"use strict"; +},{"../data/priority-queue":15}],6:[function(require,module,exports){ +var tarjan = require("./tarjan"); + +module.exports = findCycles; -Object.defineProperty(exports, "__esModule", { - value: true -}); -exports.default = findCycles; -var _tarjan = _interopRequireDefault(require("./tarjan.js")); -function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function findCycles(g) { - return (0, _tarjan.default)(g).filter(function (cmpt) { - return cmpt.length > 1 || cmpt.length === 1 && g.hasEdge(cmpt[0], cmpt[0]); + return tarjan(g).filter(function(cmpt) { + return cmpt.length > 1 || (cmpt.length === 1 && g.hasEdge(cmpt[0], cmpt[0])); }); } -module.exports = exports.default; -},{"./tarjan.js":13}],7:[function(require,module,exports){ -"use strict"; +},{"./tarjan":13}],7:[function(require,module,exports){ +module.exports = floydWarshall; -Object.defineProperty(exports, "__esModule", { - value: true -}); -exports.default = floydWarshall; var DEFAULT_WEIGHT_FUNC = () => 1; + function floydWarshall(g, weightFn, edgeFn) { - return runFloydWarshall(g, weightFn || DEFAULT_WEIGHT_FUNC, edgeFn || function (v) { - return g.outEdges(v); - }); + return runFloydWarshall(g, + weightFn || DEFAULT_WEIGHT_FUNC, + edgeFn || function(v) { return g.outEdges(v); }); } + function runFloydWarshall(g, weightFn, edgeFn) { var results = {}; var nodes = g.nodes(); - nodes.forEach(function (v) { + + nodes.forEach(function(v) { results[v] = {}; - results[v][v] = { - distance: 0 - }; - nodes.forEach(function (w) { + results[v][v] = { distance: 0 }; + nodes.forEach(function(w) { if (v !== w) { - results[v][w] = { - distance: Number.POSITIVE_INFINITY - }; + results[v][w] = { distance: Number.POSITIVE_INFINITY }; } }); - edgeFn(v).forEach(function (edge) { + edgeFn(v).forEach(function(edge) { var w = edge.v === v ? edge.w : edge.v; var d = weightFn(edge); - results[v][w] = { - distance: d, - predecessor: v - }; + results[v][w] = { distance: d, predecessor: v }; }); }); - nodes.forEach(function (k) { + + nodes.forEach(function(k) { var rowK = results[k]; - nodes.forEach(function (i) { + nodes.forEach(function(i) { var rowI = results[i]; - nodes.forEach(function (j) { + nodes.forEach(function(j) { var ik = rowI[k]; var kj = rowK[j]; var ij = rowI[j]; @@ -271,160 +258,72 @@ function runFloydWarshall(g, weightFn, edgeFn) { }); }); }); + return results; } -module.exports = exports.default; },{}],8:[function(require,module,exports){ -"use strict"; +module.exports = { + components: require("./components"), + dijkstra: require("./dijkstra"), + dijkstraAll: require("./dijkstra-all"), + findCycles: require("./find-cycles"), + floydWarshall: require("./floyd-warshall"), + isAcyclic: require("./is-acyclic"), + postorder: require("./postorder"), + preorder: require("./preorder"), + prim: require("./prim"), + tarjan: require("./tarjan"), + topsort: require("./topsort") +}; -Object.defineProperty(exports, "__esModule", { - value: true -}); -Object.defineProperty(exports, "components", { - enumerable: true, - get: function () { - return _components.default; - } -}); -Object.defineProperty(exports, "dijkstra", { - enumerable: true, - get: function () { - return _dijkstra.default; - } -}); -Object.defineProperty(exports, "dijkstraAll", { - enumerable: true, - get: function () { - return _dijkstraAll.default; - } -}); -Object.defineProperty(exports, "findCycles", { - enumerable: true, - get: function () { - return _findCycles.default; - } -}); -Object.defineProperty(exports, "floydWarshall", { - enumerable: true, - get: function () { - return _floydWarshall.default; - } -}); -Object.defineProperty(exports, "isAcyclic", { - enumerable: true, - get: function () { - return _isAcyclic.default; - } -}); -Object.defineProperty(exports, "postorder", { - enumerable: true, - get: function () { - return _postorder.default; - } -}); -Object.defineProperty(exports, "preorder", { - enumerable: true, - get: function () { - return _preorder.default; - } -}); -Object.defineProperty(exports, "prim", { - enumerable: true, - get: function () { - return _prim.default; - } -}); -Object.defineProperty(exports, "tarjan", { - enumerable: true, - get: function () { - return _tarjan.default; - } -}); -Object.defineProperty(exports, "topsort", { - enumerable: true, - get: function () { - return _topsort.default; - } -}); -var _components = _interopRequireDefault(require("./components.js")); -var _dijkstra = _interopRequireDefault(require("./dijkstra.js")); -var _dijkstraAll = _interopRequireDefault(require("./dijkstra-all.js")); -var _findCycles = _interopRequireDefault(require("./find-cycles.js")); -var _floydWarshall = _interopRequireDefault(require("./floyd-warshall.js")); -var _isAcyclic = _interopRequireDefault(require("./is-acyclic.js")); -var _postorder = _interopRequireDefault(require("./postorder.js")); -var _preorder = _interopRequireDefault(require("./preorder.js")); -var _prim = _interopRequireDefault(require("./prim.js")); -var _tarjan = _interopRequireDefault(require("./tarjan.js")); -var _topsort = _interopRequireDefault(require("./topsort.js")); -function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } - -},{"./components.js":2,"./dijkstra-all.js":4,"./dijkstra.js":5,"./find-cycles.js":6,"./floyd-warshall.js":7,"./is-acyclic.js":9,"./postorder.js":10,"./preorder.js":11,"./prim.js":12,"./tarjan.js":13,"./topsort.js":14}],9:[function(require,module,exports){ -"use strict"; +},{"./components":2,"./dijkstra":5,"./dijkstra-all":4,"./find-cycles":6,"./floyd-warshall":7,"./is-acyclic":9,"./postorder":10,"./preorder":11,"./prim":12,"./tarjan":13,"./topsort":14}],9:[function(require,module,exports){ +var topsort = require("./topsort"); + +module.exports = isAcyclic; -Object.defineProperty(exports, "__esModule", { - value: true -}); -exports.default = isAcyclic; -var _topsort = _interopRequireDefault(require("./topsort.js")); -function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function isAcyclic(g) { try { - (0, _topsort.default)(g); + topsort(g); } catch (e) { - if (e instanceof _topsort.default.CycleException) { + if (e instanceof topsort.CycleException) { return false; } throw e; } return true; } -module.exports = exports.default; -},{"./topsort.js":14}],10:[function(require,module,exports){ -"use strict"; +},{"./topsort":14}],10:[function(require,module,exports){ +var dfs = require("./dfs"); + +module.exports = postorder; -Object.defineProperty(exports, "__esModule", { - value: true -}); -exports.default = postorder; -var _dfs = _interopRequireDefault(require("./dfs.js")); -function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function postorder(g, vs) { - return (0, _dfs.default)(g, vs, "post"); + return dfs(g, vs, "post"); } -module.exports = exports.default; -},{"./dfs.js":3}],11:[function(require,module,exports){ -"use strict"; +},{"./dfs":3}],11:[function(require,module,exports){ +var dfs = require("./dfs"); + +module.exports = preorder; -Object.defineProperty(exports, "__esModule", { - value: true -}); -exports.default = preorder; -var _dfs = _interopRequireDefault(require("./dfs.js")); -function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function preorder(g, vs) { - return (0, _dfs.default)(g, vs, "pre"); + return dfs(g, vs, "pre"); } -module.exports = exports.default; -},{"./dfs.js":3}],12:[function(require,module,exports){ -"use strict"; +},{"./dfs":3}],12:[function(require,module,exports){ +var Graph = require("../graph"); +var PriorityQueue = require("../data/priority-queue"); + +module.exports = prim; -Object.defineProperty(exports, "__esModule", { - value: true -}); -exports.default = prim; -var _graph = _interopRequireDefault(require("../graph.js")); -var _priorityQueue = _interopRequireDefault(require("../data/priority-queue.js")); -function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function prim(g, weightFunc) { - var result = new _graph.default(); + var result = new Graph(); var parents = {}; - var pq = new _priorityQueue.default(); + var pq = new PriorityQueue(); var v; + function updateNeighbors(edge) { var w = edge.v === v ? edge.w : edge.v; var pri = pq.priority(w); @@ -436,16 +335,19 @@ function prim(g, weightFunc) { } } } + if (g.nodeCount() === 0) { return result; } - g.nodes().forEach(function (v) { + + g.nodes().forEach(function(v) { pq.add(v, Number.POSITIVE_INFINITY); result.setNode(v); }); // Start from an arbitrary node pq.decrease(g.nodes()[0], 0); + var init = false; while (pq.size() > 0) { v = pq.removeMin(); @@ -456,24 +358,22 @@ function prim(g, weightFunc) { } else { init = true; } + g.nodeEdges(v).forEach(updateNeighbors); } + return result; } -module.exports = exports.default; -},{"../data/priority-queue.js":15,"../graph.js":16}],13:[function(require,module,exports){ -"use strict"; +},{"../data/priority-queue":15,"../graph":16}],13:[function(require,module,exports){ +module.exports = tarjan; -Object.defineProperty(exports, "__esModule", { - value: true -}); -exports.default = tarjan; function tarjan(g) { var index = 0; var stack = []; var visited = {}; // node id -> { onStack, lowlink, index } var results = []; + function dfs(v) { var entry = visited[v] = { onStack: true, @@ -481,7 +381,8 @@ function tarjan(g) { index: index++ }; stack.push(v); - g.successors(v).forEach(function (w) { + + g.successors(v).forEach(function(w) { if (!visited.hasOwnProperty(w)) { dfs(w); entry.lowlink = Math.min(entry.lowlink, visited[w].lowlink); @@ -489,6 +390,7 @@ function tarjan(g) { entry.lowlink = Math.min(entry.lowlink, visited[w].index); } }); + if (entry.lowlink === entry.index) { var cmpt = []; var w; @@ -500,30 +402,27 @@ function tarjan(g) { results.push(cmpt); } } - g.nodes().forEach(function (v) { + + g.nodes().forEach(function(v) { if (!visited.hasOwnProperty(v)) { dfs(v); } }); + return results; } -module.exports = exports.default; },{}],14:[function(require,module,exports){ -"use strict"; - -Object.defineProperty(exports, "__esModule", { - value: true -}); -exports.default = topsort; function topsort(g) { var visited = {}; var stack = {}; var results = []; + function visit(node) { if (stack.hasOwnProperty(node)) { throw new CycleException(); } + if (!visited.hasOwnProperty(node)) { stack[node] = true; visited[node] = true; @@ -532,27 +431,26 @@ function topsort(g) { results.push(node); } } + g.sinks().forEach(visit); + if (Object.keys(visited).length !== g.nodeCount()) { throw new CycleException(); } + return results; } + class CycleException extends Error { constructor() { super(...arguments); } } + +module.exports = topsort; topsort.CycleException = CycleException; -module.exports = exports.default; },{}],15:[function(require,module,exports){ -"use strict"; - -Object.defineProperty(exports, "__esModule", { - value: true -}); -exports.default = void 0; /** * A min-priority queue data structure. This algorithm is derived from Cormen, * et al., "Introduction to Algorithms". The basic idea of a min-priority @@ -575,9 +473,7 @@ class PriorityQueue { * Returns the keys that are in the queue. Takes `O(n)` time. */ keys() { - return this.#arr.map(function (x) { - return x.key; - }); + return this.#arr.map(function(x) { return x.key; }); } /** @@ -626,10 +522,7 @@ class PriorityQueue { var arr = this.#arr; var index = arr.length; keyIndices[key] = index; - arr.push({ - key: key, - priority: priority - }); + arr.push({key: key, priority: priority}); this.#decrease(index); return true; } @@ -657,11 +550,13 @@ class PriorityQueue { decrease(key, priority) { var index = this.#keyIndices[key]; if (priority > this.#arr[index].priority) { - throw new Error("New priority is greater than current priority. " + "Key: " + key + " Old: " + this.#arr[index].priority + " New: " + priority); + throw new Error("New priority is greater than current priority. " + + "Key: " + key + " Old: " + this.#arr[index].priority + " New: " + priority); } this.#arr[index].priority = priority; this.#decrease(index); } + #heapify(i) { var arr = this.#arr; var l = 2 * i; @@ -678,6 +573,7 @@ class PriorityQueue { } } } + #decrease(index) { var arr = this.#arr; var priority = arr[index].priority; @@ -691,6 +587,7 @@ class PriorityQueue { index = parent; } } + #swap(i, j) { var arr = this.#arr; var keyIndices = this.#keyIndices; @@ -702,16 +599,12 @@ class PriorityQueue { keyIndices[origArrI.key] = j; } } -exports.default = PriorityQueue; -module.exports = exports.default; + +module.exports = PriorityQueue; },{}],16:[function(require,module,exports){ "use strict"; -Object.defineProperty(exports, "__esModule", { - value: true -}); -exports.default = void 0; var DEFAULT_EDGE_NAME = "\x00"; var GRAPH_NODE = "\x00"; var EDGE_KEY_DELIM = "\x01"; @@ -766,14 +659,18 @@ class Graph { /* Number of edges in the graph. Should only be changed by the implementation. */ #edgeCount = 0; + #parent; + #children; + constructor(opts) { if (opts) { this.#isDirected = opts.hasOwnProperty("directed") ? opts.directed : true; this.#isMultigraph = opts.hasOwnProperty("multigraph") ? opts.multigraph : false; this.#isCompound = opts.hasOwnProperty("compound") ? opts.compound : false; } + if (this.#isCompound) { // v -> parent this.#parent = {}; @@ -822,6 +719,7 @@ class Graph { return this.#label; } + /* === Node functions ========== */ /** @@ -836,6 +734,7 @@ class Graph { if (typeof newDefault !== 'function') { this.#defaultNodeLabelFn = () => newDefault; } + return this; } @@ -881,7 +780,7 @@ class Graph { setNodes(vs, value) { var args = arguments; var self = this; - vs.forEach(function (v) { + vs.forEach(function(v) { if (args.length > 1) { self.setNode(v, value); } else { @@ -904,6 +803,7 @@ class Graph { } return this; } + this.#nodes[v] = arguments.length > 1 ? value : this.#defaultNodeLabelFn(v); if (this.#isCompound) { this.#parent[v] = GRAPH_NODE; @@ -947,7 +847,7 @@ class Graph { if (this.#isCompound) { this.#removeFromParentsChildList(v); delete this.#parent[v]; - this.children(v).forEach(function (child) { + this.children(v).forEach(function(child) { self.setParent(child); }); delete this.#children[v]; @@ -973,6 +873,7 @@ class Graph { if (!this.#isCompound) { throw new Error("Cannot set parent in a non-compound graph"); } + if (parent === undefined) { parent = GRAPH_NODE; } else { @@ -980,17 +881,21 @@ class Graph { parent += ""; for (var ancestor = parent; ancestor !== undefined; ancestor = this.parent(ancestor)) { if (ancestor === v) { - throw new Error("Setting " + parent + " as parent of " + v + " would create a cycle"); + throw new Error("Setting " + parent+ " as parent of " + v + + " would create a cycle"); } } + this.setNode(parent); } + this.setNode(v); this.#removeFromParentsChildList(v); this.#parent[v] = parent; this.#children[parent][v] = true; return this; } + #removeFromParentsChildList(v) { delete this.#children[this.#parent[v]][v]; } @@ -1061,9 +966,11 @@ class Graph { for (var succ of this.successors(v)) { union.add(succ); } + return Array.from(union.values()); } } + isLeaf(v) { var neighbors; if (this.isDirected()) { @@ -1086,18 +993,22 @@ class Graph { multigraph: this.#isMultigraph, compound: this.#isCompound }); + copy.setGraph(this.graph()); + var self = this; - Object.entries(this.#nodes).forEach(function ([v, value]) { + Object.entries(this.#nodes).forEach(function([v, value]) { if (filter(v)) { copy.setNode(v, value); } }); - Object.values(this.#edgeObjs).forEach(function (e) { + + Object.values(this.#edgeObjs).forEach(function(e) { if (copy.hasNode(e.v) && copy.hasNode(e.w)) { copy.setEdge(e, self.edge(e)); } }); + var parents = {}; function findParent(v) { var parent = self.parent(v); @@ -1110,9 +1021,11 @@ class Graph { return findParent(parent); } } + if (this.#isCompound) { copy.nodes().forEach(v => copy.setParent(v, findParent(v))); } + return copy; } @@ -1130,6 +1043,7 @@ class Graph { if (typeof newDefault !== 'function') { this.#defaultEdgeLabelFn = () => newDefault; } + return this; } @@ -1158,7 +1072,7 @@ class Graph { setPath(vs, value) { var self = this; var args = arguments; - vs.reduce(function (v, w) { + vs.reduce(function(v, w) { if (args.length > 1) { self.setEdge(v, w, value); } else { @@ -1179,6 +1093,7 @@ class Graph { var v, w, name, value; var valueSpecified = false; var arg0 = arguments[0]; + if (typeof arg0 === "object" && arg0 !== null && "v" in arg0) { v = arg0.v; w = arg0.w; @@ -1196,11 +1111,13 @@ class Graph { valueSpecified = true; } } + v = "" + v; w = "" + w; if (name !== undefined) { name = "" + name; } + var e = edgeArgsToId(this.#isDirected, v, w, name); if (this.#edgeLabels.hasOwnProperty(e)) { if (valueSpecified) { @@ -1208,6 +1125,7 @@ class Graph { } return this; } + if (name !== undefined && !this.#isMultigraph) { throw new Error("Cannot set a named edge when isMultigraph = false"); } @@ -1216,11 +1134,14 @@ class Graph { // First ensure the nodes exist. this.setNode(v); this.setNode(w); + this.#edgeLabels[e] = valueSpecified ? value : this.#defaultEdgeLabelFn(v, w, name); + var edgeObj = edgeArgsToObj(this.#isDirected, v, w, name); // Ensure we add undirected edges in a consistent way. v = edgeObj.v; w = edgeObj.w; + Object.freeze(edgeObj); this.#edgeObjs[e] = edgeObj; incrementOrInitEntry(this.#preds[w], v); @@ -1236,7 +1157,9 @@ class Graph { * Complexity: O(1). */ edge(v, w, name) { - var e = arguments.length === 1 ? edgeObjToId(this.#isDirected, arguments[0]) : edgeArgsToId(this.#isDirected, v, w, name); + var e = (arguments.length === 1 + ? edgeObjToId(this.#isDirected, arguments[0]) + : edgeArgsToId(this.#isDirected, v, w, name)); return this.#edgeLabels[e]; } @@ -1247,10 +1170,9 @@ class Graph { edgeAsObj() { const edge = this.edge(...arguments); if (typeof edge !== "object") { - return { - label: edge - }; + return {label: edge}; } + return edge; } @@ -1259,7 +1181,9 @@ class Graph { * Complexity: O(1). */ hasEdge(v, w, name) { - var e = arguments.length === 1 ? edgeObjToId(this.#isDirected, arguments[0]) : edgeArgsToId(this.#isDirected, v, w, name); + var e = (arguments.length === 1 + ? edgeObjToId(this.#isDirected, arguments[0]) + : edgeArgsToId(this.#isDirected, v, w, name)); return this.#edgeLabels.hasOwnProperty(e); } @@ -1268,7 +1192,9 @@ class Graph { * Complexity: O(1). */ removeEdge(v, w, name) { - var e = arguments.length === 1 ? edgeObjToId(this.#isDirected, arguments[0]) : edgeArgsToId(this.#isDirected, v, w, name); + var e = (arguments.length === 1 + ? edgeObjToId(this.#isDirected, arguments[0]) + : edgeArgsToId(this.#isDirected, v, w, name)); var edge = this.#edgeObjs[e]; if (edge) { v = edge.v; @@ -1328,7 +1254,7 @@ class Graph { } } } -exports.default = Graph; + function incrementOrInitEntry(map, k) { if (map[k]) { map[k]++; @@ -1336,11 +1262,11 @@ function incrementOrInitEntry(map, k) { map[k] = 1; } } + function decrementOrRemoveEntry(map, k) { - if (! --map[k]) { - delete map[k]; - } + if (!--map[k]) { delete map[k]; } } + function edgeArgsToId(isDirected, v_, w_, name) { var v = "" + v_; var w = "" + w_; @@ -1349,8 +1275,10 @@ function edgeArgsToId(isDirected, v_, w_, name) { v = w; w = tmp; } - return v + EDGE_KEY_DELIM + w + EDGE_KEY_DELIM + (name === undefined ? DEFAULT_EDGE_NAME : name); + return v + EDGE_KEY_DELIM + w + EDGE_KEY_DELIM + + (name === undefined ? DEFAULT_EDGE_NAME : name); } + function edgeArgsToObj(isDirected, v_, w_, name) { var v = "" + v_; var w = "" + w_; @@ -1359,59 +1287,34 @@ function edgeArgsToObj(isDirected, v_, w_, name) { v = w; w = tmp; } - var edgeObj = { - v: v, - w: w - }; + var edgeObj = { v: v, w: w }; if (name) { edgeObj.name = name; } return edgeObj; } + function edgeObjToId(isDirected, edgeObj) { return edgeArgsToId(isDirected, edgeObj.v, edgeObj.w, edgeObj.name); } -module.exports = exports.default; + +module.exports = Graph; },{}],17:[function(require,module,exports){ -"use strict"; +// Includes only the "core" of graphlib +module.exports = { + Graph: require("./graph"), + version: require("./version") +}; -Object.defineProperty(exports, "__esModule", { - value: true -}); -Object.defineProperty(exports, "Graph", { - enumerable: true, - get: function () { - return _graph.default; - } -}); -exports.json = exports.alg = void 0; -Object.defineProperty(exports, "version", { - enumerable: true, - get: function () { - return _version.default; - } -}); -var _graph = _interopRequireDefault(require("./graph.js")); -var _version = _interopRequireDefault(require("./version.js")); -var _json = _interopRequireWildcard(require("./json.js")); -exports.json = _json; -var _alg = _interopRequireWildcard(require("./alg/index.js")); -exports.alg = _alg; -function _getRequireWildcardCache(e) { if ("function" != typeof WeakMap) return null; var r = new WeakMap(), t = new WeakMap(); return (_getRequireWildcardCache = function (e) { return e ? t : r; })(e); } -function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e; if (null === e || "object" != typeof e && "function" != typeof e) return { default: e }; var t = _getRequireWildcardCache(r); if (t && t.has(e)) return t.get(e); var n = { __proto__: null }, a = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var u in e) if ("default" !== u && Object.prototype.hasOwnProperty.call(e, u)) { var i = a ? Object.getOwnPropertyDescriptor(e, u) : null; i && (i.get || i.set) ? Object.defineProperty(n, u, i) : n[u] = e[u]; } return n.default = e, t && t.set(e, n), n; } -function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } - -},{"./alg/index.js":8,"./graph.js":16,"./json.js":18,"./version.js":19}],18:[function(require,module,exports){ -"use strict"; +},{"./graph":16,"./version":19}],18:[function(require,module,exports){ +var Graph = require("./graph"); + +module.exports = { + write: write, + read: read +}; -Object.defineProperty(exports, "__esModule", { - value: true -}); -exports.read = read; -exports.write = write; -var _graph = _interopRequireDefault(require("./graph.js")); -function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } /** * Creates a JSON representation of the graph that can be serialized to a string with * JSON.stringify. The graph can later be restored using json.read. @@ -1426,18 +1329,18 @@ function write(g) { nodes: writeNodes(g), edges: writeEdges(g) }; + if (g.graph() !== undefined) { json.value = structuredClone(g.graph()); } return json; } + function writeNodes(g) { - return g.nodes().map(function (v) { + return g.nodes().map(function(v) { var nodeValue = g.node(v); var parent = g.parent(v); - var node = { - v: v - }; + var node = { v: v }; if (nodeValue !== undefined) { node.value = nodeValue; } @@ -1447,13 +1350,11 @@ function writeNodes(g) { return node; }); } + function writeEdges(g) { - return g.edges().map(function (e) { + return g.edges().map(function(e) { var edgeValue = g.edge(e); - var edge = { - v: e.v, - w: e.w - }; + var edge = { v: e.v, w: e.w }; if (e.name !== undefined) { edge.name = e.name; } @@ -1475,32 +1376,21 @@ function writeEdges(g) { * // [ { v: 'a', w: 'b' } ] */ function read(json) { - var g = new _graph.default(json.options).setGraph(json.value); - json.nodes.forEach(function (entry) { + var g = new Graph(json.options).setGraph(json.value); + json.nodes.forEach(function(entry) { g.setNode(entry.v, entry.value); if (entry.parent) { g.setParent(entry.v, entry.parent); } }); - json.edges.forEach(function (entry) { - g.setEdge({ - v: entry.v, - w: entry.w, - name: entry.name - }, entry.value); + json.edges.forEach(function(entry) { + g.setEdge({ v: entry.v, w: entry.w, name: entry.name }, entry.value); }); return g; } -},{"./graph.js":16}],19:[function(require,module,exports){ -"use strict"; - -Object.defineProperty(exports, "__esModule", { - value: true -}); -exports.default = void 0; -var _default = exports.default = '2.2.0'; -module.exports = exports.default; +},{"./graph":16}],19:[function(require,module,exports){ +module.exports = '2.2.1'; },{}]},{},[1])(1) }); diff --git a/dist/graphlib.core.min.js b/dist/graphlib.core.min.js index 91a8d88b..d43b43f8 100644 --- a/dist/graphlib.core.min.js +++ b/dist/graphlib.core.min.js @@ -28,7 +28,7 @@ * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -var lib=require("./lib");module.exports={Graph:lib.Graph,json:require("./lib/json"),alg:require("./lib/alg"),version:lib.version}},{"./lib":17,"./lib/alg":8,"./lib/json":18}],2:[function(require,module,exports){"use strict";Object.defineProperty(exports,"__esModule",{value:true});exports.default=components;function components(g){var visited={};var cmpts=[];var cmpt;function dfs(v){if(visited.hasOwnProperty(v))return;visited[v]=true;cmpt.push(v);g.successors(v).forEach(dfs);g.predecessors(v).forEach(dfs)}g.nodes().forEach(function(v){cmpt=[];dfs(v);if(cmpt.length){cmpts.push(cmpt)}});return cmpts}module.exports=exports.default},{}],3:[function(require,module,exports){"use strict";Object.defineProperty(exports,"__esModule",{value:true});exports.default=dfs; +var lib=require("./lib");module.exports={Graph:lib.Graph,json:require("./lib/json"),alg:require("./lib/alg"),version:lib.version}},{"./lib":17,"./lib/alg":8,"./lib/json":18}],2:[function(require,module,exports){module.exports=components;function components(g){var visited={};var cmpts=[];var cmpt;function dfs(v){if(visited.hasOwnProperty(v))return;visited[v]=true;cmpt.push(v);g.successors(v).forEach(dfs);g.predecessors(v).forEach(dfs)}g.nodes().forEach(function(v){cmpt=[];dfs(v);if(cmpt.length){cmpts.push(cmpt)}});return cmpts}},{}],3:[function(require,module,exports){module.exports=dfs; /* * A helper that preforms a pre- or post-order traversal on the input graph * and returns the nodes in the order they were visited. If the graph is @@ -36,17 +36,18 @@ var lib=require("./lib");module.exports={Graph:lib.Graph,json:require("./lib/jso * is directed then this algorithm will navigate using successors. * * If the order is not "post", it will be treated as "pre". - */function dfs(g,vs,order){if(!Array.isArray(vs)){vs=[vs]}var navigation=g.isDirected()?v=>g.successors(v):v=>g.neighbors(v);var orderFunc=order==="post"?postOrderDfs:preOrderDfs;var acc=[];var visited={};vs.forEach(v=>{if(!g.hasNode(v)){throw new Error("Graph does not have node: "+v)}orderFunc(v,navigation,visited,acc)});return acc}function postOrderDfs(v,navigation,visited,acc){var stack=[[v,false]];while(stack.length>0){var curr=stack.pop();if(curr[1]){acc.push(curr[0])}else{if(!visited.hasOwnProperty(curr[0])){visited[curr[0]]=true;stack.push([curr[0],true]);forEachRight(navigation(curr[0]),w=>stack.push([w,false]))}}}}function preOrderDfs(v,navigation,visited,acc){var stack=[v];while(stack.length>0){var curr=stack.pop();if(!visited.hasOwnProperty(curr)){visited[curr]=true;acc.push(curr);forEachRight(navigation(curr),w=>stack.push(w))}}}function forEachRight(array,iteratee){var length=array.length;while(length--){iteratee(array[length],length,array)}return array}module.exports=exports.default},{}],4:[function(require,module,exports){"use strict";Object.defineProperty(exports,"__esModule",{value:true});exports.default=dijkstraAll;var _dijkstra=_interopRequireDefault(require("./dijkstra.js"));function _interopRequireDefault(obj){return obj&&obj.__esModule?obj:{default:obj}}function dijkstraAll(g,weightFunc,edgeFunc){return g.nodes().reduce(function(acc,v){acc[v]=(0,_dijkstra.default)(g,v,weightFunc,edgeFunc);return acc},{})}module.exports=exports.default},{"./dijkstra.js":5}],5:[function(require,module,exports){"use strict";Object.defineProperty(exports,"__esModule",{value:true});exports.default=dijkstra;var _priorityQueue=_interopRequireDefault(require("../data/priority-queue.js"));function _interopRequireDefault(obj){return obj&&obj.__esModule?obj:{default:obj}}var DEFAULT_WEIGHT_FUNC=()=>1;function dijkstra(g,source,weightFn,edgeFn){return runDijkstra(g,String(source),weightFn||DEFAULT_WEIGHT_FUNC,edgeFn||function(v){return g.outEdges(v)})}function runDijkstra(g,source,weightFn,edgeFn){var results={};var pq=new _priorityQueue.default;var v,vEntry;var updateNeighbors=function(edge){var w=edge.v!==v?edge.v:edge.w;var wEntry=results[w];var weight=weightFn(edge);var distance=vEntry.distance+weight;if(weight<0){throw new Error("dijkstra does not allow negative edge weights. "+"Bad edge: "+edge+" Weight: "+weight)}if(distance0){v=pq.removeMin();vEntry=results[v];if(vEntry.distance===Number.POSITIVE_INFINITY){break}edgeFn(v).forEach(updateNeighbors)}return results}module.exports=exports.default},{"../data/priority-queue.js":15}],6:[function(require,module,exports){"use strict";Object.defineProperty(exports,"__esModule",{value:true});exports.default=findCycles;var _tarjan=_interopRequireDefault(require("./tarjan.js"));function _interopRequireDefault(obj){return obj&&obj.__esModule?obj:{default:obj}}function findCycles(g){return(0,_tarjan.default)(g).filter(function(cmpt){return cmpt.length>1||cmpt.length===1&&g.hasEdge(cmpt[0],cmpt[0])})}module.exports=exports.default},{"./tarjan.js":13}],7:[function(require,module,exports){"use strict";Object.defineProperty(exports,"__esModule",{value:true});exports.default=floydWarshall;var DEFAULT_WEIGHT_FUNC=()=>1;function floydWarshall(g,weightFn,edgeFn){return runFloydWarshall(g,weightFn||DEFAULT_WEIGHT_FUNC,edgeFn||function(v){return g.outEdges(v)})}function runFloydWarshall(g,weightFn,edgeFn){var results={};var nodes=g.nodes();nodes.forEach(function(v){results[v]={};results[v][v]={distance:0};nodes.forEach(function(w){if(v!==w){results[v][w]={distance:Number.POSITIVE_INFINITY}}});edgeFn(v).forEach(function(edge){var w=edge.v===v?edge.w:edge.v;var d=weightFn(edge);results[v][w]={distance:d,predecessor:v}})});nodes.forEach(function(k){var rowK=results[k];nodes.forEach(function(i){var rowI=results[i];nodes.forEach(function(j){var ik=rowI[k];var kj=rowK[j];var ij=rowI[j];var altDistance=ik.distance+kj.distance;if(altDistanceg.successors(v):v=>g.neighbors(v);var orderFunc=order==="post"?postOrderDfs:preOrderDfs;var acc=[];var visited={};vs.forEach(v=>{if(!g.hasNode(v)){throw new Error("Graph does not have node: "+v)}orderFunc(v,navigation,visited,acc)});return acc}function postOrderDfs(v,navigation,visited,acc){var stack=[[v,false]];while(stack.length>0){var curr=stack.pop();if(curr[1]){acc.push(curr[0])}else{if(!visited.hasOwnProperty(curr[0])){visited[curr[0]]=true;stack.push([curr[0],true]);forEachRight(navigation(curr[0]),w=>stack.push([w,false]))}}}}function preOrderDfs(v,navigation,visited,acc){var stack=[v];while(stack.length>0){var curr=stack.pop();if(!visited.hasOwnProperty(curr)){visited[curr]=true;acc.push(curr);forEachRight(navigation(curr),w=>stack.push(w))}}}function forEachRight(array,iteratee){var length=array.length;while(length--){iteratee(array[length],length,array)}return array}},{}],4:[function(require,module,exports){var dijkstra=require("./dijkstra");module.exports=dijkstraAll;function dijkstraAll(g,weightFunc,edgeFunc){return g.nodes().reduce(function(acc,v){acc[v]=dijkstra(g,v,weightFunc,edgeFunc);return acc},{})}},{"./dijkstra":5}],5:[function(require,module,exports){var PriorityQueue=require("../data/priority-queue");module.exports=dijkstra;var DEFAULT_WEIGHT_FUNC=()=>1;function dijkstra(g,source,weightFn,edgeFn){return runDijkstra(g,String(source),weightFn||DEFAULT_WEIGHT_FUNC,edgeFn||function(v){return g.outEdges(v)})}function runDijkstra(g,source,weightFn,edgeFn){var results={};var pq=new PriorityQueue;var v,vEntry;var updateNeighbors=function(edge){var w=edge.v!==v?edge.v:edge.w;var wEntry=results[w];var weight=weightFn(edge);var distance=vEntry.distance+weight;if(weight<0){throw new Error("dijkstra does not allow negative edge weights. "+"Bad edge: "+edge+" Weight: "+weight)}if(distance0){v=pq.removeMin();vEntry=results[v];if(vEntry.distance===Number.POSITIVE_INFINITY){break}edgeFn(v).forEach(updateNeighbors)}return results}},{"../data/priority-queue":15}],6:[function(require,module,exports){var tarjan=require("./tarjan");module.exports=findCycles;function findCycles(g){return tarjan(g).filter(function(cmpt){return cmpt.length>1||cmpt.length===1&&g.hasEdge(cmpt[0],cmpt[0])})}},{"./tarjan":13}],7:[function(require,module,exports){module.exports=floydWarshall;var DEFAULT_WEIGHT_FUNC=()=>1;function floydWarshall(g,weightFn,edgeFn){return runFloydWarshall(g,weightFn||DEFAULT_WEIGHT_FUNC,edgeFn||function(v){return g.outEdges(v)})}function runFloydWarshall(g,weightFn,edgeFn){var results={};var nodes=g.nodes();nodes.forEach(function(v){results[v]={};results[v][v]={distance:0};nodes.forEach(function(w){if(v!==w){results[v][w]={distance:Number.POSITIVE_INFINITY}}});edgeFn(v).forEach(function(edge){var w=edge.v===v?edge.w:edge.v;var d=weightFn(edge);results[v][w]={distance:d,predecessor:v}})});nodes.forEach(function(k){var rowK=results[k];nodes.forEach(function(i){var rowI=results[i];nodes.forEach(function(j){var ik=rowI[k];var kj=rowK[j];var ij=rowI[j];var altDistance=ik.distance+kj.distance;if(altDistance0){v=pq.removeMin();if(parents.hasOwnProperty(v)){result.setEdge(v,parents[v])}else if(init){throw new Error("Input graph is not connected: "+g)}else{init=true}g.nodeEdges(v).forEach(updateNeighbors)}return result}module.exports=exports.default},{"../data/priority-queue.js":15,"../graph.js":16}],13:[function(require,module,exports){"use strict";Object.defineProperty(exports,"__esModule",{value:true});exports.default=tarjan;function tarjan(g){var index=0;var stack=[];var visited={};// node id -> { onStack, lowlink, index } -var results=[];function dfs(v){var entry=visited[v]={onStack:true,lowlink:index,index:index++};stack.push(v);g.successors(v).forEach(function(w){if(!visited.hasOwnProperty(w)){dfs(w);entry.lowlink=Math.min(entry.lowlink,visited[w].lowlink)}else if(visited[w].onStack){entry.lowlink=Math.min(entry.lowlink,visited[w].index)}});if(entry.lowlink===entry.index){var cmpt=[];var w;do{w=stack.pop();visited[w].onStack=false;cmpt.push(w)}while(v!==w);results.push(cmpt)}}g.nodes().forEach(function(v){if(!visited.hasOwnProperty(v)){dfs(v)}});return results}module.exports=exports.default},{}],14:[function(require,module,exports){"use strict";Object.defineProperty(exports,"__esModule",{value:true});exports.default=topsort;function topsort(g){var visited={};var stack={};var results=[];function visit(node){if(stack.hasOwnProperty(node)){throw new CycleException}if(!visited.hasOwnProperty(node)){stack[node]=true;visited[node]=true;g.predecessors(node).forEach(visit);delete stack[node];results.push(node)}}g.sinks().forEach(visit);if(Object.keys(visited).length!==g.nodeCount()){throw new CycleException}return results}class CycleException extends Error{constructor(){super(...arguments)}}topsort.CycleException=CycleException;module.exports=exports.default},{}],15:[function(require,module,exports){"use strict";Object.defineProperty(exports,"__esModule",{value:true});exports.default=void 0; +pq.decrease(g.nodes()[0],0);var init=false;while(pq.size()>0){v=pq.removeMin();if(parents.hasOwnProperty(v)){result.setEdge(v,parents[v])}else if(init){throw new Error("Input graph is not connected: "+g)}else{init=true}g.nodeEdges(v).forEach(updateNeighbors)}return result}},{"../data/priority-queue":15,"../graph":16}],13:[function(require,module,exports){module.exports=tarjan;function tarjan(g){var index=0;var stack=[];var visited={};// node id -> { onStack, lowlink, index } +var results=[];function dfs(v){var entry=visited[v]={onStack:true,lowlink:index,index:index++};stack.push(v);g.successors(v).forEach(function(w){if(!visited.hasOwnProperty(w)){dfs(w);entry.lowlink=Math.min(entry.lowlink,visited[w].lowlink)}else if(visited[w].onStack){entry.lowlink=Math.min(entry.lowlink,visited[w].index)}});if(entry.lowlink===entry.index){var cmpt=[];var w;do{w=stack.pop();visited[w].onStack=false;cmpt.push(w)}while(v!==w);results.push(cmpt)}}g.nodes().forEach(function(v){if(!visited.hasOwnProperty(v)){dfs(v)}});return results}},{}],14:[function(require,module,exports){function topsort(g){var visited={};var stack={};var results=[];function visit(node){if(stack.hasOwnProperty(node)){throw new CycleException}if(!visited.hasOwnProperty(node)){stack[node]=true;visited[node]=true;g.predecessors(node).forEach(visit);delete stack[node];results.push(node)}}g.sinks().forEach(visit);if(Object.keys(visited).length!==g.nodeCount()){throw new CycleException}return results}class CycleException extends Error{constructor(){super(...arguments)}}module.exports=topsort;topsort.CycleException=CycleException},{}],15:[function(require,module,exports){ /** * A min-priority queue data structure. This algorithm is derived from Cormen, * et al., "Introduction to Algorithms". The basic idea of a min-priority * queue is that you can efficiently (in O(1) time) get the smallest key in * the queue. Adding and removing elements takes O(log n) time. A key can * have its priority decreased in O(log n) time. - */class PriorityQueue{#arr=[];#keyIndices={}; + */ +class PriorityQueue{#arr=[];#keyIndices={}; /** * Returns the number of elements in the queue. Takes `O(1)` time. */size(){return this.#arr.length} @@ -83,7 +84,7 @@ var results=[];function dfs(v){var entry=visited[v]={onStack:true,lowlink:index, * * @param {Object} key the key for which to raise priority * @param {Number} priority the new priority for the key - */decrease(key,priority){var index=this.#keyIndices[key];if(priority>this.#arr[index].priority){throw new Error("New priority is greater than current priority. "+"Key: "+key+" Old: "+this.#arr[index].priority+" New: "+priority)}this.#arr[index].priority=priority;this.#decrease(index)}#heapify(i){var arr=this.#arr;var l=2*i;var r=l+1;var largest=i;if(l>1;if(arr[parent].prioritythis.#arr[index].priority){throw new Error("New priority is greater than current priority. "+"Key: "+key+" Old: "+this.#arr[index].priority+" New: "+priority)}this.#arr[index].priority=priority;this.#decrease(index)}#heapify(i){var arr=this.#arr;var l=2*i;var r=l+1;var largest=i;if(l>1;if(arr[parent].priorityw){var tmp=v;v=w;w=tmp}return v+EDGE_KEY_DELIM+w+EDGE_KEY_DELIM+(name===undefined?DEFAULT_EDGE_NAME:name)}function edgeArgsToObj(isDirected,v_,w_,name){var v=""+v_;var w=""+w_;if(!isDirected&&v>w){var tmp=v;v=w;w=tmp}var edgeObj={v:v,w:w};if(name){edgeObj.name=name}return edgeObj}function edgeObjToId(isDirected,edgeObj){return edgeArgsToId(isDirected,edgeObj.v,edgeObj.w,edgeObj.name)}module.exports=exports.default},{}],17:[function(require,module,exports){"use strict";Object.defineProperty(exports,"__esModule",{value:true});Object.defineProperty(exports,"Graph",{enumerable:true,get:function(){return _graph.default}});exports.json=exports.alg=void 0;Object.defineProperty(exports,"version",{enumerable:true,get:function(){return _version.default}});var _graph=_interopRequireDefault(require("./graph.js"));var _version=_interopRequireDefault(require("./version.js"));var _json=_interopRequireWildcard(require("./json.js"));exports.json=_json;var _alg=_interopRequireWildcard(require("./alg/index.js"));exports.alg=_alg;function _getRequireWildcardCache(e){if("function"!=typeof WeakMap)return null;var r=new WeakMap,t=new WeakMap;return(_getRequireWildcardCache=function(e){return e?t:r})(e)}function _interopRequireWildcard(e,r){if(!r&&e&&e.__esModule)return e;if(null===e||"object"!=typeof e&&"function"!=typeof e)return{default:e};var t=_getRequireWildcardCache(r);if(t&&t.has(e))return t.get(e);var n={__proto__:null},a=Object.defineProperty&&Object.getOwnPropertyDescriptor;for(var u in e)if("default"!==u&&Object.prototype.hasOwnProperty.call(e,u)){var i=a?Object.getOwnPropertyDescriptor(e,u):null;i&&(i.get||i.set)?Object.defineProperty(n,u,i):n[u]=e[u]}return n.default=e,t&&t.set(e,n),n}function _interopRequireDefault(obj){return obj&&obj.__esModule?obj:{default:obj}}},{"./alg/index.js":8,"./graph.js":16,"./json.js":18,"./version.js":19}],18:[function(require,module,exports){"use strict";Object.defineProperty(exports,"__esModule",{value:true});exports.read=read;exports.write=write;var _graph=_interopRequireDefault(require("./graph.js"));function _interopRequireDefault(obj){return obj&&obj.__esModule?obj:{default:obj}} + */nodeEdges(v,w){var inEdges=this.inEdges(v,w);if(inEdges){return inEdges.concat(this.outEdges(v,w))}}}function incrementOrInitEntry(map,k){if(map[k]){map[k]++}else{map[k]=1}}function decrementOrRemoveEntry(map,k){if(!--map[k]){delete map[k]}}function edgeArgsToId(isDirected,v_,w_,name){var v=""+v_;var w=""+w_;if(!isDirected&&v>w){var tmp=v;v=w;w=tmp}return v+EDGE_KEY_DELIM+w+EDGE_KEY_DELIM+(name===undefined?DEFAULT_EDGE_NAME:name)}function edgeArgsToObj(isDirected,v_,w_,name){var v=""+v_;var w=""+w_;if(!isDirected&&v>w){var tmp=v;v=w;w=tmp}var edgeObj={v:v,w:w};if(name){edgeObj.name=name}return edgeObj}function edgeObjToId(isDirected,edgeObj){return edgeArgsToId(isDirected,edgeObj.v,edgeObj.w,edgeObj.name)}module.exports=Graph},{}],17:[function(require,module,exports){ +// Includes only the "core" of graphlib +module.exports={Graph:require("./graph"),version:require("./version")}},{"./graph":16,"./version":19}],18:[function(require,module,exports){var Graph=require("./graph");module.exports={write:write,read:read}; /** * Creates a JSON representation of the graph that can be serialized to a string with * JSON.stringify. The graph can later be restored using json.read. @@ -298,4 +301,4 @@ v=edgeObj.v;w=edgeObj.w;Object.freeze(edgeObj);this.#edgeObjs[e]=edgeObj;increme * // ['a', 'b'] * g2.edges() * // [ { v: 'a', w: 'b' } ] - */function read(json){var g=new _graph.default(json.options).setGraph(json.value);json.nodes.forEach(function(entry){g.setNode(entry.v,entry.value);if(entry.parent){g.setParent(entry.v,entry.parent)}});json.edges.forEach(function(entry){g.setEdge({v:entry.v,w:entry.w,name:entry.name},entry.value)});return g}},{"./graph.js":16}],19:[function(require,module,exports){"use strict";Object.defineProperty(exports,"__esModule",{value:true});exports.default=void 0;var _default=exports.default="2.2.0";module.exports=exports.default},{}]},{},[1])(1)}); + */function read(json){var g=new Graph(json.options).setGraph(json.value);json.nodes.forEach(function(entry){g.setNode(entry.v,entry.value);if(entry.parent){g.setParent(entry.v,entry.parent)}});json.edges.forEach(function(entry){g.setEdge({v:entry.v,w:entry.w,name:entry.name},entry.value)});return g}},{"./graph":16}],19:[function(require,module,exports){module.exports="2.2.1"},{}]},{},[1])(1)}); diff --git a/dist/graphlib.js b/dist/graphlib.js index 6d12a675..1ed4f81f 100644 --- a/dist/graphlib.js +++ b/dist/graphlib.js @@ -39,16 +39,13 @@ module.exports = { }; },{"./lib":17,"./lib/alg":8,"./lib/json":18}],2:[function(require,module,exports){ -"use strict"; +module.exports = components; -Object.defineProperty(exports, "__esModule", { - value: true -}); -exports.default = components; function components(g) { var visited = {}; var cmpts = []; var cmpt; + function dfs(v) { if (visited.hasOwnProperty(v)) return; visited[v] = true; @@ -56,24 +53,21 @@ function components(g) { g.successors(v).forEach(dfs); g.predecessors(v).forEach(dfs); } - g.nodes().forEach(function (v) { + + g.nodes().forEach(function(v) { cmpt = []; dfs(v); if (cmpt.length) { cmpts.push(cmpt); } }); + return cmpts; } -module.exports = exports.default; },{}],3:[function(require,module,exports){ -"use strict"; +module.exports = dfs; -Object.defineProperty(exports, "__esModule", { - value: true -}); -exports.default = dfs; /* * A helper that preforms a pre- or post-order traversal on the input graph * and returns the nodes in the order they were visited. If the graph is @@ -86,18 +80,23 @@ function dfs(g, vs, order) { if (!Array.isArray(vs)) { vs = [vs]; } + var navigation = g.isDirected() ? v => g.successors(v) : v => g.neighbors(v); var orderFunc = order === "post" ? postOrderDfs : preOrderDfs; + var acc = []; var visited = {}; vs.forEach(v => { if (!g.hasNode(v)) { throw new Error("Graph does not have node: " + v); } + orderFunc(v, navigation, visited, acc); }); + return acc; } + function postOrderDfs(v, navigation, visited, acc) { var stack = [[v, false]]; while (stack.length > 0) { @@ -113,6 +112,7 @@ function postOrderDfs(v, navigation, visited, acc) { } } } + function preOrderDfs(v, navigation, visited, acc) { var stack = [v]; while (stack.length > 0) { @@ -124,142 +124,129 @@ function preOrderDfs(v, navigation, visited, acc) { } } } + function forEachRight(array, iteratee) { var length = array.length; while (length--) { iteratee(array[length], length, array); } + return array; } -module.exports = exports.default; },{}],4:[function(require,module,exports){ -"use strict"; +var dijkstra = require("./dijkstra"); + +module.exports = dijkstraAll; -Object.defineProperty(exports, "__esModule", { - value: true -}); -exports.default = dijkstraAll; -var _dijkstra = _interopRequireDefault(require("./dijkstra.js")); -function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function dijkstraAll(g, weightFunc, edgeFunc) { - return g.nodes().reduce(function (acc, v) { - acc[v] = (0, _dijkstra.default)(g, v, weightFunc, edgeFunc); + return g.nodes().reduce(function(acc, v) { + acc[v] = dijkstra(g, v, weightFunc, edgeFunc); return acc; }, {}); } -module.exports = exports.default; -},{"./dijkstra.js":5}],5:[function(require,module,exports){ -"use strict"; +},{"./dijkstra":5}],5:[function(require,module,exports){ +var PriorityQueue = require("../data/priority-queue"); + +module.exports = dijkstra; -Object.defineProperty(exports, "__esModule", { - value: true -}); -exports.default = dijkstra; -var _priorityQueue = _interopRequireDefault(require("../data/priority-queue.js")); -function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } var DEFAULT_WEIGHT_FUNC = () => 1; + function dijkstra(g, source, weightFn, edgeFn) { - return runDijkstra(g, String(source), weightFn || DEFAULT_WEIGHT_FUNC, edgeFn || function (v) { - return g.outEdges(v); - }); + return runDijkstra(g, String(source), + weightFn || DEFAULT_WEIGHT_FUNC, + edgeFn || function(v) { return g.outEdges(v); }); } + function runDijkstra(g, source, weightFn, edgeFn) { var results = {}; - var pq = new _priorityQueue.default(); + var pq = new PriorityQueue(); var v, vEntry; - var updateNeighbors = function (edge) { + + var updateNeighbors = function(edge) { var w = edge.v !== v ? edge.v : edge.w; var wEntry = results[w]; var weight = weightFn(edge); var distance = vEntry.distance + weight; + if (weight < 0) { - throw new Error("dijkstra does not allow negative edge weights. " + "Bad edge: " + edge + " Weight: " + weight); + throw new Error("dijkstra does not allow negative edge weights. " + + "Bad edge: " + edge + " Weight: " + weight); } + if (distance < wEntry.distance) { wEntry.distance = distance; wEntry.predecessor = v; pq.decrease(w, distance); } }; - g.nodes().forEach(function (v) { + + g.nodes().forEach(function(v) { var distance = v === source ? 0 : Number.POSITIVE_INFINITY; - results[v] = { - distance: distance - }; + results[v] = { distance: distance }; pq.add(v, distance); }); + while (pq.size() > 0) { v = pq.removeMin(); vEntry = results[v]; if (vEntry.distance === Number.POSITIVE_INFINITY) { break; } + edgeFn(v).forEach(updateNeighbors); } + return results; } -module.exports = exports.default; -},{"../data/priority-queue.js":15}],6:[function(require,module,exports){ -"use strict"; +},{"../data/priority-queue":15}],6:[function(require,module,exports){ +var tarjan = require("./tarjan"); + +module.exports = findCycles; -Object.defineProperty(exports, "__esModule", { - value: true -}); -exports.default = findCycles; -var _tarjan = _interopRequireDefault(require("./tarjan.js")); -function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function findCycles(g) { - return (0, _tarjan.default)(g).filter(function (cmpt) { - return cmpt.length > 1 || cmpt.length === 1 && g.hasEdge(cmpt[0], cmpt[0]); + return tarjan(g).filter(function(cmpt) { + return cmpt.length > 1 || (cmpt.length === 1 && g.hasEdge(cmpt[0], cmpt[0])); }); } -module.exports = exports.default; -},{"./tarjan.js":13}],7:[function(require,module,exports){ -"use strict"; +},{"./tarjan":13}],7:[function(require,module,exports){ +module.exports = floydWarshall; -Object.defineProperty(exports, "__esModule", { - value: true -}); -exports.default = floydWarshall; var DEFAULT_WEIGHT_FUNC = () => 1; + function floydWarshall(g, weightFn, edgeFn) { - return runFloydWarshall(g, weightFn || DEFAULT_WEIGHT_FUNC, edgeFn || function (v) { - return g.outEdges(v); - }); + return runFloydWarshall(g, + weightFn || DEFAULT_WEIGHT_FUNC, + edgeFn || function(v) { return g.outEdges(v); }); } + function runFloydWarshall(g, weightFn, edgeFn) { var results = {}; var nodes = g.nodes(); - nodes.forEach(function (v) { + + nodes.forEach(function(v) { results[v] = {}; - results[v][v] = { - distance: 0 - }; - nodes.forEach(function (w) { + results[v][v] = { distance: 0 }; + nodes.forEach(function(w) { if (v !== w) { - results[v][w] = { - distance: Number.POSITIVE_INFINITY - }; + results[v][w] = { distance: Number.POSITIVE_INFINITY }; } }); - edgeFn(v).forEach(function (edge) { + edgeFn(v).forEach(function(edge) { var w = edge.v === v ? edge.w : edge.v; var d = weightFn(edge); - results[v][w] = { - distance: d, - predecessor: v - }; + results[v][w] = { distance: d, predecessor: v }; }); }); - nodes.forEach(function (k) { + + nodes.forEach(function(k) { var rowK = results[k]; - nodes.forEach(function (i) { + nodes.forEach(function(i) { var rowI = results[i]; - nodes.forEach(function (j) { + nodes.forEach(function(j) { var ik = rowI[k]; var kj = rowK[j]; var ij = rowI[j]; @@ -271,160 +258,72 @@ function runFloydWarshall(g, weightFn, edgeFn) { }); }); }); + return results; } -module.exports = exports.default; },{}],8:[function(require,module,exports){ -"use strict"; +module.exports = { + components: require("./components"), + dijkstra: require("./dijkstra"), + dijkstraAll: require("./dijkstra-all"), + findCycles: require("./find-cycles"), + floydWarshall: require("./floyd-warshall"), + isAcyclic: require("./is-acyclic"), + postorder: require("./postorder"), + preorder: require("./preorder"), + prim: require("./prim"), + tarjan: require("./tarjan"), + topsort: require("./topsort") +}; -Object.defineProperty(exports, "__esModule", { - value: true -}); -Object.defineProperty(exports, "components", { - enumerable: true, - get: function () { - return _components.default; - } -}); -Object.defineProperty(exports, "dijkstra", { - enumerable: true, - get: function () { - return _dijkstra.default; - } -}); -Object.defineProperty(exports, "dijkstraAll", { - enumerable: true, - get: function () { - return _dijkstraAll.default; - } -}); -Object.defineProperty(exports, "findCycles", { - enumerable: true, - get: function () { - return _findCycles.default; - } -}); -Object.defineProperty(exports, "floydWarshall", { - enumerable: true, - get: function () { - return _floydWarshall.default; - } -}); -Object.defineProperty(exports, "isAcyclic", { - enumerable: true, - get: function () { - return _isAcyclic.default; - } -}); -Object.defineProperty(exports, "postorder", { - enumerable: true, - get: function () { - return _postorder.default; - } -}); -Object.defineProperty(exports, "preorder", { - enumerable: true, - get: function () { - return _preorder.default; - } -}); -Object.defineProperty(exports, "prim", { - enumerable: true, - get: function () { - return _prim.default; - } -}); -Object.defineProperty(exports, "tarjan", { - enumerable: true, - get: function () { - return _tarjan.default; - } -}); -Object.defineProperty(exports, "topsort", { - enumerable: true, - get: function () { - return _topsort.default; - } -}); -var _components = _interopRequireDefault(require("./components.js")); -var _dijkstra = _interopRequireDefault(require("./dijkstra.js")); -var _dijkstraAll = _interopRequireDefault(require("./dijkstra-all.js")); -var _findCycles = _interopRequireDefault(require("./find-cycles.js")); -var _floydWarshall = _interopRequireDefault(require("./floyd-warshall.js")); -var _isAcyclic = _interopRequireDefault(require("./is-acyclic.js")); -var _postorder = _interopRequireDefault(require("./postorder.js")); -var _preorder = _interopRequireDefault(require("./preorder.js")); -var _prim = _interopRequireDefault(require("./prim.js")); -var _tarjan = _interopRequireDefault(require("./tarjan.js")); -var _topsort = _interopRequireDefault(require("./topsort.js")); -function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } - -},{"./components.js":2,"./dijkstra-all.js":4,"./dijkstra.js":5,"./find-cycles.js":6,"./floyd-warshall.js":7,"./is-acyclic.js":9,"./postorder.js":10,"./preorder.js":11,"./prim.js":12,"./tarjan.js":13,"./topsort.js":14}],9:[function(require,module,exports){ -"use strict"; +},{"./components":2,"./dijkstra":5,"./dijkstra-all":4,"./find-cycles":6,"./floyd-warshall":7,"./is-acyclic":9,"./postorder":10,"./preorder":11,"./prim":12,"./tarjan":13,"./topsort":14}],9:[function(require,module,exports){ +var topsort = require("./topsort"); + +module.exports = isAcyclic; -Object.defineProperty(exports, "__esModule", { - value: true -}); -exports.default = isAcyclic; -var _topsort = _interopRequireDefault(require("./topsort.js")); -function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function isAcyclic(g) { try { - (0, _topsort.default)(g); + topsort(g); } catch (e) { - if (e instanceof _topsort.default.CycleException) { + if (e instanceof topsort.CycleException) { return false; } throw e; } return true; } -module.exports = exports.default; -},{"./topsort.js":14}],10:[function(require,module,exports){ -"use strict"; +},{"./topsort":14}],10:[function(require,module,exports){ +var dfs = require("./dfs"); + +module.exports = postorder; -Object.defineProperty(exports, "__esModule", { - value: true -}); -exports.default = postorder; -var _dfs = _interopRequireDefault(require("./dfs.js")); -function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function postorder(g, vs) { - return (0, _dfs.default)(g, vs, "post"); + return dfs(g, vs, "post"); } -module.exports = exports.default; -},{"./dfs.js":3}],11:[function(require,module,exports){ -"use strict"; +},{"./dfs":3}],11:[function(require,module,exports){ +var dfs = require("./dfs"); + +module.exports = preorder; -Object.defineProperty(exports, "__esModule", { - value: true -}); -exports.default = preorder; -var _dfs = _interopRequireDefault(require("./dfs.js")); -function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function preorder(g, vs) { - return (0, _dfs.default)(g, vs, "pre"); + return dfs(g, vs, "pre"); } -module.exports = exports.default; -},{"./dfs.js":3}],12:[function(require,module,exports){ -"use strict"; +},{"./dfs":3}],12:[function(require,module,exports){ +var Graph = require("../graph"); +var PriorityQueue = require("../data/priority-queue"); + +module.exports = prim; -Object.defineProperty(exports, "__esModule", { - value: true -}); -exports.default = prim; -var _graph = _interopRequireDefault(require("../graph.js")); -var _priorityQueue = _interopRequireDefault(require("../data/priority-queue.js")); -function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function prim(g, weightFunc) { - var result = new _graph.default(); + var result = new Graph(); var parents = {}; - var pq = new _priorityQueue.default(); + var pq = new PriorityQueue(); var v; + function updateNeighbors(edge) { var w = edge.v === v ? edge.w : edge.v; var pri = pq.priority(w); @@ -436,16 +335,19 @@ function prim(g, weightFunc) { } } } + if (g.nodeCount() === 0) { return result; } - g.nodes().forEach(function (v) { + + g.nodes().forEach(function(v) { pq.add(v, Number.POSITIVE_INFINITY); result.setNode(v); }); // Start from an arbitrary node pq.decrease(g.nodes()[0], 0); + var init = false; while (pq.size() > 0) { v = pq.removeMin(); @@ -456,24 +358,22 @@ function prim(g, weightFunc) { } else { init = true; } + g.nodeEdges(v).forEach(updateNeighbors); } + return result; } -module.exports = exports.default; -},{"../data/priority-queue.js":15,"../graph.js":16}],13:[function(require,module,exports){ -"use strict"; +},{"../data/priority-queue":15,"../graph":16}],13:[function(require,module,exports){ +module.exports = tarjan; -Object.defineProperty(exports, "__esModule", { - value: true -}); -exports.default = tarjan; function tarjan(g) { var index = 0; var stack = []; var visited = {}; // node id -> { onStack, lowlink, index } var results = []; + function dfs(v) { var entry = visited[v] = { onStack: true, @@ -481,7 +381,8 @@ function tarjan(g) { index: index++ }; stack.push(v); - g.successors(v).forEach(function (w) { + + g.successors(v).forEach(function(w) { if (!visited.hasOwnProperty(w)) { dfs(w); entry.lowlink = Math.min(entry.lowlink, visited[w].lowlink); @@ -489,6 +390,7 @@ function tarjan(g) { entry.lowlink = Math.min(entry.lowlink, visited[w].index); } }); + if (entry.lowlink === entry.index) { var cmpt = []; var w; @@ -500,30 +402,27 @@ function tarjan(g) { results.push(cmpt); } } - g.nodes().forEach(function (v) { + + g.nodes().forEach(function(v) { if (!visited.hasOwnProperty(v)) { dfs(v); } }); + return results; } -module.exports = exports.default; },{}],14:[function(require,module,exports){ -"use strict"; - -Object.defineProperty(exports, "__esModule", { - value: true -}); -exports.default = topsort; function topsort(g) { var visited = {}; var stack = {}; var results = []; + function visit(node) { if (stack.hasOwnProperty(node)) { throw new CycleException(); } + if (!visited.hasOwnProperty(node)) { stack[node] = true; visited[node] = true; @@ -532,27 +431,26 @@ function topsort(g) { results.push(node); } } + g.sinks().forEach(visit); + if (Object.keys(visited).length !== g.nodeCount()) { throw new CycleException(); } + return results; } + class CycleException extends Error { constructor() { super(...arguments); } } + +module.exports = topsort; topsort.CycleException = CycleException; -module.exports = exports.default; },{}],15:[function(require,module,exports){ -"use strict"; - -Object.defineProperty(exports, "__esModule", { - value: true -}); -exports.default = void 0; /** * A min-priority queue data structure. This algorithm is derived from Cormen, * et al., "Introduction to Algorithms". The basic idea of a min-priority @@ -575,9 +473,7 @@ class PriorityQueue { * Returns the keys that are in the queue. Takes `O(n)` time. */ keys() { - return this.#arr.map(function (x) { - return x.key; - }); + return this.#arr.map(function(x) { return x.key; }); } /** @@ -626,10 +522,7 @@ class PriorityQueue { var arr = this.#arr; var index = arr.length; keyIndices[key] = index; - arr.push({ - key: key, - priority: priority - }); + arr.push({key: key, priority: priority}); this.#decrease(index); return true; } @@ -657,11 +550,13 @@ class PriorityQueue { decrease(key, priority) { var index = this.#keyIndices[key]; if (priority > this.#arr[index].priority) { - throw new Error("New priority is greater than current priority. " + "Key: " + key + " Old: " + this.#arr[index].priority + " New: " + priority); + throw new Error("New priority is greater than current priority. " + + "Key: " + key + " Old: " + this.#arr[index].priority + " New: " + priority); } this.#arr[index].priority = priority; this.#decrease(index); } + #heapify(i) { var arr = this.#arr; var l = 2 * i; @@ -678,6 +573,7 @@ class PriorityQueue { } } } + #decrease(index) { var arr = this.#arr; var priority = arr[index].priority; @@ -691,6 +587,7 @@ class PriorityQueue { index = parent; } } + #swap(i, j) { var arr = this.#arr; var keyIndices = this.#keyIndices; @@ -702,16 +599,12 @@ class PriorityQueue { keyIndices[origArrI.key] = j; } } -exports.default = PriorityQueue; -module.exports = exports.default; + +module.exports = PriorityQueue; },{}],16:[function(require,module,exports){ "use strict"; -Object.defineProperty(exports, "__esModule", { - value: true -}); -exports.default = void 0; var DEFAULT_EDGE_NAME = "\x00"; var GRAPH_NODE = "\x00"; var EDGE_KEY_DELIM = "\x01"; @@ -766,14 +659,18 @@ class Graph { /* Number of edges in the graph. Should only be changed by the implementation. */ #edgeCount = 0; + #parent; + #children; + constructor(opts) { if (opts) { this.#isDirected = opts.hasOwnProperty("directed") ? opts.directed : true; this.#isMultigraph = opts.hasOwnProperty("multigraph") ? opts.multigraph : false; this.#isCompound = opts.hasOwnProperty("compound") ? opts.compound : false; } + if (this.#isCompound) { // v -> parent this.#parent = {}; @@ -822,6 +719,7 @@ class Graph { return this.#label; } + /* === Node functions ========== */ /** @@ -836,6 +734,7 @@ class Graph { if (typeof newDefault !== 'function') { this.#defaultNodeLabelFn = () => newDefault; } + return this; } @@ -881,7 +780,7 @@ class Graph { setNodes(vs, value) { var args = arguments; var self = this; - vs.forEach(function (v) { + vs.forEach(function(v) { if (args.length > 1) { self.setNode(v, value); } else { @@ -904,6 +803,7 @@ class Graph { } return this; } + this.#nodes[v] = arguments.length > 1 ? value : this.#defaultNodeLabelFn(v); if (this.#isCompound) { this.#parent[v] = GRAPH_NODE; @@ -947,7 +847,7 @@ class Graph { if (this.#isCompound) { this.#removeFromParentsChildList(v); delete this.#parent[v]; - this.children(v).forEach(function (child) { + this.children(v).forEach(function(child) { self.setParent(child); }); delete this.#children[v]; @@ -973,6 +873,7 @@ class Graph { if (!this.#isCompound) { throw new Error("Cannot set parent in a non-compound graph"); } + if (parent === undefined) { parent = GRAPH_NODE; } else { @@ -980,17 +881,21 @@ class Graph { parent += ""; for (var ancestor = parent; ancestor !== undefined; ancestor = this.parent(ancestor)) { if (ancestor === v) { - throw new Error("Setting " + parent + " as parent of " + v + " would create a cycle"); + throw new Error("Setting " + parent+ " as parent of " + v + + " would create a cycle"); } } + this.setNode(parent); } + this.setNode(v); this.#removeFromParentsChildList(v); this.#parent[v] = parent; this.#children[parent][v] = true; return this; } + #removeFromParentsChildList(v) { delete this.#children[this.#parent[v]][v]; } @@ -1061,9 +966,11 @@ class Graph { for (var succ of this.successors(v)) { union.add(succ); } + return Array.from(union.values()); } } + isLeaf(v) { var neighbors; if (this.isDirected()) { @@ -1086,18 +993,22 @@ class Graph { multigraph: this.#isMultigraph, compound: this.#isCompound }); + copy.setGraph(this.graph()); + var self = this; - Object.entries(this.#nodes).forEach(function ([v, value]) { + Object.entries(this.#nodes).forEach(function([v, value]) { if (filter(v)) { copy.setNode(v, value); } }); - Object.values(this.#edgeObjs).forEach(function (e) { + + Object.values(this.#edgeObjs).forEach(function(e) { if (copy.hasNode(e.v) && copy.hasNode(e.w)) { copy.setEdge(e, self.edge(e)); } }); + var parents = {}; function findParent(v) { var parent = self.parent(v); @@ -1110,9 +1021,11 @@ class Graph { return findParent(parent); } } + if (this.#isCompound) { copy.nodes().forEach(v => copy.setParent(v, findParent(v))); } + return copy; } @@ -1130,6 +1043,7 @@ class Graph { if (typeof newDefault !== 'function') { this.#defaultEdgeLabelFn = () => newDefault; } + return this; } @@ -1158,7 +1072,7 @@ class Graph { setPath(vs, value) { var self = this; var args = arguments; - vs.reduce(function (v, w) { + vs.reduce(function(v, w) { if (args.length > 1) { self.setEdge(v, w, value); } else { @@ -1179,6 +1093,7 @@ class Graph { var v, w, name, value; var valueSpecified = false; var arg0 = arguments[0]; + if (typeof arg0 === "object" && arg0 !== null && "v" in arg0) { v = arg0.v; w = arg0.w; @@ -1196,11 +1111,13 @@ class Graph { valueSpecified = true; } } + v = "" + v; w = "" + w; if (name !== undefined) { name = "" + name; } + var e = edgeArgsToId(this.#isDirected, v, w, name); if (this.#edgeLabels.hasOwnProperty(e)) { if (valueSpecified) { @@ -1208,6 +1125,7 @@ class Graph { } return this; } + if (name !== undefined && !this.#isMultigraph) { throw new Error("Cannot set a named edge when isMultigraph = false"); } @@ -1216,11 +1134,14 @@ class Graph { // First ensure the nodes exist. this.setNode(v); this.setNode(w); + this.#edgeLabels[e] = valueSpecified ? value : this.#defaultEdgeLabelFn(v, w, name); + var edgeObj = edgeArgsToObj(this.#isDirected, v, w, name); // Ensure we add undirected edges in a consistent way. v = edgeObj.v; w = edgeObj.w; + Object.freeze(edgeObj); this.#edgeObjs[e] = edgeObj; incrementOrInitEntry(this.#preds[w], v); @@ -1236,7 +1157,9 @@ class Graph { * Complexity: O(1). */ edge(v, w, name) { - var e = arguments.length === 1 ? edgeObjToId(this.#isDirected, arguments[0]) : edgeArgsToId(this.#isDirected, v, w, name); + var e = (arguments.length === 1 + ? edgeObjToId(this.#isDirected, arguments[0]) + : edgeArgsToId(this.#isDirected, v, w, name)); return this.#edgeLabels[e]; } @@ -1247,10 +1170,9 @@ class Graph { edgeAsObj() { const edge = this.edge(...arguments); if (typeof edge !== "object") { - return { - label: edge - }; + return {label: edge}; } + return edge; } @@ -1259,7 +1181,9 @@ class Graph { * Complexity: O(1). */ hasEdge(v, w, name) { - var e = arguments.length === 1 ? edgeObjToId(this.#isDirected, arguments[0]) : edgeArgsToId(this.#isDirected, v, w, name); + var e = (arguments.length === 1 + ? edgeObjToId(this.#isDirected, arguments[0]) + : edgeArgsToId(this.#isDirected, v, w, name)); return this.#edgeLabels.hasOwnProperty(e); } @@ -1268,7 +1192,9 @@ class Graph { * Complexity: O(1). */ removeEdge(v, w, name) { - var e = arguments.length === 1 ? edgeObjToId(this.#isDirected, arguments[0]) : edgeArgsToId(this.#isDirected, v, w, name); + var e = (arguments.length === 1 + ? edgeObjToId(this.#isDirected, arguments[0]) + : edgeArgsToId(this.#isDirected, v, w, name)); var edge = this.#edgeObjs[e]; if (edge) { v = edge.v; @@ -1328,7 +1254,7 @@ class Graph { } } } -exports.default = Graph; + function incrementOrInitEntry(map, k) { if (map[k]) { map[k]++; @@ -1336,11 +1262,11 @@ function incrementOrInitEntry(map, k) { map[k] = 1; } } + function decrementOrRemoveEntry(map, k) { - if (! --map[k]) { - delete map[k]; - } + if (!--map[k]) { delete map[k]; } } + function edgeArgsToId(isDirected, v_, w_, name) { var v = "" + v_; var w = "" + w_; @@ -1349,8 +1275,10 @@ function edgeArgsToId(isDirected, v_, w_, name) { v = w; w = tmp; } - return v + EDGE_KEY_DELIM + w + EDGE_KEY_DELIM + (name === undefined ? DEFAULT_EDGE_NAME : name); + return v + EDGE_KEY_DELIM + w + EDGE_KEY_DELIM + + (name === undefined ? DEFAULT_EDGE_NAME : name); } + function edgeArgsToObj(isDirected, v_, w_, name) { var v = "" + v_; var w = "" + w_; @@ -1359,59 +1287,34 @@ function edgeArgsToObj(isDirected, v_, w_, name) { v = w; w = tmp; } - var edgeObj = { - v: v, - w: w - }; + var edgeObj = { v: v, w: w }; if (name) { edgeObj.name = name; } return edgeObj; } + function edgeObjToId(isDirected, edgeObj) { return edgeArgsToId(isDirected, edgeObj.v, edgeObj.w, edgeObj.name); } -module.exports = exports.default; + +module.exports = Graph; },{}],17:[function(require,module,exports){ -"use strict"; +// Includes only the "core" of graphlib +module.exports = { + Graph: require("./graph"), + version: require("./version") +}; -Object.defineProperty(exports, "__esModule", { - value: true -}); -Object.defineProperty(exports, "Graph", { - enumerable: true, - get: function () { - return _graph.default; - } -}); -exports.json = exports.alg = void 0; -Object.defineProperty(exports, "version", { - enumerable: true, - get: function () { - return _version.default; - } -}); -var _graph = _interopRequireDefault(require("./graph.js")); -var _version = _interopRequireDefault(require("./version.js")); -var _json = _interopRequireWildcard(require("./json.js")); -exports.json = _json; -var _alg = _interopRequireWildcard(require("./alg/index.js")); -exports.alg = _alg; -function _getRequireWildcardCache(e) { if ("function" != typeof WeakMap) return null; var r = new WeakMap(), t = new WeakMap(); return (_getRequireWildcardCache = function (e) { return e ? t : r; })(e); } -function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e; if (null === e || "object" != typeof e && "function" != typeof e) return { default: e }; var t = _getRequireWildcardCache(r); if (t && t.has(e)) return t.get(e); var n = { __proto__: null }, a = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var u in e) if ("default" !== u && Object.prototype.hasOwnProperty.call(e, u)) { var i = a ? Object.getOwnPropertyDescriptor(e, u) : null; i && (i.get || i.set) ? Object.defineProperty(n, u, i) : n[u] = e[u]; } return n.default = e, t && t.set(e, n), n; } -function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } - -},{"./alg/index.js":8,"./graph.js":16,"./json.js":18,"./version.js":19}],18:[function(require,module,exports){ -"use strict"; +},{"./graph":16,"./version":19}],18:[function(require,module,exports){ +var Graph = require("./graph"); + +module.exports = { + write: write, + read: read +}; -Object.defineProperty(exports, "__esModule", { - value: true -}); -exports.read = read; -exports.write = write; -var _graph = _interopRequireDefault(require("./graph.js")); -function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } /** * Creates a JSON representation of the graph that can be serialized to a string with * JSON.stringify. The graph can later be restored using json.read. @@ -1426,18 +1329,18 @@ function write(g) { nodes: writeNodes(g), edges: writeEdges(g) }; + if (g.graph() !== undefined) { json.value = structuredClone(g.graph()); } return json; } + function writeNodes(g) { - return g.nodes().map(function (v) { + return g.nodes().map(function(v) { var nodeValue = g.node(v); var parent = g.parent(v); - var node = { - v: v - }; + var node = { v: v }; if (nodeValue !== undefined) { node.value = nodeValue; } @@ -1447,13 +1350,11 @@ function writeNodes(g) { return node; }); } + function writeEdges(g) { - return g.edges().map(function (e) { + return g.edges().map(function(e) { var edgeValue = g.edge(e); - var edge = { - v: e.v, - w: e.w - }; + var edge = { v: e.v, w: e.w }; if (e.name !== undefined) { edge.name = e.name; } @@ -1475,32 +1376,21 @@ function writeEdges(g) { * // [ { v: 'a', w: 'b' } ] */ function read(json) { - var g = new _graph.default(json.options).setGraph(json.value); - json.nodes.forEach(function (entry) { + var g = new Graph(json.options).setGraph(json.value); + json.nodes.forEach(function(entry) { g.setNode(entry.v, entry.value); if (entry.parent) { g.setParent(entry.v, entry.parent); } }); - json.edges.forEach(function (entry) { - g.setEdge({ - v: entry.v, - w: entry.w, - name: entry.name - }, entry.value); + json.edges.forEach(function(entry) { + g.setEdge({ v: entry.v, w: entry.w, name: entry.name }, entry.value); }); return g; } -},{"./graph.js":16}],19:[function(require,module,exports){ -"use strict"; - -Object.defineProperty(exports, "__esModule", { - value: true -}); -exports.default = void 0; -var _default = exports.default = '2.2.0'; -module.exports = exports.default; +},{"./graph":16}],19:[function(require,module,exports){ +module.exports = '2.2.1'; },{}]},{},[1])(1) }); diff --git a/dist/graphlib.min.js b/dist/graphlib.min.js index 91a8d88b..d43b43f8 100644 --- a/dist/graphlib.min.js +++ b/dist/graphlib.min.js @@ -28,7 +28,7 @@ * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -var lib=require("./lib");module.exports={Graph:lib.Graph,json:require("./lib/json"),alg:require("./lib/alg"),version:lib.version}},{"./lib":17,"./lib/alg":8,"./lib/json":18}],2:[function(require,module,exports){"use strict";Object.defineProperty(exports,"__esModule",{value:true});exports.default=components;function components(g){var visited={};var cmpts=[];var cmpt;function dfs(v){if(visited.hasOwnProperty(v))return;visited[v]=true;cmpt.push(v);g.successors(v).forEach(dfs);g.predecessors(v).forEach(dfs)}g.nodes().forEach(function(v){cmpt=[];dfs(v);if(cmpt.length){cmpts.push(cmpt)}});return cmpts}module.exports=exports.default},{}],3:[function(require,module,exports){"use strict";Object.defineProperty(exports,"__esModule",{value:true});exports.default=dfs; +var lib=require("./lib");module.exports={Graph:lib.Graph,json:require("./lib/json"),alg:require("./lib/alg"),version:lib.version}},{"./lib":17,"./lib/alg":8,"./lib/json":18}],2:[function(require,module,exports){module.exports=components;function components(g){var visited={};var cmpts=[];var cmpt;function dfs(v){if(visited.hasOwnProperty(v))return;visited[v]=true;cmpt.push(v);g.successors(v).forEach(dfs);g.predecessors(v).forEach(dfs)}g.nodes().forEach(function(v){cmpt=[];dfs(v);if(cmpt.length){cmpts.push(cmpt)}});return cmpts}},{}],3:[function(require,module,exports){module.exports=dfs; /* * A helper that preforms a pre- or post-order traversal on the input graph * and returns the nodes in the order they were visited. If the graph is @@ -36,17 +36,18 @@ var lib=require("./lib");module.exports={Graph:lib.Graph,json:require("./lib/jso * is directed then this algorithm will navigate using successors. * * If the order is not "post", it will be treated as "pre". - */function dfs(g,vs,order){if(!Array.isArray(vs)){vs=[vs]}var navigation=g.isDirected()?v=>g.successors(v):v=>g.neighbors(v);var orderFunc=order==="post"?postOrderDfs:preOrderDfs;var acc=[];var visited={};vs.forEach(v=>{if(!g.hasNode(v)){throw new Error("Graph does not have node: "+v)}orderFunc(v,navigation,visited,acc)});return acc}function postOrderDfs(v,navigation,visited,acc){var stack=[[v,false]];while(stack.length>0){var curr=stack.pop();if(curr[1]){acc.push(curr[0])}else{if(!visited.hasOwnProperty(curr[0])){visited[curr[0]]=true;stack.push([curr[0],true]);forEachRight(navigation(curr[0]),w=>stack.push([w,false]))}}}}function preOrderDfs(v,navigation,visited,acc){var stack=[v];while(stack.length>0){var curr=stack.pop();if(!visited.hasOwnProperty(curr)){visited[curr]=true;acc.push(curr);forEachRight(navigation(curr),w=>stack.push(w))}}}function forEachRight(array,iteratee){var length=array.length;while(length--){iteratee(array[length],length,array)}return array}module.exports=exports.default},{}],4:[function(require,module,exports){"use strict";Object.defineProperty(exports,"__esModule",{value:true});exports.default=dijkstraAll;var _dijkstra=_interopRequireDefault(require("./dijkstra.js"));function _interopRequireDefault(obj){return obj&&obj.__esModule?obj:{default:obj}}function dijkstraAll(g,weightFunc,edgeFunc){return g.nodes().reduce(function(acc,v){acc[v]=(0,_dijkstra.default)(g,v,weightFunc,edgeFunc);return acc},{})}module.exports=exports.default},{"./dijkstra.js":5}],5:[function(require,module,exports){"use strict";Object.defineProperty(exports,"__esModule",{value:true});exports.default=dijkstra;var _priorityQueue=_interopRequireDefault(require("../data/priority-queue.js"));function _interopRequireDefault(obj){return obj&&obj.__esModule?obj:{default:obj}}var DEFAULT_WEIGHT_FUNC=()=>1;function dijkstra(g,source,weightFn,edgeFn){return runDijkstra(g,String(source),weightFn||DEFAULT_WEIGHT_FUNC,edgeFn||function(v){return g.outEdges(v)})}function runDijkstra(g,source,weightFn,edgeFn){var results={};var pq=new _priorityQueue.default;var v,vEntry;var updateNeighbors=function(edge){var w=edge.v!==v?edge.v:edge.w;var wEntry=results[w];var weight=weightFn(edge);var distance=vEntry.distance+weight;if(weight<0){throw new Error("dijkstra does not allow negative edge weights. "+"Bad edge: "+edge+" Weight: "+weight)}if(distance0){v=pq.removeMin();vEntry=results[v];if(vEntry.distance===Number.POSITIVE_INFINITY){break}edgeFn(v).forEach(updateNeighbors)}return results}module.exports=exports.default},{"../data/priority-queue.js":15}],6:[function(require,module,exports){"use strict";Object.defineProperty(exports,"__esModule",{value:true});exports.default=findCycles;var _tarjan=_interopRequireDefault(require("./tarjan.js"));function _interopRequireDefault(obj){return obj&&obj.__esModule?obj:{default:obj}}function findCycles(g){return(0,_tarjan.default)(g).filter(function(cmpt){return cmpt.length>1||cmpt.length===1&&g.hasEdge(cmpt[0],cmpt[0])})}module.exports=exports.default},{"./tarjan.js":13}],7:[function(require,module,exports){"use strict";Object.defineProperty(exports,"__esModule",{value:true});exports.default=floydWarshall;var DEFAULT_WEIGHT_FUNC=()=>1;function floydWarshall(g,weightFn,edgeFn){return runFloydWarshall(g,weightFn||DEFAULT_WEIGHT_FUNC,edgeFn||function(v){return g.outEdges(v)})}function runFloydWarshall(g,weightFn,edgeFn){var results={};var nodes=g.nodes();nodes.forEach(function(v){results[v]={};results[v][v]={distance:0};nodes.forEach(function(w){if(v!==w){results[v][w]={distance:Number.POSITIVE_INFINITY}}});edgeFn(v).forEach(function(edge){var w=edge.v===v?edge.w:edge.v;var d=weightFn(edge);results[v][w]={distance:d,predecessor:v}})});nodes.forEach(function(k){var rowK=results[k];nodes.forEach(function(i){var rowI=results[i];nodes.forEach(function(j){var ik=rowI[k];var kj=rowK[j];var ij=rowI[j];var altDistance=ik.distance+kj.distance;if(altDistanceg.successors(v):v=>g.neighbors(v);var orderFunc=order==="post"?postOrderDfs:preOrderDfs;var acc=[];var visited={};vs.forEach(v=>{if(!g.hasNode(v)){throw new Error("Graph does not have node: "+v)}orderFunc(v,navigation,visited,acc)});return acc}function postOrderDfs(v,navigation,visited,acc){var stack=[[v,false]];while(stack.length>0){var curr=stack.pop();if(curr[1]){acc.push(curr[0])}else{if(!visited.hasOwnProperty(curr[0])){visited[curr[0]]=true;stack.push([curr[0],true]);forEachRight(navigation(curr[0]),w=>stack.push([w,false]))}}}}function preOrderDfs(v,navigation,visited,acc){var stack=[v];while(stack.length>0){var curr=stack.pop();if(!visited.hasOwnProperty(curr)){visited[curr]=true;acc.push(curr);forEachRight(navigation(curr),w=>stack.push(w))}}}function forEachRight(array,iteratee){var length=array.length;while(length--){iteratee(array[length],length,array)}return array}},{}],4:[function(require,module,exports){var dijkstra=require("./dijkstra");module.exports=dijkstraAll;function dijkstraAll(g,weightFunc,edgeFunc){return g.nodes().reduce(function(acc,v){acc[v]=dijkstra(g,v,weightFunc,edgeFunc);return acc},{})}},{"./dijkstra":5}],5:[function(require,module,exports){var PriorityQueue=require("../data/priority-queue");module.exports=dijkstra;var DEFAULT_WEIGHT_FUNC=()=>1;function dijkstra(g,source,weightFn,edgeFn){return runDijkstra(g,String(source),weightFn||DEFAULT_WEIGHT_FUNC,edgeFn||function(v){return g.outEdges(v)})}function runDijkstra(g,source,weightFn,edgeFn){var results={};var pq=new PriorityQueue;var v,vEntry;var updateNeighbors=function(edge){var w=edge.v!==v?edge.v:edge.w;var wEntry=results[w];var weight=weightFn(edge);var distance=vEntry.distance+weight;if(weight<0){throw new Error("dijkstra does not allow negative edge weights. "+"Bad edge: "+edge+" Weight: "+weight)}if(distance0){v=pq.removeMin();vEntry=results[v];if(vEntry.distance===Number.POSITIVE_INFINITY){break}edgeFn(v).forEach(updateNeighbors)}return results}},{"../data/priority-queue":15}],6:[function(require,module,exports){var tarjan=require("./tarjan");module.exports=findCycles;function findCycles(g){return tarjan(g).filter(function(cmpt){return cmpt.length>1||cmpt.length===1&&g.hasEdge(cmpt[0],cmpt[0])})}},{"./tarjan":13}],7:[function(require,module,exports){module.exports=floydWarshall;var DEFAULT_WEIGHT_FUNC=()=>1;function floydWarshall(g,weightFn,edgeFn){return runFloydWarshall(g,weightFn||DEFAULT_WEIGHT_FUNC,edgeFn||function(v){return g.outEdges(v)})}function runFloydWarshall(g,weightFn,edgeFn){var results={};var nodes=g.nodes();nodes.forEach(function(v){results[v]={};results[v][v]={distance:0};nodes.forEach(function(w){if(v!==w){results[v][w]={distance:Number.POSITIVE_INFINITY}}});edgeFn(v).forEach(function(edge){var w=edge.v===v?edge.w:edge.v;var d=weightFn(edge);results[v][w]={distance:d,predecessor:v}})});nodes.forEach(function(k){var rowK=results[k];nodes.forEach(function(i){var rowI=results[i];nodes.forEach(function(j){var ik=rowI[k];var kj=rowK[j];var ij=rowI[j];var altDistance=ik.distance+kj.distance;if(altDistance0){v=pq.removeMin();if(parents.hasOwnProperty(v)){result.setEdge(v,parents[v])}else if(init){throw new Error("Input graph is not connected: "+g)}else{init=true}g.nodeEdges(v).forEach(updateNeighbors)}return result}module.exports=exports.default},{"../data/priority-queue.js":15,"../graph.js":16}],13:[function(require,module,exports){"use strict";Object.defineProperty(exports,"__esModule",{value:true});exports.default=tarjan;function tarjan(g){var index=0;var stack=[];var visited={};// node id -> { onStack, lowlink, index } -var results=[];function dfs(v){var entry=visited[v]={onStack:true,lowlink:index,index:index++};stack.push(v);g.successors(v).forEach(function(w){if(!visited.hasOwnProperty(w)){dfs(w);entry.lowlink=Math.min(entry.lowlink,visited[w].lowlink)}else if(visited[w].onStack){entry.lowlink=Math.min(entry.lowlink,visited[w].index)}});if(entry.lowlink===entry.index){var cmpt=[];var w;do{w=stack.pop();visited[w].onStack=false;cmpt.push(w)}while(v!==w);results.push(cmpt)}}g.nodes().forEach(function(v){if(!visited.hasOwnProperty(v)){dfs(v)}});return results}module.exports=exports.default},{}],14:[function(require,module,exports){"use strict";Object.defineProperty(exports,"__esModule",{value:true});exports.default=topsort;function topsort(g){var visited={};var stack={};var results=[];function visit(node){if(stack.hasOwnProperty(node)){throw new CycleException}if(!visited.hasOwnProperty(node)){stack[node]=true;visited[node]=true;g.predecessors(node).forEach(visit);delete stack[node];results.push(node)}}g.sinks().forEach(visit);if(Object.keys(visited).length!==g.nodeCount()){throw new CycleException}return results}class CycleException extends Error{constructor(){super(...arguments)}}topsort.CycleException=CycleException;module.exports=exports.default},{}],15:[function(require,module,exports){"use strict";Object.defineProperty(exports,"__esModule",{value:true});exports.default=void 0; +pq.decrease(g.nodes()[0],0);var init=false;while(pq.size()>0){v=pq.removeMin();if(parents.hasOwnProperty(v)){result.setEdge(v,parents[v])}else if(init){throw new Error("Input graph is not connected: "+g)}else{init=true}g.nodeEdges(v).forEach(updateNeighbors)}return result}},{"../data/priority-queue":15,"../graph":16}],13:[function(require,module,exports){module.exports=tarjan;function tarjan(g){var index=0;var stack=[];var visited={};// node id -> { onStack, lowlink, index } +var results=[];function dfs(v){var entry=visited[v]={onStack:true,lowlink:index,index:index++};stack.push(v);g.successors(v).forEach(function(w){if(!visited.hasOwnProperty(w)){dfs(w);entry.lowlink=Math.min(entry.lowlink,visited[w].lowlink)}else if(visited[w].onStack){entry.lowlink=Math.min(entry.lowlink,visited[w].index)}});if(entry.lowlink===entry.index){var cmpt=[];var w;do{w=stack.pop();visited[w].onStack=false;cmpt.push(w)}while(v!==w);results.push(cmpt)}}g.nodes().forEach(function(v){if(!visited.hasOwnProperty(v)){dfs(v)}});return results}},{}],14:[function(require,module,exports){function topsort(g){var visited={};var stack={};var results=[];function visit(node){if(stack.hasOwnProperty(node)){throw new CycleException}if(!visited.hasOwnProperty(node)){stack[node]=true;visited[node]=true;g.predecessors(node).forEach(visit);delete stack[node];results.push(node)}}g.sinks().forEach(visit);if(Object.keys(visited).length!==g.nodeCount()){throw new CycleException}return results}class CycleException extends Error{constructor(){super(...arguments)}}module.exports=topsort;topsort.CycleException=CycleException},{}],15:[function(require,module,exports){ /** * A min-priority queue data structure. This algorithm is derived from Cormen, * et al., "Introduction to Algorithms". The basic idea of a min-priority * queue is that you can efficiently (in O(1) time) get the smallest key in * the queue. Adding and removing elements takes O(log n) time. A key can * have its priority decreased in O(log n) time. - */class PriorityQueue{#arr=[];#keyIndices={}; + */ +class PriorityQueue{#arr=[];#keyIndices={}; /** * Returns the number of elements in the queue. Takes `O(1)` time. */size(){return this.#arr.length} @@ -83,7 +84,7 @@ var results=[];function dfs(v){var entry=visited[v]={onStack:true,lowlink:index, * * @param {Object} key the key for which to raise priority * @param {Number} priority the new priority for the key - */decrease(key,priority){var index=this.#keyIndices[key];if(priority>this.#arr[index].priority){throw new Error("New priority is greater than current priority. "+"Key: "+key+" Old: "+this.#arr[index].priority+" New: "+priority)}this.#arr[index].priority=priority;this.#decrease(index)}#heapify(i){var arr=this.#arr;var l=2*i;var r=l+1;var largest=i;if(l>1;if(arr[parent].prioritythis.#arr[index].priority){throw new Error("New priority is greater than current priority. "+"Key: "+key+" Old: "+this.#arr[index].priority+" New: "+priority)}this.#arr[index].priority=priority;this.#decrease(index)}#heapify(i){var arr=this.#arr;var l=2*i;var r=l+1;var largest=i;if(l>1;if(arr[parent].priorityw){var tmp=v;v=w;w=tmp}return v+EDGE_KEY_DELIM+w+EDGE_KEY_DELIM+(name===undefined?DEFAULT_EDGE_NAME:name)}function edgeArgsToObj(isDirected,v_,w_,name){var v=""+v_;var w=""+w_;if(!isDirected&&v>w){var tmp=v;v=w;w=tmp}var edgeObj={v:v,w:w};if(name){edgeObj.name=name}return edgeObj}function edgeObjToId(isDirected,edgeObj){return edgeArgsToId(isDirected,edgeObj.v,edgeObj.w,edgeObj.name)}module.exports=exports.default},{}],17:[function(require,module,exports){"use strict";Object.defineProperty(exports,"__esModule",{value:true});Object.defineProperty(exports,"Graph",{enumerable:true,get:function(){return _graph.default}});exports.json=exports.alg=void 0;Object.defineProperty(exports,"version",{enumerable:true,get:function(){return _version.default}});var _graph=_interopRequireDefault(require("./graph.js"));var _version=_interopRequireDefault(require("./version.js"));var _json=_interopRequireWildcard(require("./json.js"));exports.json=_json;var _alg=_interopRequireWildcard(require("./alg/index.js"));exports.alg=_alg;function _getRequireWildcardCache(e){if("function"!=typeof WeakMap)return null;var r=new WeakMap,t=new WeakMap;return(_getRequireWildcardCache=function(e){return e?t:r})(e)}function _interopRequireWildcard(e,r){if(!r&&e&&e.__esModule)return e;if(null===e||"object"!=typeof e&&"function"!=typeof e)return{default:e};var t=_getRequireWildcardCache(r);if(t&&t.has(e))return t.get(e);var n={__proto__:null},a=Object.defineProperty&&Object.getOwnPropertyDescriptor;for(var u in e)if("default"!==u&&Object.prototype.hasOwnProperty.call(e,u)){var i=a?Object.getOwnPropertyDescriptor(e,u):null;i&&(i.get||i.set)?Object.defineProperty(n,u,i):n[u]=e[u]}return n.default=e,t&&t.set(e,n),n}function _interopRequireDefault(obj){return obj&&obj.__esModule?obj:{default:obj}}},{"./alg/index.js":8,"./graph.js":16,"./json.js":18,"./version.js":19}],18:[function(require,module,exports){"use strict";Object.defineProperty(exports,"__esModule",{value:true});exports.read=read;exports.write=write;var _graph=_interopRequireDefault(require("./graph.js"));function _interopRequireDefault(obj){return obj&&obj.__esModule?obj:{default:obj}} + */nodeEdges(v,w){var inEdges=this.inEdges(v,w);if(inEdges){return inEdges.concat(this.outEdges(v,w))}}}function incrementOrInitEntry(map,k){if(map[k]){map[k]++}else{map[k]=1}}function decrementOrRemoveEntry(map,k){if(!--map[k]){delete map[k]}}function edgeArgsToId(isDirected,v_,w_,name){var v=""+v_;var w=""+w_;if(!isDirected&&v>w){var tmp=v;v=w;w=tmp}return v+EDGE_KEY_DELIM+w+EDGE_KEY_DELIM+(name===undefined?DEFAULT_EDGE_NAME:name)}function edgeArgsToObj(isDirected,v_,w_,name){var v=""+v_;var w=""+w_;if(!isDirected&&v>w){var tmp=v;v=w;w=tmp}var edgeObj={v:v,w:w};if(name){edgeObj.name=name}return edgeObj}function edgeObjToId(isDirected,edgeObj){return edgeArgsToId(isDirected,edgeObj.v,edgeObj.w,edgeObj.name)}module.exports=Graph},{}],17:[function(require,module,exports){ +// Includes only the "core" of graphlib +module.exports={Graph:require("./graph"),version:require("./version")}},{"./graph":16,"./version":19}],18:[function(require,module,exports){var Graph=require("./graph");module.exports={write:write,read:read}; /** * Creates a JSON representation of the graph that can be serialized to a string with * JSON.stringify. The graph can later be restored using json.read. @@ -298,4 +301,4 @@ v=edgeObj.v;w=edgeObj.w;Object.freeze(edgeObj);this.#edgeObjs[e]=edgeObj;increme * // ['a', 'b'] * g2.edges() * // [ { v: 'a', w: 'b' } ] - */function read(json){var g=new _graph.default(json.options).setGraph(json.value);json.nodes.forEach(function(entry){g.setNode(entry.v,entry.value);if(entry.parent){g.setParent(entry.v,entry.parent)}});json.edges.forEach(function(entry){g.setEdge({v:entry.v,w:entry.w,name:entry.name},entry.value)});return g}},{"./graph.js":16}],19:[function(require,module,exports){"use strict";Object.defineProperty(exports,"__esModule",{value:true});exports.default=void 0;var _default=exports.default="2.2.0";module.exports=exports.default},{}]},{},[1])(1)}); + */function read(json){var g=new Graph(json.options).setGraph(json.value);json.nodes.forEach(function(entry){g.setNode(entry.v,entry.value);if(entry.parent){g.setParent(entry.v,entry.parent)}});json.edges.forEach(function(entry){g.setEdge({v:entry.v,w:entry.w,name:entry.name},entry.value)});return g}},{"./graph":16}],19:[function(require,module,exports){module.exports="2.2.1"},{}]},{},[1])(1)}); From fe61e39cc4994e4b91fbfb04e75d5c93471fb195 Mon Sep 17 00:00:00 2001 From: David Newell Date: Fri, 15 Mar 2024 15:50:55 +0100 Subject: [PATCH 66/85] Bump version and set as pre-release --- lib/version.js | 2 +- package.json | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/lib/version.js b/lib/version.js index d810b945..e3d40348 100644 --- a/lib/version.js +++ b/lib/version.js @@ -1 +1 @@ -module.exports = '2.2.1'; +module.exports = '2.2.2-pre'; diff --git a/package.json b/package.json index a772d994..391e63c7 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@dagrejs/graphlib", - "version": "2.2.1", + "version": "2.2.2-pre", "description": "A directed and undirected multi-graph library", "author": "Chris Pettitt ", "license": "MIT", @@ -47,4 +47,4 @@ "type": "git", "url": "https://github.com/dagrejs/graphlib.git" } -} +} \ No newline at end of file From 96e5d45e78cb34ff9ae682b2137f5d4465e361a8 Mon Sep 17 00:00:00 2001 From: David Newell Date: Fri, 15 Mar 2024 15:03:01 +0000 Subject: [PATCH 67/85] Switching GitHub actions to Chrome --- .github/workflows/build.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 3cec4123..d5e5c6c7 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -15,7 +15,7 @@ jobs: steps: - uses: actions/checkout@v2 - - uses: browser-actions/setup-firefox@latest + - uses: browser-actions/setup-chrome@latest - name: Use Node.js ${{ matrix.node-version }} uses: actions/setup-node@v3 @@ -39,4 +39,4 @@ jobs: - name: Test run: | - KARMA_OPTS="--browsers Firefox" xvfb-run --auto-servernum make -e test + KARMA_OPTS="--browsers Chrome" xvfb-run --auto-servernum make -e test From cec77cc5c28d3a5fa834cebf8ebea3de9524d5eb Mon Sep 17 00:00:00 2001 From: David Newell Date: Thu, 11 Apr 2024 11:01:44 +0000 Subject: [PATCH 68/85] Replacing the '#' to enforce private with '_' to suggest private --- lib/data/priority-queue.js | 60 +++++----- lib/graph.js | 230 ++++++++++++++++++------------------- package-lock.json | 4 +- 3 files changed, 147 insertions(+), 147 deletions(-) diff --git a/lib/data/priority-queue.js b/lib/data/priority-queue.js index 1a411fff..6ce46fe8 100644 --- a/lib/data/priority-queue.js +++ b/lib/data/priority-queue.js @@ -6,28 +6,28 @@ * have its priority decreased in O(log n) time. */ class PriorityQueue { - #arr = []; - #keyIndices = {}; + _arr = []; + _keyIndices = {}; /** * Returns the number of elements in the queue. Takes `O(1)` time. */ size() { - return this.#arr.length; + return this._arr.length; } /** * Returns the keys that are in the queue. Takes `O(n)` time. */ keys() { - return this.#arr.map(function(x) { return x.key; }); + return this._arr.map(function(x) { return x.key; }); } /** * Returns `true` if **key** is in the queue and `false` if not. */ has(key) { - return this.#keyIndices.hasOwnProperty(key); + return this._keyIndices.hasOwnProperty(key); } /** @@ -37,9 +37,9 @@ class PriorityQueue { * @param {Object} key */ priority(key) { - var index = this.#keyIndices[key]; + var index = this._keyIndices[key]; if (index !== undefined) { - return this.#arr[index].priority; + return this._arr[index].priority; } } @@ -51,7 +51,7 @@ class PriorityQueue { if (this.size() === 0) { throw new Error("Queue underflow"); } - return this.#arr[0].key; + return this._arr[0].key; } /** @@ -63,14 +63,14 @@ class PriorityQueue { * @param {Number} priority the initial priority for the key */ add(key, priority) { - var keyIndices = this.#keyIndices; + var keyIndices = this._keyIndices; key = String(key); if (!keyIndices.hasOwnProperty(key)) { - var arr = this.#arr; + var arr = this._arr; var index = arr.length; keyIndices[key] = index; arr.push({key: key, priority: priority}); - this.#decrease(index); + this._decrease(index); return true; } return false; @@ -80,10 +80,10 @@ class PriorityQueue { * Removes and returns the smallest key in the queue. Takes `O(log n)` time. */ removeMin() { - this.#swap(0, this.#arr.length - 1); - var min = this.#arr.pop(); - delete this.#keyIndices[min.key]; - this.#heapify(0); + this._swap(0, this._arr.length - 1); + var min = this._arr.pop(); + delete this._keyIndices[min.key]; + this._heapify(0); return min.key; } @@ -95,17 +95,17 @@ class PriorityQueue { * @param {Number} priority the new priority for the key */ decrease(key, priority) { - var index = this.#keyIndices[key]; - if (priority > this.#arr[index].priority) { + var index = this._keyIndices[key]; + if (priority > this._arr[index].priority) { throw new Error("New priority is greater than current priority. " + - "Key: " + key + " Old: " + this.#arr[index].priority + " New: " + priority); + "Key: " + key + " Old: " + this._arr[index].priority + " New: " + priority); } - this.#arr[index].priority = priority; - this.#decrease(index); + this._arr[index].priority = priority; + this._decrease(index); } - #heapify(i) { - var arr = this.#arr; + _heapify(i) { + var arr = this._arr; var l = 2 * i; var r = l + 1; var largest = i; @@ -115,14 +115,14 @@ class PriorityQueue { largest = arr[r].priority < arr[largest].priority ? r : largest; } if (largest !== i) { - this.#swap(i, largest); - this.#heapify(largest); + this._swap(i, largest); + this._heapify(largest); } } } - #decrease(index) { - var arr = this.#arr; + _decrease(index) { + var arr = this._arr; var priority = arr[index].priority; var parent; while (index !== 0) { @@ -130,14 +130,14 @@ class PriorityQueue { if (arr[parent].priority < priority) { break; } - this.#swap(index, parent); + this._swap(index, parent); index = parent; } } - #swap(i, j) { - var arr = this.#arr; - var keyIndices = this.#keyIndices; + _swap(i, j) { + var arr = this._arr; + var keyIndices = this._keyIndices; var origArrI = arr[i]; var origArrJ = arr[j]; arr[i] = origArrJ; diff --git a/lib/graph.js b/lib/graph.js index 0b466cd3..da9fa731 100644 --- a/lib/graph.js +++ b/lib/graph.js @@ -15,64 +15,64 @@ var EDGE_KEY_DELIM = "\x01"; // we're going to get to a performant hashtable in JavaScript. class Graph { - #isDirected = true; - #isMultigraph = false; - #isCompound = false; + _isDirected = true; + _isMultigraph = false; + _isCompound = false; // Label for the graph itself - #label; + _label; // Defaults to be set when creating a new node - #defaultNodeLabelFn = () => undefined; + _defaultNodeLabelFn = () => undefined; // Defaults to be set when creating a new edge - #defaultEdgeLabelFn = () => undefined; + _defaultEdgeLabelFn = () => undefined; // v -> label - #nodes = {}; + _nodes = {}; // v -> edgeObj - #in = {}; + _in = {}; // u -> v -> Number - #preds = {}; + _preds = {}; // v -> edgeObj - #out = {}; + _out = {}; // v -> w -> Number - #sucs = {}; + _sucs = {}; // e -> edgeObj - #edgeObjs = {}; + _edgeObjs = {}; // e -> label - #edgeLabels = {}; + _edgeLabels = {}; /* Number of nodes in the graph. Should only be changed by the implementation. */ - #nodeCount = 0; + _nodeCount = 0; /* Number of edges in the graph. Should only be changed by the implementation. */ - #edgeCount = 0; + _edgeCount = 0; - #parent; + _parent; - #children; + _children; constructor(opts) { if (opts) { - this.#isDirected = opts.hasOwnProperty("directed") ? opts.directed : true; - this.#isMultigraph = opts.hasOwnProperty("multigraph") ? opts.multigraph : false; - this.#isCompound = opts.hasOwnProperty("compound") ? opts.compound : false; + this._isDirected = opts.hasOwnProperty("directed") ? opts.directed : true; + this._isMultigraph = opts.hasOwnProperty("multigraph") ? opts.multigraph : false; + this._isCompound = opts.hasOwnProperty("compound") ? opts.compound : false; } - if (this.#isCompound) { + if (this._isCompound) { // v -> parent - this.#parent = {}; + this._parent = {}; // v -> children - this.#children = {}; - this.#children[GRAPH_NODE] = {}; + this._children = {}; + this._children[GRAPH_NODE] = {}; } } @@ -82,28 +82,28 @@ class Graph { * Whether graph was created with 'directed' flag set to true or not. */ isDirected() { - return this.#isDirected; + return this._isDirected; } /** * Whether graph was created with 'multigraph' flag set to true or not. */ isMultigraph() { - return this.#isMultigraph; + return this._isMultigraph; } /** * Whether graph was created with 'compound' flag set to true or not. */ isCompound() { - return this.#isCompound; + return this._isCompound; } /** * Sets the label of the graph. */ setGraph(label) { - this.#label = label; + this._label = label; return this; } @@ -111,7 +111,7 @@ class Graph { * Gets the graph label. */ graph() { - return this.#label; + return this._label; } @@ -125,9 +125,9 @@ class Graph { * Complexity: O(1). */ setDefaultNodeLabel(newDefault) { - this.#defaultNodeLabelFn = newDefault; + this._defaultNodeLabelFn = newDefault; if (typeof newDefault !== 'function') { - this.#defaultNodeLabelFn = () => newDefault; + this._defaultNodeLabelFn = () => newDefault; } return this; @@ -138,7 +138,7 @@ class Graph { * Complexity: O(1). */ nodeCount() { - return this.#nodeCount; + return this._nodeCount; } /** @@ -147,7 +147,7 @@ class Graph { * Complexity: O(1). */ nodes() { - return Object.keys(this.#nodes); + return Object.keys(this._nodes); } /** @@ -156,7 +156,7 @@ class Graph { */ sources() { var self = this; - return this.nodes().filter(v => Object.keys(self.#in[v]).length === 0); + return this.nodes().filter(v => Object.keys(self._in[v]).length === 0); } /** @@ -165,7 +165,7 @@ class Graph { */ sinks() { var self = this; - return this.nodes().filter(v => Object.keys(self.#out[v]).length === 0); + return this.nodes().filter(v => Object.keys(self._out[v]).length === 0); } /** @@ -192,24 +192,24 @@ class Graph { * Complexity: O(1). */ setNode(v, value) { - if (this.#nodes.hasOwnProperty(v)) { + if (this._nodes.hasOwnProperty(v)) { if (arguments.length > 1) { - this.#nodes[v] = value; + this._nodes[v] = value; } return this; } - this.#nodes[v] = arguments.length > 1 ? value : this.#defaultNodeLabelFn(v); - if (this.#isCompound) { - this.#parent[v] = GRAPH_NODE; - this.#children[v] = {}; - this.#children[GRAPH_NODE][v] = true; + this._nodes[v] = arguments.length > 1 ? value : this._defaultNodeLabelFn(v); + if (this._isCompound) { + this._parent[v] = GRAPH_NODE; + this._children[v] = {}; + this._children[GRAPH_NODE][v] = true; } - this.#in[v] = {}; - this.#preds[v] = {}; - this.#out[v] = {}; - this.#sucs[v] = {}; - ++this.#nodeCount; + this._in[v] = {}; + this._preds[v] = {}; + this._out[v] = {}; + this._sucs[v] = {}; + ++this._nodeCount; return this; } @@ -218,14 +218,14 @@ class Graph { * Complexity: O(|V|). */ node(v) { - return this.#nodes[v]; + return this._nodes[v]; } /** * Detects whether graph has a node with specified name or not. */ hasNode(v) { - return this.#nodes.hasOwnProperty(v); + return this._nodes.hasOwnProperty(v); } /** @@ -236,24 +236,24 @@ class Graph { */ removeNode(v) { var self = this; - if (this.#nodes.hasOwnProperty(v)) { - var removeEdge = e => self.removeEdge(self.#edgeObjs[e]); - delete this.#nodes[v]; - if (this.#isCompound) { - this.#removeFromParentsChildList(v); - delete this.#parent[v]; + if (this._nodes.hasOwnProperty(v)) { + var removeEdge = e => self.removeEdge(self._edgeObjs[e]); + delete this._nodes[v]; + if (this._isCompound) { + this._removeFromParentsChildList(v); + delete this._parent[v]; this.children(v).forEach(function(child) { self.setParent(child); }); - delete this.#children[v]; + delete this._children[v]; } - Object.keys(this.#in[v]).forEach(removeEdge); - delete this.#in[v]; - delete this.#preds[v]; - Object.keys(this.#out[v]).forEach(removeEdge); - delete this.#out[v]; - delete this.#sucs[v]; - --this.#nodeCount; + Object.keys(this._in[v]).forEach(removeEdge); + delete this._in[v]; + delete this._preds[v]; + Object.keys(this._out[v]).forEach(removeEdge); + delete this._out[v]; + delete this._sucs[v]; + --this._nodeCount; } return this; } @@ -265,7 +265,7 @@ class Graph { * Average-case complexity: O(1). */ setParent(v, parent) { - if (!this.#isCompound) { + if (!this._isCompound) { throw new Error("Cannot set parent in a non-compound graph"); } @@ -285,14 +285,14 @@ class Graph { } this.setNode(v); - this.#removeFromParentsChildList(v); - this.#parent[v] = parent; - this.#children[parent][v] = true; + this._removeFromParentsChildList(v); + this._parent[v] = parent; + this._children[parent][v] = true; return this; } - #removeFromParentsChildList(v) { - delete this.#children[this.#parent[v]][v]; + _removeFromParentsChildList(v) { + delete this._children[this._parent[v]][v]; } /** @@ -300,8 +300,8 @@ class Graph { * Complexity: O(1). */ parent(v) { - if (this.#isCompound) { - var parent = this.#parent[v]; + if (this._isCompound) { + var parent = this._parent[v]; if (parent !== GRAPH_NODE) { return parent; } @@ -313,8 +313,8 @@ class Graph { * Complexity: O(1). */ children(v = GRAPH_NODE) { - if (this.#isCompound) { - var children = this.#children[v]; + if (this._isCompound) { + var children = this._children[v]; if (children) { return Object.keys(children); } @@ -331,7 +331,7 @@ class Graph { * Complexity: O(|V|). */ predecessors(v) { - var predsV = this.#preds[v]; + var predsV = this._preds[v]; if (predsV) { return Object.keys(predsV); } @@ -343,7 +343,7 @@ class Graph { * Complexity: O(|V|). */ successors(v) { - var sucsV = this.#sucs[v]; + var sucsV = this._sucs[v]; if (sucsV) { return Object.keys(sucsV); } @@ -384,21 +384,21 @@ class Graph { */ filterNodes(filter) { var copy = new this.constructor({ - directed: this.#isDirected, - multigraph: this.#isMultigraph, - compound: this.#isCompound + directed: this._isDirected, + multigraph: this._isMultigraph, + compound: this._isCompound }); copy.setGraph(this.graph()); var self = this; - Object.entries(this.#nodes).forEach(function([v, value]) { + Object.entries(this._nodes).forEach(function([v, value]) { if (filter(v)) { copy.setNode(v, value); } }); - Object.values(this.#edgeObjs).forEach(function(e) { + Object.values(this._edgeObjs).forEach(function(e) { if (copy.hasNode(e.v) && copy.hasNode(e.w)) { copy.setEdge(e, self.edge(e)); } @@ -417,7 +417,7 @@ class Graph { } } - if (this.#isCompound) { + if (this._isCompound) { copy.nodes().forEach(v => copy.setParent(v, findParent(v))); } @@ -434,9 +434,9 @@ class Graph { * Complexity: O(1). */ setDefaultEdgeLabel(newDefault) { - this.#defaultEdgeLabelFn = newDefault; + this._defaultEdgeLabelFn = newDefault; if (typeof newDefault !== 'function') { - this.#defaultEdgeLabelFn = () => newDefault; + this._defaultEdgeLabelFn = () => newDefault; } return this; @@ -447,7 +447,7 @@ class Graph { * Complexity: O(1). */ edgeCount() { - return this.#edgeCount; + return this._edgeCount; } /** @@ -455,7 +455,7 @@ class Graph { * Complexity: O(|E|). */ edges() { - return Object.values(this.#edgeObjs); + return Object.values(this._edgeObjs); } /** @@ -513,15 +513,15 @@ class Graph { name = "" + name; } - var e = edgeArgsToId(this.#isDirected, v, w, name); - if (this.#edgeLabels.hasOwnProperty(e)) { + var e = edgeArgsToId(this._isDirected, v, w, name); + if (this._edgeLabels.hasOwnProperty(e)) { if (valueSpecified) { - this.#edgeLabels[e] = value; + this._edgeLabels[e] = value; } return this; } - if (name !== undefined && !this.#isMultigraph) { + if (name !== undefined && !this._isMultigraph) { throw new Error("Cannot set a named edge when isMultigraph = false"); } @@ -530,20 +530,20 @@ class Graph { this.setNode(v); this.setNode(w); - this.#edgeLabels[e] = valueSpecified ? value : this.#defaultEdgeLabelFn(v, w, name); + this._edgeLabels[e] = valueSpecified ? value : this._defaultEdgeLabelFn(v, w, name); - var edgeObj = edgeArgsToObj(this.#isDirected, v, w, name); + var edgeObj = edgeArgsToObj(this._isDirected, v, w, name); // Ensure we add undirected edges in a consistent way. v = edgeObj.v; w = edgeObj.w; Object.freeze(edgeObj); - this.#edgeObjs[e] = edgeObj; - incrementOrInitEntry(this.#preds[w], v); - incrementOrInitEntry(this.#sucs[v], w); - this.#in[w][e] = edgeObj; - this.#out[v][e] = edgeObj; - this.#edgeCount++; + this._edgeObjs[e] = edgeObj; + incrementOrInitEntry(this._preds[w], v); + incrementOrInitEntry(this._sucs[v], w); + this._in[w][e] = edgeObj; + this._out[v][e] = edgeObj; + this._edgeCount++; return this; } @@ -553,9 +553,9 @@ class Graph { */ edge(v, w, name) { var e = (arguments.length === 1 - ? edgeObjToId(this.#isDirected, arguments[0]) - : edgeArgsToId(this.#isDirected, v, w, name)); - return this.#edgeLabels[e]; + ? edgeObjToId(this._isDirected, arguments[0]) + : edgeArgsToId(this._isDirected, v, w, name)); + return this._edgeLabels[e]; } /** @@ -577,9 +577,9 @@ class Graph { */ hasEdge(v, w, name) { var e = (arguments.length === 1 - ? edgeObjToId(this.#isDirected, arguments[0]) - : edgeArgsToId(this.#isDirected, v, w, name)); - return this.#edgeLabels.hasOwnProperty(e); + ? edgeObjToId(this._isDirected, arguments[0]) + : edgeArgsToId(this._isDirected, v, w, name)); + return this._edgeLabels.hasOwnProperty(e); } /** @@ -588,19 +588,19 @@ class Graph { */ removeEdge(v, w, name) { var e = (arguments.length === 1 - ? edgeObjToId(this.#isDirected, arguments[0]) - : edgeArgsToId(this.#isDirected, v, w, name)); - var edge = this.#edgeObjs[e]; + ? edgeObjToId(this._isDirected, arguments[0]) + : edgeArgsToId(this._isDirected, v, w, name)); + var edge = this._edgeObjs[e]; if (edge) { v = edge.v; w = edge.w; - delete this.#edgeLabels[e]; - delete this.#edgeObjs[e]; - decrementOrRemoveEntry(this.#preds[w], v); - decrementOrRemoveEntry(this.#sucs[v], w); - delete this.#in[w][e]; - delete this.#out[v][e]; - this.#edgeCount--; + delete this._edgeLabels[e]; + delete this._edgeObjs[e]; + decrementOrRemoveEntry(this._preds[w], v); + decrementOrRemoveEntry(this._sucs[v], w); + delete this._in[w][e]; + delete this._out[v][e]; + this._edgeCount--; } return this; } @@ -611,7 +611,7 @@ class Graph { * Complexity: O(|E|). */ inEdges(v, u) { - var inV = this.#in[v]; + var inV = this._in[v]; if (inV) { var edges = Object.values(inV); if (!u) { @@ -627,7 +627,7 @@ class Graph { * Complexity: O(|E|). */ outEdges(v, w) { - var outV = this.#out[v]; + var outV = this._out[v]; if (outV) { var edges = Object.values(outV); if (!w) { diff --git a/package-lock.json b/package-lock.json index b3c5ca34..04974cc8 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "@dagrejs/graphlib", - "version": "2.2.1", + "version": "2.2.2-pre", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "@dagrejs/graphlib", - "version": "2.2.1", + "version": "2.2.2-pre", "license": "MIT", "devDependencies": { "benchmark": "2.1.4", From 6d46d6db24cbdad2aae805f8f3efa49cf1d3d715 Mon Sep 17 00:00:00 2001 From: David Newell Date: Thu, 11 Apr 2024 13:09:03 +0200 Subject: [PATCH 69/85] Prep before release --- bower.json | 2 +- dist/graphlib.core.js | 292 +++++++++++++++++++------------------- dist/graphlib.core.min.js | 114 +++++++-------- dist/graphlib.js | 292 +++++++++++++++++++------------------- dist/graphlib.min.js | 114 +++++++-------- lib/version.js | 2 +- package-lock.json | 4 +- package.json | 4 +- 8 files changed, 412 insertions(+), 412 deletions(-) diff --git a/bower.json b/bower.json index 229def72..3533e8c8 100644 --- a/bower.json +++ b/bower.json @@ -1,6 +1,6 @@ { "name": "graphlib", - "version": "2.2.1", + "version": "2.2.2", "main": [ "dist/graphlib.core.js" ], diff --git a/dist/graphlib.core.js b/dist/graphlib.core.js index 1ed4f81f..d9924a35 100644 --- a/dist/graphlib.core.js +++ b/dist/graphlib.core.js @@ -459,28 +459,28 @@ topsort.CycleException = CycleException; * have its priority decreased in O(log n) time. */ class PriorityQueue { - #arr = []; - #keyIndices = {}; + _arr = []; + _keyIndices = {}; /** * Returns the number of elements in the queue. Takes `O(1)` time. */ size() { - return this.#arr.length; + return this._arr.length; } /** * Returns the keys that are in the queue. Takes `O(n)` time. */ keys() { - return this.#arr.map(function(x) { return x.key; }); + return this._arr.map(function(x) { return x.key; }); } /** * Returns `true` if **key** is in the queue and `false` if not. */ has(key) { - return this.#keyIndices.hasOwnProperty(key); + return this._keyIndices.hasOwnProperty(key); } /** @@ -490,9 +490,9 @@ class PriorityQueue { * @param {Object} key */ priority(key) { - var index = this.#keyIndices[key]; + var index = this._keyIndices[key]; if (index !== undefined) { - return this.#arr[index].priority; + return this._arr[index].priority; } } @@ -504,7 +504,7 @@ class PriorityQueue { if (this.size() === 0) { throw new Error("Queue underflow"); } - return this.#arr[0].key; + return this._arr[0].key; } /** @@ -516,14 +516,14 @@ class PriorityQueue { * @param {Number} priority the initial priority for the key */ add(key, priority) { - var keyIndices = this.#keyIndices; + var keyIndices = this._keyIndices; key = String(key); if (!keyIndices.hasOwnProperty(key)) { - var arr = this.#arr; + var arr = this._arr; var index = arr.length; keyIndices[key] = index; arr.push({key: key, priority: priority}); - this.#decrease(index); + this._decrease(index); return true; } return false; @@ -533,10 +533,10 @@ class PriorityQueue { * Removes and returns the smallest key in the queue. Takes `O(log n)` time. */ removeMin() { - this.#swap(0, this.#arr.length - 1); - var min = this.#arr.pop(); - delete this.#keyIndices[min.key]; - this.#heapify(0); + this._swap(0, this._arr.length - 1); + var min = this._arr.pop(); + delete this._keyIndices[min.key]; + this._heapify(0); return min.key; } @@ -548,17 +548,17 @@ class PriorityQueue { * @param {Number} priority the new priority for the key */ decrease(key, priority) { - var index = this.#keyIndices[key]; - if (priority > this.#arr[index].priority) { + var index = this._keyIndices[key]; + if (priority > this._arr[index].priority) { throw new Error("New priority is greater than current priority. " + - "Key: " + key + " Old: " + this.#arr[index].priority + " New: " + priority); + "Key: " + key + " Old: " + this._arr[index].priority + " New: " + priority); } - this.#arr[index].priority = priority; - this.#decrease(index); + this._arr[index].priority = priority; + this._decrease(index); } - #heapify(i) { - var arr = this.#arr; + _heapify(i) { + var arr = this._arr; var l = 2 * i; var r = l + 1; var largest = i; @@ -568,14 +568,14 @@ class PriorityQueue { largest = arr[r].priority < arr[largest].priority ? r : largest; } if (largest !== i) { - this.#swap(i, largest); - this.#heapify(largest); + this._swap(i, largest); + this._heapify(largest); } } } - #decrease(index) { - var arr = this.#arr; + _decrease(index) { + var arr = this._arr; var priority = arr[index].priority; var parent; while (index !== 0) { @@ -583,14 +583,14 @@ class PriorityQueue { if (arr[parent].priority < priority) { break; } - this.#swap(index, parent); + this._swap(index, parent); index = parent; } } - #swap(i, j) { - var arr = this.#arr; - var keyIndices = this.#keyIndices; + _swap(i, j) { + var arr = this._arr; + var keyIndices = this._keyIndices; var origArrI = arr[i]; var origArrJ = arr[j]; arr[i] = origArrJ; @@ -620,64 +620,64 @@ var EDGE_KEY_DELIM = "\x01"; // we're going to get to a performant hashtable in JavaScript. class Graph { - #isDirected = true; - #isMultigraph = false; - #isCompound = false; + _isDirected = true; + _isMultigraph = false; + _isCompound = false; // Label for the graph itself - #label; + _label; // Defaults to be set when creating a new node - #defaultNodeLabelFn = () => undefined; + _defaultNodeLabelFn = () => undefined; // Defaults to be set when creating a new edge - #defaultEdgeLabelFn = () => undefined; + _defaultEdgeLabelFn = () => undefined; // v -> label - #nodes = {}; + _nodes = {}; // v -> edgeObj - #in = {}; + _in = {}; // u -> v -> Number - #preds = {}; + _preds = {}; // v -> edgeObj - #out = {}; + _out = {}; // v -> w -> Number - #sucs = {}; + _sucs = {}; // e -> edgeObj - #edgeObjs = {}; + _edgeObjs = {}; // e -> label - #edgeLabels = {}; + _edgeLabels = {}; /* Number of nodes in the graph. Should only be changed by the implementation. */ - #nodeCount = 0; + _nodeCount = 0; /* Number of edges in the graph. Should only be changed by the implementation. */ - #edgeCount = 0; + _edgeCount = 0; - #parent; + _parent; - #children; + _children; constructor(opts) { if (opts) { - this.#isDirected = opts.hasOwnProperty("directed") ? opts.directed : true; - this.#isMultigraph = opts.hasOwnProperty("multigraph") ? opts.multigraph : false; - this.#isCompound = opts.hasOwnProperty("compound") ? opts.compound : false; + this._isDirected = opts.hasOwnProperty("directed") ? opts.directed : true; + this._isMultigraph = opts.hasOwnProperty("multigraph") ? opts.multigraph : false; + this._isCompound = opts.hasOwnProperty("compound") ? opts.compound : false; } - if (this.#isCompound) { + if (this._isCompound) { // v -> parent - this.#parent = {}; + this._parent = {}; // v -> children - this.#children = {}; - this.#children[GRAPH_NODE] = {}; + this._children = {}; + this._children[GRAPH_NODE] = {}; } } @@ -687,28 +687,28 @@ class Graph { * Whether graph was created with 'directed' flag set to true or not. */ isDirected() { - return this.#isDirected; + return this._isDirected; } /** * Whether graph was created with 'multigraph' flag set to true or not. */ isMultigraph() { - return this.#isMultigraph; + return this._isMultigraph; } /** * Whether graph was created with 'compound' flag set to true or not. */ isCompound() { - return this.#isCompound; + return this._isCompound; } /** * Sets the label of the graph. */ setGraph(label) { - this.#label = label; + this._label = label; return this; } @@ -716,7 +716,7 @@ class Graph { * Gets the graph label. */ graph() { - return this.#label; + return this._label; } @@ -730,9 +730,9 @@ class Graph { * Complexity: O(1). */ setDefaultNodeLabel(newDefault) { - this.#defaultNodeLabelFn = newDefault; + this._defaultNodeLabelFn = newDefault; if (typeof newDefault !== 'function') { - this.#defaultNodeLabelFn = () => newDefault; + this._defaultNodeLabelFn = () => newDefault; } return this; @@ -743,7 +743,7 @@ class Graph { * Complexity: O(1). */ nodeCount() { - return this.#nodeCount; + return this._nodeCount; } /** @@ -752,7 +752,7 @@ class Graph { * Complexity: O(1). */ nodes() { - return Object.keys(this.#nodes); + return Object.keys(this._nodes); } /** @@ -761,7 +761,7 @@ class Graph { */ sources() { var self = this; - return this.nodes().filter(v => Object.keys(self.#in[v]).length === 0); + return this.nodes().filter(v => Object.keys(self._in[v]).length === 0); } /** @@ -770,7 +770,7 @@ class Graph { */ sinks() { var self = this; - return this.nodes().filter(v => Object.keys(self.#out[v]).length === 0); + return this.nodes().filter(v => Object.keys(self._out[v]).length === 0); } /** @@ -797,24 +797,24 @@ class Graph { * Complexity: O(1). */ setNode(v, value) { - if (this.#nodes.hasOwnProperty(v)) { + if (this._nodes.hasOwnProperty(v)) { if (arguments.length > 1) { - this.#nodes[v] = value; + this._nodes[v] = value; } return this; } - this.#nodes[v] = arguments.length > 1 ? value : this.#defaultNodeLabelFn(v); - if (this.#isCompound) { - this.#parent[v] = GRAPH_NODE; - this.#children[v] = {}; - this.#children[GRAPH_NODE][v] = true; + this._nodes[v] = arguments.length > 1 ? value : this._defaultNodeLabelFn(v); + if (this._isCompound) { + this._parent[v] = GRAPH_NODE; + this._children[v] = {}; + this._children[GRAPH_NODE][v] = true; } - this.#in[v] = {}; - this.#preds[v] = {}; - this.#out[v] = {}; - this.#sucs[v] = {}; - ++this.#nodeCount; + this._in[v] = {}; + this._preds[v] = {}; + this._out[v] = {}; + this._sucs[v] = {}; + ++this._nodeCount; return this; } @@ -823,14 +823,14 @@ class Graph { * Complexity: O(|V|). */ node(v) { - return this.#nodes[v]; + return this._nodes[v]; } /** * Detects whether graph has a node with specified name or not. */ hasNode(v) { - return this.#nodes.hasOwnProperty(v); + return this._nodes.hasOwnProperty(v); } /** @@ -841,24 +841,24 @@ class Graph { */ removeNode(v) { var self = this; - if (this.#nodes.hasOwnProperty(v)) { - var removeEdge = e => self.removeEdge(self.#edgeObjs[e]); - delete this.#nodes[v]; - if (this.#isCompound) { - this.#removeFromParentsChildList(v); - delete this.#parent[v]; + if (this._nodes.hasOwnProperty(v)) { + var removeEdge = e => self.removeEdge(self._edgeObjs[e]); + delete this._nodes[v]; + if (this._isCompound) { + this._removeFromParentsChildList(v); + delete this._parent[v]; this.children(v).forEach(function(child) { self.setParent(child); }); - delete this.#children[v]; + delete this._children[v]; } - Object.keys(this.#in[v]).forEach(removeEdge); - delete this.#in[v]; - delete this.#preds[v]; - Object.keys(this.#out[v]).forEach(removeEdge); - delete this.#out[v]; - delete this.#sucs[v]; - --this.#nodeCount; + Object.keys(this._in[v]).forEach(removeEdge); + delete this._in[v]; + delete this._preds[v]; + Object.keys(this._out[v]).forEach(removeEdge); + delete this._out[v]; + delete this._sucs[v]; + --this._nodeCount; } return this; } @@ -870,7 +870,7 @@ class Graph { * Average-case complexity: O(1). */ setParent(v, parent) { - if (!this.#isCompound) { + if (!this._isCompound) { throw new Error("Cannot set parent in a non-compound graph"); } @@ -890,14 +890,14 @@ class Graph { } this.setNode(v); - this.#removeFromParentsChildList(v); - this.#parent[v] = parent; - this.#children[parent][v] = true; + this._removeFromParentsChildList(v); + this._parent[v] = parent; + this._children[parent][v] = true; return this; } - #removeFromParentsChildList(v) { - delete this.#children[this.#parent[v]][v]; + _removeFromParentsChildList(v) { + delete this._children[this._parent[v]][v]; } /** @@ -905,8 +905,8 @@ class Graph { * Complexity: O(1). */ parent(v) { - if (this.#isCompound) { - var parent = this.#parent[v]; + if (this._isCompound) { + var parent = this._parent[v]; if (parent !== GRAPH_NODE) { return parent; } @@ -918,8 +918,8 @@ class Graph { * Complexity: O(1). */ children(v = GRAPH_NODE) { - if (this.#isCompound) { - var children = this.#children[v]; + if (this._isCompound) { + var children = this._children[v]; if (children) { return Object.keys(children); } @@ -936,7 +936,7 @@ class Graph { * Complexity: O(|V|). */ predecessors(v) { - var predsV = this.#preds[v]; + var predsV = this._preds[v]; if (predsV) { return Object.keys(predsV); } @@ -948,7 +948,7 @@ class Graph { * Complexity: O(|V|). */ successors(v) { - var sucsV = this.#sucs[v]; + var sucsV = this._sucs[v]; if (sucsV) { return Object.keys(sucsV); } @@ -989,21 +989,21 @@ class Graph { */ filterNodes(filter) { var copy = new this.constructor({ - directed: this.#isDirected, - multigraph: this.#isMultigraph, - compound: this.#isCompound + directed: this._isDirected, + multigraph: this._isMultigraph, + compound: this._isCompound }); copy.setGraph(this.graph()); var self = this; - Object.entries(this.#nodes).forEach(function([v, value]) { + Object.entries(this._nodes).forEach(function([v, value]) { if (filter(v)) { copy.setNode(v, value); } }); - Object.values(this.#edgeObjs).forEach(function(e) { + Object.values(this._edgeObjs).forEach(function(e) { if (copy.hasNode(e.v) && copy.hasNode(e.w)) { copy.setEdge(e, self.edge(e)); } @@ -1022,7 +1022,7 @@ class Graph { } } - if (this.#isCompound) { + if (this._isCompound) { copy.nodes().forEach(v => copy.setParent(v, findParent(v))); } @@ -1039,9 +1039,9 @@ class Graph { * Complexity: O(1). */ setDefaultEdgeLabel(newDefault) { - this.#defaultEdgeLabelFn = newDefault; + this._defaultEdgeLabelFn = newDefault; if (typeof newDefault !== 'function') { - this.#defaultEdgeLabelFn = () => newDefault; + this._defaultEdgeLabelFn = () => newDefault; } return this; @@ -1052,7 +1052,7 @@ class Graph { * Complexity: O(1). */ edgeCount() { - return this.#edgeCount; + return this._edgeCount; } /** @@ -1060,7 +1060,7 @@ class Graph { * Complexity: O(|E|). */ edges() { - return Object.values(this.#edgeObjs); + return Object.values(this._edgeObjs); } /** @@ -1118,15 +1118,15 @@ class Graph { name = "" + name; } - var e = edgeArgsToId(this.#isDirected, v, w, name); - if (this.#edgeLabels.hasOwnProperty(e)) { + var e = edgeArgsToId(this._isDirected, v, w, name); + if (this._edgeLabels.hasOwnProperty(e)) { if (valueSpecified) { - this.#edgeLabels[e] = value; + this._edgeLabels[e] = value; } return this; } - if (name !== undefined && !this.#isMultigraph) { + if (name !== undefined && !this._isMultigraph) { throw new Error("Cannot set a named edge when isMultigraph = false"); } @@ -1135,20 +1135,20 @@ class Graph { this.setNode(v); this.setNode(w); - this.#edgeLabels[e] = valueSpecified ? value : this.#defaultEdgeLabelFn(v, w, name); + this._edgeLabels[e] = valueSpecified ? value : this._defaultEdgeLabelFn(v, w, name); - var edgeObj = edgeArgsToObj(this.#isDirected, v, w, name); + var edgeObj = edgeArgsToObj(this._isDirected, v, w, name); // Ensure we add undirected edges in a consistent way. v = edgeObj.v; w = edgeObj.w; Object.freeze(edgeObj); - this.#edgeObjs[e] = edgeObj; - incrementOrInitEntry(this.#preds[w], v); - incrementOrInitEntry(this.#sucs[v], w); - this.#in[w][e] = edgeObj; - this.#out[v][e] = edgeObj; - this.#edgeCount++; + this._edgeObjs[e] = edgeObj; + incrementOrInitEntry(this._preds[w], v); + incrementOrInitEntry(this._sucs[v], w); + this._in[w][e] = edgeObj; + this._out[v][e] = edgeObj; + this._edgeCount++; return this; } @@ -1158,9 +1158,9 @@ class Graph { */ edge(v, w, name) { var e = (arguments.length === 1 - ? edgeObjToId(this.#isDirected, arguments[0]) - : edgeArgsToId(this.#isDirected, v, w, name)); - return this.#edgeLabels[e]; + ? edgeObjToId(this._isDirected, arguments[0]) + : edgeArgsToId(this._isDirected, v, w, name)); + return this._edgeLabels[e]; } /** @@ -1182,9 +1182,9 @@ class Graph { */ hasEdge(v, w, name) { var e = (arguments.length === 1 - ? edgeObjToId(this.#isDirected, arguments[0]) - : edgeArgsToId(this.#isDirected, v, w, name)); - return this.#edgeLabels.hasOwnProperty(e); + ? edgeObjToId(this._isDirected, arguments[0]) + : edgeArgsToId(this._isDirected, v, w, name)); + return this._edgeLabels.hasOwnProperty(e); } /** @@ -1193,19 +1193,19 @@ class Graph { */ removeEdge(v, w, name) { var e = (arguments.length === 1 - ? edgeObjToId(this.#isDirected, arguments[0]) - : edgeArgsToId(this.#isDirected, v, w, name)); - var edge = this.#edgeObjs[e]; + ? edgeObjToId(this._isDirected, arguments[0]) + : edgeArgsToId(this._isDirected, v, w, name)); + var edge = this._edgeObjs[e]; if (edge) { v = edge.v; w = edge.w; - delete this.#edgeLabels[e]; - delete this.#edgeObjs[e]; - decrementOrRemoveEntry(this.#preds[w], v); - decrementOrRemoveEntry(this.#sucs[v], w); - delete this.#in[w][e]; - delete this.#out[v][e]; - this.#edgeCount--; + delete this._edgeLabels[e]; + delete this._edgeObjs[e]; + decrementOrRemoveEntry(this._preds[w], v); + decrementOrRemoveEntry(this._sucs[v], w); + delete this._in[w][e]; + delete this._out[v][e]; + this._edgeCount--; } return this; } @@ -1216,7 +1216,7 @@ class Graph { * Complexity: O(|E|). */ inEdges(v, u) { - var inV = this.#in[v]; + var inV = this._in[v]; if (inV) { var edges = Object.values(inV); if (!u) { @@ -1232,7 +1232,7 @@ class Graph { * Complexity: O(|E|). */ outEdges(v, w) { - var outV = this.#out[v]; + var outV = this._out[v]; if (outV) { var edges = Object.values(outV); if (!w) { @@ -1390,7 +1390,7 @@ function read(json) { } },{"./graph":16}],19:[function(require,module,exports){ -module.exports = '2.2.1'; +module.exports = '2.2.2'; },{}]},{},[1])(1) }); diff --git a/dist/graphlib.core.min.js b/dist/graphlib.core.min.js index d43b43f8..89756ba9 100644 --- a/dist/graphlib.core.min.js +++ b/dist/graphlib.core.min.js @@ -47,26 +47,26 @@ var results=[];function dfs(v){var entry=visited[v]={onStack:true,lowlink:index, * the queue. Adding and removing elements takes O(log n) time. A key can * have its priority decreased in O(log n) time. */ -class PriorityQueue{#arr=[];#keyIndices={}; +class PriorityQueue{_arr=[];_keyIndices={}; /** * Returns the number of elements in the queue. Takes `O(1)` time. - */size(){return this.#arr.length} + */size(){return this._arr.length} /** * Returns the keys that are in the queue. Takes `O(n)` time. - */keys(){return this.#arr.map(function(x){return x.key})} + */keys(){return this._arr.map(function(x){return x.key})} /** * Returns `true` if **key** is in the queue and `false` if not. - */has(key){return this.#keyIndices.hasOwnProperty(key)} + */has(key){return this._keyIndices.hasOwnProperty(key)} /** * Returns the priority for **key**. If **key** is not present in the queue * then this function returns `undefined`. Takes `O(1)` time. * * @param {Object} key - */priority(key){var index=this.#keyIndices[key];if(index!==undefined){return this.#arr[index].priority}} + */priority(key){var index=this._keyIndices[key];if(index!==undefined){return this._arr[index].priority}} /** * Returns the key for the minimum element in this queue. If the queue is * empty this function throws an Error. Takes `O(1)` time. - */min(){if(this.size()===0){throw new Error("Queue underflow")}return this.#arr[0].key} + */min(){if(this.size()===0){throw new Error("Queue underflow")}return this._arr[0].key} /** * Inserts a new key into the priority queue. If the key already exists in * the queue this function returns `false`; otherwise it will return `true`. @@ -74,17 +74,17 @@ class PriorityQueue{#arr=[];#keyIndices={}; * * @param {Object} key the key to add * @param {Number} priority the initial priority for the key - */add(key,priority){var keyIndices=this.#keyIndices;key=String(key);if(!keyIndices.hasOwnProperty(key)){var arr=this.#arr;var index=arr.length;keyIndices[key]=index;arr.push({key:key,priority:priority});this.#decrease(index);return true}return false} + */add(key,priority){var keyIndices=this._keyIndices;key=String(key);if(!keyIndices.hasOwnProperty(key)){var arr=this._arr;var index=arr.length;keyIndices[key]=index;arr.push({key:key,priority:priority});this._decrease(index);return true}return false} /** * Removes and returns the smallest key in the queue. Takes `O(log n)` time. - */removeMin(){this.#swap(0,this.#arr.length-1);var min=this.#arr.pop();delete this.#keyIndices[min.key];this.#heapify(0);return min.key} + */removeMin(){this._swap(0,this._arr.length-1);var min=this._arr.pop();delete this._keyIndices[min.key];this._heapify(0);return min.key} /** * Decreases the priority for **key** to **priority**. If the new priority is * greater than the previous priority, this function will throw an Error. * * @param {Object} key the key for which to raise priority * @param {Number} priority the new priority for the key - */decrease(key,priority){var index=this.#keyIndices[key];if(priority>this.#arr[index].priority){throw new Error("New priority is greater than current priority. "+"Key: "+key+" Old: "+this.#arr[index].priority+" New: "+priority)}this.#arr[index].priority=priority;this.#decrease(index)}#heapify(i){var arr=this.#arr;var l=2*i;var r=l+1;var largest=i;if(l>1;if(arr[parent].prioritythis._arr[index].priority){throw new Error("New priority is greater than current priority. "+"Key: "+key+" Old: "+this._arr[index].priority+" New: "+priority)}this._arr[index].priority=priority;this._decrease(index)}_heapify(i){var arr=this._arr;var l=2*i;var r=l+1;var largest=i;if(l>1;if(arr[parent].priorityundefined; +_defaultNodeLabelFn=()=>undefined; // Defaults to be set when creating a new edge -#defaultEdgeLabelFn=()=>undefined; +_defaultEdgeLabelFn=()=>undefined; // v -> label -#nodes={}; +_nodes={}; // v -> edgeObj -#in={}; +_in={}; // u -> v -> Number -#preds={}; +_preds={}; // v -> edgeObj -#out={}; +_out={}; // v -> w -> Number -#sucs={}; +_sucs={}; // e -> edgeObj -#edgeObjs={}; +_edgeObjs={}; // e -> label -#edgeLabels={}; -/* Number of nodes in the graph. Should only be changed by the implementation. */#nodeCount=0; -/* Number of edges in the graph. Should only be changed by the implementation. */#edgeCount=0;#parent;#children;constructor(opts){if(opts){this.#isDirected=opts.hasOwnProperty("directed")?opts.directed:true;this.#isMultigraph=opts.hasOwnProperty("multigraph")?opts.multigraph:false;this.#isCompound=opts.hasOwnProperty("compound")?opts.compound:false}if(this.#isCompound){ +_edgeLabels={}; +/* Number of nodes in the graph. Should only be changed by the implementation. */_nodeCount=0; +/* Number of edges in the graph. Should only be changed by the implementation. */_edgeCount=0;_parent;_children;constructor(opts){if(opts){this._isDirected=opts.hasOwnProperty("directed")?opts.directed:true;this._isMultigraph=opts.hasOwnProperty("multigraph")?opts.multigraph:false;this._isCompound=opts.hasOwnProperty("compound")?opts.compound:false}if(this._isCompound){ // v -> parent -this.#parent={}; +this._parent={}; // v -> children -this.#children={};this.#children[GRAPH_NODE]={}}} +this._children={};this._children[GRAPH_NODE]={}}} /* === Graph functions ========= */ /** * Whether graph was created with 'directed' flag set to true or not. - */isDirected(){return this.#isDirected} + */isDirected(){return this._isDirected} /** * Whether graph was created with 'multigraph' flag set to true or not. - */isMultigraph(){return this.#isMultigraph} + */isMultigraph(){return this._isMultigraph} /** * Whether graph was created with 'compound' flag set to true or not. - */isCompound(){return this.#isCompound} + */isCompound(){return this._isCompound} /** * Sets the label of the graph. - */setGraph(label){this.#label=label;return this} + */setGraph(label){this._label=label;return this} /** * Gets the graph label. - */graph(){return this.#label} + */graph(){return this._label} /* === Node functions ========== */ /** * Sets the default node label. If newDefault is a function, it will be @@ -144,24 +144,24 @@ this.#children={};this.#children[GRAPH_NODE]={}}} * will be assigned as default label in case if no label was specified while * setting a node. * Complexity: O(1). - */setDefaultNodeLabel(newDefault){this.#defaultNodeLabelFn=newDefault;if(typeof newDefault!=="function"){this.#defaultNodeLabelFn=()=>newDefault}return this} + */setDefaultNodeLabel(newDefault){this._defaultNodeLabelFn=newDefault;if(typeof newDefault!=="function"){this._defaultNodeLabelFn=()=>newDefault}return this} /** * Gets the number of nodes in the graph. * Complexity: O(1). - */nodeCount(){return this.#nodeCount} + */nodeCount(){return this._nodeCount} /** * Gets all nodes of the graph. Note, the in case of compound graph subnodes are * not included in list. * Complexity: O(1). - */nodes(){return Object.keys(this.#nodes)} + */nodes(){return Object.keys(this._nodes)} /** * Gets list of nodes without in-edges. * Complexity: O(|V|). - */sources(){var self=this;return this.nodes().filter(v=>Object.keys(self.#in[v]).length===0)} + */sources(){var self=this;return this.nodes().filter(v=>Object.keys(self._in[v]).length===0)} /** * Gets list of nodes without out-edges. * Complexity: O(|V|). - */sinks(){var self=this;return this.nodes().filter(v=>Object.keys(self.#out[v]).length===0)} + */sinks(){var self=this;return this.nodes().filter(v=>Object.keys(self._out[v]).length===0)} /** * Invokes setNode method for each node in names list. * Complexity: O(|names|). @@ -171,46 +171,46 @@ this.#children={};this.#children[GRAPH_NODE]={}}} * it is set as the value for the node. If label is not supplied and the node was * created by this call then the default node label will be assigned. * Complexity: O(1). - */setNode(v,value){if(this.#nodes.hasOwnProperty(v)){if(arguments.length>1){this.#nodes[v]=value}return this}this.#nodes[v]=arguments.length>1?value:this.#defaultNodeLabelFn(v);if(this.#isCompound){this.#parent[v]=GRAPH_NODE;this.#children[v]={};this.#children[GRAPH_NODE][v]=true}this.#in[v]={};this.#preds[v]={};this.#out[v]={};this.#sucs[v]={};++this.#nodeCount;return this} + */setNode(v,value){if(this._nodes.hasOwnProperty(v)){if(arguments.length>1){this._nodes[v]=value}return this}this._nodes[v]=arguments.length>1?value:this._defaultNodeLabelFn(v);if(this._isCompound){this._parent[v]=GRAPH_NODE;this._children[v]={};this._children[GRAPH_NODE][v]=true}this._in[v]={};this._preds[v]={};this._out[v]={};this._sucs[v]={};++this._nodeCount;return this} /** * Gets the label of node with specified name. * Complexity: O(|V|). - */node(v){return this.#nodes[v]} + */node(v){return this._nodes[v]} /** * Detects whether graph has a node with specified name or not. - */hasNode(v){return this.#nodes.hasOwnProperty(v)} + */hasNode(v){return this._nodes.hasOwnProperty(v)} /** * Remove the node with the name from the graph or do nothing if the node is not in * the graph. If the node was removed this function also removes any incident * edges. * Complexity: O(1). - */removeNode(v){var self=this;if(this.#nodes.hasOwnProperty(v)){var removeEdge=e=>self.removeEdge(self.#edgeObjs[e]);delete this.#nodes[v];if(this.#isCompound){this.#removeFromParentsChildList(v);delete this.#parent[v];this.children(v).forEach(function(child){self.setParent(child)});delete this.#children[v]}Object.keys(this.#in[v]).forEach(removeEdge);delete this.#in[v];delete this.#preds[v];Object.keys(this.#out[v]).forEach(removeEdge);delete this.#out[v];delete this.#sucs[v];--this.#nodeCount}return this} + */removeNode(v){var self=this;if(this._nodes.hasOwnProperty(v)){var removeEdge=e=>self.removeEdge(self._edgeObjs[e]);delete this._nodes[v];if(this._isCompound){this._removeFromParentsChildList(v);delete this._parent[v];this.children(v).forEach(function(child){self.setParent(child)});delete this._children[v]}Object.keys(this._in[v]).forEach(removeEdge);delete this._in[v];delete this._preds[v];Object.keys(this._out[v]).forEach(removeEdge);delete this._out[v];delete this._sucs[v];--this._nodeCount}return this} /** * Sets node p as a parent for node v if it is defined, or removes the * parent for v if p is undefined. Method throws an exception in case of * invoking it in context of noncompound graph. * Average-case complexity: O(1). - */setParent(v,parent){if(!this.#isCompound){throw new Error("Cannot set parent in a non-compound graph")}if(parent===undefined){parent=GRAPH_NODE}else{ + */setParent(v,parent){if(!this._isCompound){throw new Error("Cannot set parent in a non-compound graph")}if(parent===undefined){parent=GRAPH_NODE}else{ // Coerce parent to string -parent+="";for(var ancestor=parent;ancestor!==undefined;ancestor=this.parent(ancestor)){if(ancestor===v){throw new Error("Setting "+parent+" as parent of "+v+" would create a cycle")}}this.setNode(parent)}this.setNode(v);this.#removeFromParentsChildList(v);this.#parent[v]=parent;this.#children[parent][v]=true;return this}#removeFromParentsChildList(v){delete this.#children[this.#parent[v]][v]} +parent+="";for(var ancestor=parent;ancestor!==undefined;ancestor=this.parent(ancestor)){if(ancestor===v){throw new Error("Setting "+parent+" as parent of "+v+" would create a cycle")}}this.setNode(parent)}this.setNode(v);this._removeFromParentsChildList(v);this._parent[v]=parent;this._children[parent][v]=true;return this}_removeFromParentsChildList(v){delete this._children[this._parent[v]][v]} /** * Gets parent node for node v. * Complexity: O(1). - */parent(v){if(this.#isCompound){var parent=this.#parent[v];if(parent!==GRAPH_NODE){return parent}}} + */parent(v){if(this._isCompound){var parent=this._parent[v];if(parent!==GRAPH_NODE){return parent}}} /** * Gets list of direct children of node v. * Complexity: O(1). - */children(v=GRAPH_NODE){if(this.#isCompound){var children=this.#children[v];if(children){return Object.keys(children)}}else if(v===GRAPH_NODE){return this.nodes()}else if(this.hasNode(v)){return[]}} + */children(v=GRAPH_NODE){if(this._isCompound){var children=this._children[v];if(children){return Object.keys(children)}}else if(v===GRAPH_NODE){return this.nodes()}else if(this.hasNode(v)){return[]}} /** * Return all nodes that are predecessors of the specified node or undefined if node v is not in * the graph. Behavior is undefined for undirected graphs - use neighbors instead. * Complexity: O(|V|). - */predecessors(v){var predsV=this.#preds[v];if(predsV){return Object.keys(predsV)}} + */predecessors(v){var predsV=this._preds[v];if(predsV){return Object.keys(predsV)}} /** * Return all nodes that are successors of the specified node or undefined if node v is not in * the graph. Behavior is undefined for undirected graphs - use neighbors instead. * Complexity: O(|V|). - */successors(v){var sucsV=this.#sucs[v];if(sucsV){return Object.keys(sucsV)}} + */successors(v){var sucsV=this._sucs[v];if(sucsV){return Object.keys(sucsV)}} /** * Return all nodes that are predecessors or successors of the specified node or undefined if * node v is not in the graph. @@ -221,7 +221,7 @@ parent+="";for(var ancestor=parent;ancestor!==undefined;ancestor=this.parent(anc * are also removed. In case of compound graph, if parent is rejected by filter, * than all its children are rejected too. * Average-case complexity: O(|E|+|V|). - */filterNodes(filter){var copy=new this.constructor({directed:this.#isDirected,multigraph:this.#isMultigraph,compound:this.#isCompound});copy.setGraph(this.graph());var self=this;Object.entries(this.#nodes).forEach(function([v,value]){if(filter(v)){copy.setNode(v,value)}});Object.values(this.#edgeObjs).forEach(function(e){if(copy.hasNode(e.v)&©.hasNode(e.w)){copy.setEdge(e,self.edge(e))}});var parents={};function findParent(v){var parent=self.parent(v);if(parent===undefined||copy.hasNode(parent)){parents[v]=parent;return parent}else if(parent in parents){return parents[parent]}else{return findParent(parent)}}if(this.#isCompound){copy.nodes().forEach(v=>copy.setParent(v,findParent(v)))}return copy} + */filterNodes(filter){var copy=new this.constructor({directed:this._isDirected,multigraph:this._isMultigraph,compound:this._isCompound});copy.setGraph(this.graph());var self=this;Object.entries(this._nodes).forEach(function([v,value]){if(filter(v)){copy.setNode(v,value)}});Object.values(this._edgeObjs).forEach(function(e){if(copy.hasNode(e.v)&©.hasNode(e.w)){copy.setEdge(e,self.edge(e))}});var parents={};function findParent(v){var parent=self.parent(v);if(parent===undefined||copy.hasNode(parent)){parents[v]=parent;return parent}else if(parent in parents){return parents[parent]}else{return findParent(parent)}}if(this._isCompound){copy.nodes().forEach(v=>copy.setParent(v,findParent(v)))}return copy} /* === Edge functions ========== */ /** * Sets the default edge label or factory function. This label will be @@ -229,15 +229,15 @@ parent+="";for(var ancestor=parent;ancestor!==undefined;ancestor=this.parent(anc * an edge or this function will be invoked each time when setting an edge * with no label specified and returned value * will be used as a label for edge. * Complexity: O(1). - */setDefaultEdgeLabel(newDefault){this.#defaultEdgeLabelFn=newDefault;if(typeof newDefault!=="function"){this.#defaultEdgeLabelFn=()=>newDefault}return this} + */setDefaultEdgeLabel(newDefault){this._defaultEdgeLabelFn=newDefault;if(typeof newDefault!=="function"){this._defaultEdgeLabelFn=()=>newDefault}return this} /** * Gets the number of edges in the graph. * Complexity: O(1). - */edgeCount(){return this.#edgeCount} + */edgeCount(){return this._edgeCount} /** * Gets edges of the graph. In case of compound graph subgraphs are not considered. * Complexity: O(|E|). - */edges(){return Object.values(this.#edgeObjs)} + */edges(){return Object.values(this._edgeObjs)} /** * Establish an edges path over the nodes in nodes list. If some edge is already * exists, it will update its label, otherwise it will create an edge between pair @@ -249,16 +249,16 @@ parent+="";for(var ancestor=parent;ancestor!==undefined;ancestor=this.parent(anc * name. If label is supplied it is set as the value for the edge. If label is not * supplied and the edge was created by this call then the default edge label will * be assigned. The name parameter is only useful with multigraphs. - */setEdge(){var v,w,name,value;var valueSpecified=false;var arg0=arguments[0];if(typeof arg0==="object"&&arg0!==null&&"v"in arg0){v=arg0.v;w=arg0.w;name=arg0.name;if(arguments.length===2){value=arguments[1];valueSpecified=true}}else{v=arg0;w=arguments[1];name=arguments[3];if(arguments.length>2){value=arguments[2];valueSpecified=true}}v=""+v;w=""+w;if(name!==undefined){name=""+name}var e=edgeArgsToId(this.#isDirected,v,w,name);if(this.#edgeLabels.hasOwnProperty(e)){if(valueSpecified){this.#edgeLabels[e]=value}return this}if(name!==undefined&&!this.#isMultigraph){throw new Error("Cannot set a named edge when isMultigraph = false")} + */setEdge(){var v,w,name,value;var valueSpecified=false;var arg0=arguments[0];if(typeof arg0==="object"&&arg0!==null&&"v"in arg0){v=arg0.v;w=arg0.w;name=arg0.name;if(arguments.length===2){value=arguments[1];valueSpecified=true}}else{v=arg0;w=arguments[1];name=arguments[3];if(arguments.length>2){value=arguments[2];valueSpecified=true}}v=""+v;w=""+w;if(name!==undefined){name=""+name}var e=edgeArgsToId(this._isDirected,v,w,name);if(this._edgeLabels.hasOwnProperty(e)){if(valueSpecified){this._edgeLabels[e]=value}return this}if(name!==undefined&&!this._isMultigraph){throw new Error("Cannot set a named edge when isMultigraph = false")} // It didn't exist, so we need to create it. // First ensure the nodes exist. -this.setNode(v);this.setNode(w);this.#edgeLabels[e]=valueSpecified?value:this.#defaultEdgeLabelFn(v,w,name);var edgeObj=edgeArgsToObj(this.#isDirected,v,w,name); +this.setNode(v);this.setNode(w);this._edgeLabels[e]=valueSpecified?value:this._defaultEdgeLabelFn(v,w,name);var edgeObj=edgeArgsToObj(this._isDirected,v,w,name); // Ensure we add undirected edges in a consistent way. -v=edgeObj.v;w=edgeObj.w;Object.freeze(edgeObj);this.#edgeObjs[e]=edgeObj;incrementOrInitEntry(this.#preds[w],v);incrementOrInitEntry(this.#sucs[v],w);this.#in[w][e]=edgeObj;this.#out[v][e]=edgeObj;this.#edgeCount++;return this} +v=edgeObj.v;w=edgeObj.w;Object.freeze(edgeObj);this._edgeObjs[e]=edgeObj;incrementOrInitEntry(this._preds[w],v);incrementOrInitEntry(this._sucs[v],w);this._in[w][e]=edgeObj;this._out[v][e]=edgeObj;this._edgeCount++;return this} /** * Gets the label for the specified edge. * Complexity: O(1). - */edge(v,w,name){var e=arguments.length===1?edgeObjToId(this.#isDirected,arguments[0]):edgeArgsToId(this.#isDirected,v,w,name);return this.#edgeLabels[e]} + */edge(v,w,name){var e=arguments.length===1?edgeObjToId(this._isDirected,arguments[0]):edgeArgsToId(this._isDirected,v,w,name);return this._edgeLabels[e]} /** * Gets the label for the specified edge and converts it to an object. * Complexity: O(1) @@ -266,21 +266,21 @@ v=edgeObj.v;w=edgeObj.w;Object.freeze(edgeObj);this.#edgeObjs[e]=edgeObj;increme /** * Detects whether the graph contains specified edge or not. No subgraphs are considered. * Complexity: O(1). - */hasEdge(v,w,name){var e=arguments.length===1?edgeObjToId(this.#isDirected,arguments[0]):edgeArgsToId(this.#isDirected,v,w,name);return this.#edgeLabels.hasOwnProperty(e)} + */hasEdge(v,w,name){var e=arguments.length===1?edgeObjToId(this._isDirected,arguments[0]):edgeArgsToId(this._isDirected,v,w,name);return this._edgeLabels.hasOwnProperty(e)} /** * Removes the specified edge from the graph. No subgraphs are considered. * Complexity: O(1). - */removeEdge(v,w,name){var e=arguments.length===1?edgeObjToId(this.#isDirected,arguments[0]):edgeArgsToId(this.#isDirected,v,w,name);var edge=this.#edgeObjs[e];if(edge){v=edge.v;w=edge.w;delete this.#edgeLabels[e];delete this.#edgeObjs[e];decrementOrRemoveEntry(this.#preds[w],v);decrementOrRemoveEntry(this.#sucs[v],w);delete this.#in[w][e];delete this.#out[v][e];this.#edgeCount--}return this} + */removeEdge(v,w,name){var e=arguments.length===1?edgeObjToId(this._isDirected,arguments[0]):edgeArgsToId(this._isDirected,v,w,name);var edge=this._edgeObjs[e];if(edge){v=edge.v;w=edge.w;delete this._edgeLabels[e];delete this._edgeObjs[e];decrementOrRemoveEntry(this._preds[w],v);decrementOrRemoveEntry(this._sucs[v],w);delete this._in[w][e];delete this._out[v][e];this._edgeCount--}return this} /** * Return all edges that point to the node v. Optionally filters those edges down to just those * coming from node u. Behavior is undefined for undirected graphs - use nodeEdges instead. * Complexity: O(|E|). - */inEdges(v,u){var inV=this.#in[v];if(inV){var edges=Object.values(inV);if(!u){return edges}return edges.filter(edge=>edge.v===u)}} + */inEdges(v,u){var inV=this._in[v];if(inV){var edges=Object.values(inV);if(!u){return edges}return edges.filter(edge=>edge.v===u)}} /** * Return all edges that are pointed at by node v. Optionally filters those edges down to just * those point to w. Behavior is undefined for undirected graphs - use nodeEdges instead. * Complexity: O(|E|). - */outEdges(v,w){var outV=this.#out[v];if(outV){var edges=Object.values(outV);if(!w){return edges}return edges.filter(edge=>edge.w===w)}} + */outEdges(v,w){var outV=this._out[v];if(outV){var edges=Object.values(outV);if(!w){return edges}return edges.filter(edge=>edge.w===w)}} /** * Returns all edges to or from node v regardless of direction. Optionally filters those edges * down to just those between nodes v and w regardless of direction. @@ -301,4 +301,4 @@ module.exports={Graph:require("./graph"),version:require("./version")}},{"./grap * // ['a', 'b'] * g2.edges() * // [ { v: 'a', w: 'b' } ] - */function read(json){var g=new Graph(json.options).setGraph(json.value);json.nodes.forEach(function(entry){g.setNode(entry.v,entry.value);if(entry.parent){g.setParent(entry.v,entry.parent)}});json.edges.forEach(function(entry){g.setEdge({v:entry.v,w:entry.w,name:entry.name},entry.value)});return g}},{"./graph":16}],19:[function(require,module,exports){module.exports="2.2.1"},{}]},{},[1])(1)}); + */function read(json){var g=new Graph(json.options).setGraph(json.value);json.nodes.forEach(function(entry){g.setNode(entry.v,entry.value);if(entry.parent){g.setParent(entry.v,entry.parent)}});json.edges.forEach(function(entry){g.setEdge({v:entry.v,w:entry.w,name:entry.name},entry.value)});return g}},{"./graph":16}],19:[function(require,module,exports){module.exports="2.2.2"},{}]},{},[1])(1)}); diff --git a/dist/graphlib.js b/dist/graphlib.js index 1ed4f81f..d9924a35 100644 --- a/dist/graphlib.js +++ b/dist/graphlib.js @@ -459,28 +459,28 @@ topsort.CycleException = CycleException; * have its priority decreased in O(log n) time. */ class PriorityQueue { - #arr = []; - #keyIndices = {}; + _arr = []; + _keyIndices = {}; /** * Returns the number of elements in the queue. Takes `O(1)` time. */ size() { - return this.#arr.length; + return this._arr.length; } /** * Returns the keys that are in the queue. Takes `O(n)` time. */ keys() { - return this.#arr.map(function(x) { return x.key; }); + return this._arr.map(function(x) { return x.key; }); } /** * Returns `true` if **key** is in the queue and `false` if not. */ has(key) { - return this.#keyIndices.hasOwnProperty(key); + return this._keyIndices.hasOwnProperty(key); } /** @@ -490,9 +490,9 @@ class PriorityQueue { * @param {Object} key */ priority(key) { - var index = this.#keyIndices[key]; + var index = this._keyIndices[key]; if (index !== undefined) { - return this.#arr[index].priority; + return this._arr[index].priority; } } @@ -504,7 +504,7 @@ class PriorityQueue { if (this.size() === 0) { throw new Error("Queue underflow"); } - return this.#arr[0].key; + return this._arr[0].key; } /** @@ -516,14 +516,14 @@ class PriorityQueue { * @param {Number} priority the initial priority for the key */ add(key, priority) { - var keyIndices = this.#keyIndices; + var keyIndices = this._keyIndices; key = String(key); if (!keyIndices.hasOwnProperty(key)) { - var arr = this.#arr; + var arr = this._arr; var index = arr.length; keyIndices[key] = index; arr.push({key: key, priority: priority}); - this.#decrease(index); + this._decrease(index); return true; } return false; @@ -533,10 +533,10 @@ class PriorityQueue { * Removes and returns the smallest key in the queue. Takes `O(log n)` time. */ removeMin() { - this.#swap(0, this.#arr.length - 1); - var min = this.#arr.pop(); - delete this.#keyIndices[min.key]; - this.#heapify(0); + this._swap(0, this._arr.length - 1); + var min = this._arr.pop(); + delete this._keyIndices[min.key]; + this._heapify(0); return min.key; } @@ -548,17 +548,17 @@ class PriorityQueue { * @param {Number} priority the new priority for the key */ decrease(key, priority) { - var index = this.#keyIndices[key]; - if (priority > this.#arr[index].priority) { + var index = this._keyIndices[key]; + if (priority > this._arr[index].priority) { throw new Error("New priority is greater than current priority. " + - "Key: " + key + " Old: " + this.#arr[index].priority + " New: " + priority); + "Key: " + key + " Old: " + this._arr[index].priority + " New: " + priority); } - this.#arr[index].priority = priority; - this.#decrease(index); + this._arr[index].priority = priority; + this._decrease(index); } - #heapify(i) { - var arr = this.#arr; + _heapify(i) { + var arr = this._arr; var l = 2 * i; var r = l + 1; var largest = i; @@ -568,14 +568,14 @@ class PriorityQueue { largest = arr[r].priority < arr[largest].priority ? r : largest; } if (largest !== i) { - this.#swap(i, largest); - this.#heapify(largest); + this._swap(i, largest); + this._heapify(largest); } } } - #decrease(index) { - var arr = this.#arr; + _decrease(index) { + var arr = this._arr; var priority = arr[index].priority; var parent; while (index !== 0) { @@ -583,14 +583,14 @@ class PriorityQueue { if (arr[parent].priority < priority) { break; } - this.#swap(index, parent); + this._swap(index, parent); index = parent; } } - #swap(i, j) { - var arr = this.#arr; - var keyIndices = this.#keyIndices; + _swap(i, j) { + var arr = this._arr; + var keyIndices = this._keyIndices; var origArrI = arr[i]; var origArrJ = arr[j]; arr[i] = origArrJ; @@ -620,64 +620,64 @@ var EDGE_KEY_DELIM = "\x01"; // we're going to get to a performant hashtable in JavaScript. class Graph { - #isDirected = true; - #isMultigraph = false; - #isCompound = false; + _isDirected = true; + _isMultigraph = false; + _isCompound = false; // Label for the graph itself - #label; + _label; // Defaults to be set when creating a new node - #defaultNodeLabelFn = () => undefined; + _defaultNodeLabelFn = () => undefined; // Defaults to be set when creating a new edge - #defaultEdgeLabelFn = () => undefined; + _defaultEdgeLabelFn = () => undefined; // v -> label - #nodes = {}; + _nodes = {}; // v -> edgeObj - #in = {}; + _in = {}; // u -> v -> Number - #preds = {}; + _preds = {}; // v -> edgeObj - #out = {}; + _out = {}; // v -> w -> Number - #sucs = {}; + _sucs = {}; // e -> edgeObj - #edgeObjs = {}; + _edgeObjs = {}; // e -> label - #edgeLabels = {}; + _edgeLabels = {}; /* Number of nodes in the graph. Should only be changed by the implementation. */ - #nodeCount = 0; + _nodeCount = 0; /* Number of edges in the graph. Should only be changed by the implementation. */ - #edgeCount = 0; + _edgeCount = 0; - #parent; + _parent; - #children; + _children; constructor(opts) { if (opts) { - this.#isDirected = opts.hasOwnProperty("directed") ? opts.directed : true; - this.#isMultigraph = opts.hasOwnProperty("multigraph") ? opts.multigraph : false; - this.#isCompound = opts.hasOwnProperty("compound") ? opts.compound : false; + this._isDirected = opts.hasOwnProperty("directed") ? opts.directed : true; + this._isMultigraph = opts.hasOwnProperty("multigraph") ? opts.multigraph : false; + this._isCompound = opts.hasOwnProperty("compound") ? opts.compound : false; } - if (this.#isCompound) { + if (this._isCompound) { // v -> parent - this.#parent = {}; + this._parent = {}; // v -> children - this.#children = {}; - this.#children[GRAPH_NODE] = {}; + this._children = {}; + this._children[GRAPH_NODE] = {}; } } @@ -687,28 +687,28 @@ class Graph { * Whether graph was created with 'directed' flag set to true or not. */ isDirected() { - return this.#isDirected; + return this._isDirected; } /** * Whether graph was created with 'multigraph' flag set to true or not. */ isMultigraph() { - return this.#isMultigraph; + return this._isMultigraph; } /** * Whether graph was created with 'compound' flag set to true or not. */ isCompound() { - return this.#isCompound; + return this._isCompound; } /** * Sets the label of the graph. */ setGraph(label) { - this.#label = label; + this._label = label; return this; } @@ -716,7 +716,7 @@ class Graph { * Gets the graph label. */ graph() { - return this.#label; + return this._label; } @@ -730,9 +730,9 @@ class Graph { * Complexity: O(1). */ setDefaultNodeLabel(newDefault) { - this.#defaultNodeLabelFn = newDefault; + this._defaultNodeLabelFn = newDefault; if (typeof newDefault !== 'function') { - this.#defaultNodeLabelFn = () => newDefault; + this._defaultNodeLabelFn = () => newDefault; } return this; @@ -743,7 +743,7 @@ class Graph { * Complexity: O(1). */ nodeCount() { - return this.#nodeCount; + return this._nodeCount; } /** @@ -752,7 +752,7 @@ class Graph { * Complexity: O(1). */ nodes() { - return Object.keys(this.#nodes); + return Object.keys(this._nodes); } /** @@ -761,7 +761,7 @@ class Graph { */ sources() { var self = this; - return this.nodes().filter(v => Object.keys(self.#in[v]).length === 0); + return this.nodes().filter(v => Object.keys(self._in[v]).length === 0); } /** @@ -770,7 +770,7 @@ class Graph { */ sinks() { var self = this; - return this.nodes().filter(v => Object.keys(self.#out[v]).length === 0); + return this.nodes().filter(v => Object.keys(self._out[v]).length === 0); } /** @@ -797,24 +797,24 @@ class Graph { * Complexity: O(1). */ setNode(v, value) { - if (this.#nodes.hasOwnProperty(v)) { + if (this._nodes.hasOwnProperty(v)) { if (arguments.length > 1) { - this.#nodes[v] = value; + this._nodes[v] = value; } return this; } - this.#nodes[v] = arguments.length > 1 ? value : this.#defaultNodeLabelFn(v); - if (this.#isCompound) { - this.#parent[v] = GRAPH_NODE; - this.#children[v] = {}; - this.#children[GRAPH_NODE][v] = true; + this._nodes[v] = arguments.length > 1 ? value : this._defaultNodeLabelFn(v); + if (this._isCompound) { + this._parent[v] = GRAPH_NODE; + this._children[v] = {}; + this._children[GRAPH_NODE][v] = true; } - this.#in[v] = {}; - this.#preds[v] = {}; - this.#out[v] = {}; - this.#sucs[v] = {}; - ++this.#nodeCount; + this._in[v] = {}; + this._preds[v] = {}; + this._out[v] = {}; + this._sucs[v] = {}; + ++this._nodeCount; return this; } @@ -823,14 +823,14 @@ class Graph { * Complexity: O(|V|). */ node(v) { - return this.#nodes[v]; + return this._nodes[v]; } /** * Detects whether graph has a node with specified name or not. */ hasNode(v) { - return this.#nodes.hasOwnProperty(v); + return this._nodes.hasOwnProperty(v); } /** @@ -841,24 +841,24 @@ class Graph { */ removeNode(v) { var self = this; - if (this.#nodes.hasOwnProperty(v)) { - var removeEdge = e => self.removeEdge(self.#edgeObjs[e]); - delete this.#nodes[v]; - if (this.#isCompound) { - this.#removeFromParentsChildList(v); - delete this.#parent[v]; + if (this._nodes.hasOwnProperty(v)) { + var removeEdge = e => self.removeEdge(self._edgeObjs[e]); + delete this._nodes[v]; + if (this._isCompound) { + this._removeFromParentsChildList(v); + delete this._parent[v]; this.children(v).forEach(function(child) { self.setParent(child); }); - delete this.#children[v]; + delete this._children[v]; } - Object.keys(this.#in[v]).forEach(removeEdge); - delete this.#in[v]; - delete this.#preds[v]; - Object.keys(this.#out[v]).forEach(removeEdge); - delete this.#out[v]; - delete this.#sucs[v]; - --this.#nodeCount; + Object.keys(this._in[v]).forEach(removeEdge); + delete this._in[v]; + delete this._preds[v]; + Object.keys(this._out[v]).forEach(removeEdge); + delete this._out[v]; + delete this._sucs[v]; + --this._nodeCount; } return this; } @@ -870,7 +870,7 @@ class Graph { * Average-case complexity: O(1). */ setParent(v, parent) { - if (!this.#isCompound) { + if (!this._isCompound) { throw new Error("Cannot set parent in a non-compound graph"); } @@ -890,14 +890,14 @@ class Graph { } this.setNode(v); - this.#removeFromParentsChildList(v); - this.#parent[v] = parent; - this.#children[parent][v] = true; + this._removeFromParentsChildList(v); + this._parent[v] = parent; + this._children[parent][v] = true; return this; } - #removeFromParentsChildList(v) { - delete this.#children[this.#parent[v]][v]; + _removeFromParentsChildList(v) { + delete this._children[this._parent[v]][v]; } /** @@ -905,8 +905,8 @@ class Graph { * Complexity: O(1). */ parent(v) { - if (this.#isCompound) { - var parent = this.#parent[v]; + if (this._isCompound) { + var parent = this._parent[v]; if (parent !== GRAPH_NODE) { return parent; } @@ -918,8 +918,8 @@ class Graph { * Complexity: O(1). */ children(v = GRAPH_NODE) { - if (this.#isCompound) { - var children = this.#children[v]; + if (this._isCompound) { + var children = this._children[v]; if (children) { return Object.keys(children); } @@ -936,7 +936,7 @@ class Graph { * Complexity: O(|V|). */ predecessors(v) { - var predsV = this.#preds[v]; + var predsV = this._preds[v]; if (predsV) { return Object.keys(predsV); } @@ -948,7 +948,7 @@ class Graph { * Complexity: O(|V|). */ successors(v) { - var sucsV = this.#sucs[v]; + var sucsV = this._sucs[v]; if (sucsV) { return Object.keys(sucsV); } @@ -989,21 +989,21 @@ class Graph { */ filterNodes(filter) { var copy = new this.constructor({ - directed: this.#isDirected, - multigraph: this.#isMultigraph, - compound: this.#isCompound + directed: this._isDirected, + multigraph: this._isMultigraph, + compound: this._isCompound }); copy.setGraph(this.graph()); var self = this; - Object.entries(this.#nodes).forEach(function([v, value]) { + Object.entries(this._nodes).forEach(function([v, value]) { if (filter(v)) { copy.setNode(v, value); } }); - Object.values(this.#edgeObjs).forEach(function(e) { + Object.values(this._edgeObjs).forEach(function(e) { if (copy.hasNode(e.v) && copy.hasNode(e.w)) { copy.setEdge(e, self.edge(e)); } @@ -1022,7 +1022,7 @@ class Graph { } } - if (this.#isCompound) { + if (this._isCompound) { copy.nodes().forEach(v => copy.setParent(v, findParent(v))); } @@ -1039,9 +1039,9 @@ class Graph { * Complexity: O(1). */ setDefaultEdgeLabel(newDefault) { - this.#defaultEdgeLabelFn = newDefault; + this._defaultEdgeLabelFn = newDefault; if (typeof newDefault !== 'function') { - this.#defaultEdgeLabelFn = () => newDefault; + this._defaultEdgeLabelFn = () => newDefault; } return this; @@ -1052,7 +1052,7 @@ class Graph { * Complexity: O(1). */ edgeCount() { - return this.#edgeCount; + return this._edgeCount; } /** @@ -1060,7 +1060,7 @@ class Graph { * Complexity: O(|E|). */ edges() { - return Object.values(this.#edgeObjs); + return Object.values(this._edgeObjs); } /** @@ -1118,15 +1118,15 @@ class Graph { name = "" + name; } - var e = edgeArgsToId(this.#isDirected, v, w, name); - if (this.#edgeLabels.hasOwnProperty(e)) { + var e = edgeArgsToId(this._isDirected, v, w, name); + if (this._edgeLabels.hasOwnProperty(e)) { if (valueSpecified) { - this.#edgeLabels[e] = value; + this._edgeLabels[e] = value; } return this; } - if (name !== undefined && !this.#isMultigraph) { + if (name !== undefined && !this._isMultigraph) { throw new Error("Cannot set a named edge when isMultigraph = false"); } @@ -1135,20 +1135,20 @@ class Graph { this.setNode(v); this.setNode(w); - this.#edgeLabels[e] = valueSpecified ? value : this.#defaultEdgeLabelFn(v, w, name); + this._edgeLabels[e] = valueSpecified ? value : this._defaultEdgeLabelFn(v, w, name); - var edgeObj = edgeArgsToObj(this.#isDirected, v, w, name); + var edgeObj = edgeArgsToObj(this._isDirected, v, w, name); // Ensure we add undirected edges in a consistent way. v = edgeObj.v; w = edgeObj.w; Object.freeze(edgeObj); - this.#edgeObjs[e] = edgeObj; - incrementOrInitEntry(this.#preds[w], v); - incrementOrInitEntry(this.#sucs[v], w); - this.#in[w][e] = edgeObj; - this.#out[v][e] = edgeObj; - this.#edgeCount++; + this._edgeObjs[e] = edgeObj; + incrementOrInitEntry(this._preds[w], v); + incrementOrInitEntry(this._sucs[v], w); + this._in[w][e] = edgeObj; + this._out[v][e] = edgeObj; + this._edgeCount++; return this; } @@ -1158,9 +1158,9 @@ class Graph { */ edge(v, w, name) { var e = (arguments.length === 1 - ? edgeObjToId(this.#isDirected, arguments[0]) - : edgeArgsToId(this.#isDirected, v, w, name)); - return this.#edgeLabels[e]; + ? edgeObjToId(this._isDirected, arguments[0]) + : edgeArgsToId(this._isDirected, v, w, name)); + return this._edgeLabels[e]; } /** @@ -1182,9 +1182,9 @@ class Graph { */ hasEdge(v, w, name) { var e = (arguments.length === 1 - ? edgeObjToId(this.#isDirected, arguments[0]) - : edgeArgsToId(this.#isDirected, v, w, name)); - return this.#edgeLabels.hasOwnProperty(e); + ? edgeObjToId(this._isDirected, arguments[0]) + : edgeArgsToId(this._isDirected, v, w, name)); + return this._edgeLabels.hasOwnProperty(e); } /** @@ -1193,19 +1193,19 @@ class Graph { */ removeEdge(v, w, name) { var e = (arguments.length === 1 - ? edgeObjToId(this.#isDirected, arguments[0]) - : edgeArgsToId(this.#isDirected, v, w, name)); - var edge = this.#edgeObjs[e]; + ? edgeObjToId(this._isDirected, arguments[0]) + : edgeArgsToId(this._isDirected, v, w, name)); + var edge = this._edgeObjs[e]; if (edge) { v = edge.v; w = edge.w; - delete this.#edgeLabels[e]; - delete this.#edgeObjs[e]; - decrementOrRemoveEntry(this.#preds[w], v); - decrementOrRemoveEntry(this.#sucs[v], w); - delete this.#in[w][e]; - delete this.#out[v][e]; - this.#edgeCount--; + delete this._edgeLabels[e]; + delete this._edgeObjs[e]; + decrementOrRemoveEntry(this._preds[w], v); + decrementOrRemoveEntry(this._sucs[v], w); + delete this._in[w][e]; + delete this._out[v][e]; + this._edgeCount--; } return this; } @@ -1216,7 +1216,7 @@ class Graph { * Complexity: O(|E|). */ inEdges(v, u) { - var inV = this.#in[v]; + var inV = this._in[v]; if (inV) { var edges = Object.values(inV); if (!u) { @@ -1232,7 +1232,7 @@ class Graph { * Complexity: O(|E|). */ outEdges(v, w) { - var outV = this.#out[v]; + var outV = this._out[v]; if (outV) { var edges = Object.values(outV); if (!w) { @@ -1390,7 +1390,7 @@ function read(json) { } },{"./graph":16}],19:[function(require,module,exports){ -module.exports = '2.2.1'; +module.exports = '2.2.2'; },{}]},{},[1])(1) }); diff --git a/dist/graphlib.min.js b/dist/graphlib.min.js index d43b43f8..89756ba9 100644 --- a/dist/graphlib.min.js +++ b/dist/graphlib.min.js @@ -47,26 +47,26 @@ var results=[];function dfs(v){var entry=visited[v]={onStack:true,lowlink:index, * the queue. Adding and removing elements takes O(log n) time. A key can * have its priority decreased in O(log n) time. */ -class PriorityQueue{#arr=[];#keyIndices={}; +class PriorityQueue{_arr=[];_keyIndices={}; /** * Returns the number of elements in the queue. Takes `O(1)` time. - */size(){return this.#arr.length} + */size(){return this._arr.length} /** * Returns the keys that are in the queue. Takes `O(n)` time. - */keys(){return this.#arr.map(function(x){return x.key})} + */keys(){return this._arr.map(function(x){return x.key})} /** * Returns `true` if **key** is in the queue and `false` if not. - */has(key){return this.#keyIndices.hasOwnProperty(key)} + */has(key){return this._keyIndices.hasOwnProperty(key)} /** * Returns the priority for **key**. If **key** is not present in the queue * then this function returns `undefined`. Takes `O(1)` time. * * @param {Object} key - */priority(key){var index=this.#keyIndices[key];if(index!==undefined){return this.#arr[index].priority}} + */priority(key){var index=this._keyIndices[key];if(index!==undefined){return this._arr[index].priority}} /** * Returns the key for the minimum element in this queue. If the queue is * empty this function throws an Error. Takes `O(1)` time. - */min(){if(this.size()===0){throw new Error("Queue underflow")}return this.#arr[0].key} + */min(){if(this.size()===0){throw new Error("Queue underflow")}return this._arr[0].key} /** * Inserts a new key into the priority queue. If the key already exists in * the queue this function returns `false`; otherwise it will return `true`. @@ -74,17 +74,17 @@ class PriorityQueue{#arr=[];#keyIndices={}; * * @param {Object} key the key to add * @param {Number} priority the initial priority for the key - */add(key,priority){var keyIndices=this.#keyIndices;key=String(key);if(!keyIndices.hasOwnProperty(key)){var arr=this.#arr;var index=arr.length;keyIndices[key]=index;arr.push({key:key,priority:priority});this.#decrease(index);return true}return false} + */add(key,priority){var keyIndices=this._keyIndices;key=String(key);if(!keyIndices.hasOwnProperty(key)){var arr=this._arr;var index=arr.length;keyIndices[key]=index;arr.push({key:key,priority:priority});this._decrease(index);return true}return false} /** * Removes and returns the smallest key in the queue. Takes `O(log n)` time. - */removeMin(){this.#swap(0,this.#arr.length-1);var min=this.#arr.pop();delete this.#keyIndices[min.key];this.#heapify(0);return min.key} + */removeMin(){this._swap(0,this._arr.length-1);var min=this._arr.pop();delete this._keyIndices[min.key];this._heapify(0);return min.key} /** * Decreases the priority for **key** to **priority**. If the new priority is * greater than the previous priority, this function will throw an Error. * * @param {Object} key the key for which to raise priority * @param {Number} priority the new priority for the key - */decrease(key,priority){var index=this.#keyIndices[key];if(priority>this.#arr[index].priority){throw new Error("New priority is greater than current priority. "+"Key: "+key+" Old: "+this.#arr[index].priority+" New: "+priority)}this.#arr[index].priority=priority;this.#decrease(index)}#heapify(i){var arr=this.#arr;var l=2*i;var r=l+1;var largest=i;if(l>1;if(arr[parent].prioritythis._arr[index].priority){throw new Error("New priority is greater than current priority. "+"Key: "+key+" Old: "+this._arr[index].priority+" New: "+priority)}this._arr[index].priority=priority;this._decrease(index)}_heapify(i){var arr=this._arr;var l=2*i;var r=l+1;var largest=i;if(l>1;if(arr[parent].priorityundefined; +_defaultNodeLabelFn=()=>undefined; // Defaults to be set when creating a new edge -#defaultEdgeLabelFn=()=>undefined; +_defaultEdgeLabelFn=()=>undefined; // v -> label -#nodes={}; +_nodes={}; // v -> edgeObj -#in={}; +_in={}; // u -> v -> Number -#preds={}; +_preds={}; // v -> edgeObj -#out={}; +_out={}; // v -> w -> Number -#sucs={}; +_sucs={}; // e -> edgeObj -#edgeObjs={}; +_edgeObjs={}; // e -> label -#edgeLabels={}; -/* Number of nodes in the graph. Should only be changed by the implementation. */#nodeCount=0; -/* Number of edges in the graph. Should only be changed by the implementation. */#edgeCount=0;#parent;#children;constructor(opts){if(opts){this.#isDirected=opts.hasOwnProperty("directed")?opts.directed:true;this.#isMultigraph=opts.hasOwnProperty("multigraph")?opts.multigraph:false;this.#isCompound=opts.hasOwnProperty("compound")?opts.compound:false}if(this.#isCompound){ +_edgeLabels={}; +/* Number of nodes in the graph. Should only be changed by the implementation. */_nodeCount=0; +/* Number of edges in the graph. Should only be changed by the implementation. */_edgeCount=0;_parent;_children;constructor(opts){if(opts){this._isDirected=opts.hasOwnProperty("directed")?opts.directed:true;this._isMultigraph=opts.hasOwnProperty("multigraph")?opts.multigraph:false;this._isCompound=opts.hasOwnProperty("compound")?opts.compound:false}if(this._isCompound){ // v -> parent -this.#parent={}; +this._parent={}; // v -> children -this.#children={};this.#children[GRAPH_NODE]={}}} +this._children={};this._children[GRAPH_NODE]={}}} /* === Graph functions ========= */ /** * Whether graph was created with 'directed' flag set to true or not. - */isDirected(){return this.#isDirected} + */isDirected(){return this._isDirected} /** * Whether graph was created with 'multigraph' flag set to true or not. - */isMultigraph(){return this.#isMultigraph} + */isMultigraph(){return this._isMultigraph} /** * Whether graph was created with 'compound' flag set to true or not. - */isCompound(){return this.#isCompound} + */isCompound(){return this._isCompound} /** * Sets the label of the graph. - */setGraph(label){this.#label=label;return this} + */setGraph(label){this._label=label;return this} /** * Gets the graph label. - */graph(){return this.#label} + */graph(){return this._label} /* === Node functions ========== */ /** * Sets the default node label. If newDefault is a function, it will be @@ -144,24 +144,24 @@ this.#children={};this.#children[GRAPH_NODE]={}}} * will be assigned as default label in case if no label was specified while * setting a node. * Complexity: O(1). - */setDefaultNodeLabel(newDefault){this.#defaultNodeLabelFn=newDefault;if(typeof newDefault!=="function"){this.#defaultNodeLabelFn=()=>newDefault}return this} + */setDefaultNodeLabel(newDefault){this._defaultNodeLabelFn=newDefault;if(typeof newDefault!=="function"){this._defaultNodeLabelFn=()=>newDefault}return this} /** * Gets the number of nodes in the graph. * Complexity: O(1). - */nodeCount(){return this.#nodeCount} + */nodeCount(){return this._nodeCount} /** * Gets all nodes of the graph. Note, the in case of compound graph subnodes are * not included in list. * Complexity: O(1). - */nodes(){return Object.keys(this.#nodes)} + */nodes(){return Object.keys(this._nodes)} /** * Gets list of nodes without in-edges. * Complexity: O(|V|). - */sources(){var self=this;return this.nodes().filter(v=>Object.keys(self.#in[v]).length===0)} + */sources(){var self=this;return this.nodes().filter(v=>Object.keys(self._in[v]).length===0)} /** * Gets list of nodes without out-edges. * Complexity: O(|V|). - */sinks(){var self=this;return this.nodes().filter(v=>Object.keys(self.#out[v]).length===0)} + */sinks(){var self=this;return this.nodes().filter(v=>Object.keys(self._out[v]).length===0)} /** * Invokes setNode method for each node in names list. * Complexity: O(|names|). @@ -171,46 +171,46 @@ this.#children={};this.#children[GRAPH_NODE]={}}} * it is set as the value for the node. If label is not supplied and the node was * created by this call then the default node label will be assigned. * Complexity: O(1). - */setNode(v,value){if(this.#nodes.hasOwnProperty(v)){if(arguments.length>1){this.#nodes[v]=value}return this}this.#nodes[v]=arguments.length>1?value:this.#defaultNodeLabelFn(v);if(this.#isCompound){this.#parent[v]=GRAPH_NODE;this.#children[v]={};this.#children[GRAPH_NODE][v]=true}this.#in[v]={};this.#preds[v]={};this.#out[v]={};this.#sucs[v]={};++this.#nodeCount;return this} + */setNode(v,value){if(this._nodes.hasOwnProperty(v)){if(arguments.length>1){this._nodes[v]=value}return this}this._nodes[v]=arguments.length>1?value:this._defaultNodeLabelFn(v);if(this._isCompound){this._parent[v]=GRAPH_NODE;this._children[v]={};this._children[GRAPH_NODE][v]=true}this._in[v]={};this._preds[v]={};this._out[v]={};this._sucs[v]={};++this._nodeCount;return this} /** * Gets the label of node with specified name. * Complexity: O(|V|). - */node(v){return this.#nodes[v]} + */node(v){return this._nodes[v]} /** * Detects whether graph has a node with specified name or not. - */hasNode(v){return this.#nodes.hasOwnProperty(v)} + */hasNode(v){return this._nodes.hasOwnProperty(v)} /** * Remove the node with the name from the graph or do nothing if the node is not in * the graph. If the node was removed this function also removes any incident * edges. * Complexity: O(1). - */removeNode(v){var self=this;if(this.#nodes.hasOwnProperty(v)){var removeEdge=e=>self.removeEdge(self.#edgeObjs[e]);delete this.#nodes[v];if(this.#isCompound){this.#removeFromParentsChildList(v);delete this.#parent[v];this.children(v).forEach(function(child){self.setParent(child)});delete this.#children[v]}Object.keys(this.#in[v]).forEach(removeEdge);delete this.#in[v];delete this.#preds[v];Object.keys(this.#out[v]).forEach(removeEdge);delete this.#out[v];delete this.#sucs[v];--this.#nodeCount}return this} + */removeNode(v){var self=this;if(this._nodes.hasOwnProperty(v)){var removeEdge=e=>self.removeEdge(self._edgeObjs[e]);delete this._nodes[v];if(this._isCompound){this._removeFromParentsChildList(v);delete this._parent[v];this.children(v).forEach(function(child){self.setParent(child)});delete this._children[v]}Object.keys(this._in[v]).forEach(removeEdge);delete this._in[v];delete this._preds[v];Object.keys(this._out[v]).forEach(removeEdge);delete this._out[v];delete this._sucs[v];--this._nodeCount}return this} /** * Sets node p as a parent for node v if it is defined, or removes the * parent for v if p is undefined. Method throws an exception in case of * invoking it in context of noncompound graph. * Average-case complexity: O(1). - */setParent(v,parent){if(!this.#isCompound){throw new Error("Cannot set parent in a non-compound graph")}if(parent===undefined){parent=GRAPH_NODE}else{ + */setParent(v,parent){if(!this._isCompound){throw new Error("Cannot set parent in a non-compound graph")}if(parent===undefined){parent=GRAPH_NODE}else{ // Coerce parent to string -parent+="";for(var ancestor=parent;ancestor!==undefined;ancestor=this.parent(ancestor)){if(ancestor===v){throw new Error("Setting "+parent+" as parent of "+v+" would create a cycle")}}this.setNode(parent)}this.setNode(v);this.#removeFromParentsChildList(v);this.#parent[v]=parent;this.#children[parent][v]=true;return this}#removeFromParentsChildList(v){delete this.#children[this.#parent[v]][v]} +parent+="";for(var ancestor=parent;ancestor!==undefined;ancestor=this.parent(ancestor)){if(ancestor===v){throw new Error("Setting "+parent+" as parent of "+v+" would create a cycle")}}this.setNode(parent)}this.setNode(v);this._removeFromParentsChildList(v);this._parent[v]=parent;this._children[parent][v]=true;return this}_removeFromParentsChildList(v){delete this._children[this._parent[v]][v]} /** * Gets parent node for node v. * Complexity: O(1). - */parent(v){if(this.#isCompound){var parent=this.#parent[v];if(parent!==GRAPH_NODE){return parent}}} + */parent(v){if(this._isCompound){var parent=this._parent[v];if(parent!==GRAPH_NODE){return parent}}} /** * Gets list of direct children of node v. * Complexity: O(1). - */children(v=GRAPH_NODE){if(this.#isCompound){var children=this.#children[v];if(children){return Object.keys(children)}}else if(v===GRAPH_NODE){return this.nodes()}else if(this.hasNode(v)){return[]}} + */children(v=GRAPH_NODE){if(this._isCompound){var children=this._children[v];if(children){return Object.keys(children)}}else if(v===GRAPH_NODE){return this.nodes()}else if(this.hasNode(v)){return[]}} /** * Return all nodes that are predecessors of the specified node or undefined if node v is not in * the graph. Behavior is undefined for undirected graphs - use neighbors instead. * Complexity: O(|V|). - */predecessors(v){var predsV=this.#preds[v];if(predsV){return Object.keys(predsV)}} + */predecessors(v){var predsV=this._preds[v];if(predsV){return Object.keys(predsV)}} /** * Return all nodes that are successors of the specified node or undefined if node v is not in * the graph. Behavior is undefined for undirected graphs - use neighbors instead. * Complexity: O(|V|). - */successors(v){var sucsV=this.#sucs[v];if(sucsV){return Object.keys(sucsV)}} + */successors(v){var sucsV=this._sucs[v];if(sucsV){return Object.keys(sucsV)}} /** * Return all nodes that are predecessors or successors of the specified node or undefined if * node v is not in the graph. @@ -221,7 +221,7 @@ parent+="";for(var ancestor=parent;ancestor!==undefined;ancestor=this.parent(anc * are also removed. In case of compound graph, if parent is rejected by filter, * than all its children are rejected too. * Average-case complexity: O(|E|+|V|). - */filterNodes(filter){var copy=new this.constructor({directed:this.#isDirected,multigraph:this.#isMultigraph,compound:this.#isCompound});copy.setGraph(this.graph());var self=this;Object.entries(this.#nodes).forEach(function([v,value]){if(filter(v)){copy.setNode(v,value)}});Object.values(this.#edgeObjs).forEach(function(e){if(copy.hasNode(e.v)&©.hasNode(e.w)){copy.setEdge(e,self.edge(e))}});var parents={};function findParent(v){var parent=self.parent(v);if(parent===undefined||copy.hasNode(parent)){parents[v]=parent;return parent}else if(parent in parents){return parents[parent]}else{return findParent(parent)}}if(this.#isCompound){copy.nodes().forEach(v=>copy.setParent(v,findParent(v)))}return copy} + */filterNodes(filter){var copy=new this.constructor({directed:this._isDirected,multigraph:this._isMultigraph,compound:this._isCompound});copy.setGraph(this.graph());var self=this;Object.entries(this._nodes).forEach(function([v,value]){if(filter(v)){copy.setNode(v,value)}});Object.values(this._edgeObjs).forEach(function(e){if(copy.hasNode(e.v)&©.hasNode(e.w)){copy.setEdge(e,self.edge(e))}});var parents={};function findParent(v){var parent=self.parent(v);if(parent===undefined||copy.hasNode(parent)){parents[v]=parent;return parent}else if(parent in parents){return parents[parent]}else{return findParent(parent)}}if(this._isCompound){copy.nodes().forEach(v=>copy.setParent(v,findParent(v)))}return copy} /* === Edge functions ========== */ /** * Sets the default edge label or factory function. This label will be @@ -229,15 +229,15 @@ parent+="";for(var ancestor=parent;ancestor!==undefined;ancestor=this.parent(anc * an edge or this function will be invoked each time when setting an edge * with no label specified and returned value * will be used as a label for edge. * Complexity: O(1). - */setDefaultEdgeLabel(newDefault){this.#defaultEdgeLabelFn=newDefault;if(typeof newDefault!=="function"){this.#defaultEdgeLabelFn=()=>newDefault}return this} + */setDefaultEdgeLabel(newDefault){this._defaultEdgeLabelFn=newDefault;if(typeof newDefault!=="function"){this._defaultEdgeLabelFn=()=>newDefault}return this} /** * Gets the number of edges in the graph. * Complexity: O(1). - */edgeCount(){return this.#edgeCount} + */edgeCount(){return this._edgeCount} /** * Gets edges of the graph. In case of compound graph subgraphs are not considered. * Complexity: O(|E|). - */edges(){return Object.values(this.#edgeObjs)} + */edges(){return Object.values(this._edgeObjs)} /** * Establish an edges path over the nodes in nodes list. If some edge is already * exists, it will update its label, otherwise it will create an edge between pair @@ -249,16 +249,16 @@ parent+="";for(var ancestor=parent;ancestor!==undefined;ancestor=this.parent(anc * name. If label is supplied it is set as the value for the edge. If label is not * supplied and the edge was created by this call then the default edge label will * be assigned. The name parameter is only useful with multigraphs. - */setEdge(){var v,w,name,value;var valueSpecified=false;var arg0=arguments[0];if(typeof arg0==="object"&&arg0!==null&&"v"in arg0){v=arg0.v;w=arg0.w;name=arg0.name;if(arguments.length===2){value=arguments[1];valueSpecified=true}}else{v=arg0;w=arguments[1];name=arguments[3];if(arguments.length>2){value=arguments[2];valueSpecified=true}}v=""+v;w=""+w;if(name!==undefined){name=""+name}var e=edgeArgsToId(this.#isDirected,v,w,name);if(this.#edgeLabels.hasOwnProperty(e)){if(valueSpecified){this.#edgeLabels[e]=value}return this}if(name!==undefined&&!this.#isMultigraph){throw new Error("Cannot set a named edge when isMultigraph = false")} + */setEdge(){var v,w,name,value;var valueSpecified=false;var arg0=arguments[0];if(typeof arg0==="object"&&arg0!==null&&"v"in arg0){v=arg0.v;w=arg0.w;name=arg0.name;if(arguments.length===2){value=arguments[1];valueSpecified=true}}else{v=arg0;w=arguments[1];name=arguments[3];if(arguments.length>2){value=arguments[2];valueSpecified=true}}v=""+v;w=""+w;if(name!==undefined){name=""+name}var e=edgeArgsToId(this._isDirected,v,w,name);if(this._edgeLabels.hasOwnProperty(e)){if(valueSpecified){this._edgeLabels[e]=value}return this}if(name!==undefined&&!this._isMultigraph){throw new Error("Cannot set a named edge when isMultigraph = false")} // It didn't exist, so we need to create it. // First ensure the nodes exist. -this.setNode(v);this.setNode(w);this.#edgeLabels[e]=valueSpecified?value:this.#defaultEdgeLabelFn(v,w,name);var edgeObj=edgeArgsToObj(this.#isDirected,v,w,name); +this.setNode(v);this.setNode(w);this._edgeLabels[e]=valueSpecified?value:this._defaultEdgeLabelFn(v,w,name);var edgeObj=edgeArgsToObj(this._isDirected,v,w,name); // Ensure we add undirected edges in a consistent way. -v=edgeObj.v;w=edgeObj.w;Object.freeze(edgeObj);this.#edgeObjs[e]=edgeObj;incrementOrInitEntry(this.#preds[w],v);incrementOrInitEntry(this.#sucs[v],w);this.#in[w][e]=edgeObj;this.#out[v][e]=edgeObj;this.#edgeCount++;return this} +v=edgeObj.v;w=edgeObj.w;Object.freeze(edgeObj);this._edgeObjs[e]=edgeObj;incrementOrInitEntry(this._preds[w],v);incrementOrInitEntry(this._sucs[v],w);this._in[w][e]=edgeObj;this._out[v][e]=edgeObj;this._edgeCount++;return this} /** * Gets the label for the specified edge. * Complexity: O(1). - */edge(v,w,name){var e=arguments.length===1?edgeObjToId(this.#isDirected,arguments[0]):edgeArgsToId(this.#isDirected,v,w,name);return this.#edgeLabels[e]} + */edge(v,w,name){var e=arguments.length===1?edgeObjToId(this._isDirected,arguments[0]):edgeArgsToId(this._isDirected,v,w,name);return this._edgeLabels[e]} /** * Gets the label for the specified edge and converts it to an object. * Complexity: O(1) @@ -266,21 +266,21 @@ v=edgeObj.v;w=edgeObj.w;Object.freeze(edgeObj);this.#edgeObjs[e]=edgeObj;increme /** * Detects whether the graph contains specified edge or not. No subgraphs are considered. * Complexity: O(1). - */hasEdge(v,w,name){var e=arguments.length===1?edgeObjToId(this.#isDirected,arguments[0]):edgeArgsToId(this.#isDirected,v,w,name);return this.#edgeLabels.hasOwnProperty(e)} + */hasEdge(v,w,name){var e=arguments.length===1?edgeObjToId(this._isDirected,arguments[0]):edgeArgsToId(this._isDirected,v,w,name);return this._edgeLabels.hasOwnProperty(e)} /** * Removes the specified edge from the graph. No subgraphs are considered. * Complexity: O(1). - */removeEdge(v,w,name){var e=arguments.length===1?edgeObjToId(this.#isDirected,arguments[0]):edgeArgsToId(this.#isDirected,v,w,name);var edge=this.#edgeObjs[e];if(edge){v=edge.v;w=edge.w;delete this.#edgeLabels[e];delete this.#edgeObjs[e];decrementOrRemoveEntry(this.#preds[w],v);decrementOrRemoveEntry(this.#sucs[v],w);delete this.#in[w][e];delete this.#out[v][e];this.#edgeCount--}return this} + */removeEdge(v,w,name){var e=arguments.length===1?edgeObjToId(this._isDirected,arguments[0]):edgeArgsToId(this._isDirected,v,w,name);var edge=this._edgeObjs[e];if(edge){v=edge.v;w=edge.w;delete this._edgeLabels[e];delete this._edgeObjs[e];decrementOrRemoveEntry(this._preds[w],v);decrementOrRemoveEntry(this._sucs[v],w);delete this._in[w][e];delete this._out[v][e];this._edgeCount--}return this} /** * Return all edges that point to the node v. Optionally filters those edges down to just those * coming from node u. Behavior is undefined for undirected graphs - use nodeEdges instead. * Complexity: O(|E|). - */inEdges(v,u){var inV=this.#in[v];if(inV){var edges=Object.values(inV);if(!u){return edges}return edges.filter(edge=>edge.v===u)}} + */inEdges(v,u){var inV=this._in[v];if(inV){var edges=Object.values(inV);if(!u){return edges}return edges.filter(edge=>edge.v===u)}} /** * Return all edges that are pointed at by node v. Optionally filters those edges down to just * those point to w. Behavior is undefined for undirected graphs - use nodeEdges instead. * Complexity: O(|E|). - */outEdges(v,w){var outV=this.#out[v];if(outV){var edges=Object.values(outV);if(!w){return edges}return edges.filter(edge=>edge.w===w)}} + */outEdges(v,w){var outV=this._out[v];if(outV){var edges=Object.values(outV);if(!w){return edges}return edges.filter(edge=>edge.w===w)}} /** * Returns all edges to or from node v regardless of direction. Optionally filters those edges * down to just those between nodes v and w regardless of direction. @@ -301,4 +301,4 @@ module.exports={Graph:require("./graph"),version:require("./version")}},{"./grap * // ['a', 'b'] * g2.edges() * // [ { v: 'a', w: 'b' } ] - */function read(json){var g=new Graph(json.options).setGraph(json.value);json.nodes.forEach(function(entry){g.setNode(entry.v,entry.value);if(entry.parent){g.setParent(entry.v,entry.parent)}});json.edges.forEach(function(entry){g.setEdge({v:entry.v,w:entry.w,name:entry.name},entry.value)});return g}},{"./graph":16}],19:[function(require,module,exports){module.exports="2.2.1"},{}]},{},[1])(1)}); + */function read(json){var g=new Graph(json.options).setGraph(json.value);json.nodes.forEach(function(entry){g.setNode(entry.v,entry.value);if(entry.parent){g.setParent(entry.v,entry.parent)}});json.edges.forEach(function(entry){g.setEdge({v:entry.v,w:entry.w,name:entry.name},entry.value)});return g}},{"./graph":16}],19:[function(require,module,exports){module.exports="2.2.2"},{}]},{},[1])(1)}); diff --git a/lib/version.js b/lib/version.js index e3d40348..a39338fe 100644 --- a/lib/version.js +++ b/lib/version.js @@ -1 +1 @@ -module.exports = '2.2.2-pre'; +module.exports = '2.2.2'; diff --git a/package-lock.json b/package-lock.json index c1f82066..29ecdfcf 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "@dagrejs/graphlib", - "version": "2.2.2-pre", + "version": "2.2.2", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "@dagrejs/graphlib", - "version": "2.2.2-pre", + "version": "2.2.2", "license": "MIT", "devDependencies": { "benchmark": "2.1.4", diff --git a/package.json b/package.json index 391e63c7..994b16ec 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@dagrejs/graphlib", - "version": "2.2.2-pre", + "version": "2.2.2", "description": "A directed and undirected multi-graph library", "author": "Chris Pettitt ", "license": "MIT", @@ -47,4 +47,4 @@ "type": "git", "url": "https://github.com/dagrejs/graphlib.git" } -} \ No newline at end of file +} From 722011c4187f48cc9117b3341bc19f9280733262 Mon Sep 17 00:00:00 2001 From: David Newell Date: Thu, 11 Apr 2024 13:09:41 +0200 Subject: [PATCH 70/85] Bump version and set as pre-release --- lib/version.js | 2 +- package.json | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/lib/version.js b/lib/version.js index a39338fe..4a7cb62d 100644 --- a/lib/version.js +++ b/lib/version.js @@ -1 +1 @@ -module.exports = '2.2.2'; +module.exports = '2.2.3-pre'; diff --git a/package.json b/package.json index 994b16ec..200449c0 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@dagrejs/graphlib", - "version": "2.2.2", + "version": "2.2.3-pre", "description": "A directed and undirected multi-graph library", "author": "Chris Pettitt ", "license": "MIT", @@ -47,4 +47,4 @@ "type": "git", "url": "https://github.com/dagrejs/graphlib.git" } -} +} \ No newline at end of file From 012772cbb4fa35fdefbf81cddd55b2535e299829 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sun, 16 Jun 2024 09:52:45 +0000 Subject: [PATCH 71/85] Bump braces from 3.0.2 to 3.0.3 Bumps [braces](https://github.com/micromatch/braces) from 3.0.2 to 3.0.3. - [Changelog](https://github.com/micromatch/braces/blob/master/CHANGELOG.md) - [Commits](https://github.com/micromatch/braces/compare/3.0.2...3.0.3) --- updated-dependencies: - dependency-name: braces dependency-type: indirect ... Signed-off-by: dependabot[bot] --- package-lock.json | 36 ++++++++++++++++++++++++------------ 1 file changed, 24 insertions(+), 12 deletions(-) diff --git a/package-lock.json b/package-lock.json index 29ecdfcf..95323e2a 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "@dagrejs/graphlib", - "version": "2.2.2", + "version": "2.2.3-pre", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "@dagrejs/graphlib", - "version": "2.2.2", + "version": "2.2.3-pre", "license": "MIT", "devDependencies": { "benchmark": "2.1.4", @@ -952,11 +952,12 @@ } }, "node_modules/braces": { - "version": "3.0.2", + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", + "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", "dev": true, - "license": "MIT", "dependencies": { - "fill-range": "^7.0.1" + "fill-range": "^7.1.1" }, "engines": { "node": ">=8" @@ -2342,9 +2343,10 @@ } }, "node_modules/fill-range": { - "version": "7.0.1", + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", + "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", "dev": true, - "license": "MIT", "dependencies": { "to-regex-range": "^5.0.1" }, @@ -2983,8 +2985,9 @@ }, "node_modules/is-number": { "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", "dev": true, - "license": "MIT", "engines": { "node": ">=0.12.0" } @@ -5338,8 +5341,9 @@ }, "node_modules/to-regex-range": { "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", "dev": true, - "license": "MIT", "dependencies": { "is-number": "^7.0.0" }, @@ -6403,10 +6407,12 @@ } }, "braces": { - "version": "3.0.2", + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", + "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", "dev": true, "requires": { - "fill-range": "^7.0.1" + "fill-range": "^7.1.1" } }, "brorand": { @@ -7393,7 +7399,9 @@ } }, "fill-range": { - "version": "7.0.1", + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", + "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", "dev": true, "requires": { "to-regex-range": "^5.0.1" @@ -7797,6 +7805,8 @@ }, "is-number": { "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", "dev": true }, "is-path-inside": { @@ -9351,6 +9361,8 @@ }, "to-regex-range": { "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", "dev": true, "requires": { "is-number": "^7.0.0" From ed60ce4b26d60d0252a27e18215964609a06c18d Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 10 Jul 2024 17:12:34 +0000 Subject: [PATCH 72/85] Bump ws and socket.io Bumps [ws](https://github.com/websockets/ws) and [socket.io](https://github.com/socketio/socket.io). These dependencies needed to be updated together. Updates `ws` from 8.11.0 to 8.17.1 - [Release notes](https://github.com/websockets/ws/releases) - [Commits](https://github.com/websockets/ws/compare/8.11.0...8.17.1) Updates `socket.io` from 4.6.1 to 4.7.5 - [Release notes](https://github.com/socketio/socket.io/releases) - [Changelog](https://github.com/socketio/socket.io/blob/4.7.5/CHANGELOG.md) - [Commits](https://github.com/socketio/socket.io/compare/4.6.1...4.7.5) --- updated-dependencies: - dependency-name: ws dependency-type: indirect - dependency-name: socket.io dependency-type: indirect ... Signed-off-by: dependabot[bot] --- package-lock.json | 180 ++++++++++++++++++++++++++++++++++------------ 1 file changed, 133 insertions(+), 47 deletions(-) diff --git a/package-lock.json b/package-lock.json index 95323e2a..3aac7d47 100644 --- a/package-lock.json +++ b/package-lock.json @@ -637,32 +637,40 @@ } }, "node_modules/@socket.io/component-emitter": { - "version": "3.1.0", - "dev": true, - "license": "MIT" + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@socket.io/component-emitter/-/component-emitter-3.1.2.tgz", + "integrity": "sha512-9BCxFwvbGg/RsZK9tjXd8s4UcwR0MWeFQ1XEKIQVVvAGJyINdrqKMcTRyLoK8Rse1GjzLV9cwjWV1olXRWEXVA==", + "dev": true }, "node_modules/@types/cookie": { "version": "0.4.1", - "dev": true, - "license": "MIT" + "resolved": "https://registry.npmjs.org/@types/cookie/-/cookie-0.4.1.tgz", + "integrity": "sha512-XW/Aa8APYr6jSVVA1y/DEIZX0/GMKLEVekNG727R8cs56ahETkRAy/3DR7+fJyh7oUgGwNQaRfXCun0+KbWY7Q==", + "dev": true }, "node_modules/@types/cors": { - "version": "2.8.13", + "version": "2.8.17", + "resolved": "https://registry.npmjs.org/@types/cors/-/cors-2.8.17.tgz", + "integrity": "sha512-8CGDvrBj1zgo2qE+oS3pOCyYNqCPryMWY2bGfwA0dcfopWGgxs+78df0Rs3rc9THP4JkOhLsAa+15VdpAqkcUA==", "dev": true, - "license": "MIT", "dependencies": { "@types/node": "*" } }, "node_modules/@types/node": { - "version": "18.14.2", + "version": "20.14.10", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.14.10.tgz", + "integrity": "sha512-MdiXf+nDuMvY0gJKxyfZ7/6UFsETO7mGKF54MVD/ekJS6HdFtpZFBgrh6Pseu64XTb2MLyFPlbW6hj8HYRQNOQ==", "dev": true, - "license": "MIT" + "dependencies": { + "undici-types": "~5.26.4" + } }, "node_modules/accepts": { "version": "1.3.8", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", + "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", "dev": true, - "license": "MIT", "dependencies": { "mime-types": "~2.1.34", "negotiator": "0.6.3" @@ -859,8 +867,9 @@ }, "node_modules/base64id": { "version": "2.0.0", + "resolved": "https://registry.npmjs.org/base64id/-/base64id-2.0.0.tgz", + "integrity": "sha512-lGe34o6EHj9y3Kts9R4ZYs/Gr+6N7MCaMlIFA3F1R2O5/m7K06AxfSeO5530PEERE6/WyEg3lsuyw4GHlPZHog==", "dev": true, - "license": "MIT", "engines": { "node": "^4.5.0 || >= 5.9" } @@ -1493,8 +1502,9 @@ }, "node_modules/cookie": { "version": "0.4.2", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.2.tgz", + "integrity": "sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA==", "dev": true, - "license": "MIT", "engines": { "node": ">= 0.6" } @@ -1506,8 +1516,9 @@ }, "node_modules/cors": { "version": "2.8.5", + "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz", + "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==", "dev": true, - "license": "MIT", "dependencies": { "object-assign": "^4", "vary": "^1" @@ -1872,9 +1883,9 @@ } }, "node_modules/engine.io": { - "version": "6.4.2", - "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-6.4.2.tgz", - "integrity": "sha512-FKn/3oMiJjrOEOeUub2WCox6JhxBXq/Zn3fZOMCBxKnNYtsdKjxhl7yR3fZhM9PV+rdE75SU5SYMc+2PGzo+Tg==", + "version": "6.5.5", + "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-6.5.5.tgz", + "integrity": "sha512-C5Pn8Wk+1vKBoHghJODM63yk8MvrO9EWZUfkAt5HAqIgPE4/8FF0PEGHXtEd40l223+cE5ABWuPzm38PHFXfMA==", "dev": true, "dependencies": { "@types/cookie": "^0.4.1", @@ -1885,21 +1896,43 @@ "cookie": "~0.4.1", "cors": "~2.8.5", "debug": "~4.3.1", - "engine.io-parser": "~5.0.3", - "ws": "~8.11.0" + "engine.io-parser": "~5.2.1", + "ws": "~8.17.1" }, "engines": { - "node": ">=10.0.0" + "node": ">=10.2.0" } }, "node_modules/engine.io-parser": { - "version": "5.0.6", + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-5.2.2.tgz", + "integrity": "sha512-RcyUFKA93/CXH20l4SoVvzZfrSDMOTUS3bWVpTt2FuFP+XYrL8i8oonHP7WInRyVHXh0n/ORtoeiE1os+8qkSw==", "dev": true, - "license": "MIT", "engines": { "node": ">=10.0.0" } }, + "node_modules/engine.io/node_modules/ws": { + "version": "8.17.1", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.17.1.tgz", + "integrity": "sha512-6XQFvXTkbfUOZOKKILFG1PDK2NDQs4azKQl26T0YS5CxqWLgXajbPZ+h4gZekJyRqFU8pvnbAbbs/3TgRPy+GQ==", + "dev": true, + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": ">=5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, "node_modules/ent": { "version": "2.2.0", "dev": true, @@ -3995,8 +4028,9 @@ }, "node_modules/negotiator": { "version": "0.6.3", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", + "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", "dev": true, - "license": "MIT", "engines": { "node": ">= 0.6" } @@ -4997,19 +5031,21 @@ "license": "MIT" }, "node_modules/socket.io": { - "version": "4.6.1", + "version": "4.7.5", + "resolved": "https://registry.npmjs.org/socket.io/-/socket.io-4.7.5.tgz", + "integrity": "sha512-DmeAkF6cwM9jSfmp6Dr/5/mfMwb5Z5qRrSXLpo3Fq5SqyU8CMF15jIN4ZhfSwu35ksM1qmHZDQ/DK5XTccSTvA==", "dev": true, - "license": "MIT", "dependencies": { "accepts": "~1.3.4", "base64id": "~2.0.0", + "cors": "~2.8.5", "debug": "~4.3.2", - "engine.io": "~6.4.1", + "engine.io": "~6.5.2", "socket.io-adapter": "~2.5.2", - "socket.io-parser": "~4.2.1" + "socket.io-parser": "~4.2.4" }, "engines": { - "node": ">=10.0.0" + "node": ">=10.2.0" } }, "node_modules/socket.io-adapter": { @@ -5021,9 +5057,9 @@ } }, "node_modules/socket.io-parser": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-4.2.3.tgz", - "integrity": "sha512-JMafRntWVO2DCJimKsRTh/wnqVvO4hrfwOqtO7f+uzwsQMuxO6VwImtYxaQ+ieoyshWOTJyV0fA21lccEXRPpQ==", + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-4.2.4.tgz", + "integrity": "sha512-/GbIKmo8ioc+NIWIhwdecY0ge+qVBSMdgxGygevmdHj24bsfgtCmcUUcQ5ZzcylGFHsN3k4HB4Cgkl96KVnuew==", "dev": true, "dependencies": { "@socket.io/component-emitter": "~3.1.0", @@ -5460,6 +5496,12 @@ "undeclared-identifiers": "bin.js" } }, + "node_modules/undici-types": { + "version": "5.26.5", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", + "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==", + "dev": true + }, "node_modules/universalify": { "version": "0.1.2", "dev": true, @@ -5567,8 +5609,9 @@ }, "node_modules/vary": { "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", "dev": true, - "license": "MIT", "engines": { "node": ">= 0.8" } @@ -6186,26 +6229,39 @@ } }, "@socket.io/component-emitter": { - "version": "3.1.0", + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@socket.io/component-emitter/-/component-emitter-3.1.2.tgz", + "integrity": "sha512-9BCxFwvbGg/RsZK9tjXd8s4UcwR0MWeFQ1XEKIQVVvAGJyINdrqKMcTRyLoK8Rse1GjzLV9cwjWV1olXRWEXVA==", "dev": true }, "@types/cookie": { "version": "0.4.1", + "resolved": "https://registry.npmjs.org/@types/cookie/-/cookie-0.4.1.tgz", + "integrity": "sha512-XW/Aa8APYr6jSVVA1y/DEIZX0/GMKLEVekNG727R8cs56ahETkRAy/3DR7+fJyh7oUgGwNQaRfXCun0+KbWY7Q==", "dev": true }, "@types/cors": { - "version": "2.8.13", + "version": "2.8.17", + "resolved": "https://registry.npmjs.org/@types/cors/-/cors-2.8.17.tgz", + "integrity": "sha512-8CGDvrBj1zgo2qE+oS3pOCyYNqCPryMWY2bGfwA0dcfopWGgxs+78df0Rs3rc9THP4JkOhLsAa+15VdpAqkcUA==", "dev": true, "requires": { "@types/node": "*" } }, "@types/node": { - "version": "18.14.2", - "dev": true + "version": "20.14.10", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.14.10.tgz", + "integrity": "sha512-MdiXf+nDuMvY0gJKxyfZ7/6UFsETO7mGKF54MVD/ekJS6HdFtpZFBgrh6Pseu64XTb2MLyFPlbW6hj8HYRQNOQ==", + "dev": true, + "requires": { + "undici-types": "~5.26.4" + } }, "accepts": { "version": "1.3.8", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", + "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", "dev": true, "requires": { "mime-types": "~2.1.34", @@ -6338,6 +6394,8 @@ }, "base64id": { "version": "2.0.0", + "resolved": "https://registry.npmjs.org/base64id/-/base64id-2.0.0.tgz", + "integrity": "sha512-lGe34o6EHj9y3Kts9R4ZYs/Gr+6N7MCaMlIFA3F1R2O5/m7K06AxfSeO5530PEERE6/WyEg3lsuyw4GHlPZHog==", "dev": true }, "beeper": { @@ -6820,6 +6878,8 @@ }, "cookie": { "version": "0.4.2", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.2.tgz", + "integrity": "sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA==", "dev": true }, "core-util-is": { @@ -6828,6 +6888,8 @@ }, "cors": { "version": "2.8.5", + "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz", + "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==", "dev": true, "requires": { "object-assign": "^4", @@ -7092,9 +7154,9 @@ "dev": true }, "engine.io": { - "version": "6.4.2", - "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-6.4.2.tgz", - "integrity": "sha512-FKn/3oMiJjrOEOeUub2WCox6JhxBXq/Zn3fZOMCBxKnNYtsdKjxhl7yR3fZhM9PV+rdE75SU5SYMc+2PGzo+Tg==", + "version": "6.5.5", + "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-6.5.5.tgz", + "integrity": "sha512-C5Pn8Wk+1vKBoHghJODM63yk8MvrO9EWZUfkAt5HAqIgPE4/8FF0PEGHXtEd40l223+cE5ABWuPzm38PHFXfMA==", "dev": true, "requires": { "@types/cookie": "^0.4.1", @@ -7105,12 +7167,23 @@ "cookie": "~0.4.1", "cors": "~2.8.5", "debug": "~4.3.1", - "engine.io-parser": "~5.0.3", - "ws": "~8.11.0" + "engine.io-parser": "~5.2.1", + "ws": "~8.17.1" + }, + "dependencies": { + "ws": { + "version": "8.17.1", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.17.1.tgz", + "integrity": "sha512-6XQFvXTkbfUOZOKKILFG1PDK2NDQs4azKQl26T0YS5CxqWLgXajbPZ+h4gZekJyRqFU8pvnbAbbs/3TgRPy+GQ==", + "dev": true, + "requires": {} + } } }, "engine.io-parser": { - "version": "5.0.6", + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-5.2.2.tgz", + "integrity": "sha512-RcyUFKA93/CXH20l4SoVvzZfrSDMOTUS3bWVpTt2FuFP+XYrL8i8oonHP7WInRyVHXh0n/ORtoeiE1os+8qkSw==", "dev": true }, "ent": { @@ -8464,6 +8537,8 @@ }, "negotiator": { "version": "0.6.3", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", + "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", "dev": true }, "node-preload": { @@ -9113,15 +9188,18 @@ "dev": true }, "socket.io": { - "version": "4.6.1", + "version": "4.7.5", + "resolved": "https://registry.npmjs.org/socket.io/-/socket.io-4.7.5.tgz", + "integrity": "sha512-DmeAkF6cwM9jSfmp6Dr/5/mfMwb5Z5qRrSXLpo3Fq5SqyU8CMF15jIN4ZhfSwu35ksM1qmHZDQ/DK5XTccSTvA==", "dev": true, "requires": { "accepts": "~1.3.4", "base64id": "~2.0.0", + "cors": "~2.8.5", "debug": "~4.3.2", - "engine.io": "~6.4.1", + "engine.io": "~6.5.2", "socket.io-adapter": "~2.5.2", - "socket.io-parser": "~4.2.1" + "socket.io-parser": "~4.2.4" } }, "socket.io-adapter": { @@ -9132,9 +9210,9 @@ } }, "socket.io-parser": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-4.2.3.tgz", - "integrity": "sha512-JMafRntWVO2DCJimKsRTh/wnqVvO4hrfwOqtO7f+uzwsQMuxO6VwImtYxaQ+ieoyshWOTJyV0fA21lccEXRPpQ==", + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-4.2.4.tgz", + "integrity": "sha512-/GbIKmo8ioc+NIWIhwdecY0ge+qVBSMdgxGygevmdHj24bsfgtCmcUUcQ5ZzcylGFHsN3k4HB4Cgkl96KVnuew==", "dev": true, "requires": { "@socket.io/component-emitter": "~3.1.0", @@ -9426,6 +9504,12 @@ "xtend": "^4.0.1" } }, + "undici-types": { + "version": "5.26.5", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", + "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==", + "dev": true + }, "universalify": { "version": "0.1.2", "dev": true @@ -9496,6 +9580,8 @@ }, "vary": { "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", "dev": true }, "vm-browserify": { From 0c488b346398968661dfa356fad076b209026054 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?TATSUNO=20=E2=80=9CTaz=E2=80=9D=20Yasuhiro?= Date: Fri, 12 Jul 2024 15:45:28 +0900 Subject: [PATCH 73/85] Update npm badge --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index a41700b3..8bb73d22 100644 --- a/README.md +++ b/README.md @@ -5,7 +5,7 @@ Graphlib is a JavaScript library that provides data structures for undirected and directed multi-graphs along with algorithms that can be used with them. [![Build Status](https://github.com/dagrejs/graphlib/workflows/Build%20Status/badge.svg?branch=master)](https://github.com/dagrejs/graphlib/actions?query=workflow%3A%22Build+Status%22) -[![npm](https://img.shields.io/npm/v/graphlib.svg)](https://www.npmjs.com/package/graphlib) +[![npm](https://img.shields.io/npm/v/@dagrejs/graphlib.svg)](https://www.npmjs.com/package/graphlib) To learn more [see our Wiki](https://github.com/cpettitt/graphlib/wiki). From df8c6f708de412c6a6c51f1f4e15f69c7305fc7a Mon Sep 17 00:00:00 2001 From: David Newell Date: Wed, 17 Jul 2024 09:01:37 +0000 Subject: [PATCH 74/85] Bumping the version for release --- README.md | 2 +- lib/version.js | 2 +- package.json | 4 ++-- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index 8bb73d22..21d1007e 100644 --- a/README.md +++ b/README.md @@ -5,7 +5,7 @@ Graphlib is a JavaScript library that provides data structures for undirected and directed multi-graphs along with algorithms that can be used with them. [![Build Status](https://github.com/dagrejs/graphlib/workflows/Build%20Status/badge.svg?branch=master)](https://github.com/dagrejs/graphlib/actions?query=workflow%3A%22Build+Status%22) -[![npm](https://img.shields.io/npm/v/@dagrejs/graphlib.svg)](https://www.npmjs.com/package/graphlib) +[![npm](https://img.shields.io/npm/v/@dagrejs/graphlib.svg)](https://www.npmjs.com/package/@dagrejs/graphlib) To learn more [see our Wiki](https://github.com/cpettitt/graphlib/wiki). diff --git a/lib/version.js b/lib/version.js index 4a7cb62d..7064366e 100644 --- a/lib/version.js +++ b/lib/version.js @@ -1 +1 @@ -module.exports = '2.2.3-pre'; +module.exports = '2.2.3'; diff --git a/package.json b/package.json index 200449c0..f43d0f1e 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@dagrejs/graphlib", - "version": "2.2.3-pre", + "version": "2.2.3", "description": "A directed and undirected multi-graph library", "author": "Chris Pettitt ", "license": "MIT", @@ -47,4 +47,4 @@ "type": "git", "url": "https://github.com/dagrejs/graphlib.git" } -} \ No newline at end of file +} From 3a3769027f782448d9c7e331b8fdaf8ba78ab36f Mon Sep 17 00:00:00 2001 From: David Newell Date: Wed, 17 Jul 2024 11:07:42 +0200 Subject: [PATCH 75/85] Building for release --- bower.json | 2 +- dist/graphlib.core.js | 2 +- dist/graphlib.core.min.js | 2 +- dist/graphlib.js | 2 +- dist/graphlib.min.js | 2 +- package-lock.json | 4 ++-- 6 files changed, 7 insertions(+), 7 deletions(-) diff --git a/bower.json b/bower.json index 3533e8c8..0d51f93b 100644 --- a/bower.json +++ b/bower.json @@ -1,6 +1,6 @@ { "name": "graphlib", - "version": "2.2.2", + "version": "2.2.3", "main": [ "dist/graphlib.core.js" ], diff --git a/dist/graphlib.core.js b/dist/graphlib.core.js index d9924a35..3e60a926 100644 --- a/dist/graphlib.core.js +++ b/dist/graphlib.core.js @@ -1390,7 +1390,7 @@ function read(json) { } },{"./graph":16}],19:[function(require,module,exports){ -module.exports = '2.2.2'; +module.exports = '2.2.3'; },{}]},{},[1])(1) }); diff --git a/dist/graphlib.core.min.js b/dist/graphlib.core.min.js index 89756ba9..c638472c 100644 --- a/dist/graphlib.core.min.js +++ b/dist/graphlib.core.min.js @@ -301,4 +301,4 @@ module.exports={Graph:require("./graph"),version:require("./version")}},{"./grap * // ['a', 'b'] * g2.edges() * // [ { v: 'a', w: 'b' } ] - */function read(json){var g=new Graph(json.options).setGraph(json.value);json.nodes.forEach(function(entry){g.setNode(entry.v,entry.value);if(entry.parent){g.setParent(entry.v,entry.parent)}});json.edges.forEach(function(entry){g.setEdge({v:entry.v,w:entry.w,name:entry.name},entry.value)});return g}},{"./graph":16}],19:[function(require,module,exports){module.exports="2.2.2"},{}]},{},[1])(1)}); + */function read(json){var g=new Graph(json.options).setGraph(json.value);json.nodes.forEach(function(entry){g.setNode(entry.v,entry.value);if(entry.parent){g.setParent(entry.v,entry.parent)}});json.edges.forEach(function(entry){g.setEdge({v:entry.v,w:entry.w,name:entry.name},entry.value)});return g}},{"./graph":16}],19:[function(require,module,exports){module.exports="2.2.3"},{}]},{},[1])(1)}); diff --git a/dist/graphlib.js b/dist/graphlib.js index d9924a35..3e60a926 100644 --- a/dist/graphlib.js +++ b/dist/graphlib.js @@ -1390,7 +1390,7 @@ function read(json) { } },{"./graph":16}],19:[function(require,module,exports){ -module.exports = '2.2.2'; +module.exports = '2.2.3'; },{}]},{},[1])(1) }); diff --git a/dist/graphlib.min.js b/dist/graphlib.min.js index 89756ba9..c638472c 100644 --- a/dist/graphlib.min.js +++ b/dist/graphlib.min.js @@ -301,4 +301,4 @@ module.exports={Graph:require("./graph"),version:require("./version")}},{"./grap * // ['a', 'b'] * g2.edges() * // [ { v: 'a', w: 'b' } ] - */function read(json){var g=new Graph(json.options).setGraph(json.value);json.nodes.forEach(function(entry){g.setNode(entry.v,entry.value);if(entry.parent){g.setParent(entry.v,entry.parent)}});json.edges.forEach(function(entry){g.setEdge({v:entry.v,w:entry.w,name:entry.name},entry.value)});return g}},{"./graph":16}],19:[function(require,module,exports){module.exports="2.2.2"},{}]},{},[1])(1)}); + */function read(json){var g=new Graph(json.options).setGraph(json.value);json.nodes.forEach(function(entry){g.setNode(entry.v,entry.value);if(entry.parent){g.setParent(entry.v,entry.parent)}});json.edges.forEach(function(entry){g.setEdge({v:entry.v,w:entry.w,name:entry.name},entry.value)});return g}},{"./graph":16}],19:[function(require,module,exports){module.exports="2.2.3"},{}]},{},[1])(1)}); diff --git a/package-lock.json b/package-lock.json index 3aac7d47..86bab631 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "@dagrejs/graphlib", - "version": "2.2.3-pre", + "version": "2.2.3", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "@dagrejs/graphlib", - "version": "2.2.3-pre", + "version": "2.2.3", "license": "MIT", "devDependencies": { "benchmark": "2.1.4", From 19cd7c02f8ccbf6a88b206cc867ea672c4931810 Mon Sep 17 00:00:00 2001 From: David Newell Date: Wed, 17 Jul 2024 11:08:19 +0200 Subject: [PATCH 76/85] Bump version and set as pre-release --- lib/version.js | 2 +- package.json | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/lib/version.js b/lib/version.js index 7064366e..f3be55b3 100644 --- a/lib/version.js +++ b/lib/version.js @@ -1 +1 @@ -module.exports = '2.2.3'; +module.exports = '2.2.4-pre'; diff --git a/package.json b/package.json index f43d0f1e..28274c47 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@dagrejs/graphlib", - "version": "2.2.3", + "version": "2.2.4-pre", "description": "A directed and undirected multi-graph library", "author": "Chris Pettitt ", "license": "MIT", @@ -47,4 +47,4 @@ "type": "git", "url": "https://github.com/dagrejs/graphlib.git" } -} +} \ No newline at end of file From 95cd299ca848d187fc86e4d669e479aac089ec3f Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 7 Aug 2024 21:12:45 +0000 Subject: [PATCH 77/85] Bump requirejs from 2.3.6 to 2.3.7 Bumps [requirejs](https://github.com/jrburke/r.js) from 2.3.6 to 2.3.7. - [Commits](https://github.com/jrburke/r.js/compare/2.3.6...2.3.7) --- updated-dependencies: - dependency-name: requirejs dependency-type: direct:development ... Signed-off-by: dependabot[bot] --- package-lock.json | 15 +++++++++------ package.json | 2 +- 2 files changed, 10 insertions(+), 7 deletions(-) diff --git a/package-lock.json b/package-lock.json index 86bab631..b62aa2f7 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "@dagrejs/graphlib", - "version": "2.2.3", + "version": "2.2.4-pre", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "@dagrejs/graphlib", - "version": "2.2.3", + "version": "2.2.4-pre", "license": "MIT", "devDependencies": { "benchmark": "2.1.4", @@ -22,7 +22,7 @@ "karma-safari-launcher": "1.0.0", "mocha": "10.1.0", "nyc": "^15.1.0", - "requirejs": "2.3.6", + "requirejs": "2.3.7", "seedrandom": "3.0.5", "semver": "7.5.4", "sprintf": "0.1.5", @@ -4787,9 +4787,10 @@ "license": "ISC" }, "node_modules/requirejs": { - "version": "2.3.6", + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/requirejs/-/requirejs-2.3.7.tgz", + "integrity": "sha512-DouTG8T1WanGok6Qjg2SXuCMzszOo0eHeH9hDZ5Y4x8Je+9JB38HdTLT4/VA8OaUhBa0JPVHJ0pyBkM1z+pDsw==", "dev": true, - "license": "MIT", "bin": { "r_js": "bin/r.js", "r.js": "bin/r.js" @@ -9036,7 +9037,9 @@ "dev": true }, "requirejs": { - "version": "2.3.6", + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/requirejs/-/requirejs-2.3.7.tgz", + "integrity": "sha512-DouTG8T1WanGok6Qjg2SXuCMzszOo0eHeH9hDZ5Y4x8Je+9JB38HdTLT4/VA8OaUhBa0JPVHJ0pyBkM1z+pDsw==", "dev": true }, "requires-port": { diff --git a/package.json b/package.json index 28274c47..42d67a12 100644 --- a/package.json +++ b/package.json @@ -37,7 +37,7 @@ "karma-safari-launcher": "1.0.0", "mocha": "10.1.0", "nyc": "^15.1.0", - "requirejs": "2.3.6", + "requirejs": "2.3.7", "seedrandom": "3.0.5", "semver": "7.5.4", "sprintf": "0.1.5", From 0a8d03208aa6055477d11cb28393dcd56450c317 Mon Sep 17 00:00:00 2001 From: David Newell Date: Thu, 15 Aug 2024 10:58:04 +0000 Subject: [PATCH 78/85] Using Object.hasOwn instead of hasOwnProperty --- lib/alg/components.js | 2 +- lib/alg/dfs.js | 4 ++-- lib/alg/prim.js | 2 +- lib/alg/tarjan.js | 4 ++-- lib/alg/topsort.js | 4 ++-- lib/data/priority-queue.js | 4 ++-- lib/graph.js | 16 ++++++++-------- package-lock.json | 4 ++-- 8 files changed, 20 insertions(+), 20 deletions(-) diff --git a/lib/alg/components.js b/lib/alg/components.js index deeb85ed..df4f9e87 100644 --- a/lib/alg/components.js +++ b/lib/alg/components.js @@ -6,7 +6,7 @@ function components(g) { var cmpt; function dfs(v) { - if (visited.hasOwnProperty(v)) return; + if (Object.hasOwn(visited, v)) return; visited[v] = true; cmpt.push(v); g.successors(v).forEach(dfs); diff --git a/lib/alg/dfs.js b/lib/alg/dfs.js index 34a323cb..447f6a74 100644 --- a/lib/alg/dfs.js +++ b/lib/alg/dfs.js @@ -36,7 +36,7 @@ function postOrderDfs(v, navigation, visited, acc) { if (curr[1]) { acc.push(curr[0]); } else { - if (!visited.hasOwnProperty(curr[0])) { + if (!Object.hasOwn(visited, curr[0])) { visited[curr[0]] = true; stack.push([curr[0], true]); forEachRight(navigation(curr[0]), w => stack.push([w, false])); @@ -49,7 +49,7 @@ function preOrderDfs(v, navigation, visited, acc) { var stack = [v]; while (stack.length > 0) { var curr = stack.pop(); - if (!visited.hasOwnProperty(curr)) { + if (!Object.hasOwn(visited, curr)) { visited[curr] = true; acc.push(curr); forEachRight(navigation(curr), w => stack.push(w)); diff --git a/lib/alg/prim.js b/lib/alg/prim.js index 72fcd841..e9ec3e4d 100644 --- a/lib/alg/prim.js +++ b/lib/alg/prim.js @@ -36,7 +36,7 @@ function prim(g, weightFunc) { var init = false; while (pq.size() > 0) { v = pq.removeMin(); - if (parents.hasOwnProperty(v)) { + if (Object.hasOwn(parents, v)) { result.setEdge(v, parents[v]); } else if (init) { throw new Error("Input graph is not connected: " + g); diff --git a/lib/alg/tarjan.js b/lib/alg/tarjan.js index c00eeba7..a6146df0 100644 --- a/lib/alg/tarjan.js +++ b/lib/alg/tarjan.js @@ -15,7 +15,7 @@ function tarjan(g) { stack.push(v); g.successors(v).forEach(function(w) { - if (!visited.hasOwnProperty(w)) { + if (!Object.hasOwn(visited, w)) { dfs(w); entry.lowlink = Math.min(entry.lowlink, visited[w].lowlink); } else if (visited[w].onStack) { @@ -36,7 +36,7 @@ function tarjan(g) { } g.nodes().forEach(function(v) { - if (!visited.hasOwnProperty(v)) { + if (!Object.hasOwn(visited, v)) { dfs(v); } }); diff --git a/lib/alg/topsort.js b/lib/alg/topsort.js index 5986ce02..082044fe 100644 --- a/lib/alg/topsort.js +++ b/lib/alg/topsort.js @@ -4,11 +4,11 @@ function topsort(g) { var results = []; function visit(node) { - if (stack.hasOwnProperty(node)) { + if (Object.hasOwn(stack, node)) { throw new CycleException(); } - if (!visited.hasOwnProperty(node)) { + if (!Object.hasOwn(visited, node)) { stack[node] = true; visited[node] = true; g.predecessors(node).forEach(visit); diff --git a/lib/data/priority-queue.js b/lib/data/priority-queue.js index 6ce46fe8..d0836561 100644 --- a/lib/data/priority-queue.js +++ b/lib/data/priority-queue.js @@ -27,7 +27,7 @@ class PriorityQueue { * Returns `true` if **key** is in the queue and `false` if not. */ has(key) { - return this._keyIndices.hasOwnProperty(key); + return Object.hasOwn(this._keyIndices, key); } /** @@ -65,7 +65,7 @@ class PriorityQueue { add(key, priority) { var keyIndices = this._keyIndices; key = String(key); - if (!keyIndices.hasOwnProperty(key)) { + if (!Object.hasOwn(keyIndices, key)) { var arr = this._arr; var index = arr.length; keyIndices[key] = index; diff --git a/lib/graph.js b/lib/graph.js index da9fa731..c593dc71 100644 --- a/lib/graph.js +++ b/lib/graph.js @@ -61,9 +61,9 @@ class Graph { constructor(opts) { if (opts) { - this._isDirected = opts.hasOwnProperty("directed") ? opts.directed : true; - this._isMultigraph = opts.hasOwnProperty("multigraph") ? opts.multigraph : false; - this._isCompound = opts.hasOwnProperty("compound") ? opts.compound : false; + this._isDirected = Object.hasOwn(opts, "directed") ? opts.directed : true; + this._isMultigraph = Object.hasOwn(opts, "multigraph") ? opts.multigraph : false; + this._isCompound = Object.hasOwn(opts, "compound") ? opts.compound : false; } if (this._isCompound) { @@ -192,7 +192,7 @@ class Graph { * Complexity: O(1). */ setNode(v, value) { - if (this._nodes.hasOwnProperty(v)) { + if (Object.hasOwn(this._nodes, v)) { if (arguments.length > 1) { this._nodes[v] = value; } @@ -225,7 +225,7 @@ class Graph { * Detects whether graph has a node with specified name or not. */ hasNode(v) { - return this._nodes.hasOwnProperty(v); + return Object.hasOwn(this._nodes, v); } /** @@ -236,7 +236,7 @@ class Graph { */ removeNode(v) { var self = this; - if (this._nodes.hasOwnProperty(v)) { + if (Object.hasOwn(this._nodes, v)) { var removeEdge = e => self.removeEdge(self._edgeObjs[e]); delete this._nodes[v]; if (this._isCompound) { @@ -514,7 +514,7 @@ class Graph { } var e = edgeArgsToId(this._isDirected, v, w, name); - if (this._edgeLabels.hasOwnProperty(e)) { + if (Object.hasOwn(this._edgeLabels, e)) { if (valueSpecified) { this._edgeLabels[e] = value; } @@ -579,7 +579,7 @@ class Graph { var e = (arguments.length === 1 ? edgeObjToId(this._isDirected, arguments[0]) : edgeArgsToId(this._isDirected, v, w, name)); - return this._edgeLabels.hasOwnProperty(e); + return Object.hasOwn(this._edgeLabels, e); } /** diff --git a/package-lock.json b/package-lock.json index 86bab631..efb69566 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "@dagrejs/graphlib", - "version": "2.2.3", + "version": "2.2.4-pre", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "@dagrejs/graphlib", - "version": "2.2.3", + "version": "2.2.4-pre", "license": "MIT", "devDependencies": { "benchmark": "2.1.4", From 6c5035b844f1c7ed6074aaa974963b258d57aaa3 Mon Sep 17 00:00:00 2001 From: David Newell Date: Thu, 15 Aug 2024 13:06:13 +0200 Subject: [PATCH 79/85] Bumping for release --- lib/version.js | 2 +- package-lock.json | 4 ++-- package.json | 4 ++-- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/lib/version.js b/lib/version.js index f3be55b3..78e2ac8f 100644 --- a/lib/version.js +++ b/lib/version.js @@ -1 +1 @@ -module.exports = '2.2.4-pre'; +module.exports = '2.2.4'; diff --git a/package-lock.json b/package-lock.json index b62aa2f7..a02d9048 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "@dagrejs/graphlib", - "version": "2.2.4-pre", + "version": "2.2.4", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "@dagrejs/graphlib", - "version": "2.2.4-pre", + "version": "2.2.4", "license": "MIT", "devDependencies": { "benchmark": "2.1.4", diff --git a/package.json b/package.json index 42d67a12..89d89c14 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@dagrejs/graphlib", - "version": "2.2.4-pre", + "version": "2.2.4", "description": "A directed and undirected multi-graph library", "author": "Chris Pettitt ", "license": "MIT", @@ -47,4 +47,4 @@ "type": "git", "url": "https://github.com/dagrejs/graphlib.git" } -} \ No newline at end of file +} From 380d5efa1f4ab0904539f046bdba583d14ac2add Mon Sep 17 00:00:00 2001 From: David Newell Date: Thu, 15 Aug 2024 13:06:32 +0200 Subject: [PATCH 80/85] Building for release --- bower.json | 2 +- dist/graphlib.core.js | 38 +++++++++++++++++++------------------- dist/graphlib.core.min.js | 26 +++++++++++++------------- dist/graphlib.js | 38 +++++++++++++++++++------------------- dist/graphlib.min.js | 26 +++++++++++++------------- 5 files changed, 65 insertions(+), 65 deletions(-) diff --git a/bower.json b/bower.json index 0d51f93b..46815830 100644 --- a/bower.json +++ b/bower.json @@ -1,6 +1,6 @@ { "name": "graphlib", - "version": "2.2.3", + "version": "2.2.4", "main": [ "dist/graphlib.core.js" ], diff --git a/dist/graphlib.core.js b/dist/graphlib.core.js index 3e60a926..2e297c95 100644 --- a/dist/graphlib.core.js +++ b/dist/graphlib.core.js @@ -47,7 +47,7 @@ function components(g) { var cmpt; function dfs(v) { - if (visited.hasOwnProperty(v)) return; + if (Object.hasOwn(visited, v)) return; visited[v] = true; cmpt.push(v); g.successors(v).forEach(dfs); @@ -104,7 +104,7 @@ function postOrderDfs(v, navigation, visited, acc) { if (curr[1]) { acc.push(curr[0]); } else { - if (!visited.hasOwnProperty(curr[0])) { + if (!Object.hasOwn(visited, curr[0])) { visited[curr[0]] = true; stack.push([curr[0], true]); forEachRight(navigation(curr[0]), w => stack.push([w, false])); @@ -117,7 +117,7 @@ function preOrderDfs(v, navigation, visited, acc) { var stack = [v]; while (stack.length > 0) { var curr = stack.pop(); - if (!visited.hasOwnProperty(curr)) { + if (!Object.hasOwn(visited, curr)) { visited[curr] = true; acc.push(curr); forEachRight(navigation(curr), w => stack.push(w)); @@ -351,7 +351,7 @@ function prim(g, weightFunc) { var init = false; while (pq.size() > 0) { v = pq.removeMin(); - if (parents.hasOwnProperty(v)) { + if (Object.hasOwn(parents, v)) { result.setEdge(v, parents[v]); } else if (init) { throw new Error("Input graph is not connected: " + g); @@ -383,7 +383,7 @@ function tarjan(g) { stack.push(v); g.successors(v).forEach(function(w) { - if (!visited.hasOwnProperty(w)) { + if (!Object.hasOwn(visited, w)) { dfs(w); entry.lowlink = Math.min(entry.lowlink, visited[w].lowlink); } else if (visited[w].onStack) { @@ -404,7 +404,7 @@ function tarjan(g) { } g.nodes().forEach(function(v) { - if (!visited.hasOwnProperty(v)) { + if (!Object.hasOwn(visited, v)) { dfs(v); } }); @@ -419,11 +419,11 @@ function topsort(g) { var results = []; function visit(node) { - if (stack.hasOwnProperty(node)) { + if (Object.hasOwn(stack, node)) { throw new CycleException(); } - if (!visited.hasOwnProperty(node)) { + if (!Object.hasOwn(visited, node)) { stack[node] = true; visited[node] = true; g.predecessors(node).forEach(visit); @@ -480,7 +480,7 @@ class PriorityQueue { * Returns `true` if **key** is in the queue and `false` if not. */ has(key) { - return this._keyIndices.hasOwnProperty(key); + return Object.hasOwn(this._keyIndices, key); } /** @@ -518,7 +518,7 @@ class PriorityQueue { add(key, priority) { var keyIndices = this._keyIndices; key = String(key); - if (!keyIndices.hasOwnProperty(key)) { + if (!Object.hasOwn(keyIndices, key)) { var arr = this._arr; var index = arr.length; keyIndices[key] = index; @@ -666,9 +666,9 @@ class Graph { constructor(opts) { if (opts) { - this._isDirected = opts.hasOwnProperty("directed") ? opts.directed : true; - this._isMultigraph = opts.hasOwnProperty("multigraph") ? opts.multigraph : false; - this._isCompound = opts.hasOwnProperty("compound") ? opts.compound : false; + this._isDirected = Object.hasOwn(opts, "directed") ? opts.directed : true; + this._isMultigraph = Object.hasOwn(opts, "multigraph") ? opts.multigraph : false; + this._isCompound = Object.hasOwn(opts, "compound") ? opts.compound : false; } if (this._isCompound) { @@ -797,7 +797,7 @@ class Graph { * Complexity: O(1). */ setNode(v, value) { - if (this._nodes.hasOwnProperty(v)) { + if (Object.hasOwn(this._nodes, v)) { if (arguments.length > 1) { this._nodes[v] = value; } @@ -830,7 +830,7 @@ class Graph { * Detects whether graph has a node with specified name or not. */ hasNode(v) { - return this._nodes.hasOwnProperty(v); + return Object.hasOwn(this._nodes, v); } /** @@ -841,7 +841,7 @@ class Graph { */ removeNode(v) { var self = this; - if (this._nodes.hasOwnProperty(v)) { + if (Object.hasOwn(this._nodes, v)) { var removeEdge = e => self.removeEdge(self._edgeObjs[e]); delete this._nodes[v]; if (this._isCompound) { @@ -1119,7 +1119,7 @@ class Graph { } var e = edgeArgsToId(this._isDirected, v, w, name); - if (this._edgeLabels.hasOwnProperty(e)) { + if (Object.hasOwn(this._edgeLabels, e)) { if (valueSpecified) { this._edgeLabels[e] = value; } @@ -1184,7 +1184,7 @@ class Graph { var e = (arguments.length === 1 ? edgeObjToId(this._isDirected, arguments[0]) : edgeArgsToId(this._isDirected, v, w, name)); - return this._edgeLabels.hasOwnProperty(e); + return Object.hasOwn(this._edgeLabels, e); } /** @@ -1390,7 +1390,7 @@ function read(json) { } },{"./graph":16}],19:[function(require,module,exports){ -module.exports = '2.2.3'; +module.exports = '2.2.4'; },{}]},{},[1])(1) }); diff --git a/dist/graphlib.core.min.js b/dist/graphlib.core.min.js index c638472c..c925c2b6 100644 --- a/dist/graphlib.core.min.js +++ b/dist/graphlib.core.min.js @@ -28,7 +28,7 @@ * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -var lib=require("./lib");module.exports={Graph:lib.Graph,json:require("./lib/json"),alg:require("./lib/alg"),version:lib.version}},{"./lib":17,"./lib/alg":8,"./lib/json":18}],2:[function(require,module,exports){module.exports=components;function components(g){var visited={};var cmpts=[];var cmpt;function dfs(v){if(visited.hasOwnProperty(v))return;visited[v]=true;cmpt.push(v);g.successors(v).forEach(dfs);g.predecessors(v).forEach(dfs)}g.nodes().forEach(function(v){cmpt=[];dfs(v);if(cmpt.length){cmpts.push(cmpt)}});return cmpts}},{}],3:[function(require,module,exports){module.exports=dfs; +var lib=require("./lib");module.exports={Graph:lib.Graph,json:require("./lib/json"),alg:require("./lib/alg"),version:lib.version}},{"./lib":17,"./lib/alg":8,"./lib/json":18}],2:[function(require,module,exports){module.exports=components;function components(g){var visited={};var cmpts=[];var cmpt;function dfs(v){if(Object.hasOwn(visited,v))return;visited[v]=true;cmpt.push(v);g.successors(v).forEach(dfs);g.predecessors(v).forEach(dfs)}g.nodes().forEach(function(v){cmpt=[];dfs(v);if(cmpt.length){cmpts.push(cmpt)}});return cmpts}},{}],3:[function(require,module,exports){module.exports=dfs; /* * A helper that preforms a pre- or post-order traversal on the input graph * and returns the nodes in the order they were visited. If the graph is @@ -36,10 +36,10 @@ var lib=require("./lib");module.exports={Graph:lib.Graph,json:require("./lib/jso * is directed then this algorithm will navigate using successors. * * If the order is not "post", it will be treated as "pre". - */function dfs(g,vs,order){if(!Array.isArray(vs)){vs=[vs]}var navigation=g.isDirected()?v=>g.successors(v):v=>g.neighbors(v);var orderFunc=order==="post"?postOrderDfs:preOrderDfs;var acc=[];var visited={};vs.forEach(v=>{if(!g.hasNode(v)){throw new Error("Graph does not have node: "+v)}orderFunc(v,navigation,visited,acc)});return acc}function postOrderDfs(v,navigation,visited,acc){var stack=[[v,false]];while(stack.length>0){var curr=stack.pop();if(curr[1]){acc.push(curr[0])}else{if(!visited.hasOwnProperty(curr[0])){visited[curr[0]]=true;stack.push([curr[0],true]);forEachRight(navigation(curr[0]),w=>stack.push([w,false]))}}}}function preOrderDfs(v,navigation,visited,acc){var stack=[v];while(stack.length>0){var curr=stack.pop();if(!visited.hasOwnProperty(curr)){visited[curr]=true;acc.push(curr);forEachRight(navigation(curr),w=>stack.push(w))}}}function forEachRight(array,iteratee){var length=array.length;while(length--){iteratee(array[length],length,array)}return array}},{}],4:[function(require,module,exports){var dijkstra=require("./dijkstra");module.exports=dijkstraAll;function dijkstraAll(g,weightFunc,edgeFunc){return g.nodes().reduce(function(acc,v){acc[v]=dijkstra(g,v,weightFunc,edgeFunc);return acc},{})}},{"./dijkstra":5}],5:[function(require,module,exports){var PriorityQueue=require("../data/priority-queue");module.exports=dijkstra;var DEFAULT_WEIGHT_FUNC=()=>1;function dijkstra(g,source,weightFn,edgeFn){return runDijkstra(g,String(source),weightFn||DEFAULT_WEIGHT_FUNC,edgeFn||function(v){return g.outEdges(v)})}function runDijkstra(g,source,weightFn,edgeFn){var results={};var pq=new PriorityQueue;var v,vEntry;var updateNeighbors=function(edge){var w=edge.v!==v?edge.v:edge.w;var wEntry=results[w];var weight=weightFn(edge);var distance=vEntry.distance+weight;if(weight<0){throw new Error("dijkstra does not allow negative edge weights. "+"Bad edge: "+edge+" Weight: "+weight)}if(distance0){v=pq.removeMin();vEntry=results[v];if(vEntry.distance===Number.POSITIVE_INFINITY){break}edgeFn(v).forEach(updateNeighbors)}return results}},{"../data/priority-queue":15}],6:[function(require,module,exports){var tarjan=require("./tarjan");module.exports=findCycles;function findCycles(g){return tarjan(g).filter(function(cmpt){return cmpt.length>1||cmpt.length===1&&g.hasEdge(cmpt[0],cmpt[0])})}},{"./tarjan":13}],7:[function(require,module,exports){module.exports=floydWarshall;var DEFAULT_WEIGHT_FUNC=()=>1;function floydWarshall(g,weightFn,edgeFn){return runFloydWarshall(g,weightFn||DEFAULT_WEIGHT_FUNC,edgeFn||function(v){return g.outEdges(v)})}function runFloydWarshall(g,weightFn,edgeFn){var results={};var nodes=g.nodes();nodes.forEach(function(v){results[v]={};results[v][v]={distance:0};nodes.forEach(function(w){if(v!==w){results[v][w]={distance:Number.POSITIVE_INFINITY}}});edgeFn(v).forEach(function(edge){var w=edge.v===v?edge.w:edge.v;var d=weightFn(edge);results[v][w]={distance:d,predecessor:v}})});nodes.forEach(function(k){var rowK=results[k];nodes.forEach(function(i){var rowI=results[i];nodes.forEach(function(j){var ik=rowI[k];var kj=rowK[j];var ij=rowI[j];var altDistance=ik.distance+kj.distance;if(altDistanceg.successors(v):v=>g.neighbors(v);var orderFunc=order==="post"?postOrderDfs:preOrderDfs;var acc=[];var visited={};vs.forEach(v=>{if(!g.hasNode(v)){throw new Error("Graph does not have node: "+v)}orderFunc(v,navigation,visited,acc)});return acc}function postOrderDfs(v,navigation,visited,acc){var stack=[[v,false]];while(stack.length>0){var curr=stack.pop();if(curr[1]){acc.push(curr[0])}else{if(!Object.hasOwn(visited,curr[0])){visited[curr[0]]=true;stack.push([curr[0],true]);forEachRight(navigation(curr[0]),w=>stack.push([w,false]))}}}}function preOrderDfs(v,navigation,visited,acc){var stack=[v];while(stack.length>0){var curr=stack.pop();if(!Object.hasOwn(visited,curr)){visited[curr]=true;acc.push(curr);forEachRight(navigation(curr),w=>stack.push(w))}}}function forEachRight(array,iteratee){var length=array.length;while(length--){iteratee(array[length],length,array)}return array}},{}],4:[function(require,module,exports){var dijkstra=require("./dijkstra");module.exports=dijkstraAll;function dijkstraAll(g,weightFunc,edgeFunc){return g.nodes().reduce(function(acc,v){acc[v]=dijkstra(g,v,weightFunc,edgeFunc);return acc},{})}},{"./dijkstra":5}],5:[function(require,module,exports){var PriorityQueue=require("../data/priority-queue");module.exports=dijkstra;var DEFAULT_WEIGHT_FUNC=()=>1;function dijkstra(g,source,weightFn,edgeFn){return runDijkstra(g,String(source),weightFn||DEFAULT_WEIGHT_FUNC,edgeFn||function(v){return g.outEdges(v)})}function runDijkstra(g,source,weightFn,edgeFn){var results={};var pq=new PriorityQueue;var v,vEntry;var updateNeighbors=function(edge){var w=edge.v!==v?edge.v:edge.w;var wEntry=results[w];var weight=weightFn(edge);var distance=vEntry.distance+weight;if(weight<0){throw new Error("dijkstra does not allow negative edge weights. "+"Bad edge: "+edge+" Weight: "+weight)}if(distance0){v=pq.removeMin();vEntry=results[v];if(vEntry.distance===Number.POSITIVE_INFINITY){break}edgeFn(v).forEach(updateNeighbors)}return results}},{"../data/priority-queue":15}],6:[function(require,module,exports){var tarjan=require("./tarjan");module.exports=findCycles;function findCycles(g){return tarjan(g).filter(function(cmpt){return cmpt.length>1||cmpt.length===1&&g.hasEdge(cmpt[0],cmpt[0])})}},{"./tarjan":13}],7:[function(require,module,exports){module.exports=floydWarshall;var DEFAULT_WEIGHT_FUNC=()=>1;function floydWarshall(g,weightFn,edgeFn){return runFloydWarshall(g,weightFn||DEFAULT_WEIGHT_FUNC,edgeFn||function(v){return g.outEdges(v)})}function runFloydWarshall(g,weightFn,edgeFn){var results={};var nodes=g.nodes();nodes.forEach(function(v){results[v]={};results[v][v]={distance:0};nodes.forEach(function(w){if(v!==w){results[v][w]={distance:Number.POSITIVE_INFINITY}}});edgeFn(v).forEach(function(edge){var w=edge.v===v?edge.w:edge.v;var d=weightFn(edge);results[v][w]={distance:d,predecessor:v}})});nodes.forEach(function(k){var rowK=results[k];nodes.forEach(function(i){var rowI=results[i];nodes.forEach(function(j){var ik=rowI[k];var kj=rowK[j];var ij=rowI[j];var altDistance=ik.distance+kj.distance;if(altDistance0){v=pq.removeMin();if(parents.hasOwnProperty(v)){result.setEdge(v,parents[v])}else if(init){throw new Error("Input graph is not connected: "+g)}else{init=true}g.nodeEdges(v).forEach(updateNeighbors)}return result}},{"../data/priority-queue":15,"../graph":16}],13:[function(require,module,exports){module.exports=tarjan;function tarjan(g){var index=0;var stack=[];var visited={};// node id -> { onStack, lowlink, index } -var results=[];function dfs(v){var entry=visited[v]={onStack:true,lowlink:index,index:index++};stack.push(v);g.successors(v).forEach(function(w){if(!visited.hasOwnProperty(w)){dfs(w);entry.lowlink=Math.min(entry.lowlink,visited[w].lowlink)}else if(visited[w].onStack){entry.lowlink=Math.min(entry.lowlink,visited[w].index)}});if(entry.lowlink===entry.index){var cmpt=[];var w;do{w=stack.pop();visited[w].onStack=false;cmpt.push(w)}while(v!==w);results.push(cmpt)}}g.nodes().forEach(function(v){if(!visited.hasOwnProperty(v)){dfs(v)}});return results}},{}],14:[function(require,module,exports){function topsort(g){var visited={};var stack={};var results=[];function visit(node){if(stack.hasOwnProperty(node)){throw new CycleException}if(!visited.hasOwnProperty(node)){stack[node]=true;visited[node]=true;g.predecessors(node).forEach(visit);delete stack[node];results.push(node)}}g.sinks().forEach(visit);if(Object.keys(visited).length!==g.nodeCount()){throw new CycleException}return results}class CycleException extends Error{constructor(){super(...arguments)}}module.exports=topsort;topsort.CycleException=CycleException},{}],15:[function(require,module,exports){ +pq.decrease(g.nodes()[0],0);var init=false;while(pq.size()>0){v=pq.removeMin();if(Object.hasOwn(parents,v)){result.setEdge(v,parents[v])}else if(init){throw new Error("Input graph is not connected: "+g)}else{init=true}g.nodeEdges(v).forEach(updateNeighbors)}return result}},{"../data/priority-queue":15,"../graph":16}],13:[function(require,module,exports){module.exports=tarjan;function tarjan(g){var index=0;var stack=[];var visited={};// node id -> { onStack, lowlink, index } +var results=[];function dfs(v){var entry=visited[v]={onStack:true,lowlink:index,index:index++};stack.push(v);g.successors(v).forEach(function(w){if(!Object.hasOwn(visited,w)){dfs(w);entry.lowlink=Math.min(entry.lowlink,visited[w].lowlink)}else if(visited[w].onStack){entry.lowlink=Math.min(entry.lowlink,visited[w].index)}});if(entry.lowlink===entry.index){var cmpt=[];var w;do{w=stack.pop();visited[w].onStack=false;cmpt.push(w)}while(v!==w);results.push(cmpt)}}g.nodes().forEach(function(v){if(!Object.hasOwn(visited,v)){dfs(v)}});return results}},{}],14:[function(require,module,exports){function topsort(g){var visited={};var stack={};var results=[];function visit(node){if(Object.hasOwn(stack,node)){throw new CycleException}if(!Object.hasOwn(visited,node)){stack[node]=true;visited[node]=true;g.predecessors(node).forEach(visit);delete stack[node];results.push(node)}}g.sinks().forEach(visit);if(Object.keys(visited).length!==g.nodeCount()){throw new CycleException}return results}class CycleException extends Error{constructor(){super(...arguments)}}module.exports=topsort;topsort.CycleException=CycleException},{}],15:[function(require,module,exports){ /** * A min-priority queue data structure. This algorithm is derived from Cormen, * et al., "Introduction to Algorithms". The basic idea of a min-priority @@ -56,7 +56,7 @@ class PriorityQueue{_arr=[];_keyIndices={}; */keys(){return this._arr.map(function(x){return x.key})} /** * Returns `true` if **key** is in the queue and `false` if not. - */has(key){return this._keyIndices.hasOwnProperty(key)} + */has(key){return Object.hasOwn(this._keyIndices,key)} /** * Returns the priority for **key**. If **key** is not present in the queue * then this function returns `undefined`. Takes `O(1)` time. @@ -74,7 +74,7 @@ class PriorityQueue{_arr=[];_keyIndices={}; * * @param {Object} key the key to add * @param {Number} priority the initial priority for the key - */add(key,priority){var keyIndices=this._keyIndices;key=String(key);if(!keyIndices.hasOwnProperty(key)){var arr=this._arr;var index=arr.length;keyIndices[key]=index;arr.push({key:key,priority:priority});this._decrease(index);return true}return false} + */add(key,priority){var keyIndices=this._keyIndices;key=String(key);if(!Object.hasOwn(keyIndices,key)){var arr=this._arr;var index=arr.length;keyIndices[key]=index;arr.push({key:key,priority:priority});this._decrease(index);return true}return false} /** * Removes and returns the smallest key in the queue. Takes `O(log n)` time. */removeMin(){this._swap(0,this._arr.length-1);var min=this._arr.pop();delete this._keyIndices[min.key];this._heapify(0);return min.key} @@ -116,7 +116,7 @@ _edgeObjs={}; // e -> label _edgeLabels={}; /* Number of nodes in the graph. Should only be changed by the implementation. */_nodeCount=0; -/* Number of edges in the graph. Should only be changed by the implementation. */_edgeCount=0;_parent;_children;constructor(opts){if(opts){this._isDirected=opts.hasOwnProperty("directed")?opts.directed:true;this._isMultigraph=opts.hasOwnProperty("multigraph")?opts.multigraph:false;this._isCompound=opts.hasOwnProperty("compound")?opts.compound:false}if(this._isCompound){ +/* Number of edges in the graph. Should only be changed by the implementation. */_edgeCount=0;_parent;_children;constructor(opts){if(opts){this._isDirected=Object.hasOwn(opts,"directed")?opts.directed:true;this._isMultigraph=Object.hasOwn(opts,"multigraph")?opts.multigraph:false;this._isCompound=Object.hasOwn(opts,"compound")?opts.compound:false}if(this._isCompound){ // v -> parent this._parent={}; // v -> children @@ -171,20 +171,20 @@ this._children={};this._children[GRAPH_NODE]={}}} * it is set as the value for the node. If label is not supplied and the node was * created by this call then the default node label will be assigned. * Complexity: O(1). - */setNode(v,value){if(this._nodes.hasOwnProperty(v)){if(arguments.length>1){this._nodes[v]=value}return this}this._nodes[v]=arguments.length>1?value:this._defaultNodeLabelFn(v);if(this._isCompound){this._parent[v]=GRAPH_NODE;this._children[v]={};this._children[GRAPH_NODE][v]=true}this._in[v]={};this._preds[v]={};this._out[v]={};this._sucs[v]={};++this._nodeCount;return this} + */setNode(v,value){if(Object.hasOwn(this._nodes,v)){if(arguments.length>1){this._nodes[v]=value}return this}this._nodes[v]=arguments.length>1?value:this._defaultNodeLabelFn(v);if(this._isCompound){this._parent[v]=GRAPH_NODE;this._children[v]={};this._children[GRAPH_NODE][v]=true}this._in[v]={};this._preds[v]={};this._out[v]={};this._sucs[v]={};++this._nodeCount;return this} /** * Gets the label of node with specified name. * Complexity: O(|V|). */node(v){return this._nodes[v]} /** * Detects whether graph has a node with specified name or not. - */hasNode(v){return this._nodes.hasOwnProperty(v)} + */hasNode(v){return Object.hasOwn(this._nodes,v)} /** * Remove the node with the name from the graph or do nothing if the node is not in * the graph. If the node was removed this function also removes any incident * edges. * Complexity: O(1). - */removeNode(v){var self=this;if(this._nodes.hasOwnProperty(v)){var removeEdge=e=>self.removeEdge(self._edgeObjs[e]);delete this._nodes[v];if(this._isCompound){this._removeFromParentsChildList(v);delete this._parent[v];this.children(v).forEach(function(child){self.setParent(child)});delete this._children[v]}Object.keys(this._in[v]).forEach(removeEdge);delete this._in[v];delete this._preds[v];Object.keys(this._out[v]).forEach(removeEdge);delete this._out[v];delete this._sucs[v];--this._nodeCount}return this} + */removeNode(v){var self=this;if(Object.hasOwn(this._nodes,v)){var removeEdge=e=>self.removeEdge(self._edgeObjs[e]);delete this._nodes[v];if(this._isCompound){this._removeFromParentsChildList(v);delete this._parent[v];this.children(v).forEach(function(child){self.setParent(child)});delete this._children[v]}Object.keys(this._in[v]).forEach(removeEdge);delete this._in[v];delete this._preds[v];Object.keys(this._out[v]).forEach(removeEdge);delete this._out[v];delete this._sucs[v];--this._nodeCount}return this} /** * Sets node p as a parent for node v if it is defined, or removes the * parent for v if p is undefined. Method throws an exception in case of @@ -249,7 +249,7 @@ parent+="";for(var ancestor=parent;ancestor!==undefined;ancestor=this.parent(anc * name. If label is supplied it is set as the value for the edge. If label is not * supplied and the edge was created by this call then the default edge label will * be assigned. The name parameter is only useful with multigraphs. - */setEdge(){var v,w,name,value;var valueSpecified=false;var arg0=arguments[0];if(typeof arg0==="object"&&arg0!==null&&"v"in arg0){v=arg0.v;w=arg0.w;name=arg0.name;if(arguments.length===2){value=arguments[1];valueSpecified=true}}else{v=arg0;w=arguments[1];name=arguments[3];if(arguments.length>2){value=arguments[2];valueSpecified=true}}v=""+v;w=""+w;if(name!==undefined){name=""+name}var e=edgeArgsToId(this._isDirected,v,w,name);if(this._edgeLabels.hasOwnProperty(e)){if(valueSpecified){this._edgeLabels[e]=value}return this}if(name!==undefined&&!this._isMultigraph){throw new Error("Cannot set a named edge when isMultigraph = false")} + */setEdge(){var v,w,name,value;var valueSpecified=false;var arg0=arguments[0];if(typeof arg0==="object"&&arg0!==null&&"v"in arg0){v=arg0.v;w=arg0.w;name=arg0.name;if(arguments.length===2){value=arguments[1];valueSpecified=true}}else{v=arg0;w=arguments[1];name=arguments[3];if(arguments.length>2){value=arguments[2];valueSpecified=true}}v=""+v;w=""+w;if(name!==undefined){name=""+name}var e=edgeArgsToId(this._isDirected,v,w,name);if(Object.hasOwn(this._edgeLabels,e)){if(valueSpecified){this._edgeLabels[e]=value}return this}if(name!==undefined&&!this._isMultigraph){throw new Error("Cannot set a named edge when isMultigraph = false")} // It didn't exist, so we need to create it. // First ensure the nodes exist. this.setNode(v);this.setNode(w);this._edgeLabels[e]=valueSpecified?value:this._defaultEdgeLabelFn(v,w,name);var edgeObj=edgeArgsToObj(this._isDirected,v,w,name); @@ -266,7 +266,7 @@ v=edgeObj.v;w=edgeObj.w;Object.freeze(edgeObj);this._edgeObjs[e]=edgeObj;increme /** * Detects whether the graph contains specified edge or not. No subgraphs are considered. * Complexity: O(1). - */hasEdge(v,w,name){var e=arguments.length===1?edgeObjToId(this._isDirected,arguments[0]):edgeArgsToId(this._isDirected,v,w,name);return this._edgeLabels.hasOwnProperty(e)} + */hasEdge(v,w,name){var e=arguments.length===1?edgeObjToId(this._isDirected,arguments[0]):edgeArgsToId(this._isDirected,v,w,name);return Object.hasOwn(this._edgeLabels,e)} /** * Removes the specified edge from the graph. No subgraphs are considered. * Complexity: O(1). @@ -301,4 +301,4 @@ module.exports={Graph:require("./graph"),version:require("./version")}},{"./grap * // ['a', 'b'] * g2.edges() * // [ { v: 'a', w: 'b' } ] - */function read(json){var g=new Graph(json.options).setGraph(json.value);json.nodes.forEach(function(entry){g.setNode(entry.v,entry.value);if(entry.parent){g.setParent(entry.v,entry.parent)}});json.edges.forEach(function(entry){g.setEdge({v:entry.v,w:entry.w,name:entry.name},entry.value)});return g}},{"./graph":16}],19:[function(require,module,exports){module.exports="2.2.3"},{}]},{},[1])(1)}); + */function read(json){var g=new Graph(json.options).setGraph(json.value);json.nodes.forEach(function(entry){g.setNode(entry.v,entry.value);if(entry.parent){g.setParent(entry.v,entry.parent)}});json.edges.forEach(function(entry){g.setEdge({v:entry.v,w:entry.w,name:entry.name},entry.value)});return g}},{"./graph":16}],19:[function(require,module,exports){module.exports="2.2.4"},{}]},{},[1])(1)}); diff --git a/dist/graphlib.js b/dist/graphlib.js index 3e60a926..2e297c95 100644 --- a/dist/graphlib.js +++ b/dist/graphlib.js @@ -47,7 +47,7 @@ function components(g) { var cmpt; function dfs(v) { - if (visited.hasOwnProperty(v)) return; + if (Object.hasOwn(visited, v)) return; visited[v] = true; cmpt.push(v); g.successors(v).forEach(dfs); @@ -104,7 +104,7 @@ function postOrderDfs(v, navigation, visited, acc) { if (curr[1]) { acc.push(curr[0]); } else { - if (!visited.hasOwnProperty(curr[0])) { + if (!Object.hasOwn(visited, curr[0])) { visited[curr[0]] = true; stack.push([curr[0], true]); forEachRight(navigation(curr[0]), w => stack.push([w, false])); @@ -117,7 +117,7 @@ function preOrderDfs(v, navigation, visited, acc) { var stack = [v]; while (stack.length > 0) { var curr = stack.pop(); - if (!visited.hasOwnProperty(curr)) { + if (!Object.hasOwn(visited, curr)) { visited[curr] = true; acc.push(curr); forEachRight(navigation(curr), w => stack.push(w)); @@ -351,7 +351,7 @@ function prim(g, weightFunc) { var init = false; while (pq.size() > 0) { v = pq.removeMin(); - if (parents.hasOwnProperty(v)) { + if (Object.hasOwn(parents, v)) { result.setEdge(v, parents[v]); } else if (init) { throw new Error("Input graph is not connected: " + g); @@ -383,7 +383,7 @@ function tarjan(g) { stack.push(v); g.successors(v).forEach(function(w) { - if (!visited.hasOwnProperty(w)) { + if (!Object.hasOwn(visited, w)) { dfs(w); entry.lowlink = Math.min(entry.lowlink, visited[w].lowlink); } else if (visited[w].onStack) { @@ -404,7 +404,7 @@ function tarjan(g) { } g.nodes().forEach(function(v) { - if (!visited.hasOwnProperty(v)) { + if (!Object.hasOwn(visited, v)) { dfs(v); } }); @@ -419,11 +419,11 @@ function topsort(g) { var results = []; function visit(node) { - if (stack.hasOwnProperty(node)) { + if (Object.hasOwn(stack, node)) { throw new CycleException(); } - if (!visited.hasOwnProperty(node)) { + if (!Object.hasOwn(visited, node)) { stack[node] = true; visited[node] = true; g.predecessors(node).forEach(visit); @@ -480,7 +480,7 @@ class PriorityQueue { * Returns `true` if **key** is in the queue and `false` if not. */ has(key) { - return this._keyIndices.hasOwnProperty(key); + return Object.hasOwn(this._keyIndices, key); } /** @@ -518,7 +518,7 @@ class PriorityQueue { add(key, priority) { var keyIndices = this._keyIndices; key = String(key); - if (!keyIndices.hasOwnProperty(key)) { + if (!Object.hasOwn(keyIndices, key)) { var arr = this._arr; var index = arr.length; keyIndices[key] = index; @@ -666,9 +666,9 @@ class Graph { constructor(opts) { if (opts) { - this._isDirected = opts.hasOwnProperty("directed") ? opts.directed : true; - this._isMultigraph = opts.hasOwnProperty("multigraph") ? opts.multigraph : false; - this._isCompound = opts.hasOwnProperty("compound") ? opts.compound : false; + this._isDirected = Object.hasOwn(opts, "directed") ? opts.directed : true; + this._isMultigraph = Object.hasOwn(opts, "multigraph") ? opts.multigraph : false; + this._isCompound = Object.hasOwn(opts, "compound") ? opts.compound : false; } if (this._isCompound) { @@ -797,7 +797,7 @@ class Graph { * Complexity: O(1). */ setNode(v, value) { - if (this._nodes.hasOwnProperty(v)) { + if (Object.hasOwn(this._nodes, v)) { if (arguments.length > 1) { this._nodes[v] = value; } @@ -830,7 +830,7 @@ class Graph { * Detects whether graph has a node with specified name or not. */ hasNode(v) { - return this._nodes.hasOwnProperty(v); + return Object.hasOwn(this._nodes, v); } /** @@ -841,7 +841,7 @@ class Graph { */ removeNode(v) { var self = this; - if (this._nodes.hasOwnProperty(v)) { + if (Object.hasOwn(this._nodes, v)) { var removeEdge = e => self.removeEdge(self._edgeObjs[e]); delete this._nodes[v]; if (this._isCompound) { @@ -1119,7 +1119,7 @@ class Graph { } var e = edgeArgsToId(this._isDirected, v, w, name); - if (this._edgeLabels.hasOwnProperty(e)) { + if (Object.hasOwn(this._edgeLabels, e)) { if (valueSpecified) { this._edgeLabels[e] = value; } @@ -1184,7 +1184,7 @@ class Graph { var e = (arguments.length === 1 ? edgeObjToId(this._isDirected, arguments[0]) : edgeArgsToId(this._isDirected, v, w, name)); - return this._edgeLabels.hasOwnProperty(e); + return Object.hasOwn(this._edgeLabels, e); } /** @@ -1390,7 +1390,7 @@ function read(json) { } },{"./graph":16}],19:[function(require,module,exports){ -module.exports = '2.2.3'; +module.exports = '2.2.4'; },{}]},{},[1])(1) }); diff --git a/dist/graphlib.min.js b/dist/graphlib.min.js index c638472c..c925c2b6 100644 --- a/dist/graphlib.min.js +++ b/dist/graphlib.min.js @@ -28,7 +28,7 @@ * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -var lib=require("./lib");module.exports={Graph:lib.Graph,json:require("./lib/json"),alg:require("./lib/alg"),version:lib.version}},{"./lib":17,"./lib/alg":8,"./lib/json":18}],2:[function(require,module,exports){module.exports=components;function components(g){var visited={};var cmpts=[];var cmpt;function dfs(v){if(visited.hasOwnProperty(v))return;visited[v]=true;cmpt.push(v);g.successors(v).forEach(dfs);g.predecessors(v).forEach(dfs)}g.nodes().forEach(function(v){cmpt=[];dfs(v);if(cmpt.length){cmpts.push(cmpt)}});return cmpts}},{}],3:[function(require,module,exports){module.exports=dfs; +var lib=require("./lib");module.exports={Graph:lib.Graph,json:require("./lib/json"),alg:require("./lib/alg"),version:lib.version}},{"./lib":17,"./lib/alg":8,"./lib/json":18}],2:[function(require,module,exports){module.exports=components;function components(g){var visited={};var cmpts=[];var cmpt;function dfs(v){if(Object.hasOwn(visited,v))return;visited[v]=true;cmpt.push(v);g.successors(v).forEach(dfs);g.predecessors(v).forEach(dfs)}g.nodes().forEach(function(v){cmpt=[];dfs(v);if(cmpt.length){cmpts.push(cmpt)}});return cmpts}},{}],3:[function(require,module,exports){module.exports=dfs; /* * A helper that preforms a pre- or post-order traversal on the input graph * and returns the nodes in the order they were visited. If the graph is @@ -36,10 +36,10 @@ var lib=require("./lib");module.exports={Graph:lib.Graph,json:require("./lib/jso * is directed then this algorithm will navigate using successors. * * If the order is not "post", it will be treated as "pre". - */function dfs(g,vs,order){if(!Array.isArray(vs)){vs=[vs]}var navigation=g.isDirected()?v=>g.successors(v):v=>g.neighbors(v);var orderFunc=order==="post"?postOrderDfs:preOrderDfs;var acc=[];var visited={};vs.forEach(v=>{if(!g.hasNode(v)){throw new Error("Graph does not have node: "+v)}orderFunc(v,navigation,visited,acc)});return acc}function postOrderDfs(v,navigation,visited,acc){var stack=[[v,false]];while(stack.length>0){var curr=stack.pop();if(curr[1]){acc.push(curr[0])}else{if(!visited.hasOwnProperty(curr[0])){visited[curr[0]]=true;stack.push([curr[0],true]);forEachRight(navigation(curr[0]),w=>stack.push([w,false]))}}}}function preOrderDfs(v,navigation,visited,acc){var stack=[v];while(stack.length>0){var curr=stack.pop();if(!visited.hasOwnProperty(curr)){visited[curr]=true;acc.push(curr);forEachRight(navigation(curr),w=>stack.push(w))}}}function forEachRight(array,iteratee){var length=array.length;while(length--){iteratee(array[length],length,array)}return array}},{}],4:[function(require,module,exports){var dijkstra=require("./dijkstra");module.exports=dijkstraAll;function dijkstraAll(g,weightFunc,edgeFunc){return g.nodes().reduce(function(acc,v){acc[v]=dijkstra(g,v,weightFunc,edgeFunc);return acc},{})}},{"./dijkstra":5}],5:[function(require,module,exports){var PriorityQueue=require("../data/priority-queue");module.exports=dijkstra;var DEFAULT_WEIGHT_FUNC=()=>1;function dijkstra(g,source,weightFn,edgeFn){return runDijkstra(g,String(source),weightFn||DEFAULT_WEIGHT_FUNC,edgeFn||function(v){return g.outEdges(v)})}function runDijkstra(g,source,weightFn,edgeFn){var results={};var pq=new PriorityQueue;var v,vEntry;var updateNeighbors=function(edge){var w=edge.v!==v?edge.v:edge.w;var wEntry=results[w];var weight=weightFn(edge);var distance=vEntry.distance+weight;if(weight<0){throw new Error("dijkstra does not allow negative edge weights. "+"Bad edge: "+edge+" Weight: "+weight)}if(distance0){v=pq.removeMin();vEntry=results[v];if(vEntry.distance===Number.POSITIVE_INFINITY){break}edgeFn(v).forEach(updateNeighbors)}return results}},{"../data/priority-queue":15}],6:[function(require,module,exports){var tarjan=require("./tarjan");module.exports=findCycles;function findCycles(g){return tarjan(g).filter(function(cmpt){return cmpt.length>1||cmpt.length===1&&g.hasEdge(cmpt[0],cmpt[0])})}},{"./tarjan":13}],7:[function(require,module,exports){module.exports=floydWarshall;var DEFAULT_WEIGHT_FUNC=()=>1;function floydWarshall(g,weightFn,edgeFn){return runFloydWarshall(g,weightFn||DEFAULT_WEIGHT_FUNC,edgeFn||function(v){return g.outEdges(v)})}function runFloydWarshall(g,weightFn,edgeFn){var results={};var nodes=g.nodes();nodes.forEach(function(v){results[v]={};results[v][v]={distance:0};nodes.forEach(function(w){if(v!==w){results[v][w]={distance:Number.POSITIVE_INFINITY}}});edgeFn(v).forEach(function(edge){var w=edge.v===v?edge.w:edge.v;var d=weightFn(edge);results[v][w]={distance:d,predecessor:v}})});nodes.forEach(function(k){var rowK=results[k];nodes.forEach(function(i){var rowI=results[i];nodes.forEach(function(j){var ik=rowI[k];var kj=rowK[j];var ij=rowI[j];var altDistance=ik.distance+kj.distance;if(altDistanceg.successors(v):v=>g.neighbors(v);var orderFunc=order==="post"?postOrderDfs:preOrderDfs;var acc=[];var visited={};vs.forEach(v=>{if(!g.hasNode(v)){throw new Error("Graph does not have node: "+v)}orderFunc(v,navigation,visited,acc)});return acc}function postOrderDfs(v,navigation,visited,acc){var stack=[[v,false]];while(stack.length>0){var curr=stack.pop();if(curr[1]){acc.push(curr[0])}else{if(!Object.hasOwn(visited,curr[0])){visited[curr[0]]=true;stack.push([curr[0],true]);forEachRight(navigation(curr[0]),w=>stack.push([w,false]))}}}}function preOrderDfs(v,navigation,visited,acc){var stack=[v];while(stack.length>0){var curr=stack.pop();if(!Object.hasOwn(visited,curr)){visited[curr]=true;acc.push(curr);forEachRight(navigation(curr),w=>stack.push(w))}}}function forEachRight(array,iteratee){var length=array.length;while(length--){iteratee(array[length],length,array)}return array}},{}],4:[function(require,module,exports){var dijkstra=require("./dijkstra");module.exports=dijkstraAll;function dijkstraAll(g,weightFunc,edgeFunc){return g.nodes().reduce(function(acc,v){acc[v]=dijkstra(g,v,weightFunc,edgeFunc);return acc},{})}},{"./dijkstra":5}],5:[function(require,module,exports){var PriorityQueue=require("../data/priority-queue");module.exports=dijkstra;var DEFAULT_WEIGHT_FUNC=()=>1;function dijkstra(g,source,weightFn,edgeFn){return runDijkstra(g,String(source),weightFn||DEFAULT_WEIGHT_FUNC,edgeFn||function(v){return g.outEdges(v)})}function runDijkstra(g,source,weightFn,edgeFn){var results={};var pq=new PriorityQueue;var v,vEntry;var updateNeighbors=function(edge){var w=edge.v!==v?edge.v:edge.w;var wEntry=results[w];var weight=weightFn(edge);var distance=vEntry.distance+weight;if(weight<0){throw new Error("dijkstra does not allow negative edge weights. "+"Bad edge: "+edge+" Weight: "+weight)}if(distance0){v=pq.removeMin();vEntry=results[v];if(vEntry.distance===Number.POSITIVE_INFINITY){break}edgeFn(v).forEach(updateNeighbors)}return results}},{"../data/priority-queue":15}],6:[function(require,module,exports){var tarjan=require("./tarjan");module.exports=findCycles;function findCycles(g){return tarjan(g).filter(function(cmpt){return cmpt.length>1||cmpt.length===1&&g.hasEdge(cmpt[0],cmpt[0])})}},{"./tarjan":13}],7:[function(require,module,exports){module.exports=floydWarshall;var DEFAULT_WEIGHT_FUNC=()=>1;function floydWarshall(g,weightFn,edgeFn){return runFloydWarshall(g,weightFn||DEFAULT_WEIGHT_FUNC,edgeFn||function(v){return g.outEdges(v)})}function runFloydWarshall(g,weightFn,edgeFn){var results={};var nodes=g.nodes();nodes.forEach(function(v){results[v]={};results[v][v]={distance:0};nodes.forEach(function(w){if(v!==w){results[v][w]={distance:Number.POSITIVE_INFINITY}}});edgeFn(v).forEach(function(edge){var w=edge.v===v?edge.w:edge.v;var d=weightFn(edge);results[v][w]={distance:d,predecessor:v}})});nodes.forEach(function(k){var rowK=results[k];nodes.forEach(function(i){var rowI=results[i];nodes.forEach(function(j){var ik=rowI[k];var kj=rowK[j];var ij=rowI[j];var altDistance=ik.distance+kj.distance;if(altDistance0){v=pq.removeMin();if(parents.hasOwnProperty(v)){result.setEdge(v,parents[v])}else if(init){throw new Error("Input graph is not connected: "+g)}else{init=true}g.nodeEdges(v).forEach(updateNeighbors)}return result}},{"../data/priority-queue":15,"../graph":16}],13:[function(require,module,exports){module.exports=tarjan;function tarjan(g){var index=0;var stack=[];var visited={};// node id -> { onStack, lowlink, index } -var results=[];function dfs(v){var entry=visited[v]={onStack:true,lowlink:index,index:index++};stack.push(v);g.successors(v).forEach(function(w){if(!visited.hasOwnProperty(w)){dfs(w);entry.lowlink=Math.min(entry.lowlink,visited[w].lowlink)}else if(visited[w].onStack){entry.lowlink=Math.min(entry.lowlink,visited[w].index)}});if(entry.lowlink===entry.index){var cmpt=[];var w;do{w=stack.pop();visited[w].onStack=false;cmpt.push(w)}while(v!==w);results.push(cmpt)}}g.nodes().forEach(function(v){if(!visited.hasOwnProperty(v)){dfs(v)}});return results}},{}],14:[function(require,module,exports){function topsort(g){var visited={};var stack={};var results=[];function visit(node){if(stack.hasOwnProperty(node)){throw new CycleException}if(!visited.hasOwnProperty(node)){stack[node]=true;visited[node]=true;g.predecessors(node).forEach(visit);delete stack[node];results.push(node)}}g.sinks().forEach(visit);if(Object.keys(visited).length!==g.nodeCount()){throw new CycleException}return results}class CycleException extends Error{constructor(){super(...arguments)}}module.exports=topsort;topsort.CycleException=CycleException},{}],15:[function(require,module,exports){ +pq.decrease(g.nodes()[0],0);var init=false;while(pq.size()>0){v=pq.removeMin();if(Object.hasOwn(parents,v)){result.setEdge(v,parents[v])}else if(init){throw new Error("Input graph is not connected: "+g)}else{init=true}g.nodeEdges(v).forEach(updateNeighbors)}return result}},{"../data/priority-queue":15,"../graph":16}],13:[function(require,module,exports){module.exports=tarjan;function tarjan(g){var index=0;var stack=[];var visited={};// node id -> { onStack, lowlink, index } +var results=[];function dfs(v){var entry=visited[v]={onStack:true,lowlink:index,index:index++};stack.push(v);g.successors(v).forEach(function(w){if(!Object.hasOwn(visited,w)){dfs(w);entry.lowlink=Math.min(entry.lowlink,visited[w].lowlink)}else if(visited[w].onStack){entry.lowlink=Math.min(entry.lowlink,visited[w].index)}});if(entry.lowlink===entry.index){var cmpt=[];var w;do{w=stack.pop();visited[w].onStack=false;cmpt.push(w)}while(v!==w);results.push(cmpt)}}g.nodes().forEach(function(v){if(!Object.hasOwn(visited,v)){dfs(v)}});return results}},{}],14:[function(require,module,exports){function topsort(g){var visited={};var stack={};var results=[];function visit(node){if(Object.hasOwn(stack,node)){throw new CycleException}if(!Object.hasOwn(visited,node)){stack[node]=true;visited[node]=true;g.predecessors(node).forEach(visit);delete stack[node];results.push(node)}}g.sinks().forEach(visit);if(Object.keys(visited).length!==g.nodeCount()){throw new CycleException}return results}class CycleException extends Error{constructor(){super(...arguments)}}module.exports=topsort;topsort.CycleException=CycleException},{}],15:[function(require,module,exports){ /** * A min-priority queue data structure. This algorithm is derived from Cormen, * et al., "Introduction to Algorithms". The basic idea of a min-priority @@ -56,7 +56,7 @@ class PriorityQueue{_arr=[];_keyIndices={}; */keys(){return this._arr.map(function(x){return x.key})} /** * Returns `true` if **key** is in the queue and `false` if not. - */has(key){return this._keyIndices.hasOwnProperty(key)} + */has(key){return Object.hasOwn(this._keyIndices,key)} /** * Returns the priority for **key**. If **key** is not present in the queue * then this function returns `undefined`. Takes `O(1)` time. @@ -74,7 +74,7 @@ class PriorityQueue{_arr=[];_keyIndices={}; * * @param {Object} key the key to add * @param {Number} priority the initial priority for the key - */add(key,priority){var keyIndices=this._keyIndices;key=String(key);if(!keyIndices.hasOwnProperty(key)){var arr=this._arr;var index=arr.length;keyIndices[key]=index;arr.push({key:key,priority:priority});this._decrease(index);return true}return false} + */add(key,priority){var keyIndices=this._keyIndices;key=String(key);if(!Object.hasOwn(keyIndices,key)){var arr=this._arr;var index=arr.length;keyIndices[key]=index;arr.push({key:key,priority:priority});this._decrease(index);return true}return false} /** * Removes and returns the smallest key in the queue. Takes `O(log n)` time. */removeMin(){this._swap(0,this._arr.length-1);var min=this._arr.pop();delete this._keyIndices[min.key];this._heapify(0);return min.key} @@ -116,7 +116,7 @@ _edgeObjs={}; // e -> label _edgeLabels={}; /* Number of nodes in the graph. Should only be changed by the implementation. */_nodeCount=0; -/* Number of edges in the graph. Should only be changed by the implementation. */_edgeCount=0;_parent;_children;constructor(opts){if(opts){this._isDirected=opts.hasOwnProperty("directed")?opts.directed:true;this._isMultigraph=opts.hasOwnProperty("multigraph")?opts.multigraph:false;this._isCompound=opts.hasOwnProperty("compound")?opts.compound:false}if(this._isCompound){ +/* Number of edges in the graph. Should only be changed by the implementation. */_edgeCount=0;_parent;_children;constructor(opts){if(opts){this._isDirected=Object.hasOwn(opts,"directed")?opts.directed:true;this._isMultigraph=Object.hasOwn(opts,"multigraph")?opts.multigraph:false;this._isCompound=Object.hasOwn(opts,"compound")?opts.compound:false}if(this._isCompound){ // v -> parent this._parent={}; // v -> children @@ -171,20 +171,20 @@ this._children={};this._children[GRAPH_NODE]={}}} * it is set as the value for the node. If label is not supplied and the node was * created by this call then the default node label will be assigned. * Complexity: O(1). - */setNode(v,value){if(this._nodes.hasOwnProperty(v)){if(arguments.length>1){this._nodes[v]=value}return this}this._nodes[v]=arguments.length>1?value:this._defaultNodeLabelFn(v);if(this._isCompound){this._parent[v]=GRAPH_NODE;this._children[v]={};this._children[GRAPH_NODE][v]=true}this._in[v]={};this._preds[v]={};this._out[v]={};this._sucs[v]={};++this._nodeCount;return this} + */setNode(v,value){if(Object.hasOwn(this._nodes,v)){if(arguments.length>1){this._nodes[v]=value}return this}this._nodes[v]=arguments.length>1?value:this._defaultNodeLabelFn(v);if(this._isCompound){this._parent[v]=GRAPH_NODE;this._children[v]={};this._children[GRAPH_NODE][v]=true}this._in[v]={};this._preds[v]={};this._out[v]={};this._sucs[v]={};++this._nodeCount;return this} /** * Gets the label of node with specified name. * Complexity: O(|V|). */node(v){return this._nodes[v]} /** * Detects whether graph has a node with specified name or not. - */hasNode(v){return this._nodes.hasOwnProperty(v)} + */hasNode(v){return Object.hasOwn(this._nodes,v)} /** * Remove the node with the name from the graph or do nothing if the node is not in * the graph. If the node was removed this function also removes any incident * edges. * Complexity: O(1). - */removeNode(v){var self=this;if(this._nodes.hasOwnProperty(v)){var removeEdge=e=>self.removeEdge(self._edgeObjs[e]);delete this._nodes[v];if(this._isCompound){this._removeFromParentsChildList(v);delete this._parent[v];this.children(v).forEach(function(child){self.setParent(child)});delete this._children[v]}Object.keys(this._in[v]).forEach(removeEdge);delete this._in[v];delete this._preds[v];Object.keys(this._out[v]).forEach(removeEdge);delete this._out[v];delete this._sucs[v];--this._nodeCount}return this} + */removeNode(v){var self=this;if(Object.hasOwn(this._nodes,v)){var removeEdge=e=>self.removeEdge(self._edgeObjs[e]);delete this._nodes[v];if(this._isCompound){this._removeFromParentsChildList(v);delete this._parent[v];this.children(v).forEach(function(child){self.setParent(child)});delete this._children[v]}Object.keys(this._in[v]).forEach(removeEdge);delete this._in[v];delete this._preds[v];Object.keys(this._out[v]).forEach(removeEdge);delete this._out[v];delete this._sucs[v];--this._nodeCount}return this} /** * Sets node p as a parent for node v if it is defined, or removes the * parent for v if p is undefined. Method throws an exception in case of @@ -249,7 +249,7 @@ parent+="";for(var ancestor=parent;ancestor!==undefined;ancestor=this.parent(anc * name. If label is supplied it is set as the value for the edge. If label is not * supplied and the edge was created by this call then the default edge label will * be assigned. The name parameter is only useful with multigraphs. - */setEdge(){var v,w,name,value;var valueSpecified=false;var arg0=arguments[0];if(typeof arg0==="object"&&arg0!==null&&"v"in arg0){v=arg0.v;w=arg0.w;name=arg0.name;if(arguments.length===2){value=arguments[1];valueSpecified=true}}else{v=arg0;w=arguments[1];name=arguments[3];if(arguments.length>2){value=arguments[2];valueSpecified=true}}v=""+v;w=""+w;if(name!==undefined){name=""+name}var e=edgeArgsToId(this._isDirected,v,w,name);if(this._edgeLabels.hasOwnProperty(e)){if(valueSpecified){this._edgeLabels[e]=value}return this}if(name!==undefined&&!this._isMultigraph){throw new Error("Cannot set a named edge when isMultigraph = false")} + */setEdge(){var v,w,name,value;var valueSpecified=false;var arg0=arguments[0];if(typeof arg0==="object"&&arg0!==null&&"v"in arg0){v=arg0.v;w=arg0.w;name=arg0.name;if(arguments.length===2){value=arguments[1];valueSpecified=true}}else{v=arg0;w=arguments[1];name=arguments[3];if(arguments.length>2){value=arguments[2];valueSpecified=true}}v=""+v;w=""+w;if(name!==undefined){name=""+name}var e=edgeArgsToId(this._isDirected,v,w,name);if(Object.hasOwn(this._edgeLabels,e)){if(valueSpecified){this._edgeLabels[e]=value}return this}if(name!==undefined&&!this._isMultigraph){throw new Error("Cannot set a named edge when isMultigraph = false")} // It didn't exist, so we need to create it. // First ensure the nodes exist. this.setNode(v);this.setNode(w);this._edgeLabels[e]=valueSpecified?value:this._defaultEdgeLabelFn(v,w,name);var edgeObj=edgeArgsToObj(this._isDirected,v,w,name); @@ -266,7 +266,7 @@ v=edgeObj.v;w=edgeObj.w;Object.freeze(edgeObj);this._edgeObjs[e]=edgeObj;increme /** * Detects whether the graph contains specified edge or not. No subgraphs are considered. * Complexity: O(1). - */hasEdge(v,w,name){var e=arguments.length===1?edgeObjToId(this._isDirected,arguments[0]):edgeArgsToId(this._isDirected,v,w,name);return this._edgeLabels.hasOwnProperty(e)} + */hasEdge(v,w,name){var e=arguments.length===1?edgeObjToId(this._isDirected,arguments[0]):edgeArgsToId(this._isDirected,v,w,name);return Object.hasOwn(this._edgeLabels,e)} /** * Removes the specified edge from the graph. No subgraphs are considered. * Complexity: O(1). @@ -301,4 +301,4 @@ module.exports={Graph:require("./graph"),version:require("./version")}},{"./grap * // ['a', 'b'] * g2.edges() * // [ { v: 'a', w: 'b' } ] - */function read(json){var g=new Graph(json.options).setGraph(json.value);json.nodes.forEach(function(entry){g.setNode(entry.v,entry.value);if(entry.parent){g.setParent(entry.v,entry.parent)}});json.edges.forEach(function(entry){g.setEdge({v:entry.v,w:entry.w,name:entry.name},entry.value)});return g}},{"./graph":16}],19:[function(require,module,exports){module.exports="2.2.3"},{}]},{},[1])(1)}); + */function read(json){var g=new Graph(json.options).setGraph(json.value);json.nodes.forEach(function(entry){g.setNode(entry.v,entry.value);if(entry.parent){g.setParent(entry.v,entry.parent)}});json.edges.forEach(function(entry){g.setEdge({v:entry.v,w:entry.w,name:entry.name},entry.value)});return g}},{"./graph":16}],19:[function(require,module,exports){module.exports="2.2.4"},{}]},{},[1])(1)}); From 8aecb697dffc19ab6419ebd91244fc99b34c9ab1 Mon Sep 17 00:00:00 2001 From: David Newell Date: Thu, 15 Aug 2024 13:07:14 +0200 Subject: [PATCH 81/85] Bump version and set as pre-release --- lib/version.js | 2 +- package.json | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/lib/version.js b/lib/version.js index 78e2ac8f..6aed4b32 100644 --- a/lib/version.js +++ b/lib/version.js @@ -1 +1 @@ -module.exports = '2.2.4'; +module.exports = '2.2.5-pre'; diff --git a/package.json b/package.json index 89d89c14..ce64fd78 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@dagrejs/graphlib", - "version": "2.2.4", + "version": "2.2.5-pre", "description": "A directed and undirected multi-graph library", "author": "Chris Pettitt ", "license": "MIT", @@ -47,4 +47,4 @@ "type": "git", "url": "https://github.com/dagrejs/graphlib.git" } -} +} \ No newline at end of file From fa804d1699b9fc2b79cfb721657498772593587a Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 20 Sep 2024 23:52:42 +0000 Subject: [PATCH 82/85] Bump body-parser from 1.20.2 to 1.20.3 Bumps [body-parser](https://github.com/expressjs/body-parser) from 1.20.2 to 1.20.3. - [Release notes](https://github.com/expressjs/body-parser/releases) - [Changelog](https://github.com/expressjs/body-parser/blob/master/HISTORY.md) - [Commits](https://github.com/expressjs/body-parser/compare/1.20.2...1.20.3) --- updated-dependencies: - dependency-name: body-parser dependency-type: indirect ... Signed-off-by: dependabot[bot] --- package-lock.json | 315 +++++++++++++++++++++++++++++++++++++++------- 1 file changed, 271 insertions(+), 44 deletions(-) diff --git a/package-lock.json b/package-lock.json index a02d9048..b49a349e 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "@dagrejs/graphlib", - "version": "2.2.4", + "version": "2.2.5-pre", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "@dagrejs/graphlib", - "version": "2.2.4", + "version": "2.2.5-pre", "license": "MIT", "devDependencies": { "benchmark": "2.1.4", @@ -905,9 +905,10 @@ "license": "MIT" }, "node_modules/body-parser": { - "version": "1.20.2", + "version": "1.20.3", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.3.tgz", + "integrity": "sha512-7rAxByjUMqQ3/bHJy7D6OGXvx/MMc4IqBn/X0fcM1QUcAItpZrBEYhWGem+tzXH90c+G01ypMcYJBO9Y30203g==", "dev": true, - "license": "MIT", "dependencies": { "bytes": "3.1.2", "content-type": "~1.0.5", @@ -917,7 +918,7 @@ "http-errors": "2.0.0", "iconv-lite": "0.4.24", "on-finished": "2.4.1", - "qs": "6.11.0", + "qs": "6.13.0", "raw-body": "2.5.2", "type-is": "~1.6.18", "unpipe": "1.0.0" @@ -1249,12 +1250,19 @@ } }, "node_modules/call-bind": { - "version": "1.0.2", + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.7.tgz", + "integrity": "sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==", "dev": true, - "license": "MIT", "dependencies": { - "function-bind": "^1.1.1", - "get-intrinsic": "^1.0.2" + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.4", + "set-function-length": "^1.2.1" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -1688,6 +1696,23 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/define-data-property": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", + "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", + "dev": true, + "dependencies": { + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "gopd": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/defined": { "version": "1.0.0", "dev": true, @@ -1943,6 +1968,27 @@ "dev": true, "license": "BSD-like" }, + "node_modules/es-define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.0.tgz", + "integrity": "sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==", + "dev": true, + "dependencies": { + "get-intrinsic": "^1.2.4" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-errors": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "dev": true, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/es6-error": { "version": "4.1.1", "dev": true, @@ -2555,9 +2601,13 @@ } }, "node_modules/function-bind": { - "version": "1.1.1", + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", "dev": true, - "license": "MIT" + "funding": { + "url": "https://github.com/sponsors/ljharb" + } }, "node_modules/gensync": { "version": "1.0.0-beta.2", @@ -2589,13 +2639,19 @@ } }, "node_modules/get-intrinsic": { - "version": "1.2.0", + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.4.tgz", + "integrity": "sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==", "dev": true, - "license": "MIT", "dependencies": { - "function-bind": "^1.1.1", - "has": "^1.0.3", - "has-symbols": "^1.0.3" + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3", + "hasown": "^2.0.0" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -2653,6 +2709,18 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/gopd": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", + "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", + "dev": true, + "dependencies": { + "get-intrinsic": "^1.1.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/graceful-fs": { "version": "4.2.10", "dev": true, @@ -2702,10 +2770,35 @@ "node": ">=4" } }, + "node_modules/has-property-descriptors": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", + "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", + "dev": true, + "dependencies": { + "es-define-property": "^1.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-proto": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.3.tgz", + "integrity": "sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/has-symbols": { "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", "dev": true, - "license": "MIT", "engines": { "node": ">= 0.4" }, @@ -2757,6 +2850,18 @@ "node": ">=8" } }, + "node_modules/hasown": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "dev": true, + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/he": { "version": "1.2.0", "dev": true, @@ -4276,9 +4381,13 @@ } }, "node_modules/object-inspect": { - "version": "1.12.3", + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.2.tgz", + "integrity": "sha512-IRZSRuzJiynemAXPYtPe5BoI/RESNYR7TYm50MC5Mqbd3Jmw5y790sErYw3V6SryFJD64b74qQQs9wn5Bg/k3g==", "dev": true, - "license": "MIT", + "engines": { + "node": ">= 0.4" + }, "funding": { "url": "https://github.com/sponsors/ljharb" } @@ -4620,11 +4729,12 @@ } }, "node_modules/qs": { - "version": "6.11.0", + "version": "6.13.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.13.0.tgz", + "integrity": "sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg==", "dev": true, - "license": "BSD-3-Clause", "dependencies": { - "side-channel": "^1.0.4" + "side-channel": "^1.0.6" }, "engines": { "node": ">=0.6" @@ -4955,6 +5065,23 @@ "dev": true, "license": "ISC" }, + "node_modules/set-function-length": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", + "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==", + "dev": true, + "dependencies": { + "define-data-property": "^1.1.4", + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.4", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/setprototypeof": { "version": "1.2.0", "dev": true, @@ -5009,13 +5136,18 @@ } }, "node_modules/side-channel": { - "version": "1.0.4", + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.6.tgz", + "integrity": "sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==", "dev": true, - "license": "MIT", "dependencies": { - "call-bind": "^1.0.0", - "get-intrinsic": "^1.0.2", - "object-inspect": "^1.9.0" + "call-bind": "^1.0.7", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.4", + "object-inspect": "^1.13.1" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -6420,7 +6552,9 @@ "dev": true }, "body-parser": { - "version": "1.20.2", + "version": "1.20.3", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.3.tgz", + "integrity": "sha512-7rAxByjUMqQ3/bHJy7D6OGXvx/MMc4IqBn/X0fcM1QUcAItpZrBEYhWGem+tzXH90c+G01ypMcYJBO9Y30203g==", "dev": true, "requires": { "bytes": "3.1.2", @@ -6431,7 +6565,7 @@ "http-errors": "2.0.0", "iconv-lite": "0.4.24", "on-finished": "2.4.1", - "qs": "6.11.0", + "qs": "6.13.0", "raw-body": "2.5.2", "type-is": "~1.6.18", "unpipe": "1.0.0" @@ -6702,11 +6836,16 @@ } }, "call-bind": { - "version": "1.0.2", + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.7.tgz", + "integrity": "sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==", "dev": true, "requires": { - "function-bind": "^1.1.1", - "get-intrinsic": "^1.0.2" + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.4", + "set-function-length": "^1.2.1" } }, "callsites": { @@ -7008,6 +7147,17 @@ "strip-bom": "^4.0.0" } }, + "define-data-property": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", + "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", + "dev": true, + "requires": { + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "gopd": "^1.0.1" + } + }, "defined": { "version": "1.0.0", "dev": true @@ -7195,6 +7345,21 @@ "version": "1.0.0", "dev": true }, + "es-define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.0.tgz", + "integrity": "sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==", + "dev": true, + "requires": { + "get-intrinsic": "^1.2.4" + } + }, + "es-errors": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "dev": true + }, "es6-error": { "version": "4.1.1", "dev": true @@ -7577,7 +7742,9 @@ "optional": true }, "function-bind": { - "version": "1.1.1", + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", "dev": true }, "gensync": { @@ -7597,12 +7764,16 @@ "dev": true }, "get-intrinsic": { - "version": "1.2.0", + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.4.tgz", + "integrity": "sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==", "dev": true, "requires": { - "function-bind": "^1.1.1", - "has": "^1.0.3", - "has-symbols": "^1.0.3" + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3", + "hasown": "^2.0.0" } }, "get-package-type": { @@ -7635,6 +7806,15 @@ "type-fest": "^0.20.2" } }, + "gopd": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", + "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", + "dev": true, + "requires": { + "get-intrinsic": "^1.1.3" + } + }, "graceful-fs": { "version": "4.2.10", "dev": true @@ -7669,8 +7849,25 @@ "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", "dev": true }, + "has-property-descriptors": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", + "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", + "dev": true, + "requires": { + "es-define-property": "^1.0.0" + } + }, + "has-proto": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.3.tgz", + "integrity": "sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==", + "dev": true + }, "has-symbols": { "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", "dev": true }, "hash-base": { @@ -7703,6 +7900,15 @@ } } }, + "hasown": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "dev": true, + "requires": { + "function-bind": "^1.1.2" + } + }, "he": { "version": "1.2.0", "dev": true @@ -8707,7 +8913,9 @@ "dev": true }, "object-inspect": { - "version": "1.12.3", + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.2.tgz", + "integrity": "sha512-IRZSRuzJiynemAXPYtPe5BoI/RESNYR7TYm50MC5Mqbd3Jmw5y790sErYw3V6SryFJD64b74qQQs9wn5Bg/k3g==", "dev": true }, "on-finished": { @@ -8930,10 +9138,12 @@ "dev": true }, "qs": { - "version": "6.11.0", + "version": "6.13.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.13.0.tgz", + "integrity": "sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg==", "dev": true, "requires": { - "side-channel": "^1.0.4" + "side-channel": "^1.0.6" } }, "querystring": { @@ -9138,6 +9348,20 @@ "version": "2.0.0", "dev": true }, + "set-function-length": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", + "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==", + "dev": true, + "requires": { + "define-data-property": "^1.1.4", + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.4", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.2" + } + }, "setprototypeof": { "version": "1.2.0", "dev": true @@ -9174,12 +9398,15 @@ "dev": true }, "side-channel": { - "version": "1.0.4", + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.6.tgz", + "integrity": "sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==", "dev": true, "requires": { - "call-bind": "^1.0.0", - "get-intrinsic": "^1.0.2", - "object-inspect": "^1.9.0" + "call-bind": "^1.0.7", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.4", + "object-inspect": "^1.13.1" } }, "signal-exit": { From 19b3edac37bb0d8779289623a14f629c202f710c Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 10 Oct 2024 13:07:13 +0000 Subject: [PATCH 83/85] Bump elliptic from 6.5.4 to 6.5.7 Bumps [elliptic](https://github.com/indutny/elliptic) from 6.5.4 to 6.5.7. - [Commits](https://github.com/indutny/elliptic/compare/v6.5.4...v6.5.7) --- updated-dependencies: - dependency-name: elliptic dependency-type: indirect ... Signed-off-by: dependabot[bot] --- package-lock.json | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/package-lock.json b/package-lock.json index b49a349e..067a6000 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1886,9 +1886,10 @@ "license": "ISC" }, "node_modules/elliptic": { - "version": "6.5.4", + "version": "6.5.7", + "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.7.tgz", + "integrity": "sha512-ESVCtTwiA+XhY3wyh24QqRGBoP3rEdDUl3EDUUo9tft074fi19IrdpH7hLCMMP3CIj7jb3W96rn8lt/BqIlt5Q==", "dev": true, - "license": "MIT", "dependencies": { "bn.js": "^4.11.9", "brorand": "^1.1.0", @@ -7288,7 +7289,9 @@ "dev": true }, "elliptic": { - "version": "6.5.4", + "version": "6.5.7", + "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.7.tgz", + "integrity": "sha512-ESVCtTwiA+XhY3wyh24QqRGBoP3rEdDUl3EDUUo9tft074fi19IrdpH7hLCMMP3CIj7jb3W96rn8lt/BqIlt5Q==", "dev": true, "requires": { "bn.js": "^4.11.9", From 01fb2c9789895683f3b5fd90ae6560c198c512af Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 10 Oct 2024 13:07:13 +0000 Subject: [PATCH 84/85] Bump cookie and socket.io Bumps [cookie](https://github.com/jshttp/cookie) and [socket.io](https://github.com/socketio/socket.io). These dependencies needed to be updated together. Updates `cookie` from 0.4.2 to 0.7.2 - [Release notes](https://github.com/jshttp/cookie/releases) - [Commits](https://github.com/jshttp/cookie/compare/v0.4.2...v0.7.2) Updates `socket.io` from 4.7.5 to 4.8.0 - [Release notes](https://github.com/socketio/socket.io/releases) - [Changelog](https://github.com/socketio/socket.io/blob/main/CHANGELOG.md) - [Commits](https://github.com/socketio/socket.io/compare/socket.io@4.7.5...socket.io@4.8.0) --- updated-dependencies: - dependency-name: cookie dependency-type: indirect - dependency-name: socket.io dependency-type: indirect ... Signed-off-by: dependabot[bot] --- package-lock.json | 84 +++++++++++++++++++++++------------------------ 1 file changed, 42 insertions(+), 42 deletions(-) diff --git a/package-lock.json b/package-lock.json index b49a349e..f403c8f5 100644 --- a/package-lock.json +++ b/package-lock.json @@ -658,12 +658,12 @@ } }, "node_modules/@types/node": { - "version": "20.14.10", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.14.10.tgz", - "integrity": "sha512-MdiXf+nDuMvY0gJKxyfZ7/6UFsETO7mGKF54MVD/ekJS6HdFtpZFBgrh6Pseu64XTb2MLyFPlbW6hj8HYRQNOQ==", + "version": "22.7.5", + "resolved": "https://registry.npmjs.org/@types/node/-/node-22.7.5.tgz", + "integrity": "sha512-jML7s2NAzMWc//QSJ1a3prpk78cOPchGvXJsC3C6R6PSMoooztvRVQEz89gmBTBY1SPMaqo5teB4uNHPdetShQ==", "dev": true, "dependencies": { - "undici-types": "~5.26.4" + "undici-types": "~6.19.2" } }, "node_modules/accepts": { @@ -1509,9 +1509,9 @@ "license": "MIT" }, "node_modules/cookie": { - "version": "0.4.2", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.2.tgz", - "integrity": "sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA==", + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.2.tgz", + "integrity": "sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==", "dev": true, "engines": { "node": ">= 0.6" @@ -1908,9 +1908,9 @@ } }, "node_modules/engine.io": { - "version": "6.5.5", - "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-6.5.5.tgz", - "integrity": "sha512-C5Pn8Wk+1vKBoHghJODM63yk8MvrO9EWZUfkAt5HAqIgPE4/8FF0PEGHXtEd40l223+cE5ABWuPzm38PHFXfMA==", + "version": "6.6.2", + "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-6.6.2.tgz", + "integrity": "sha512-gmNvsYi9C8iErnZdVcJnvCpSKbWTt1E8+JZo8b+daLninywUWi5NQ5STSHZ9rFjFO7imNcvb8Pc5pe/wMR5xEw==", "dev": true, "dependencies": { "@types/cookie": "^0.4.1", @@ -1918,7 +1918,7 @@ "@types/node": ">=10.0.0", "accepts": "~1.3.4", "base64id": "2.0.0", - "cookie": "~0.4.1", + "cookie": "~0.7.2", "cors": "~2.8.5", "debug": "~4.3.1", "engine.io-parser": "~5.2.1", @@ -1929,9 +1929,9 @@ } }, "node_modules/engine.io-parser": { - "version": "5.2.2", - "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-5.2.2.tgz", - "integrity": "sha512-RcyUFKA93/CXH20l4SoVvzZfrSDMOTUS3bWVpTt2FuFP+XYrL8i8oonHP7WInRyVHXh0n/ORtoeiE1os+8qkSw==", + "version": "5.2.3", + "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-5.2.3.tgz", + "integrity": "sha512-HqD3yTBfnBxIrbnM1DoD6Pcq8NECnh8d4As1Qgh0z5Gg3jRRIqijury0CL3ghu/edArpUYiYqQiDUQBIs4np3Q==", "dev": true, "engines": { "node": ">=10.0.0" @@ -5164,16 +5164,16 @@ "license": "MIT" }, "node_modules/socket.io": { - "version": "4.7.5", - "resolved": "https://registry.npmjs.org/socket.io/-/socket.io-4.7.5.tgz", - "integrity": "sha512-DmeAkF6cwM9jSfmp6Dr/5/mfMwb5Z5qRrSXLpo3Fq5SqyU8CMF15jIN4ZhfSwu35ksM1qmHZDQ/DK5XTccSTvA==", + "version": "4.8.0", + "resolved": "https://registry.npmjs.org/socket.io/-/socket.io-4.8.0.tgz", + "integrity": "sha512-8U6BEgGjQOfGz3HHTYaC/L1GaxDCJ/KM0XTkJly0EhZ5U/du9uNEZy4ZgYzEzIqlx2CMm25CrCqr1ck899eLNA==", "dev": true, "dependencies": { "accepts": "~1.3.4", "base64id": "~2.0.0", "cors": "~2.8.5", "debug": "~4.3.2", - "engine.io": "~6.5.2", + "engine.io": "~6.6.0", "socket.io-adapter": "~2.5.2", "socket.io-parser": "~4.2.4" }, @@ -5630,9 +5630,9 @@ } }, "node_modules/undici-types": { - "version": "5.26.5", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", - "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==", + "version": "6.19.8", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.19.8.tgz", + "integrity": "sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==", "dev": true }, "node_modules/universalify": { @@ -6383,12 +6383,12 @@ } }, "@types/node": { - "version": "20.14.10", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.14.10.tgz", - "integrity": "sha512-MdiXf+nDuMvY0gJKxyfZ7/6UFsETO7mGKF54MVD/ekJS6HdFtpZFBgrh6Pseu64XTb2MLyFPlbW6hj8HYRQNOQ==", + "version": "22.7.5", + "resolved": "https://registry.npmjs.org/@types/node/-/node-22.7.5.tgz", + "integrity": "sha512-jML7s2NAzMWc//QSJ1a3prpk78cOPchGvXJsC3C6R6PSMoooztvRVQEz89gmBTBY1SPMaqo5teB4uNHPdetShQ==", "dev": true, "requires": { - "undici-types": "~5.26.4" + "undici-types": "~6.19.2" } }, "accepts": { @@ -7017,9 +7017,9 @@ "dev": true }, "cookie": { - "version": "0.4.2", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.2.tgz", - "integrity": "sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA==", + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.2.tgz", + "integrity": "sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==", "dev": true }, "core-util-is": { @@ -7305,9 +7305,9 @@ "dev": true }, "engine.io": { - "version": "6.5.5", - "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-6.5.5.tgz", - "integrity": "sha512-C5Pn8Wk+1vKBoHghJODM63yk8MvrO9EWZUfkAt5HAqIgPE4/8FF0PEGHXtEd40l223+cE5ABWuPzm38PHFXfMA==", + "version": "6.6.2", + "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-6.6.2.tgz", + "integrity": "sha512-gmNvsYi9C8iErnZdVcJnvCpSKbWTt1E8+JZo8b+daLninywUWi5NQ5STSHZ9rFjFO7imNcvb8Pc5pe/wMR5xEw==", "dev": true, "requires": { "@types/cookie": "^0.4.1", @@ -7315,7 +7315,7 @@ "@types/node": ">=10.0.0", "accepts": "~1.3.4", "base64id": "2.0.0", - "cookie": "~0.4.1", + "cookie": "~0.7.2", "cors": "~2.8.5", "debug": "~4.3.1", "engine.io-parser": "~5.2.1", @@ -7332,9 +7332,9 @@ } }, "engine.io-parser": { - "version": "5.2.2", - "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-5.2.2.tgz", - "integrity": "sha512-RcyUFKA93/CXH20l4SoVvzZfrSDMOTUS3bWVpTt2FuFP+XYrL8i8oonHP7WInRyVHXh0n/ORtoeiE1os+8qkSw==", + "version": "5.2.3", + "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-5.2.3.tgz", + "integrity": "sha512-HqD3yTBfnBxIrbnM1DoD6Pcq8NECnh8d4As1Qgh0z5Gg3jRRIqijury0CL3ghu/edArpUYiYqQiDUQBIs4np3Q==", "dev": true }, "ent": { @@ -9418,16 +9418,16 @@ "dev": true }, "socket.io": { - "version": "4.7.5", - "resolved": "https://registry.npmjs.org/socket.io/-/socket.io-4.7.5.tgz", - "integrity": "sha512-DmeAkF6cwM9jSfmp6Dr/5/mfMwb5Z5qRrSXLpo3Fq5SqyU8CMF15jIN4ZhfSwu35ksM1qmHZDQ/DK5XTccSTvA==", + "version": "4.8.0", + "resolved": "https://registry.npmjs.org/socket.io/-/socket.io-4.8.0.tgz", + "integrity": "sha512-8U6BEgGjQOfGz3HHTYaC/L1GaxDCJ/KM0XTkJly0EhZ5U/du9uNEZy4ZgYzEzIqlx2CMm25CrCqr1ck899eLNA==", "dev": true, "requires": { "accepts": "~1.3.4", "base64id": "~2.0.0", "cors": "~2.8.5", "debug": "~4.3.2", - "engine.io": "~6.5.2", + "engine.io": "~6.6.0", "socket.io-adapter": "~2.5.2", "socket.io-parser": "~4.2.4" } @@ -9735,9 +9735,9 @@ } }, "undici-types": { - "version": "5.26.5", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", - "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==", + "version": "6.19.8", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.19.8.tgz", + "integrity": "sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==", "dev": true }, "universalify": { From a059817479763a8329ab8aafbb3ec57eab55db47 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 31 Oct 2024 02:19:44 +0000 Subject: [PATCH 85/85] Bump elliptic from 6.5.7 to 6.6.0 Bumps [elliptic](https://github.com/indutny/elliptic) from 6.5.7 to 6.6.0. - [Commits](https://github.com/indutny/elliptic/compare/v6.5.7...v6.6.0) --- updated-dependencies: - dependency-name: elliptic dependency-type: indirect ... Signed-off-by: dependabot[bot] --- package-lock.json | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/package-lock.json b/package-lock.json index e62df10f..e13bb34b 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1886,9 +1886,9 @@ "license": "ISC" }, "node_modules/elliptic": { - "version": "6.5.7", - "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.7.tgz", - "integrity": "sha512-ESVCtTwiA+XhY3wyh24QqRGBoP3rEdDUl3EDUUo9tft074fi19IrdpH7hLCMMP3CIj7jb3W96rn8lt/BqIlt5Q==", + "version": "6.6.0", + "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.6.0.tgz", + "integrity": "sha512-dpwoQcLc/2WLQvJvLRHKZ+f9FgOdjnq11rurqwekGQygGPsYSK29OMMD2WalatiqQ+XGFDglTNixpPfI+lpaAA==", "dev": true, "dependencies": { "bn.js": "^4.11.9", @@ -7289,9 +7289,9 @@ "dev": true }, "elliptic": { - "version": "6.5.7", - "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.7.tgz", - "integrity": "sha512-ESVCtTwiA+XhY3wyh24QqRGBoP3rEdDUl3EDUUo9tft074fi19IrdpH7hLCMMP3CIj7jb3W96rn8lt/BqIlt5Q==", + "version": "6.6.0", + "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.6.0.tgz", + "integrity": "sha512-dpwoQcLc/2WLQvJvLRHKZ+f9FgOdjnq11rurqwekGQygGPsYSK29OMMD2WalatiqQ+XGFDglTNixpPfI+lpaAA==", "dev": true, "requires": { "bn.js": "^4.11.9",