UNPKG

epic-designer-gold

Version:

基于vue3的设计器,可视化开发页面表单

605 lines (603 loc) 21.2 kB
import { at as N, au as v, av as f, aw as b, ax as E } from "./mermaid.core-Bw3Z-klg.js"; import { a as j, c as P, k as _, f as g, d, i as l, v as p, r as w } from "./_baseUniq-D2_Vs4c5.js"; var D = N(function(o) { return j(P(o, 1, v, !0)); }), F = "\0", a = "\0", O = ""; class L { /** * @param {GraphOptions} [opts] - Graph options. */ constructor(e = {}) { this._isDirected = Object.prototype.hasOwnProperty.call(e, "directed") ? e.directed : !0, this._isMultigraph = Object.prototype.hasOwnProperty.call(e, "multigraph") ? e.multigraph : !1, this._isCompound = Object.prototype.hasOwnProperty.call(e, "compound") ? e.compound : !1, this._label = void 0, this._defaultNodeLabelFn = f(void 0), this._defaultEdgeLabelFn = f(void 0), this._nodes = {}, this._isCompound && (this._parent = {}, this._children = {}, this._children[a] = {}), this._in = {}, this._preds = {}, this._out = {}, this._sucs = {}, this._edgeObjs = {}, this._edgeLabels = {}; } /* === Graph functions ========= */ /** * * @returns {boolean} `true` if the graph is [directed](https://en.wikipedia.org/wiki/Directed_graph). * A directed graph treats the order of nodes in an edge as significant whereas an * [undirected](https://en.wikipedia.org/wiki/Graph_(mathematics)#Undirected_graph) * graph does not. * This example demonstrates the difference: * * @example * * ```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" * ``` */ isDirected() { return this._isDirected; } /** * @returns {boolean} `true` if the graph is a multigraph. */ isMultigraph() { return this._isMultigraph; } /** * @returns {boolean} `true` if the graph is compound. */ isCompound() { return this._isCompound; } /** * Sets the label for the graph to `label`. * * @param {GraphLabel} label - Label for the graph. * @returns {this} */ setGraph(e) { return this._label = e, this; } /** * @returns {GraphLabel | undefined} the currently assigned label for the graph. * If no label has been assigned, returns `undefined`. * * @example * * ```js * var g = new Graph(); * g.graph(); // returns undefined * g.setGraph("graph-label"); * g.graph(); // returns "graph-label" * ``` */ graph() { return this._label; } /* === Node functions ========== */ /** * Sets a new default value that is assigned to nodes that are created without * a label. * * @param {typeof this._defaultNodeLabelFn | NodeLabel} newDefault - If a function, * it is called with the id of the node being created. * Otherwise, it is assigned as the label directly. * @returns {this} */ setDefaultNodeLabel(e) { return b(e) || (e = f(e)), this._defaultNodeLabelFn = e, this; } /** * @returns {number} the number of nodes in the graph. */ nodeCount() { return this._nodeCount; } /** * @returns {NodeID[]} the ids of the nodes in the graph. * * @remarks * Use {@link node()} to get the label for each node. * Takes `O(|V|)` time. */ nodes() { return _(this._nodes); } /** * @returns {NodeID[]} those nodes in the graph that have no in-edges. * @remarks Takes `O(|V|)` time. */ sources() { var e = this; return g(this.nodes(), function(t) { return E(e._in[t]); }); } /** * @returns {NodeID[]} those nodes in the graph that have no out-edges. * @remarks Takes `O(|V|)` time. */ sinks() { var e = this; return g(this.nodes(), function(t) { return E(e._out[t]); }); } /** * Invokes setNode method for each node in `vs` list. * * @param {Collection<NodeID | number>} vs - List of node IDs to create/set. * @param {NodeLabel} [value] - If set, update all nodes with this value. * @returns {this} * @remarks Complexity: O(|names|). */ setNodes(e, t) { var s = arguments, i = this; return d(e, function(r) { s.length > 1 ? i.setNode(r, t) : i.setNode(r); }), this; } /** * Creates or updates the value for the node `v` in the graph. * * @param {NodeID | number} v - ID of the node to create/set. * @param {NodeLabel} [value] - If supplied, it is set as the value for the node. * If not supplied and the node was created by this call then * {@link setDefaultNodeLabel} will be used to set the node's value. * @returns {this} the graph, allowing this to be chained with other functions. * @remarks Takes `O(1)` time. */ setNode(e, t) { return Object.prototype.hasOwnProperty.call(this._nodes, e) ? (arguments.length > 1 && (this._nodes[e] = t), this) : (this._nodes[e] = arguments.length > 1 ? t : this._defaultNodeLabelFn(e), this._isCompound && (this._parent[e] = a, this._children[e] = {}, this._children[a][e] = !0), this._in[e] = {}, this._preds[e] = {}, this._out[e] = {}, this._sucs[e] = {}, ++this._nodeCount, this); } /** * Gets the label of node with specified name. * * @param {NodeID | number} v - Node ID. * @returns {NodeLabel | undefined} the label assigned to the node with the id `v` * if it is in the graph. * Otherwise returns `undefined`. * @remarks Takes `O(1)` time. */ node(e) { return this._nodes[e]; } /** * Detects whether graph has a node with specified name or not. * * @param {NodeID | number} v - Node ID. * @returns {boolean} Returns `true` the graph has a node with the id. * @remarks Takes `O(1)` time. */ hasNode(e) { return Object.prototype.hasOwnProperty.call(this._nodes, e); } /** * Remove the node with the id `v` in 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. * * @param {NodeID | number} v - Node ID to remove. * @returns {this} the graph, allowing this to be chained with other functions. * @remarks Takes `O(|E|)` time. */ removeNode(e) { if (Object.prototype.hasOwnProperty.call(this._nodes, e)) { var t = (s) => this.removeEdge(this._edgeObjs[s]); delete this._nodes[e], this._isCompound && (this._removeFromParentsChildList(e), delete this._parent[e], d(this.children(e), (s) => { this.setParent(s); }), delete this._children[e]), d(_(this._in[e]), t), delete this._in[e], delete this._preds[e], d(_(this._out[e]), t), delete this._out[e], delete this._sucs[e], --this._nodeCount; } return this; } /** * Sets the parent for `v` to `parent` if it is defined or removes the parent * for `v` if `parent` is undefined. * * @param {NodeID | number} v - Node ID to set the parent for. * @param {NodeID | number} [parent] - Parent node ID. If not defined, removes the parent. * @returns {this} the graph, allowing this to be chained with other functions. * @throws if the graph is not compound. * @throws if setting the parent would create a cycle. * @remarks Takes `O(1)` time. */ setParent(e, t) { if (!this._isCompound) throw new Error("Cannot set parent in a non-compound graph"); if (l(t)) t = a; else { t += ""; for (var s = t; !l(s); s = this.parent(s)) if (s === e) throw new Error("Setting " + t + " as parent of " + e + " would create a cycle"); this.setNode(t); } return this.setNode(e), this._removeFromParentsChildList(e), this._parent[e] = t, this._children[t][e] = !0, this; } /** * @private * @param {NodeID | number} v - Node ID. */ _removeFromParentsChildList(e) { delete this._children[this._parent[e]][e]; } /** * Get parent node for node `v`. * * @param {NodeID | number} v - Node ID. * @returns {NodeID | undefined} the node that is a parent of node `v` * or `undefined` if node `v` does not have a parent or is not a member of * the graph. * Always returns `undefined` for graphs that are not compound. * @remarks Takes `O(1)` time. */ parent(e) { if (this._isCompound) { var t = this._parent[e]; if (t !== a) return t; } } /** * Gets list of direct children of node v. * * @param {NodeID | number} [v] - Node ID. If not specified, gets nodes * with no parent (top-level nodes). * @returns {NodeID[] | undefined} all nodes that are children of node `v` or * `undefined` if node `v` is not in the graph. * Always returns `[]` for graphs that are not compound. * @remarks Takes `O(|V|)` time. */ children(e) { if (l(e) && (e = a), this._isCompound) { var t = this._children[e]; if (t) return _(t); } else { if (e === a) return this.nodes(); if (this.hasNode(e)) return []; } } /** * @param {NodeID | number} v - Node ID. * @returns {NodeID[] | undefined} all nodes that are predecessors of the * specified node or `undefined` if node `v` is not in the graph. * @remarks * Behavior is undefined for undirected graphs - use {@link neighbors} instead. * Takes `O(|V|)` time. */ predecessors(e) { var t = this._preds[e]; if (t) return _(t); } /** * @param {NodeID | number} v - Node ID. * @returns {NodeID[] | undefined} all nodes that are successors of the * specified node or `undefined` if node `v` is not in the graph. * @remarks * Behavior is undefined for undirected graphs - use {@link neighbors} instead. * Takes `O(|V|)` time. */ successors(e) { var t = this._sucs[e]; if (t) return _(t); } /** * @param {NodeID | number} v - Node ID. * @returns {NodeID[] | undefined} all nodes that are predecessors or * successors of the specified node * or `undefined` if node `v` is not in the graph. * @remarks Takes `O(|V|)` time. */ neighbors(e) { var t = this.predecessors(e); if (t) return D(t, this.successors(e)); } /** * @param {NodeID | number} v - Node ID. * @returns {boolean} True if the node is a leaf (has no successors), false otherwise. */ isLeaf(e) { var t; return this.isDirected() ? t = this.successors(e) : t = this.neighbors(e), t.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. * @param {(v: NodeID) => boolean} filter - Function that returns `true` for nodes to keep. * @returns {Graph<GraphLabel, NodeLabel, EdgeLabel>} A new graph containing only the nodes for which `filter` returns `true`. * @remarks Average-case complexity: O(|E|+|V|). */ filterNodes(e) { var t = new this.constructor({ directed: this._isDirected, multigraph: this._isMultigraph, compound: this._isCompound }); t.setGraph(this.graph()); var s = this; d(this._nodes, function(n, h) { e(h) && t.setNode(h, n); }), d(this._edgeObjs, function(n) { t.hasNode(n.v) && t.hasNode(n.w) && t.setEdge(n, s.edge(n)); }); var i = {}; function r(n) { var h = s.parent(n); return h === void 0 || t.hasNode(h) ? (i[n] = h, h) : h in i ? i[h] : r(h); } return this._isCompound && d(t.nodes(), function(n) { t.setParent(n, r(n)); }), t; } /* === Edge functions ========== */ /** * Sets a new default value that is assigned to edges that are created without * a label. * * @param {typeof this._defaultEdgeLabelFn | EdgeLabel} newDefault - If a function, * it is called with the parameters `(v, w, name)`. * Otherwise, it is assigned as the label directly. * @returns {this} */ setDefaultEdgeLabel(e) { return b(e) || (e = f(e)), this._defaultEdgeLabelFn = e, this; } /** * @returns {number} the number of edges in the graph. * @remarks Complexity: O(1). */ edgeCount() { return this._edgeCount; } /** * Gets edges of the graph. * * @returns {EdgeObj[]} the {@link EdgeObj} for each edge in the graph. * * @remarks * In case of compound graph subgraphs are not considered. * Use {@link edge()} to get the label for each edge. * Takes `O(|E|)` time. */ edges() { return p(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. * * @param {Collection<NodeID>} vs - List of node IDs to create edges between. * @param {EdgeLabel} [value] - If set, update all edges with this value. * @returns {this} * @remarks Complexity: O(|nodes|). */ setPath(e, t) { var s = this, i = arguments; return w(e, function(r, n) { return i.length > 1 ? s.setEdge(r, n, t) : s.setEdge(r, n), n; }), this; } /** * Creates or updates the label for the edge (`v`, `w`) with the optionally * supplied `name`. * * @overload * @param {EdgeObj} arg0 - Edge object. * @param {EdgeLabel} [value] - If supplied, it is set as the label for the edge. * If not supplied and the edge was created by this call then * {@link setDefaultEdgeLabel} will be used to assign the edge's label. * @returns {this} the graph, allowing this to be chained with other functions. * @remarks Takes `O(1)` time. */ /** * Creates or updates the label for the edge (`v`, `w`) with the optionally * supplied `name`. * * @overload * @param {NodeID | number} v - Source node ID. Number values will be coerced to strings. * @param {NodeID | number} w - Target node ID. Number values will be coerced to strings. * @param {EdgeLabel} [value] - If supplied, it is set as the label for the edge. * If not supplied and the edge was created by this call then * {@link setDefaultEdgeLabel} will be used to assign the edge's label. * @param {string | number} [name] - Edge name. Only useful with multigraphs. * @returns {this} the graph, allowing this to be chained with other functions. * @remarks Takes `O(1)` time. */ setEdge() { var e, t, s, i, r = !1, n = arguments[0]; typeof n == "object" && n !== null && "v" in n ? (e = n.v, t = n.w, s = n.name, arguments.length === 2 && (i = arguments[1], r = !0)) : (e = n, t = arguments[1], s = arguments[3], arguments.length > 2 && (i = arguments[2], r = !0)), e = "" + e, t = "" + t, l(s) || (s = "" + s); var h = c(this._isDirected, e, t, s); if (Object.prototype.hasOwnProperty.call(this._edgeLabels, h)) return r && (this._edgeLabels[h] = i), this; if (!l(s) && !this._isMultigraph) throw new Error("Cannot set a named edge when isMultigraph = false"); this.setNode(e), this.setNode(t), this._edgeLabels[h] = r ? i : this._defaultEdgeLabelFn(e, t, s); var u = M(this._isDirected, e, t, s); return e = u.v, t = u.w, Object.freeze(u), this._edgeObjs[h] = u, y(this._preds[t], e), y(this._sucs[e], t), this._in[t][h] = u, this._out[e][h] = u, this._edgeCount++, this; } /** * Gets the label for the specified edge. * * @overload * @param {EdgeObj} v - Edge object. * @returns {EdgeLabel | undefined} the label for the edge (`v`, `w`) if the * graph has an edge between `v` and `w` with the optional `name`. * Returned `undefined` if there is no such edge in the graph. * @remarks * `v` and `w` can be interchanged for undirected graphs. * Takes `O(1)` time. */ /** * Gets the label for the specified edge. * * @overload * @param {NodeID | number} v - Source node ID. * @param {NodeID | number} w - Target node ID. * @param {string | number} [name] - Edge name. Only useful with multigraphs. * @returns {EdgeLabel | undefined} the label for the edge (`v`, `w`) if the * graph has an edge between `v` and `w` with the optional `name`. * Returned `undefined` if there is no such edge in the graph. * @remarks * `v` and `w` can be interchanged for undirected graphs. * Takes `O(1)` time. */ edge(e, t, s) { var i = arguments.length === 1 ? m(this._isDirected, arguments[0]) : c(this._isDirected, e, t, s); return this._edgeLabels[i]; } /** * Detects whether the graph contains specified edge or not. * * @overload * @param {EdgeObj} v - Edge object. * @returns {boolean} `true` if the graph has an edge between `v` and `w` * with the optional `name`. * @remarks * `v` and `w` can be interchanged for undirected graphs. * No subgraphs are considered. * Takes `O(1)` time. */ /** * Detects whether the graph contains specified edge or not. * * @overload * @param {NodeID | number} v - Source node ID. * @param {NodeID | number} w - Target node ID. * @param {string | number} [name] - Edge name. Only useful with multigraphs. * @returns {boolean} `true` if the graph has an edge between `v` and `w` * with the optional `name`. * @remarks * `v` and `w` can be interchanged for undirected graphs. * No subgraphs are considered. * Takes `O(1)` time. */ hasEdge(e, t, s) { var i = arguments.length === 1 ? m(this._isDirected, arguments[0]) : c(this._isDirected, e, t, s); return Object.prototype.hasOwnProperty.call(this._edgeLabels, i); } /** * Removes the edge (`v`, `w`) if the graph has an edge between `v` and `w` * with the optional `name`. If not this function does nothing. * * @overload * @param {EdgeObj} v - Edge object. * @returns {this} * @remarks * `v` and `w` can be interchanged for undirected graphs. * No subgraphs are considered. * Takes `O(1)` time. */ /** * Removes the edge (`v`, `w`) if the graph has an edge between `v` and `w` * with the optional `name`. If not this function does nothing. * * @overload * @param {NodeID | number} v - Source node ID. * @param {NodeID | number} w - Target node ID. * @param {string | number} [name] - Edge name. Only useful with multigraphs. * @returns {this} * @remarks * `v` and `w` can be interchanged for undirected graphs. * Takes `O(1)` time. */ removeEdge(e, t, s) { var i = arguments.length === 1 ? m(this._isDirected, arguments[0]) : c(this._isDirected, e, t, s), r = this._edgeObjs[i]; return r && (e = r.v, t = r.w, delete this._edgeLabels[i], delete this._edgeObjs[i], C(this._preds[t], e), C(this._sucs[e], t), delete this._in[t][i], delete this._out[e][i], this._edgeCount--), this; } /** * @param {NodeID | number} v - Target node ID. * @param {NodeID | number} [u] - Optionally filters edges down to just those * coming from node `u`. * @returns {EdgeObj[] | undefined} all edges that point to the node `v`. * Returns `undefined` if node `v` is not in the graph. * @remarks * Behavior is undefined for undirected graphs - use {@link nodeEdges} instead. * Takes `O(|E|)` time. */ inEdges(e, t) { var s = this._in[e]; if (s) { var i = p(s); return t ? g(i, function(r) { return r.v === t; }) : i; } } /** * @param {NodeID | number} v - Target node ID. * @param {NodeID | number} [w] - Optionally filters edges down to just those * that point to `w`. * @returns {EdgeObj[] | undefined} all edges that point to the node `v`. * Returns `undefined` if node `v` is not in the graph. * @remarks * Behavior is undefined for undirected graphs - use {@link nodeEdges} instead. * Takes `O(|E|)` time. */ outEdges(e, t) { var s = this._out[e]; if (s) { var i = p(s); return t ? g(i, function(r) { return r.w === t; }) : i; } } /** * @param {NodeID | number} v - Target Node ID. * @param {NodeID | number} [w] - If set, filters those edges down to just * those between nodes `v` and `w` regardless of direction * @returns {EdgeObj[] | undefined} all edges to or from node `v` regardless * of direction. Returns `undefined` if node `v` is not in the graph. * @remarks Takes `O(|E|)` time. */ nodeEdges(e, t) { var s = this.inEdges(e, t); if (s) return s.concat(this.outEdges(e, t)); } } L.prototype._nodeCount = 0; L.prototype._edgeCount = 0; function y(o, e) { o[e] ? o[e]++ : o[e] = 1; } function C(o, e) { --o[e] || delete o[e]; } function c(o, e, t, s) { var i = "" + e, r = "" + t; if (!o && i > r) { var n = i; i = r, r = n; } return i + O + r + O + (l(s) ? F : s); } function M(o, e, t, s) { var i = "" + e, r = "" + t; if (!o && i > r) { var n = i; i = r, r = n; } var h = { v: i, w: r }; return s && (h.name = s), h; } function m(o, e) { return c(o, e.v, e.w, e.name); } export { L as G };