From 20294b0fb63638d56031fda4254e162c3b873184 Mon Sep 17 00:00:00 2001 From: Andrej Ocenas Date: Mon, 20 May 2024 13:50:08 +0200 Subject: [PATCH] NodeGraph: Remove msagl lib and layered layout option (#87905) * Remove msagl lib * Change drone.yml * update signature --- .drone.yml | 13 +- jest.config.js | 1 - package.json | 2 - .../panel/nodeGraph/createLayoutWorker.ts | 1 - .../plugins/panel/nodeGraph/layeredLayout.js | 227 --------------- .../panel/nodeGraph/layeredLayout.test.ts | 10 - .../plugins/panel/nodeGraph/layout.test.ts | 11 - public/app/plugins/panel/nodeGraph/layout.ts | 14 +- .../panel/nodeGraph/layoutLayered.worker.js | 8 - scripts/drone/steps/lib.star | 2 - scripts/webpack/webpack.common.js | 7 - yarn.lock | 270 +----------------- 12 files changed, 9 insertions(+), 557 deletions(-) delete mode 100644 public/app/plugins/panel/nodeGraph/layeredLayout.js delete mode 100644 public/app/plugins/panel/nodeGraph/layeredLayout.test.ts delete mode 100644 public/app/plugins/panel/nodeGraph/layoutLayered.worker.js diff --git a/.drone.yml b/.drone.yml index e9c078777e4..0ee476a8289 100644 --- a/.drone.yml +++ b/.drone.yml @@ -123,7 +123,6 @@ steps: image: alpine:3.19.1 name: identify-runner - commands: - - apk add --update g++ make python3 && ln -sf /usr/bin/python3 /usr/bin/python - yarn install --immutable || yarn install --immutable depends_on: [] image: node:20.9.0-alpine @@ -225,7 +224,6 @@ steps: image: alpine:3.19.1 name: identify-runner - commands: - - apk add --update g++ make python3 && ln -sf /usr/bin/python3 /usr/bin/python - yarn install --immutable || yarn install --immutable depends_on: [] image: node:20.9.0-alpine @@ -539,7 +537,6 @@ steps: image: golang:1.22.3-alpine name: wire-install - commands: - - apk add --update g++ make python3 && ln -sf /usr/bin/python3 /usr/bin/python - yarn install --immutable || yarn install --immutable depends_on: [] image: node:20.9.0-alpine @@ -1113,7 +1110,6 @@ steps: image: alpine:3.19.1 name: identify-runner - commands: - - apk add --update g++ make python3 && ln -sf /usr/bin/python3 /usr/bin/python - yarn install --immutable || yarn install --immutable depends_on: [] image: node:20.9.0-alpine @@ -1471,7 +1467,6 @@ steps: image: alpine:3.19.1 name: identify-runner - commands: - - apk add --update g++ make python3 && ln -sf /usr/bin/python3 /usr/bin/python - yarn install --immutable || yarn install --immutable depends_on: [] image: node:20.9.0-alpine @@ -1548,7 +1543,6 @@ steps: image: alpine:3.19.1 name: identify-runner - commands: - - apk add --update g++ make python3 && ln -sf /usr/bin/python3 /usr/bin/python - yarn install --immutable || yarn install --immutable depends_on: [] image: node:20.9.0-alpine @@ -1607,7 +1601,6 @@ steps: image: alpine:3.19.1 name: identify-runner - commands: - - apk add --update g++ make python3 && ln -sf /usr/bin/python3 /usr/bin/python - yarn install --immutable || yarn install --immutable depends_on: [] image: node:20.9.0-alpine @@ -1869,7 +1862,6 @@ steps: image: golang:1.22.3-alpine name: wire-install - commands: - - apk add --update g++ make python3 && ln -sf /usr/bin/python3 /usr/bin/python - yarn install --immutable || yarn install --immutable depends_on: [] image: node:20.9.0-alpine @@ -2849,7 +2841,6 @@ steps: image: golang:1.22.3-alpine name: compile-build-cmd - commands: - - apk add --update g++ make python3 && ln -sf /usr/bin/python3 /usr/bin/python - yarn install --immutable || yarn install --immutable depends_on: [] image: node:20.9.0-alpine @@ -3123,7 +3114,6 @@ steps: image: alpine:3.19.1 name: identify-runner - commands: - - apk add --update g++ make python3 && ln -sf /usr/bin/python3 /usr/bin/python - yarn install --immutable || yarn install --immutable depends_on: [] image: node:20.9.0-alpine @@ -3548,7 +3538,6 @@ steps: image: alpine:3.19.1 name: identify-runner - commands: - - apk add --update g++ make python3 && ln -sf /usr/bin/python3 /usr/bin/python - yarn install --immutable || yarn install --immutable depends_on: [] image: node:20.9.0-alpine @@ -4922,6 +4911,6 @@ kind: secret name: gcr_credentials --- kind: signature -hmac: 29140f7ab2d57bd4c05b27863ab1227c722f793d9e1373e470c3e6b5681e7fb8 +hmac: dcf93e3d0b79e729704bfbcc269fe53f9a11117dd7b597a707622a0303197d78 ... diff --git a/jest.config.js b/jest.config.js index 4ed043f73de..015d1396134 100644 --- a/jest.config.js +++ b/jest.config.js @@ -18,7 +18,6 @@ const esModules = [ '@kusto/monaco-kusto', 'monaco-editor', 'lodash-es', - '@msagl', 'vscode-languageserver-types', ].join('|'); diff --git a/package.json b/package.json index 7939d24774d..9f4e4ec8bed 100644 --- a/package.json +++ b/package.json @@ -270,8 +270,6 @@ "@locker/near-membrane-dom": "0.13.6", "@locker/near-membrane-shared": "0.13.6", "@locker/near-membrane-shared-dom": "0.13.6", - "@msagl/core": "^1.1.16", - "@msagl/parser": "^1.1.16", "@opentelemetry/api": "1.8.0", "@opentelemetry/exporter-collector": "0.25.0", "@opentelemetry/semantic-conventions": "1.24.1", diff --git a/public/app/plugins/panel/nodeGraph/createLayoutWorker.ts b/public/app/plugins/panel/nodeGraph/createLayoutWorker.ts index d0fef044dac..1aa1f1e9083 100644 --- a/public/app/plugins/panel/nodeGraph/createLayoutWorker.ts +++ b/public/app/plugins/panel/nodeGraph/createLayoutWorker.ts @@ -1,4 +1,3 @@ import { CorsWorker as Worker } from 'app/core/utils/CorsWorker'; export const createWorker = () => new Worker(new URL('./layout.worker.js', import.meta.url)); -export const createMsaglWorker = () => new Worker(new URL('./layoutLayered.worker.js', import.meta.url)); diff --git a/public/app/plugins/panel/nodeGraph/layeredLayout.js b/public/app/plugins/panel/nodeGraph/layeredLayout.js deleted file mode 100644 index 2a3b411bab3..00000000000 --- a/public/app/plugins/panel/nodeGraph/layeredLayout.js +++ /dev/null @@ -1,227 +0,0 @@ -import { - GeomGraph, - GeomEdge, - GeomNode, - Point, - CurveFactory, - SugiyamaLayoutSettings, - LayerDirectionEnum, - layoutGeomGraph, -} from '@msagl/core'; -import { parseDot } from '@msagl/parser'; - -/** - * Use d3 force layout to lay the nodes in a sensible way. This function modifies the nodes adding the x,y positions - * and also fills in node references in edges instead of node ids. - */ -export function layout(nodes, edges) { - const { mappedEdges, DOTToIdMap } = createMappings(nodes, edges); - - const dot = graphToDOT(mappedEdges, DOTToIdMap); - const graph = parseDot(dot); - const geomGraph = new GeomGraph(graph); - for (const e of graph.deepEdges) { - new GeomEdge(e); - } - - for (const n of graph.nodesBreadthFirst) { - const gn = new GeomNode(n); - gn.boundaryCurve = CurveFactory.mkCircle(50, new Point(0, 0)); - } - geomGraph.layoutSettings = new SugiyamaLayoutSettings(); - geomGraph.layoutSettings.layerDirection = LayerDirectionEnum.LR; - geomGraph.layoutSettings.LayerSeparation = 60; - geomGraph.layoutSettings.commonSettings.NodeSeparation = 40; - layoutGeomGraph(geomGraph); - - const nodesMap = {}; - for (const node of geomGraph.nodesBreadthFirst) { - nodesMap[DOTToIdMap[node.id]] = { - obj: node, - }; - } - - for (const node of nodes) { - nodesMap[node.id] = { - ...nodesMap[node.id], - datum: { - ...node, - x: nodesMap[node.id].obj.center.x, - y: nodesMap[node.id].obj.center.y, - }, - }; - } - const edgesMapped = edges.map((e) => { - return { - ...e, - source: nodesMap[e.source].datum, - target: nodesMap[e.target].datum, - }; - }); - - // This section checks if there are separate disjointed subgraphs. If so it groups nodes for each and then aligns - // each subgraph, so it starts on a single vertical line. Otherwise, they are laid out randomly from left to right. - const subgraphs = []; - for (const e of edgesMapped) { - const sourceGraph = subgraphs.find((g) => g.nodes.has(e.source)); - const targetGraph = subgraphs.find((g) => g.nodes.has(e.target)); - if (sourceGraph && targetGraph) { - // if the node sets are not the same we merge them - if (sourceGraph !== targetGraph) { - targetGraph.nodes.forEach(sourceGraph.nodes.add, sourceGraph.nodes); - subgraphs.splice(subgraphs.indexOf(targetGraph), 1); - sourceGraph.top = Math.min(sourceGraph.top, targetGraph.top); - sourceGraph.bottom = Math.max(sourceGraph.bottom, targetGraph.bottom); - sourceGraph.left = Math.min(sourceGraph.left, targetGraph.left); - sourceGraph.right = Math.max(sourceGraph.right, targetGraph.right); - } - // if the sets are the same nothing to do. - } else if (sourceGraph) { - sourceGraph.nodes.add(e.target); - sourceGraph.top = Math.min(sourceGraph.top, e.target.y); - sourceGraph.bottom = Math.max(sourceGraph.bottom, e.target.y); - sourceGraph.left = Math.min(sourceGraph.left, e.target.x); - sourceGraph.right = Math.max(sourceGraph.right, e.target.x); - } else if (targetGraph) { - targetGraph.nodes.add(e.source); - targetGraph.top = Math.min(targetGraph.top, e.source.y); - targetGraph.bottom = Math.max(targetGraph.bottom, e.source.y); - targetGraph.left = Math.min(targetGraph.left, e.source.x); - targetGraph.right = Math.max(targetGraph.right, e.source.x); - } else { - // we don't have these nodes - subgraphs.push({ - top: Math.min(e.source.y, e.target.y), - bottom: Math.max(e.source.y, e.target.y), - left: Math.min(e.source.x, e.target.x), - right: Math.max(e.source.x, e.target.x), - nodes: new Set([e.source, e.target]), - }); - } - } - - let top = 0; - let left = 0; - for (const g of subgraphs) { - if (top === 0) { - top = g.bottom + 200; - left = g.left; - } else { - const topDiff = top - g.top; - const leftDiff = left - g.left; - for (const n of g.nodes) { - n.x += leftDiff; - n.y += topDiff; - } - top += g.bottom - g.top + 200; - } - } - - const finalNodes = Object.values(nodesMap).map((v) => v.datum); - - centerNodes(finalNodes); - return [finalNodes, edgesMapped]; -} - -// We create mapping because the DOT language we use later to create the graph doesn't support arbitrary IDs. So we -// map our IDs to just an index of the node so the IDs are safe for the DOT parser and also create and inverse mapping -// for quick lookup. -function createMappings(nodes, edges) { - // Edges where the source and target IDs are the indexes we use for layout - const mappedEdges = []; - - // Key is an ID of the node and value is new ID which is just iteration index - const idToDOTMap = {}; - - // Key is an iteration index and value is actual ID of the node - const DOTToIdMap = {}; - - let index = 0; - for (const node of nodes) { - idToDOTMap[node.id] = index.toString(10); - DOTToIdMap[index.toString(10)] = node.id; - index++; - } - - for (const edge of edges) { - mappedEdges.push({ source: idToDOTMap[edge.source], target: idToDOTMap[edge.target] }); - } - - return { - mappedEdges, - DOTToIdMap, - idToDOTMap, - }; -} - -function graphToDOT(edges, nodeIDsMap) { - let dot = ` - digraph G { - rankdir="LR"; TBbalance="min" - `; - for (const edge of edges) { - dot += edge.source + '->' + edge.target + ' ' + '[ minlen=3 ]\n'; - } - dot += nodesDOT(nodeIDsMap); - dot += '}'; - return dot; -} - -function nodesDOT(nodeIdsMap) { - let dot = ''; - for (const node of Object.keys(nodeIdsMap)) { - dot += node + ' [fixedsize=true, width=1.2, height=1.7] \n'; - } - return dot; -} - -/** - * Makes sure that the center of the graph based on its bound is in 0, 0 coordinates. - * Modifies the nodes directly. - */ -function centerNodes(nodes) { - const bounds = graphBounds(nodes); - for (let node of nodes) { - node.x = node.x - bounds.center.x; - node.y = node.y - bounds.center.y; - } -} - -/** - * Get bounds of the graph meaning the extent of the nodes in all directions. - */ -function graphBounds(nodes) { - if (nodes.length === 0) { - return { top: 0, right: 0, bottom: 0, left: 0, center: { x: 0, y: 0 } }; - } - - const bounds = nodes.reduce( - (acc, node) => { - if (node.x > acc.right) { - acc.right = node.x; - } - if (node.x < acc.left) { - acc.left = node.x; - } - if (node.y > acc.bottom) { - acc.bottom = node.y; - } - if (node.y < acc.top) { - acc.top = node.y; - } - return acc; - }, - { top: Infinity, right: -Infinity, bottom: -Infinity, left: Infinity } - ); - - const y = bounds.top + (bounds.bottom - bounds.top) / 2; - const x = bounds.left + (bounds.right - bounds.left) / 2; - - return { - ...bounds, - center: { - x, - y, - }, - }; -} diff --git a/public/app/plugins/panel/nodeGraph/layeredLayout.test.ts b/public/app/plugins/panel/nodeGraph/layeredLayout.test.ts deleted file mode 100644 index aec26b9b4eb..00000000000 --- a/public/app/plugins/panel/nodeGraph/layeredLayout.test.ts +++ /dev/null @@ -1,10 +0,0 @@ -import { layout } from './layeredLayout'; - -describe('layout', () => { - it('can render single node', () => { - const nodes = [{ id: 'A', incoming: 0 }]; - const edges: unknown[] = []; - const graph = layout(nodes, edges); - expect(graph).toEqual([[{ id: 'A', incoming: 0, x: 0, y: 0 }], []]); - }); -}); diff --git a/public/app/plugins/panel/nodeGraph/layout.test.ts b/public/app/plugins/panel/nodeGraph/layout.test.ts index 63965301e11..2d85434afba 100644 --- a/public/app/plugins/panel/nodeGraph/layout.test.ts +++ b/public/app/plugins/panel/nodeGraph/layout.test.ts @@ -27,17 +27,6 @@ jest.mock('./createLayoutWorker', () => { }; return worker; }, - createMsaglWorker: () => { - onmessage = jest.fn(); - postMessage = jest.fn(); - terminate = jest.fn(); - worker = { - onmessage: onmessage, - postMessage: postMessage, - terminate: terminate, - }; - return worker; - }, }; }); diff --git a/public/app/plugins/panel/nodeGraph/layout.ts b/public/app/plugins/panel/nodeGraph/layout.ts index b3fd26d4c93..97ccead786d 100644 --- a/public/app/plugins/panel/nodeGraph/layout.ts +++ b/public/app/plugins/panel/nodeGraph/layout.ts @@ -4,9 +4,8 @@ import { useUnmount } from 'react-use'; import useMountedState from 'react-use/lib/useMountedState'; import { Field } from '@grafana/data'; -import { config as grafanaConfig } from '@grafana/runtime'; -import { createWorker, createMsaglWorker } from './createLayoutWorker'; +import { createWorker } from './createLayoutWorker'; import { EdgeDatum, EdgeDatumLayout, NodeDatum } from './types'; import { useNodeLimit } from './useNodeLimit'; import { graphBounds } from './utils'; @@ -85,14 +84,10 @@ export function useLayout( return; } - // Layered layout is better but also more expensive, so we switch to default force based layout for bigger graphs. - const layoutType = - grafanaConfig.featureToggles.nodeGraphDotLayout && rawNodes.length <= 500 ? 'layered' : 'default'; - setLoading(true); // This is async but as I wanted to still run the sync grid layout, and you cannot return promise from effect so // having callback seems ok here. - const cancel = layout(rawNodes, rawEdges, layoutType, ({ nodes, edges }) => { + const cancel = layout(rawNodes, rawEdges, ({ nodes, edges }) => { if (isMounted()) { setNodesGraph(nodes); setEdgesGraph(edges as EdgeDatumLayout[]); @@ -154,10 +149,11 @@ export function useLayout( function layout( nodes: NodeDatum[], edges: EdgeDatum[], - engine: 'default' | 'layered', done: (data: { nodes: NodeDatum[]; edges: EdgeDatum[] }) => void ) { - const worker = engine === 'default' ? createWorker() : createMsaglWorker(); + // const worker = engine === 'default' ? createWorker() : createMsaglWorker(); + // TODO: temp fix because of problem with msagl library https://github.com/grafana/grafana/issues/83318 + const worker = createWorker(); worker.onmessage = (event: MessageEvent<{ nodes: NodeDatum[]; edges: EdgeDatumLayout[] }>) => { const nodesMap = fromPairs(nodes.map((node) => [node.id, node])); diff --git a/public/app/plugins/panel/nodeGraph/layoutLayered.worker.js b/public/app/plugins/panel/nodeGraph/layoutLayered.worker.js deleted file mode 100644 index 7fa2caec2c9..00000000000 --- a/public/app/plugins/panel/nodeGraph/layoutLayered.worker.js +++ /dev/null @@ -1,8 +0,0 @@ -import { layout } from './layeredLayout'; - -// Separate from main implementation so it does not trip out tests -addEventListener('message', async (event) => { - const { nodes, edges, config } = event.data; - const [newNodes, newEdges] = layout(nodes, edges, config); - postMessage({ nodes: newNodes, edges: newEdges }); -}); diff --git a/scripts/drone/steps/lib.star b/scripts/drone/steps/lib.star index 0ab81fa57f0..a4093b5d52d 100644 --- a/scripts/drone/steps/lib.star +++ b/scripts/drone/steps/lib.star @@ -35,8 +35,6 @@ def yarn_install_step(): "name": "yarn-install", "image": images["node"], "commands": [ - # Python is needed to build `esfx`, which is needed by `msagl` - "apk add --update g++ make python3 && ln -sf /usr/bin/python3 /usr/bin/python", "yarn install --immutable || yarn install --immutable", ], "depends_on": [], diff --git a/scripts/webpack/webpack.common.js b/scripts/webpack/webpack.common.js index 599c4a1fb41..8f2fb765299 100644 --- a/scripts/webpack/webpack.common.js +++ b/scripts/webpack/webpack.common.js @@ -109,13 +109,6 @@ module.exports = { test: /(unicons|mono|custom)[\\/].*\.svg$/, type: 'asset/source', }, - { - // Required for msagl library (used in Nodegraph panel) to work - test: /\.m?js$/, - resolve: { - fullySpecified: false, - }, - }, ], }, // https://webpack.js.org/plugins/split-chunks-plugin/#split-chunks-example-3 diff --git a/yarn.lock b/yarn.lock index e7a9bb3151b..b4610bb6fc8 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2355,98 +2355,6 @@ __metadata: languageName: node linkType: hard -"@esfx/collection-core@npm:^1.0.0": - version: 1.0.0 - resolution: "@esfx/collection-core@npm:1.0.0" - checksum: 10/7e26d89953a201a6c965af18516e48ea0628ca2674c56c51368d61a3dc47b7d47b05984dc2392fecbbda4bb7134e735da0a01445818dd843a2b54e5b2010b4a2 - languageName: node - linkType: hard - -"@esfx/collections-hashmap@npm:^1.0.2": - version: 1.0.2 - resolution: "@esfx/collections-hashmap@npm:1.0.2" - dependencies: - "@esfx/collection-core": "npm:^1.0.0" - "@esfx/equatable": "npm:^1.0.2" - checksum: 10/caef6a231ad6bb9aee06cce1a5da4918c07868be9732c96cf268762d1e7cf06365409d59c2e4d47acd3ad81022a5e552f6c1b75660ecdb2eb68265b70f67749d - languageName: node - linkType: hard - -"@esfx/collections-hashset@npm:^1.0.2": - version: 1.0.2 - resolution: "@esfx/collections-hashset@npm:1.0.2" - dependencies: - "@esfx/collection-core": "npm:^1.0.0" - "@esfx/equatable": "npm:^1.0.2" - checksum: 10/75250e1682f42af85ff5e6b837e02faf27977515f52551857fcb28854025bc02d019801f062b92eef25b1781d1686453cb18726fa1468ed1c41eabe517860a4f - languageName: node - linkType: hard - -"@esfx/collections-linkedlist@npm:^1.0.2": - version: 1.0.2 - resolution: "@esfx/collections-linkedlist@npm:1.0.2" - dependencies: - "@esfx/collection-core": "npm:^1.0.0" - "@esfx/equatable": "npm:^1.0.2" - checksum: 10/ddaafab0d90a8588b4292639e194217dfa5403fe4e6acc375b235ba1736a69dd43893b507f9c4aaae04377d66b23a1da0bee063be578940a03124cf0a6372096 - languageName: node - linkType: hard - -"@esfx/collections-multimap@npm:^1.0.2": - version: 1.0.2 - resolution: "@esfx/collections-multimap@npm:1.0.2" - dependencies: - "@esfx/collection-core": "npm:^1.0.0" - "@esfx/collections-hashmap": "npm:^1.0.2" - "@esfx/collections-hashset": "npm:^1.0.2" - "@esfx/equatable": "npm:^1.0.2" - checksum: 10/ba6aebb8c737d9f6d9c6a06edd6904bf731c0e0eddc4aaa1fd67cf074f04441c368feee7a37af7dcab658602959d75002cc314283accf37dc1789c7a81d65914 - languageName: node - linkType: hard - -"@esfx/collections-sortedmap@npm:^1.0.0, @esfx/collections-sortedmap@npm:^1.0.2": - version: 1.0.2 - resolution: "@esfx/collections-sortedmap@npm:1.0.2" - dependencies: - "@esfx/collection-core": "npm:^1.0.0" - "@esfx/equatable": "npm:^1.0.2" - checksum: 10/428f752583b5fa78e57137952f4925ca8f54daa3816a34b699adcf2206e816f3771c0bf7cfcbeafcf36e4036df200ab90bd7e6d1067bc7dc04e1dcc10f24706a - languageName: node - linkType: hard - -"@esfx/collections-sortedset@npm:^1.0.2": - version: 1.0.2 - resolution: "@esfx/collections-sortedset@npm:1.0.2" - dependencies: - "@esfx/collection-core": "npm:^1.0.0" - "@esfx/equatable": "npm:^1.0.2" - checksum: 10/3f0f1fac9a861bcad3965ffa23b9519b92b6aa54bd163e72a4220cc699a7a0f8fa120deb05152fdc3a2071bd543103fe0de74760e5ce3366e3b79874b2749b1d - languageName: node - linkType: hard - -"@esfx/collections@npm:^1.0.0": - version: 1.0.2 - resolution: "@esfx/collections@npm:1.0.2" - dependencies: - "@esfx/collections-hashmap": "npm:^1.0.2" - "@esfx/collections-hashset": "npm:^1.0.2" - "@esfx/collections-linkedlist": "npm:^1.0.2" - "@esfx/collections-multimap": "npm:^1.0.2" - "@esfx/collections-sortedmap": "npm:^1.0.2" - "@esfx/collections-sortedset": "npm:^1.0.2" - checksum: 10/3f7f8d908e0e4c7ec31f48b5f52a44d3ba00fa74dc20aa2fdb811a69612ff477b2c96a288970a29073c8a7281d1cdda58614272dd1ce7d2a88305a5f98b33f9f - languageName: node - linkType: hard - -"@esfx/equatable@npm:^1.0.2": - version: 1.0.2 - resolution: "@esfx/equatable@npm:1.0.2" - dependencies: - "@mapbox/node-pre-gyp": "npm:^1.0.9" - checksum: 10/54e9de6092116699fb206676c5afd7b513e7b3e3fa03d08b8ee84a6f3b4d0057346606ceb2745f47cb1e73be28e77ca3fa403f1dcc66151a1f7a2e9cb48f7df3 - languageName: node - linkType: hard - "@eslint-community/eslint-utils@npm:^4.2.0, @eslint-community/eslint-utils@npm:^4.4.0": version: 4.4.0 resolution: "@eslint-community/eslint-utils@npm:4.4.0" @@ -4644,25 +4552,6 @@ __metadata: languageName: node linkType: hard -"@mapbox/node-pre-gyp@npm:^1.0.9": - version: 1.0.11 - resolution: "@mapbox/node-pre-gyp@npm:1.0.11" - dependencies: - detect-libc: "npm:^2.0.0" - https-proxy-agent: "npm:^5.0.0" - make-dir: "npm:^3.1.0" - node-fetch: "npm:^2.6.7" - nopt: "npm:^5.0.0" - npmlog: "npm:^5.0.1" - rimraf: "npm:^3.0.2" - semver: "npm:^7.3.5" - tar: "npm:^6.1.11" - bin: - node-pre-gyp: bin/node-pre-gyp - checksum: 10/59529a2444e44fddb63057152452b00705aa58059079191126c79ac1388ae4565625afa84ed4dd1bf017d1111ab6e47907f7c5192e06d83c9496f2f3e708680a - languageName: node - linkType: hard - "@mapbox/point-geometry@npm:^0.1.0": version: 0.1.0 resolution: "@mapbox/point-geometry@npm:0.1.0" @@ -4713,42 +4602,6 @@ __metadata: languageName: node linkType: hard -"@msagl/core@npm:^1.1.16, @msagl/core@npm:^1.1.18": - version: 1.1.18 - resolution: "@msagl/core@npm:1.1.18" - dependencies: - "@esfx/collections": "npm:^1.0.0" - "@esfx/collections-sortedmap": "npm:^1.0.0" - queue-typescript: "npm:^1.0.1" - reliable-random: "npm:^0.0.1" - stack-typescript: "npm:^1.0.4" - typescript-string-operations: "npm:^1.4.1" - checksum: 10/90dddc3f311eb2f61631d03907c70e8f948d424b5da9617b2c5b59bbb6c997804a171bb9af148226315659bb717b8cd770bef22b28983f68e1803d32a93c58d1 - languageName: node - linkType: hard - -"@msagl/drawing@npm:^1.1.18": - version: 1.1.18 - resolution: "@msagl/drawing@npm:1.1.18" - dependencies: - "@msagl/core": "npm:^1.1.18" - checksum: 10/4cba6bd172dc39e09da9487c87b9caf511fb12eff433715ba3efeac95650315c5a5fb8cc6dfffd6f76de304a8cab0ecb839fc933268f0a0a004ee130594e4773 - languageName: node - linkType: hard - -"@msagl/parser@npm:^1.1.16": - version: 1.1.18 - resolution: "@msagl/parser@npm:1.1.18" - dependencies: - "@msagl/core": "npm:^1.1.18" - "@msagl/drawing": "npm:^1.1.18" - "@types/parse-color": "npm:^1.0.1" - dotparser: "npm:^1.1.1" - parse-color: "npm:^1.0.0" - checksum: 10/f2b2d01d08e82341251cc8907a19881b2b203480342a49d14432922d68edf03a26bf3b4959d6673f45347afce7655f7cb95ace2218e06617cde5f4ed5a669f80 - languageName: node - linkType: hard - "@mswjs/cookies@npm:^1.1.0": version: 1.1.0 resolution: "@mswjs/cookies@npm:1.1.0" @@ -8887,13 +8740,6 @@ __metadata: languageName: node linkType: hard -"@types/parse-color@npm:^1.0.1": - version: 1.0.3 - resolution: "@types/parse-color@npm:1.0.3" - checksum: 10/d9c822f820f277502cc58a4c52f5758980e6972c9a4710df515ec93dc5dde05e8e3da6210ea6514035d49c1bf36a3f720c0e5ec9c214bdc0b8c3fdb9240e36ea - languageName: node - linkType: hard - "@types/parse-json@npm:^4.0.0": version: 4.0.0 resolution: "@types/parse-json@npm:4.0.0" @@ -10521,16 +10367,6 @@ __metadata: languageName: node linkType: hard -"are-we-there-yet@npm:^2.0.0": - version: 2.0.0 - resolution: "are-we-there-yet@npm:2.0.0" - dependencies: - delegates: "npm:^1.0.0" - readable-stream: "npm:^3.6.0" - checksum: 10/ea6f47d14fc33ae9cbea3e686eeca021d9d7b9db83a306010dd04ad5f2c8b7675291b127d3fcbfcbd8fec26e47b3324ad5b469a6cc3733a582f2fe4e12fc6756 - languageName: node - linkType: hard - "are-we-there-yet@npm:^3.0.0": version: 3.0.0 resolution: "are-we-there-yet@npm:3.0.0" @@ -12210,13 +12046,6 @@ __metadata: languageName: node linkType: hard -"color-convert@npm:~0.5.0": - version: 0.5.3 - resolution: "color-convert@npm:0.5.3" - checksum: 10/00dc4256c07ed8760d7bbba234ff969c139eb964fe165853696852001002695c492e327d83ddb7a8cad8d27b49fa543d001328928c12474ee8ecb335bf5f2eb4 - languageName: node - linkType: hard - "color-name@npm:1.1.3": version: 1.1.3 resolution: "color-name@npm:1.1.3" @@ -12231,7 +12060,7 @@ __metadata: languageName: node linkType: hard -"color-support@npm:^1.1.2, color-support@npm:^1.1.3": +"color-support@npm:^1.1.3": version: 1.1.3 resolution: "color-support@npm:1.1.3" bin: @@ -14085,13 +13914,6 @@ __metadata: languageName: node linkType: hard -"detect-libc@npm:^2.0.0": - version: 2.0.2 - resolution: "detect-libc@npm:2.0.2" - checksum: 10/6118f30c0c425b1e56b9d2609f29bec50d35a6af0b762b6ad127271478f3bbfda7319ce869230cf1a351f2b219f39332cde290858553336d652c77b970f15de8 - languageName: node - linkType: hard - "detect-newline@npm:^3.0.0": version: 3.1.0 resolution: "detect-newline@npm:3.1.0" @@ -14393,13 +14215,6 @@ __metadata: languageName: node linkType: hard -"dotparser@npm:^1.1.1": - version: 1.1.1 - resolution: "dotparser@npm:1.1.1" - checksum: 10/a66a02f5add34b53356ee18b418589ccf055ef6ffec073e91230f5f34cb5ac9579ce20e843b9a3213f42a26bd89fce9232b9364cc08844dade575095dc40d88a - languageName: node - linkType: hard - "duplexer@npm:^0.1.1, duplexer@npm:^0.1.2": version: 0.1.2 resolution: "duplexer@npm:0.1.2" @@ -16378,23 +16193,6 @@ __metadata: languageName: node linkType: hard -"gauge@npm:^3.0.0": - version: 3.0.2 - resolution: "gauge@npm:3.0.2" - dependencies: - aproba: "npm:^1.0.3 || ^2.0.0" - color-support: "npm:^1.1.2" - console-control-strings: "npm:^1.0.0" - has-unicode: "npm:^2.0.1" - object-assign: "npm:^4.1.1" - signal-exit: "npm:^3.0.0" - string-width: "npm:^4.2.3" - strip-ansi: "npm:^6.0.1" - wide-align: "npm:^1.1.2" - checksum: 10/46df086451672a5fecd58f7ec86da74542c795f8e00153fbef2884286ce0e86653c3eb23be2d0abb0c4a82b9b2a9dec3b09b6a1cf31c28085fa0376599a26589 - languageName: node - linkType: hard - "gauge@npm:^4.0.3": version: 4.0.4 resolution: "gauge@npm:4.0.4" @@ -16952,8 +16750,6 @@ __metadata: "@locker/near-membrane-shared": "npm:0.13.6" "@locker/near-membrane-shared-dom": "npm:0.13.6" "@manypkg/get-packages": "npm:^2.2.0" - "@msagl/core": "npm:^1.1.16" - "@msagl/parser": "npm:^1.1.16" "@opentelemetry/api": "npm:1.8.0" "@opentelemetry/exporter-collector": "npm:0.25.0" "@opentelemetry/semantic-conventions": "npm:1.24.1" @@ -20300,13 +20096,6 @@ __metadata: languageName: node linkType: hard -"linked-list-typescript@npm:^1.0.11": - version: 1.0.15 - resolution: "linked-list-typescript@npm:1.0.15" - checksum: 10/91c87ab00fe4bb9850f169adc62b811ae7e91a743bac1a9fc969a815f20ddd0fb285f84a4d31e98900512234f59297f7beef6b076dd382cf879a319c7a14c68b - languageName: node - linkType: hard - "listr2@npm:^3.8.3": version: 3.14.0 resolution: "listr2@npm:3.14.0" @@ -20705,7 +20494,7 @@ __metadata: languageName: node linkType: hard -"make-dir@npm:^3.0.0, make-dir@npm:^3.0.2, make-dir@npm:^3.1.0": +"make-dir@npm:^3.0.0, make-dir@npm:^3.0.2": version: 3.1.0 resolution: "make-dir@npm:3.1.0" dependencies: @@ -22573,18 +22362,6 @@ __metadata: languageName: node linkType: hard -"npmlog@npm:^5.0.1": - version: 5.0.1 - resolution: "npmlog@npm:5.0.1" - dependencies: - are-we-there-yet: "npm:^2.0.0" - console-control-strings: "npm:^1.1.0" - gauge: "npm:^3.0.0" - set-blocking: "npm:^2.0.0" - checksum: 10/f42c7b9584cdd26a13c41a21930b6f5912896b6419ab15be88cc5721fc792f1c3dd30eb602b26ae08575694628ba70afdcf3675d86e4f450fc544757e52726ec - languageName: node - linkType: hard - "npmlog@npm:^6.0.2": version: 6.0.2 resolution: "npmlog@npm:6.0.2" @@ -23418,15 +23195,6 @@ __metadata: languageName: node linkType: hard -"parse-color@npm:^1.0.0": - version: 1.0.0 - resolution: "parse-color@npm:1.0.0" - dependencies: - color-convert: "npm:~0.5.0" - checksum: 10/9f988462af30929acbbce135286ce20dc2fb8efe48fd0693ed8bfd7da3a60e2465cffff6d35047fe94fd7863b43159bf41b377a9982939b7c65fdba1e30af24a - languageName: node - linkType: hard - "parse-headers@npm:^2.0.2": version: 2.0.4 resolution: "parse-headers@npm:2.0.4" @@ -24620,15 +24388,6 @@ __metadata: languageName: node linkType: hard -"queue-typescript@npm:^1.0.1": - version: 1.0.1 - resolution: "queue-typescript@npm:1.0.1" - dependencies: - linked-list-typescript: "npm:^1.0.11" - checksum: 10/403e38579902af1ac533911876c31dd1fd62e94d352263b9ed9786db3677494b15236ad43182178e5103915605a8b07da5780d84b6cc075d7f54cfb056091489 - languageName: node - linkType: hard - "quick-lru@npm:^4.0.1": version: 4.0.1 resolution: "quick-lru@npm:4.0.1" @@ -26139,13 +25898,6 @@ __metadata: languageName: node linkType: hard -"reliable-random@npm:^0.0.1": - version: 0.0.1 - resolution: "reliable-random@npm:0.0.1" - checksum: 10/dbd1fe95dcea9004a0b64540a29c72832c605957a06d26eb762e6600835981ee4949ce7e15b303dcc5c44e9a976357d560f4b6f625fdfaf17f611c65a0150975 - languageName: node - linkType: hard - "remark-gfm@npm:^4.0.0": version: 4.0.0 resolution: "remark-gfm@npm:4.0.0" @@ -27756,15 +27508,6 @@ __metadata: languageName: node linkType: hard -"stack-typescript@npm:^1.0.4": - version: 1.0.4 - resolution: "stack-typescript@npm:1.0.4" - dependencies: - linked-list-typescript: "npm:^1.0.11" - checksum: 10/a3211a70b01ab4ece788a9c0c4612a132be4019427dc1d9daa7f289b5ab495d4a30cdc947888858eb9225b4c55428530ae60526c56b141f843047db1d878114e - languageName: node - linkType: hard - "stack-utils@npm:^2.0.3": version: 2.0.5 resolution: "stack-utils@npm:2.0.5" @@ -29242,13 +28985,6 @@ __metadata: languageName: node linkType: hard -"typescript-string-operations@npm:^1.4.1": - version: 1.5.0 - resolution: "typescript-string-operations@npm:1.5.0" - checksum: 10/a884c4241fc45b9cceb2744c20fb229e6dfcb48f96afd68ef2d67fda1e4586c96d20fd0343b57c14ac33b2ebe000aa7524a4932424aea3077fe9e692555384f2 - languageName: node - linkType: hard - "typescript@npm:5.2.2": version: 5.2.2 resolution: "typescript@npm:5.2.2" @@ -30446,7 +30182,7 @@ __metadata: languageName: node linkType: hard -"wide-align@npm:^1.1.0, wide-align@npm:^1.1.2, wide-align@npm:^1.1.5": +"wide-align@npm:^1.1.0, wide-align@npm:^1.1.5": version: 1.1.5 resolution: "wide-align@npm:1.1.5" dependencies: