@prefecthq/graphs 1.0.7 → 2.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (48) hide show
  1. package/LICENSE +201 -0
  2. package/dist/assets/nodeLayout.worker-ba54e168.js.map +1 -0
  3. package/dist/graphs.mjs +3 -4
  4. package/dist/graphs.umd.js +578 -63
  5. package/dist/graphs.umd.js.map +1 -1
  6. package/dist/index-aba921f4.mjs +19945 -0
  7. package/dist/index-aba921f4.mjs.map +1 -0
  8. package/dist/types/demo/App.vue.d.ts +1 -43
  9. package/dist/types/demo/components/ComponentPage.vue.d.ts +18 -85
  10. package/dist/types/demo/components/ContextSidebar.vue.d.ts +1 -43
  11. package/dist/types/demo/components/HashLink.vue.d.ts +11 -54
  12. package/dist/types/demo/components/ResizableSection.vue.d.ts +8 -47
  13. package/dist/types/demo/sections/Data.vue.d.ts +1 -43
  14. package/dist/types/demo/sections/Home.vue.d.ts +1 -43
  15. package/dist/types/demo/sections/components/FlowRunTimelineDemo.vue.d.ts +1 -43
  16. package/dist/types/demo/sections/components/TimescaleTable.vue.d.ts +16 -67
  17. package/dist/types/demo/utilities/timescaleData.d.ts +2 -2
  18. package/dist/types/src/FlowRunTimeline.vue.d.ts +30 -122
  19. package/dist/types/src/containers/guide.d.ts +28 -0
  20. package/dist/types/src/containers/guides.d.ts +26 -0
  21. package/dist/types/src/index.d.ts +1 -0
  22. package/dist/types/src/models/FlowRunTimeline.d.ts +16 -28
  23. package/dist/types/src/pixiFunctions/bitmapFonts.d.ts +1 -1
  24. package/dist/types/src/pixiFunctions/index.d.ts +1 -2
  25. package/dist/types/src/pixiFunctions/nodeSprites.d.ts +2 -2
  26. package/dist/types/src/pixiFunctions/subNodesToggle.d.ts +3 -2
  27. package/dist/types/src/pixiFunctions/timeScale.d.ts +2 -0
  28. package/dist/types/src/pixiFunctions/timelineEdge.d.ts +2 -2
  29. package/dist/types/src/pixiFunctions/timelineNode.d.ts +8 -7
  30. package/dist/types/src/pixiFunctions/timelineNodes.d.ts +8 -10
  31. package/dist/types/src/pixiFunctions/timelinePlayhead.d.ts +4 -19
  32. package/dist/types/src/types/index.d.ts +1 -0
  33. package/dist/types/src/types/timeline.d.ts +11 -0
  34. package/dist/types/src/utilities/index.d.ts +2 -1
  35. package/dist/types/src/utilities/time.d.ts +13 -10
  36. package/dist/types/src/utilities/viewport.d.ts +3 -0
  37. package/dist/types/src/utilities/zIndex.d.ts +5 -0
  38. package/dist/types/src/workers/layouts/nearestNeighbor.d.ts +10 -0
  39. package/dist/types/src/workers/layouts/waterfall.d.ts +3 -0
  40. package/dist/{viewport.es-a4ca92c6.mjs → viewport.es-73ad6f79.mjs} +706 -2
  41. package/dist/{viewport.es-a4ca92c6.mjs.map → viewport.es-73ad6f79.mjs.map} +1 -1
  42. package/package.json +11 -11
  43. package/dist/assets/nodeLayout.worker-30c2c715.js.map +0 -1
  44. package/dist/index-0669fb1d.mjs +0 -17267
  45. package/dist/index-0669fb1d.mjs.map +0 -1
  46. package/dist/types/src/pixiFunctions/timelineGuide.d.ts +0 -20
  47. package/dist/types/src/pixiFunctions/timelineGuides.d.ts +0 -33
  48. package/dist/types/src/pixiFunctions/timelineScale.d.ts +0 -7
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@prefecthq/graphs",
3
3
  "private": false,
4
- "version": "1.0.7",
4
+ "version": "2.0.1",
5
5
  "description": "Large scale graphs designed for Prefect",
6
6
  "scripts": {
7
7
  "serve": "vite --host --mode=demo",
@@ -39,30 +39,30 @@
39
39
  "devDependencies": {
40
40
  "@fontsource/inconsolata": "^4.5.9",
41
41
  "@fontsource/inter": "4.5.14",
42
- "@prefecthq/eslint-config": "1.0.23",
42
+ "@prefecthq/eslint-config": "1.0.27",
43
43
  "@types/fontfaceobserver": "^2.1.0",
44
- "@types/node": "^18.11.11",
45
- "@vitejs/plugin-vue": "4.0.0",
44
+ "@types/node": "^20.1.7",
45
+ "@vitejs/plugin-vue": "4.2.3",
46
46
  "auto-changelog": "^2.4.0",
47
47
  "autoprefixer": "10.4.13",
48
- "eslint": "8.29.0",
48
+ "eslint": "8.40.0",
49
49
  "postcss": "8.4.19",
50
50
  "tailwindcss": "3.2.4",
51
51
  "tsc-alias": "1.8.2",
52
- "typescript": "^4.9.3",
53
- "vite": "4.0.1",
52
+ "typescript": "5.1.6",
53
+ "vite": "4.3.9",
54
54
  "vite-svg-loader": "^3.6.0",
55
- "vue-tsc": "1.0.9"
55
+ "vue-tsc": "1.6.5"
56
56
  },
57
57
  "peerDependencies": {
58
- "@prefecthq/prefect-design": "^1.2.0",
58
+ "@prefecthq/prefect-design": "2.0.0-beta.3",
59
59
  "vue": "^3.2.45",
60
60
  "vue-router": "^4.0.12"
61
61
  },
62
62
  "dependencies": {
63
63
  "@pixi-essentials/cull": "^1.1.0",
64
- "@prefecthq/vue-compositions": "1.0.0",
65
- "date-fns": "2.29.3",
64
+ "@prefecthq/vue-compositions": "1.5.6",
65
+ "date-fns": "2.30.0",
66
66
  "fontfaceobserver": "^2.3.0",
67
67
  "gsap": "^3.11.4",
68
68
  "pixi-viewport": "^4.38.0",
@@ -1 +0,0 @@
1
- {"version":3,"file":"nodeLayout.worker-30c2c715.js","sources":["../src/pixiFunctions/timelineScale.ts","../src/workers/nodeLayout.worker.ts"],"sourcesContent":["import {\n DateToX,\n XToDate,\n TimelineScale,\n InitTimelineScaleProps\n} from '@/models'\n\nexport let timelineScale: {\n dateToX: DateToX,\n xToDate: XToDate,\n}\n\n// this function is also imported into the nodeLayout.worker, so\n// it can't return the cached timelineScale\nexport const createTimelineScale = ({\n minimumStartTime,\n graphXDomain,\n initialOverallTimeSpan,\n}: InitTimelineScaleProps): TimelineScale => {\n const newTimelineScale = {\n dateToX: createDateToXScale(\n minimumStartTime,\n graphXDomain,\n initialOverallTimeSpan,\n ),\n xToDate: createXToDateScale(\n minimumStartTime,\n graphXDomain,\n initialOverallTimeSpan,\n ),\n }\n\n return newTimelineScale\n}\n\nexport const initTimelineScale = ({\n minimumStartTime,\n graphXDomain,\n initialOverallTimeSpan,\n}: InitTimelineScaleProps): TimelineScale => {\n timelineScale = createTimelineScale({\n minimumStartTime,\n graphXDomain,\n initialOverallTimeSpan,\n })\n return timelineScale\n}\n\nfunction createDateToXScale(minStartTime: number, overallWidth: number, overallTimeSpan: number): DateToX {\n return function(date: Date): number {\n return Math.ceil((date.getTime() - minStartTime) * (overallWidth / overallTimeSpan))\n }\n}\n\nfunction createXToDateScale(minStartTime: number, overallWidth: number, overallTimeSpan: number): XToDate {\n return function(xPosition: number): Date {\n return new Date(Math.ceil(minStartTime + xPosition * (overallTimeSpan / overallWidth)))\n }\n}\n","import {\n GraphTimelineNode,\n TimelineNodesLayoutOptions,\n NodeLayoutWorkerProps,\n NodeShoveDirection,\n NodesLayout,\n TimelineScale,\n NodeLayoutItem,\n NodeLayoutWorkerResponseData\n} from '@/models'\nimport { createTimelineScale } from '@/pixiFunctions/timelineScale'\n\nconst defaultPosition = 0\n\nlet timelineScale: TimelineScale | undefined\n\nlet currentApxCharacterWidth = 14\nlet minimumNodeEdgeGap = 0\nlet currentLayoutSetting: TimelineNodesLayoutOptions = 'waterfall'\nlet graphDataStore: GraphTimelineNode[] = []\n\nconst layout: NodesLayout = {}\n\nonmessage = async ({\n data: {\n layoutSetting,\n graphData,\n apxCharacterWidth,\n spacingMinimumNodeEdgeGap,\n timeScaleProps,\n centerViewportAfter,\n },\n}: NodeLayoutWorkerProps) => {\n for (const item in layout) {\n delete layout[item]\n }\n\n if (spacingMinimumNodeEdgeGap) {\n minimumNodeEdgeGap = spacingMinimumNodeEdgeGap\n }\n\n if (layoutSetting) {\n currentLayoutSetting = layoutSetting\n }\n\n if (apxCharacterWidth) {\n currentApxCharacterWidth = apxCharacterWidth\n }\n\n if (timeScaleProps) {\n const {\n minimumStartTime,\n graphXDomain,\n initialOverallTimeSpan,\n } = timeScaleProps\n timelineScale = createTimelineScale({\n minimumStartTime,\n graphXDomain,\n initialOverallTimeSpan,\n })\n }\n\n if (graphData) {\n const newData = JSON.parse(graphData) as GraphTimelineNode[]\n\n if (timelineScale && (layoutSetting || graphDataStore !== newData)) {\n graphDataStore = prepareGraphData(newData)\n await calculateNodeLayout()\n const response: NodeLayoutWorkerResponseData = {\n layout,\n centerViewportAfter,\n }\n postMessage(response)\n }\n }\n}\n\nfunction prepareGraphData(data: GraphTimelineNode[]): GraphTimelineNode[] {\n return data\n .filter(isRenderableTimelineNode)\n .map(node => {\n // during serialization, dates are converted to strings\n // so we need to convert them back in this worker\n node.start = new Date(node.start)\n if (node.end) {\n node.end = new Date(node.end)\n }\n return node\n })\n .sort((nodeA, nodeB) => {\n return nodeA.start.getTime() - nodeB.start.getTime()\n })\n}\n\nfunction isRenderableTimelineNode(value: GraphTimelineNode): value is GraphTimelineNode & { start: Date } {\n return typeof value === 'object' && 'start' in value\n}\n\nasync function calculateNodeLayout(): Promise<void> {\n if (currentLayoutSetting === 'waterfall') {\n generateWaterfallLayout()\n }\n\n if (currentLayoutSetting === 'nearestParent') {\n await generateNearestParentLayout()\n }\n\n purgeNegativePositions()\n}\n\nfunction generateWaterfallLayout(): void {\n graphDataStore.forEach((nodeData, index) => {\n layout[nodeData.id] = {\n position: index,\n startX: 0,\n endX: 0,\n }\n })\n}\n\nasync function generateNearestParentLayout(): Promise<void> {\n for await (const nodeData of graphDataStore) {\n if (!nodeData.start) {\n continue\n }\n\n const endAsPx = timelineScale!.dateToX(nodeData.end ? new Date(nodeData.end) : new Date())\n // Accommodate the label width so they don't overlap\n const apxLabelWidth = nodeData.label.length * currentApxCharacterWidth\n const endX = endAsPx + apxLabelWidth\n\n const startX = nodeData.id in layout\n ? layout[nodeData.id].startX\n : timelineScale!.dateToX(new Date(nodeData.start))\n\n const position = await getNearestParentPosition(nodeData, startX)\n\n layout[nodeData.id] = {\n position,\n startX,\n endX,\n }\n }\n}\n\nasync function getNearestParentPosition(nodeData: GraphTimelineNode, nodeStartX: number): Promise<number> {\n // if one dependency\n if (nodeData.upstreamDependencies && nodeData.upstreamDependencies.length === 1) {\n if (nodeData.upstreamDependencies[0] in layout) {\n const parent = layout[nodeData.upstreamDependencies[0]]\n return await placeNearUpstreamNode(parent, nodeStartX)\n }\n\n console.warn('timelineNodes layout worker: Parent node not found in layout', nodeData.upstreamDependencies[0])\n return defaultPosition\n }\n\n // if more than one dependency – add to the middle of upstream dependencies\n if (nodeData.upstreamDependencies && nodeData.upstreamDependencies.length > 0) {\n const upstreamLayoutItems = nodeData.upstreamDependencies\n .map(id => layout[id])\n .filter((layoutItem: NodeLayoutItem | undefined): layoutItem is NodeLayoutItem => !!layoutItem)\n const upstreamPositions = upstreamLayoutItems.map(layoutItem => layoutItem.position)\n const upstreamPositionSum = upstreamPositions.reduce((sum, position) => sum + position, 0)\n const upstreamPositionAverage = upstreamPositionSum / upstreamPositions.length\n\n const position = Math.round(upstreamPositionAverage)\n\n if (isPositionTaken(nodeStartX, position)) {\n const overlappingLayoutIds = getOverlappingLayoutIds(\n nodeStartX,\n position,\n )!\n\n const upstreamDependenciesOverlapping = overlappingLayoutIds.filter(layoutId => {\n return nodeData.upstreamDependencies?.includes(layoutId)\n })\n\n if (upstreamDependenciesOverlapping.length > 0 || overlappingLayoutIds.length > 1) {\n // upstream nodeData dependencies always win, or if there are more than one node in the way\n const [upstreamLayoutItemId] = upstreamDependenciesOverlapping.length > 0\n ? upstreamDependenciesOverlapping\n : overlappingLayoutIds\n const upstreamLayoutItem = layout[upstreamLayoutItemId]\n\n upstreamLayoutItem.nextDependencyShove = getShoveDirectionWeightedByDependencies(\n upstreamPositions,\n position,\n upstreamLayoutItem.nextDependencyShove,\n )\n\n return await placeNearUpstreamNode(upstreamLayoutItem, nodeStartX)\n }\n\n return await argueWithCompetingUpstreamPlacement({\n competingLayoutItemId: overlappingLayoutIds[0],\n upstreamPositions,\n nodeStartX,\n desiredPosition: position,\n })\n }\n }\n\n // if zero dependencies\n return placeRootNode(nodeStartX, defaultPosition)\n}\n\nfunction placeRootNode(nodeStartX: number, defaultPosition: number): number {\n if (isPositionTaken(nodeStartX, defaultPosition)) {\n return placeRootNode(nodeStartX, defaultPosition + 1)\n }\n\n return defaultPosition\n}\n\nasync function placeNearUpstreamNode(upstreamLayoutItem: NodeLayoutItem, nodeStartX: number): Promise<number> {\n // See this diagram for how shove logic works in this scenario\n // https://www.figma.com/file/1u1oXkiYRxgtqWSRG9Yely/DAG-Design?node-id=385%3A2782&t=yRLIggko0TzbMaIG-4\n if (upstreamLayoutItem.nextDependencyShove !== 1 && upstreamLayoutItem.nextDependencyShove !== -1) {\n upstreamLayoutItem.nextDependencyShove = 1\n }\n\n const {\n position: upstreamNodePosition,\n nextDependencyShove,\n } = upstreamLayoutItem\n if (isPositionTaken(nodeStartX, upstreamNodePosition)) {\n if (nextDependencyShove === 1 && !isPositionTaken(nodeStartX, upstreamNodePosition + 1)) {\n upstreamLayoutItem.nextDependencyShove = -1\n return upstreamNodePosition + 1\n } else if (!isPositionTaken(nodeStartX, upstreamNodePosition - 1)) {\n upstreamLayoutItem.nextDependencyShove = 1\n return upstreamNodePosition - 1\n }\n await shove({\n direction: nextDependencyShove,\n nodeStartX,\n desiredPosition: upstreamNodePosition + nextDependencyShove,\n })\n upstreamLayoutItem.nextDependencyShove = nextDependencyShove === 1 ? -1 : 1\n return upstreamNodePosition + nextDependencyShove\n }\n return upstreamNodePosition\n}\n\nfunction isPositionTaken(nodeStartX: number, position: number): boolean {\n const layoutKeys = Object.keys(layout)\n return layoutKeys.length > 0 && layoutKeys.some((nodeId) => {\n const layoutItem = layout[nodeId]\n return isNodesOverlapping({\n firstNodeEndX: layoutItem.endX,\n firstNodePosition: layoutItem.position,\n lastNodeStartX: nodeStartX,\n lastNodePosition: position,\n })\n })\n}\n\ntype ShoveProps = {\n direction: NodeShoveDirection,\n nodeStartX: number,\n desiredPosition: number,\n}\nasync function shove({ direction, nodeStartX, desiredPosition }: ShoveProps): Promise<void> {\n const overlappingLayoutIds = getOverlappingLayoutIds(nodeStartX, desiredPosition)\n\n if (!overlappingLayoutIds) {\n return\n }\n\n for await (const overlapId of overlappingLayoutIds) {\n // push nodes and recursively shove as needed\n const layoutItem = layout[overlapId]\n const newPosition = layoutItem.position + direction\n await shove({\n direction,\n nodeStartX: layoutItem.startX,\n desiredPosition: newPosition,\n })\n layoutItem.position = newPosition\n }\n}\n\ntype IsNodesOverlappingProps = {\n firstNodeEndX: number,\n firstNodePosition: number,\n lastNodeStartX: number,\n lastNodePosition: number,\n}\nfunction isNodesOverlapping({\n firstNodeEndX,\n firstNodePosition,\n lastNodeStartX,\n lastNodePosition,\n}: IsNodesOverlappingProps): boolean {\n return firstNodePosition === lastNodePosition\n && firstNodeEndX + minimumNodeEdgeGap >= lastNodeStartX\n}\n\nfunction getOverlappingLayoutIds(nodeStartX: number, position: number): string[] | undefined {\n const overlappingLayoutItems: string[] = []\n\n Object.keys(layout).forEach(itemId => {\n const layoutItem = layout[itemId]\n\n const isItemOverlapping = isNodesOverlapping({\n firstNodeEndX: layoutItem.endX,\n firstNodePosition: layoutItem.position,\n lastNodeStartX: nodeStartX,\n lastNodePosition: position,\n })\n\n if (isItemOverlapping) {\n overlappingLayoutItems.push(itemId)\n }\n })\n\n if (overlappingLayoutItems.length === 0) {\n return\n }\n\n // sort last to first\n overlappingLayoutItems.sort((itemAId, itemBId) => {\n const itemA = layout[itemAId]\n const itemB = layout[itemBId]\n if (itemA.endX < itemB.endX) {\n return 1\n }\n if (itemA.endX > itemB.endX) {\n return -1\n }\n return 0\n })\n\n return overlappingLayoutItems\n}\n\nfunction getShoveDirectionWeightedByDependencies(\n upstreamPositions: number[],\n position: number,\n defaultGravity?: NodeShoveDirection,\n): NodeShoveDirection {\n // check if nodeData has more connections above or below, prefer placement in that direction\n const upwardConnections = upstreamPositions.filter((upstreamPosition) => upstreamPosition < position).length\n const downwardConnections = upstreamPositions.filter((upstreamPosition) => upstreamPosition > position).length\n\n if (upwardConnections > downwardConnections) {\n return -1\n }\n\n return defaultGravity ?? 1\n}\n\ntype ArgueWithCompetingUpstreamPlacementProps = {\n desiredPosition: number,\n nodeStartX: number,\n upstreamPositions: number[],\n competingLayoutItemId: string,\n}\nasync function argueWithCompetingUpstreamPlacement({\n desiredPosition,\n nodeStartX,\n upstreamPositions,\n competingLayoutItemId,\n}: ArgueWithCompetingUpstreamPlacementProps): Promise<number> {\n const competitor = layout[competingLayoutItemId]\n const [\n competitorAboveConnections,\n competitorBelowConnections,\n ] = getLayoutItemUpAndDownwardConnections(competingLayoutItemId)\n const nodeAboveConnections = upstreamPositions.filter((upstreamPosition) => upstreamPosition < desiredPosition).length\n const nodeBelowConnections = upstreamPositions.filter((upstreamPosition) => upstreamPosition > desiredPosition).length\n\n if (nodeAboveConnections > nodeBelowConnections) {\n // node has more above\n if (\n competitorAboveConnections > competitorBelowConnections && competitorAboveConnections > nodeAboveConnections\n ) {\n // competitor has more above than below, and more above than node\n // node wins, shove competitor up\n await shove({\n direction: -1,\n nodeStartX,\n desiredPosition,\n })\n return desiredPosition\n }\n if (competitorBelowConnections > competitorAboveConnections) {\n // competitor has more below than above\n // node wins, shove competitor down\n await shove({\n direction: 1,\n nodeStartX,\n desiredPosition,\n })\n return desiredPosition\n }\n\n // competitor has equal above and below, or node has more above\n // place node above competitor\n competitor.nextDependencyShove = -1\n }\n\n if (nodeBelowConnections > nodeAboveConnections) {\n // node has more below\n if (\n competitorBelowConnections > competitorAboveConnections && competitorBelowConnections > nodeBelowConnections\n ) {\n // competitor has more below than above, and more below than node\n // node wins, shove competitor down\n await shove({\n direction: 1,\n nodeStartX,\n desiredPosition,\n })\n return desiredPosition\n }\n\n if (competitorAboveConnections > competitorBelowConnections) {\n // competitor has more above than below\n // node wins, shove competitor up\n await shove({\n direction: -1,\n nodeStartX,\n desiredPosition,\n })\n return desiredPosition\n }\n\n // competitor has equal above and below, or node has more below\n // place node below competitor\n competitor.nextDependencyShove = 1\n }\n\n return await placeNearUpstreamNode(competitor, nodeStartX)\n}\n\nfunction getLayoutItemUpAndDownwardConnections(id: string): [number, number] {\n const data = graphDataStore.find(nodeData => nodeData.id === id)!\n const layoutItem = layout[id]\n\n return data.upstreamDependencies?.reduce((counts, dependencyId) => {\n if (id in layout) {\n const dependencyLayoutItem = layout[dependencyId]\n\n if (dependencyLayoutItem.position < layoutItem.position) {\n counts[0] += 1\n }\n\n if (dependencyLayoutItem.position > layoutItem.position) {\n counts[1] += 1\n }\n\n return counts\n }\n\n console.warn('nodeLayout.worker.ts: Parent node not found on layout data', id)\n return counts\n }, [0, 0]) ?? [0, 0]\n}\n\nfunction purgeNegativePositions(): void {\n const lowestPosition = Object.values(layout).reduce((lowest, layoutItem) => {\n if (layoutItem.position < lowest) {\n return layoutItem.position\n }\n return lowest\n }, 0)\n\n if (lowestPosition < 0) {\n Object.values(layout).forEach(layoutItem => {\n layoutItem.position += Math.abs(lowestPosition)\n })\n }\n}\n"],"names":["createTimelineScale","minimumStartTime","graphXDomain","initialOverallTimeSpan","createDateToXScale","createXToDateScale","minStartTime","overallWidth","overallTimeSpan","date","xPosition","defaultPosition","timelineScale","currentApxCharacterWidth","minimumNodeEdgeGap","currentLayoutSetting","graphDataStore","layout","layoutSetting","graphData","apxCharacterWidth","spacingMinimumNodeEdgeGap","timeScaleProps","centerViewportAfter","item","newData","prepareGraphData","calculateNodeLayout","data","isRenderableTimelineNode","node","nodeA","nodeB","value","generateWaterfallLayout","generateNearestParentLayout","purgeNegativePositions","nodeData","index","endAsPx","apxLabelWidth","endX","startX","position","getNearestParentPosition","nodeStartX","parent","placeNearUpstreamNode","upstreamPositions","id","layoutItem","upstreamPositionAverage","sum","isPositionTaken","overlappingLayoutIds","getOverlappingLayoutIds","upstreamDependenciesOverlapping","layoutId","_a","upstreamLayoutItemId","upstreamLayoutItem","getShoveDirectionWeightedByDependencies","argueWithCompetingUpstreamPlacement","placeRootNode","upstreamNodePosition","nextDependencyShove","shove","layoutKeys","nodeId","isNodesOverlapping","direction","desiredPosition","overlapId","newPosition","firstNodeEndX","firstNodePosition","lastNodeStartX","lastNodePosition","overlappingLayoutItems","itemId","itemAId","itemBId","itemA","itemB","defaultGravity","upwardConnections","upstreamPosition","downwardConnections","competingLayoutItemId","competitor","competitorAboveConnections","competitorBelowConnections","getLayoutItemUpAndDownwardConnections","nodeAboveConnections","nodeBelowConnections","counts","dependencyId","dependencyLayoutItem","lowestPosition","lowest"],"mappings":"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"}