@grafana/flamegraph 11.6.0-227801 → 11.6.0-228039

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 (58) hide show
  1. package/dist/{index.js → cjs/index.cjs} +1 -1
  2. package/dist/cjs/index.cjs.map +1 -0
  3. package/dist/esm/FlameGraph/{FlameGraph.js → FlameGraph.mjs} +4 -4
  4. package/dist/esm/FlameGraph/FlameGraph.mjs.map +1 -0
  5. package/dist/esm/FlameGraph/{FlameGraphCanvas.js → FlameGraphCanvas.mjs} +5 -5
  6. package/dist/esm/FlameGraph/FlameGraphCanvas.mjs.map +1 -0
  7. package/dist/esm/FlameGraph/{FlameGraphContextMenu.js → FlameGraphContextMenu.mjs} +1 -1
  8. package/dist/esm/FlameGraph/FlameGraphContextMenu.mjs.map +1 -0
  9. package/dist/esm/FlameGraph/{FlameGraphMetadata.js → FlameGraphMetadata.mjs} +1 -1
  10. package/dist/esm/FlameGraph/FlameGraphMetadata.mjs.map +1 -0
  11. package/dist/esm/FlameGraph/{FlameGraphTooltip.js → FlameGraphTooltip.mjs} +1 -1
  12. package/dist/esm/FlameGraph/FlameGraphTooltip.mjs.map +1 -0
  13. package/dist/esm/FlameGraph/{colors.js → colors.mjs} +3 -3
  14. package/dist/esm/FlameGraph/colors.mjs.map +1 -0
  15. package/dist/esm/FlameGraph/{dataTransform.js → dataTransform.mjs} +3 -3
  16. package/dist/esm/FlameGraph/dataTransform.mjs.map +1 -0
  17. package/dist/esm/FlameGraph/{murmur3.js → murmur3.mjs} +1 -1
  18. package/dist/esm/FlameGraph/murmur3.mjs.map +1 -0
  19. package/dist/esm/FlameGraph/{rendering.js → rendering.mjs} +4 -4
  20. package/dist/esm/FlameGraph/rendering.mjs.map +1 -0
  21. package/dist/esm/FlameGraph/testData/{dataNestedSet.js → dataNestedSet.mjs} +1 -1
  22. package/dist/esm/FlameGraph/testData/dataNestedSet.mjs.map +1 -0
  23. package/dist/esm/FlameGraph/{treeTransforms.js → treeTransforms.mjs} +1 -1
  24. package/dist/esm/FlameGraph/treeTransforms.mjs.map +1 -0
  25. package/dist/esm/{FlameGraphContainer.js → FlameGraphContainer.mjs} +7 -7
  26. package/dist/esm/FlameGraphContainer.mjs.map +1 -0
  27. package/dist/esm/{FlameGraphHeader.js → FlameGraphHeader.mjs} +4 -4
  28. package/dist/esm/FlameGraphHeader.mjs.map +1 -0
  29. package/dist/esm/TopTable/{FlameGraphTopTableContainer.js → FlameGraphTopTableContainer.mjs} +4 -4
  30. package/dist/esm/TopTable/FlameGraphTopTableContainer.mjs.map +1 -0
  31. package/dist/esm/{constants.js → constants.mjs} +1 -1
  32. package/dist/esm/constants.mjs.map +1 -0
  33. package/dist/esm/index.d.mts +111 -0
  34. package/dist/esm/index.mjs +4 -0
  35. package/dist/esm/index.mjs.map +1 -0
  36. package/dist/esm/{types.js → types.mjs} +1 -1
  37. package/dist/esm/types.mjs.map +1 -0
  38. package/package.json +24 -11
  39. package/dist/esm/FlameGraph/FlameGraph.js.map +0 -1
  40. package/dist/esm/FlameGraph/FlameGraphCanvas.js.map +0 -1
  41. package/dist/esm/FlameGraph/FlameGraphContextMenu.js.map +0 -1
  42. package/dist/esm/FlameGraph/FlameGraphMetadata.js.map +0 -1
  43. package/dist/esm/FlameGraph/FlameGraphTooltip.js.map +0 -1
  44. package/dist/esm/FlameGraph/colors.js.map +0 -1
  45. package/dist/esm/FlameGraph/dataTransform.js.map +0 -1
  46. package/dist/esm/FlameGraph/murmur3.js.map +0 -1
  47. package/dist/esm/FlameGraph/rendering.js.map +0 -1
  48. package/dist/esm/FlameGraph/testData/dataNestedSet.js.map +0 -1
  49. package/dist/esm/FlameGraph/treeTransforms.js.map +0 -1
  50. package/dist/esm/FlameGraphContainer.js.map +0 -1
  51. package/dist/esm/FlameGraphHeader.js.map +0 -1
  52. package/dist/esm/TopTable/FlameGraphTopTableContainer.js.map +0 -1
  53. package/dist/esm/constants.js.map +0 -1
  54. package/dist/esm/index.js +0 -4
  55. package/dist/esm/index.js.map +0 -1
  56. package/dist/esm/types.js.map +0 -1
  57. package/dist/index.js.map +0 -1
  58. /package/dist/{index.d.ts → cjs/index.d.cts} +0 -0
@@ -2,9 +2,9 @@ import { jsxs, Fragment, jsx } from 'react/jsx-runtime';
2
2
  import { cx, css } from '@emotion/css';
3
3
  import { useState, useEffect } from 'react';
4
4
  import { Icon } from '@grafana/ui';
5
- import { PIXELS_PER_LEVEL } from '../constants.js';
6
- import FlameGraphCanvas from './FlameGraphCanvas.js';
7
- import FlameGraphMetadata from './FlameGraphMetadata.js';
5
+ import { PIXELS_PER_LEVEL } from '../constants.mjs';
6
+ import FlameGraphCanvas from './FlameGraphCanvas.mjs';
7
+ import FlameGraphMetadata from './FlameGraphMetadata.mjs';
8
8
 
9
9
  const FlameGraph = ({
10
10
  data,
@@ -166,4 +166,4 @@ const getStyles = () => ({
166
166
  });
167
167
 
168
168
  export { FlameGraph as default };
169
- //# sourceMappingURL=FlameGraph.js.map
169
+ //# sourceMappingURL=FlameGraph.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"FlameGraph.mjs","sources":["../../../src/FlameGraph/FlameGraph.tsx"],"sourcesContent":["// This component is based on logic from the flamebearer project\n// https://github.com/mapbox/flamebearer\n\n// ISC License\n\n// Copyright (c) 2018, Mapbox\n\n// Permission to use, copy, modify, and/or distribute this software for any purpose\n// with or without fee is hereby granted, provided that the above copyright notice\n// and this permission notice appear in all copies.\n\n// THE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH\n// REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND\n// FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,\n// INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS\n// OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER\n// TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF\n// THIS SOFTWARE.\nimport { css, cx } from '@emotion/css';\nimport { useEffect, useState } from 'react';\nimport * as React from 'react';\n\nimport { Icon } from '@grafana/ui';\n\nimport { PIXELS_PER_LEVEL } from '../constants';\nimport { ClickedItemData, ColorScheme, ColorSchemeDiff, SelectedView, TextAlign } from '../types';\n\nimport FlameGraphCanvas from './FlameGraphCanvas';\nimport { GetExtraContextMenuButtonsFunction } from './FlameGraphContextMenu';\nimport FlameGraphMetadata from './FlameGraphMetadata';\nimport { CollapsedMap, FlameGraphDataContainer, LevelItem } from './dataTransform';\n\ntype Props = {\n data: FlameGraphDataContainer;\n rangeMin: number;\n rangeMax: number;\n matchedLabels?: Set<string>;\n setRangeMin: (range: number) => void;\n setRangeMax: (range: number) => void;\n style?: React.CSSProperties;\n onItemFocused: (data: ClickedItemData) => void;\n focusedItemData?: ClickedItemData;\n textAlign: TextAlign;\n sandwichItem?: string;\n onSandwich: (label: string) => void;\n onFocusPillClick: () => void;\n onSandwichPillClick: () => void;\n colorScheme: ColorScheme | ColorSchemeDiff;\n showFlameGraphOnly?: boolean;\n getExtraContextMenuButtons?: GetExtraContextMenuButtonsFunction;\n collapsing?: boolean;\n selectedView: SelectedView;\n search: string;\n collapsedMap: CollapsedMap;\n setCollapsedMap: (collapsedMap: CollapsedMap) => void;\n};\n\nconst FlameGraph = ({\n data,\n rangeMin,\n rangeMax,\n matchedLabels,\n setRangeMin,\n setRangeMax,\n onItemFocused,\n focusedItemData,\n textAlign,\n onSandwich,\n sandwichItem,\n onFocusPillClick,\n onSandwichPillClick,\n colorScheme,\n showFlameGraphOnly,\n getExtraContextMenuButtons,\n collapsing,\n selectedView,\n search,\n collapsedMap,\n setCollapsedMap,\n}: Props) => {\n const styles = getStyles();\n\n const [levels, setLevels] = useState<LevelItem[][]>();\n const [levelsCallers, setLevelsCallers] = useState<LevelItem[][]>();\n const [totalProfileTicks, setTotalProfileTicks] = useState<number>(0);\n const [totalProfileTicksRight, setTotalProfileTicksRight] = useState<number>();\n const [totalViewTicks, setTotalViewTicks] = useState<number>(0);\n\n useEffect(() => {\n if (data) {\n let levels = data.getLevels();\n let totalProfileTicks = levels.length ? levels[0][0].value : 0;\n let totalProfileTicksRight = levels.length ? levels[0][0].valueRight : undefined;\n let totalViewTicks = totalProfileTicks;\n let levelsCallers = undefined;\n\n if (sandwichItem) {\n const [callers, callees] = data.getSandwichLevels(sandwichItem);\n levels = callees;\n levelsCallers = callers;\n // We need this separate as in case of diff profile we want to compute diff colors based on the original ticks.\n totalViewTicks = callees[0]?.[0]?.value ?? 0;\n }\n setLevels(levels);\n setLevelsCallers(levelsCallers);\n setTotalProfileTicks(totalProfileTicks);\n setTotalProfileTicksRight(totalProfileTicksRight);\n setTotalViewTicks(totalViewTicks);\n }\n }, [data, sandwichItem]);\n\n if (!levels) {\n return null;\n }\n\n const commonCanvasProps = {\n data,\n rangeMin,\n rangeMax,\n matchedLabels,\n setRangeMin,\n setRangeMax,\n onItemFocused,\n focusedItemData,\n textAlign,\n onSandwich,\n colorScheme,\n totalProfileTicks,\n totalProfileTicksRight,\n totalViewTicks,\n showFlameGraphOnly,\n collapsedMap,\n setCollapsedMap,\n getExtraContextMenuButtons,\n collapsing,\n search,\n selectedView,\n };\n let canvas = null;\n\n if (levelsCallers?.length) {\n canvas = (\n <>\n <div className={styles.sandwichCanvasWrapper}>\n <div className={styles.sandwichMarker}>\n Callers\n <Icon className={styles.sandwichMarkerIcon} name={'arrow-down'} />\n </div>\n <FlameGraphCanvas\n {...commonCanvasProps}\n root={levelsCallers[levelsCallers.length - 1][0]}\n depth={levelsCallers.length}\n direction={'parents'}\n // We do not support collapsing in sandwich view for now.\n collapsing={false}\n />\n </div>\n\n <div className={styles.sandwichCanvasWrapper}>\n <div className={cx(styles.sandwichMarker, styles.sandwichMarkerCalees)}>\n <Icon className={styles.sandwichMarkerIcon} name={'arrow-up'} />\n Callees\n </div>\n <FlameGraphCanvas\n {...commonCanvasProps}\n root={levels[0][0]}\n depth={levels.length}\n direction={'children'}\n collapsing={false}\n />\n </div>\n </>\n );\n } else if (levels?.length) {\n canvas = (\n <FlameGraphCanvas {...commonCanvasProps} root={levels[0][0]} depth={levels.length} direction={'children'} />\n );\n }\n\n return (\n <div className={styles.graph}>\n <FlameGraphMetadata\n data={data}\n focusedItem={focusedItemData}\n sandwichedLabel={sandwichItem}\n totalTicks={totalViewTicks}\n onFocusPillClick={onFocusPillClick}\n onSandwichPillClick={onSandwichPillClick}\n />\n {canvas}\n </div>\n );\n};\n\nconst getStyles = () => ({\n graph: css({\n label: 'graph',\n overflow: 'auto',\n flexGrow: 1,\n flexBasis: '50%',\n }),\n sandwichCanvasWrapper: css({\n label: 'sandwichCanvasWrapper',\n display: 'flex',\n marginBottom: `${PIXELS_PER_LEVEL / window.devicePixelRatio}px`,\n }),\n sandwichMarker: css({\n label: 'sandwichMarker',\n writingMode: 'vertical-lr',\n transform: 'rotate(180deg)',\n overflow: 'hidden',\n whiteSpace: 'nowrap',\n }),\n sandwichMarkerCalees: css({\n label: 'sandwichMarkerCalees',\n textAlign: 'right',\n }),\n sandwichMarkerIcon: css({\n label: 'sandwichMarkerIcon',\n verticalAlign: 'baseline',\n }),\n});\n\nexport default FlameGraph;\n"],"names":["levels","totalProfileTicks","totalProfileTicksRight","totalViewTicks","levelsCallers"],"mappings":"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"}
@@ -2,10 +2,10 @@ import { jsxs, jsx } from 'react/jsx-runtime';
2
2
  import { css } from '@emotion/css';
3
3
  import { useRef, useState, useCallback, useEffect } from 'react';
4
4
  import { useMeasure } from 'react-use';
5
- import { PIXELS_PER_LEVEL } from '../constants.js';
6
- import FlameGraphContextMenu from './FlameGraphContextMenu.js';
7
- import FlameGraphTooltip from './FlameGraphTooltip.js';
8
- import { useFlameRender, getBarX } from './rendering.js';
5
+ import { PIXELS_PER_LEVEL } from '../constants.mjs';
6
+ import FlameGraphContextMenu from './FlameGraphContextMenu.mjs';
7
+ import FlameGraphTooltip from './FlameGraphTooltip.mjs';
8
+ import { useFlameRender, getBarX } from './rendering.mjs';
9
9
 
10
10
  const FlameGraphCanvas = ({
11
11
  data,
@@ -241,4 +241,4 @@ const convertPixelCoordinatesToBarCoordinates = (pos, root, direction, depth, pi
241
241
  };
242
242
 
243
243
  export { convertPixelCoordinatesToBarCoordinates, FlameGraphCanvas as default };
244
- //# sourceMappingURL=FlameGraphCanvas.js.map
244
+ //# sourceMappingURL=FlameGraphCanvas.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"FlameGraphCanvas.mjs","sources":["../../../src/FlameGraph/FlameGraphCanvas.tsx"],"sourcesContent":["import { css } from '@emotion/css';\nimport { MouseEvent as ReactMouseEvent, useCallback, useEffect, useRef, useState } from 'react';\nimport * as React from 'react';\nimport { useMeasure } from 'react-use';\n\nimport { PIXELS_PER_LEVEL } from '../constants';\nimport { ClickedItemData, ColorScheme, ColorSchemeDiff, SelectedView, TextAlign } from '../types';\n\nimport FlameGraphContextMenu, { GetExtraContextMenuButtonsFunction } from './FlameGraphContextMenu';\nimport FlameGraphTooltip from './FlameGraphTooltip';\nimport { CollapsedMap, FlameGraphDataContainer, LevelItem } from './dataTransform';\nimport { getBarX, useFlameRender } from './rendering';\n\ntype Props = {\n data: FlameGraphDataContainer;\n rangeMin: number;\n rangeMax: number;\n matchedLabels: Set<string> | undefined;\n setRangeMin: (range: number) => void;\n setRangeMax: (range: number) => void;\n style?: React.CSSProperties;\n onItemFocused: (data: ClickedItemData) => void;\n focusedItemData?: ClickedItemData;\n textAlign: TextAlign;\n onSandwich: (label: string) => void;\n colorScheme: ColorScheme | ColorSchemeDiff;\n\n root: LevelItem;\n direction: 'children' | 'parents';\n // Depth in number of levels\n depth: number;\n\n totalProfileTicks: number;\n totalProfileTicksRight?: number;\n totalViewTicks: number;\n showFlameGraphOnly?: boolean;\n\n collapsedMap: CollapsedMap;\n setCollapsedMap: (collapsedMap: CollapsedMap) => void;\n collapsing?: boolean;\n getExtraContextMenuButtons?: GetExtraContextMenuButtonsFunction;\n\n selectedView: SelectedView;\n search: string;\n};\n\nconst FlameGraphCanvas = ({\n data,\n rangeMin,\n rangeMax,\n matchedLabels,\n setRangeMin,\n setRangeMax,\n onItemFocused,\n focusedItemData,\n textAlign,\n onSandwich,\n colorScheme,\n totalProfileTicks,\n totalProfileTicksRight,\n totalViewTicks,\n root,\n direction,\n depth,\n showFlameGraphOnly,\n collapsedMap,\n setCollapsedMap,\n collapsing,\n getExtraContextMenuButtons,\n selectedView,\n search,\n}: Props) => {\n const styles = getStyles();\n\n const [sizeRef, { width: wrapperWidth }] = useMeasure<HTMLDivElement>();\n const graphRef = useRef<HTMLCanvasElement>(null);\n const [tooltipItem, setTooltipItem] = useState<LevelItem>();\n\n const [clickedItemData, setClickedItemData] = useState<ClickedItemData>();\n\n useFlameRender({\n canvasRef: graphRef,\n colorScheme,\n data,\n focusedItemData,\n root,\n direction,\n depth,\n rangeMax,\n rangeMin,\n matchedLabels,\n textAlign,\n totalViewTicks,\n // We need this so that if we have a diff profile and are in sandwich view we still show the same diff colors.\n totalColorTicks: data.isDiffFlamegraph() ? totalProfileTicks : totalViewTicks,\n totalTicksRight: totalProfileTicksRight,\n wrapperWidth,\n collapsedMap,\n });\n\n const onGraphClick = useCallback(\n (e: ReactMouseEvent<HTMLCanvasElement>) => {\n setTooltipItem(undefined);\n const pixelsPerTick = graphRef.current!.clientWidth / totalViewTicks / (rangeMax - rangeMin);\n const item = convertPixelCoordinatesToBarCoordinates(\n { x: e.nativeEvent.offsetX, y: e.nativeEvent.offsetY },\n root,\n direction,\n depth,\n pixelsPerTick,\n totalViewTicks,\n rangeMin,\n collapsedMap\n );\n\n // if clicking on a block in the canvas\n if (item) {\n setClickedItemData({\n posY: e.clientY,\n posX: e.clientX,\n item,\n label: data.getLabel(item.itemIndexes[0]),\n });\n } else {\n // if clicking on the canvas but there is no block beneath the cursor\n setClickedItemData(undefined);\n }\n },\n [data, rangeMin, rangeMax, totalViewTicks, root, direction, depth, collapsedMap]\n );\n\n const [mousePosition, setMousePosition] = useState<{ x: number; y: number }>();\n const onGraphMouseMove = useCallback(\n (e: ReactMouseEvent<HTMLCanvasElement>) => {\n if (clickedItemData === undefined) {\n setTooltipItem(undefined);\n setMousePosition(undefined);\n const pixelsPerTick = graphRef.current!.clientWidth / totalViewTicks / (rangeMax - rangeMin);\n const item = convertPixelCoordinatesToBarCoordinates(\n { x: e.nativeEvent.offsetX, y: e.nativeEvent.offsetY },\n root,\n direction,\n depth,\n pixelsPerTick,\n totalViewTicks,\n rangeMin,\n collapsedMap\n );\n\n if (item) {\n setMousePosition({ x: e.clientX, y: e.clientY });\n setTooltipItem(item);\n }\n }\n },\n [rangeMin, rangeMax, totalViewTicks, clickedItemData, setMousePosition, root, direction, depth, collapsedMap]\n );\n\n const onGraphMouseLeave = useCallback(() => {\n setTooltipItem(undefined);\n }, []);\n\n // hide context menu if outside the flame graph canvas is clicked\n useEffect(() => {\n const handleOnClick = (e: MouseEvent) => {\n if (\n e.target instanceof HTMLElement &&\n e.target.parentElement?.id !== 'flameGraphCanvasContainer_clickOutsideCheck'\n ) {\n setClickedItemData(undefined);\n }\n };\n window.addEventListener('click', handleOnClick);\n return () => window.removeEventListener('click', handleOnClick);\n }, [setClickedItemData]);\n\n return (\n <div className={styles.graph}>\n <div className={styles.canvasWrapper} id=\"flameGraphCanvasContainer_clickOutsideCheck\" ref={sizeRef}>\n <canvas\n ref={graphRef}\n data-testid=\"flameGraph\"\n onClick={onGraphClick}\n onMouseMove={onGraphMouseMove}\n onMouseLeave={onGraphMouseLeave}\n />\n </div>\n <FlameGraphTooltip\n position={mousePosition}\n item={tooltipItem}\n data={data}\n totalTicks={totalViewTicks}\n collapseConfig={tooltipItem ? collapsedMap.get(tooltipItem) : undefined}\n />\n {!showFlameGraphOnly && clickedItemData && (\n <FlameGraphContextMenu\n data={data}\n itemData={clickedItemData}\n collapsing={collapsing}\n collapseConfig={collapsedMap.get(clickedItemData.item)}\n onMenuItemClick={() => {\n setClickedItemData(undefined);\n }}\n onItemFocus={() => {\n setRangeMin(clickedItemData.item.start / totalViewTicks);\n setRangeMax((clickedItemData.item.start + clickedItemData.item.value) / totalViewTicks);\n onItemFocused(clickedItemData);\n }}\n onSandwich={() => {\n onSandwich(data.getLabel(clickedItemData.item.itemIndexes[0]));\n }}\n onExpandGroup={() => {\n setCollapsedMap(collapsedMap.setCollapsedStatus(clickedItemData.item, false));\n }}\n onCollapseGroup={() => {\n setCollapsedMap(collapsedMap.setCollapsedStatus(clickedItemData.item, true));\n }}\n onExpandAllGroups={() => {\n setCollapsedMap(collapsedMap.setAllCollapsedStatus(false));\n }}\n onCollapseAllGroups={() => {\n setCollapsedMap(collapsedMap.setAllCollapsedStatus(true));\n }}\n allGroupsCollapsed={Array.from(collapsedMap.values()).every((i) => i.collapsed)}\n allGroupsExpanded={Array.from(collapsedMap.values()).every((i) => !i.collapsed)}\n getExtraContextMenuButtons={getExtraContextMenuButtons}\n selectedView={selectedView}\n search={search}\n />\n )}\n </div>\n );\n};\n\nconst getStyles = () => ({\n graph: css({\n label: 'graph',\n overflow: 'auto',\n flexGrow: 1,\n flexBasis: '50%',\n }),\n canvasContainer: css({\n label: 'canvasContainer',\n display: 'flex',\n }),\n canvasWrapper: css({\n label: 'canvasWrapper',\n cursor: 'pointer',\n flex: 1,\n overflow: 'hidden',\n }),\n sandwichMarker: css({\n label: 'sandwichMarker',\n writingMode: 'vertical-lr',\n transform: 'rotate(180deg)',\n overflow: 'hidden',\n whiteSpace: 'nowrap',\n }),\n sandwichMarkerIcon: css({\n label: 'sandwichMarkerIcon',\n verticalAlign: 'baseline',\n }),\n});\n\nexport const convertPixelCoordinatesToBarCoordinates = (\n // position relative to the start of the graph\n pos: { x: number; y: number },\n root: LevelItem,\n direction: 'children' | 'parents',\n depth: number,\n pixelsPerTick: number,\n totalTicks: number,\n rangeMin: number,\n collapsedMap: CollapsedMap\n): LevelItem | undefined => {\n let next: LevelItem | undefined = root;\n let currentLevel = direction === 'children' ? 0 : depth - 1;\n const levelIndex = Math.floor(pos.y / (PIXELS_PER_LEVEL / window.devicePixelRatio));\n let found = undefined;\n\n while (next) {\n const node: LevelItem = next;\n next = undefined;\n if (currentLevel === levelIndex) {\n found = node;\n break;\n }\n\n const nextList = direction === 'children' ? node.children : node.parents || [];\n\n for (const child of nextList) {\n const xStart = getBarX(child.start, totalTicks, rangeMin, pixelsPerTick);\n const xEnd = getBarX(child.start + child.value, totalTicks, rangeMin, pixelsPerTick);\n if (xStart <= pos.x && pos.x < xEnd) {\n next = child;\n // Check if item is a collapsed item. if so also check if the item is the first collapsed item in the chain,\n // which we render, or a child which we don't render. If it's a child in the chain then don't increase the\n // level end effectively skip it.\n const collapsedConfig = collapsedMap.get(child);\n if (!collapsedConfig || !collapsedConfig.collapsed || collapsedConfig.items[0] === child) {\n currentLevel = currentLevel + (direction === 'children' ? 1 : -1);\n }\n break;\n }\n }\n }\n\n return found;\n};\n\nexport default FlameGraphCanvas;\n"],"names":[],"mappings":"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"}
@@ -123,4 +123,4 @@ const FlameGraphContextMenu = ({
123
123
  };
124
124
 
125
125
  export { FlameGraphContextMenu as default };
126
- //# sourceMappingURL=FlameGraphContextMenu.js.map
126
+ //# sourceMappingURL=FlameGraphContextMenu.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"FlameGraphContextMenu.mjs","sources":["../../../src/FlameGraph/FlameGraphContextMenu.tsx"],"sourcesContent":["import { DataFrame } from '@grafana/data';\nimport { MenuItem, MenuGroup, ContextMenu, IconName } from '@grafana/ui';\n\nimport { ClickedItemData, SelectedView } from '../types';\n\nimport { CollapseConfig, FlameGraphDataContainer } from './dataTransform';\n\nexport type GetExtraContextMenuButtonsFunction = (\n clickedItemData: ClickedItemData,\n data: DataFrame,\n state: { selectedView: SelectedView; isDiff: boolean; search: string; collapseConfig?: CollapseConfig }\n) => ExtraContextMenuButton[];\n\nexport type ExtraContextMenuButton = {\n label: string;\n icon: IconName;\n onClick: () => void;\n};\n\ntype Props = {\n data: FlameGraphDataContainer;\n itemData: ClickedItemData;\n onMenuItemClick: () => void;\n onItemFocus: () => void;\n onSandwich: () => void;\n onExpandGroup: () => void;\n onCollapseGroup: () => void;\n onExpandAllGroups: () => void;\n onCollapseAllGroups: () => void;\n getExtraContextMenuButtons?: GetExtraContextMenuButtonsFunction;\n collapseConfig?: CollapseConfig;\n collapsing?: boolean;\n allGroupsCollapsed?: boolean;\n allGroupsExpanded?: boolean;\n selectedView: SelectedView;\n search: string;\n};\n\nconst FlameGraphContextMenu = ({\n data,\n itemData,\n onMenuItemClick,\n onItemFocus,\n onSandwich,\n collapseConfig,\n onExpandGroup,\n onCollapseGroup,\n onExpandAllGroups,\n onCollapseAllGroups,\n getExtraContextMenuButtons,\n collapsing,\n allGroupsExpanded,\n allGroupsCollapsed,\n selectedView,\n search,\n}: Props) => {\n function renderItems() {\n const extraButtons =\n getExtraContextMenuButtons?.(itemData, data.data, {\n selectedView,\n isDiff: data.isDiffFlamegraph(),\n search,\n collapseConfig,\n }) || [];\n return (\n <>\n <MenuItem\n label=\"Focus block\"\n icon={'eye'}\n onClick={() => {\n onItemFocus();\n onMenuItemClick();\n }}\n />\n <MenuItem\n label=\"Copy function name\"\n icon={'copy'}\n onClick={() => {\n navigator.clipboard.writeText(itemData.label).then(() => {\n onMenuItemClick();\n });\n }}\n />\n <MenuItem\n label=\"Sandwich view\"\n icon={'gf-show-context'}\n onClick={() => {\n onSandwich();\n onMenuItemClick();\n }}\n />\n {extraButtons.map(({ label, icon, onClick }) => {\n return <MenuItem label={label} icon={icon} onClick={() => onClick()} key={label} />;\n })}\n {collapsing && (\n <MenuGroup label={'Grouping'}>\n {collapseConfig ? (\n collapseConfig.collapsed ? (\n <MenuItem\n label=\"Expand group\"\n icon={'angle-double-down'}\n onClick={() => {\n onExpandGroup();\n onMenuItemClick();\n }}\n />\n ) : (\n <MenuItem\n label=\"Collapse group\"\n icon={'angle-double-up'}\n onClick={() => {\n onCollapseGroup();\n onMenuItemClick();\n }}\n />\n )\n ) : null}\n {!allGroupsExpanded && (\n <MenuItem\n label=\"Expand all groups\"\n icon={'angle-double-down'}\n onClick={() => {\n onExpandAllGroups();\n onMenuItemClick();\n }}\n />\n )}\n {!allGroupsCollapsed && (\n <MenuItem\n label=\"Collapse all groups\"\n icon={'angle-double-up'}\n onClick={() => {\n onCollapseAllGroups();\n onMenuItemClick();\n }}\n />\n )}\n </MenuGroup>\n )}\n </>\n );\n }\n\n return (\n <div data-testid=\"contextMenu\">\n <ContextMenu\n renderMenuItems={renderItems}\n x={itemData.posX + 10}\n y={itemData.posY}\n focusOnOpen={false}\n ></ContextMenu>\n </div>\n );\n};\n\nexport default FlameGraphContextMenu;\n"],"names":[],"mappings":"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"}
@@ -116,4 +116,4 @@ const getStyles = (theme) => ({
116
116
  });
117
117
 
118
118
  export { FlameGraphMetadata as default };
119
- //# sourceMappingURL=FlameGraphMetadata.js.map
119
+ //# sourceMappingURL=FlameGraphMetadata.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"FlameGraphMetadata.mjs","sources":["../../../src/FlameGraph/FlameGraphMetadata.tsx"],"sourcesContent":["import { css } from '@emotion/css';\nimport { memo, ReactNode } from 'react';\n\nimport { getValueFormat, GrafanaTheme2 } from '@grafana/data';\nimport { Icon, IconButton, Tooltip, useStyles2 } from '@grafana/ui';\n\nimport { ClickedItemData } from '../types';\n\nimport { FlameGraphDataContainer } from './dataTransform';\n\ntype Props = {\n data: FlameGraphDataContainer;\n totalTicks: number;\n onFocusPillClick: () => void;\n onSandwichPillClick: () => void;\n focusedItem?: ClickedItemData;\n sandwichedLabel?: string;\n};\n\nconst FlameGraphMetadata = memo(\n ({ data, focusedItem, totalTicks, sandwichedLabel, onFocusPillClick, onSandwichPillClick }: Props) => {\n const styles = useStyles2(getStyles);\n const parts: ReactNode[] = [];\n const ticksVal = getValueFormat('short')(totalTicks);\n\n const displayValue = data.valueDisplayProcessor(totalTicks);\n let unitValue = displayValue.text + displayValue.suffix;\n const unitTitle = data.getUnitTitle();\n if (unitTitle === 'Count') {\n if (!displayValue.suffix) {\n // Makes sure we don't show 123undefined or something like that if suffix isn't defined\n unitValue = displayValue.text;\n }\n }\n\n parts.push(\n <div className={styles.metadataPill} key={'default'}>\n {unitValue} | {ticksVal.text}\n {ticksVal.suffix} samples ({unitTitle})\n </div>\n );\n\n if (sandwichedLabel) {\n parts.push(\n <Tooltip key={'sandwich'} content={sandwichedLabel} placement=\"top\">\n <div>\n <Icon size={'sm'} name={'angle-right'} />\n <div className={styles.metadataPill}>\n <Icon size={'sm'} name={'gf-show-context'} />{' '}\n <span className={styles.metadataPillName}>\n {sandwichedLabel.substring(sandwichedLabel.lastIndexOf('/') + 1)}\n </span>\n <IconButton\n className={styles.pillCloseButton}\n name={'times'}\n size={'sm'}\n onClick={onSandwichPillClick}\n tooltip={'Remove sandwich view'}\n aria-label={'Remove sandwich view'}\n />\n </div>\n </div>\n </Tooltip>\n );\n }\n\n if (focusedItem) {\n const percentValue = totalTicks > 0 ? Math.round(10000 * (focusedItem.item.value / totalTicks)) / 100 : 0;\n const iconName = percentValue > 0 ? 'eye' : 'exclamation-circle';\n\n parts.push(\n <Tooltip key={'focus'} content={focusedItem.label} placement=\"top\">\n <div>\n <Icon size={'sm'} name={'angle-right'} />\n <div className={styles.metadataPill}>\n <Icon size={'sm'} name={iconName} />\n &nbsp;{percentValue}% of total\n <IconButton\n className={styles.pillCloseButton}\n name={'times'}\n size={'sm'}\n onClick={onFocusPillClick}\n tooltip={'Remove focus'}\n aria-label={'Remove focus'}\n />\n </div>\n </div>\n </Tooltip>\n );\n }\n\n return <div className={styles.metadata}>{parts}</div>;\n }\n);\n\nFlameGraphMetadata.displayName = 'FlameGraphMetadata';\n\nconst getStyles = (theme: GrafanaTheme2) => ({\n metadataPill: css({\n label: 'metadataPill',\n display: 'inline-flex',\n alignItems: 'center',\n background: theme.colors.background.secondary,\n borderRadius: theme.shape.borderRadius(8),\n padding: theme.spacing(0.5, 1),\n fontSize: theme.typography.bodySmall.fontSize,\n fontWeight: theme.typography.fontWeightMedium,\n lineHeight: theme.typography.bodySmall.lineHeight,\n color: theme.colors.text.secondary,\n }),\n pillCloseButton: css({\n label: 'pillCloseButton',\n verticalAlign: 'text-bottom',\n margin: theme.spacing(0, 0.5),\n }),\n metadata: css({\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n margin: '8px 0',\n }),\n metadataPillName: css({\n label: 'metadataPillName',\n maxWidth: '200px',\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n whiteSpace: 'nowrap',\n marginLeft: theme.spacing(0.5),\n }),\n});\n\nexport default FlameGraphMetadata;\n"],"names":[],"mappings":";;;;;;AAmBA,MAAM,kBAAqB,GAAA,IAAA;AAAA,EACzB,CAAC,EAAE,IAAM,EAAA,WAAA,EAAa,YAAY,eAAiB,EAAA,gBAAA,EAAkB,qBAAiC,KAAA;AACpG,IAAM,MAAA,MAAA,GAAS,WAAW,SAAS,CAAA;AACnC,IAAA,MAAM,QAAqB,EAAC;AAC5B,IAAA,MAAM,QAAW,GAAA,cAAA,CAAe,OAAO,CAAA,CAAE,UAAU,CAAA;AAEnD,IAAM,MAAA,YAAA,GAAe,IAAK,CAAA,qBAAA,CAAsB,UAAU,CAAA;AAC1D,IAAI,IAAA,SAAA,GAAY,YAAa,CAAA,IAAA,GAAO,YAAa,CAAA,MAAA;AACjD,IAAM,MAAA,SAAA,GAAY,KAAK,YAAa,EAAA;AACpC,IAAA,IAAI,cAAc,OAAS,EAAA;AACzB,MAAI,IAAA,CAAC,aAAa,MAAQ,EAAA;AAExB,QAAA,SAAA,GAAY,YAAa,CAAA,IAAA;AAAA;AAC3B;AAGF,IAAM,KAAA,CAAA,IAAA;AAAA,sBACH,IAAA,CAAA,KAAA,EAAA,EAAI,SAAW,EAAA,MAAA,CAAO,YACpB,EAAA,QAAA,EAAA;AAAA,QAAA,SAAA;AAAA,QAAU,KAAA;AAAA,QAAI,QAAS,CAAA,IAAA;AAAA,QACvB,QAAS,CAAA,MAAA;AAAA,QAAO,YAAA;AAAA,QAAW,SAAA;AAAA,QAAU;AAAA,OAAA,EAAA,EAFE,SAG1C;AAAA,KACF;AAEA,IAAA,IAAI,eAAiB,EAAA;AACnB,MAAM,KAAA,CAAA,IAAA;AAAA,4BACH,OAAyB,EAAA,EAAA,OAAA,EAAS,iBAAiB,SAAU,EAAA,KAAA,EAC5D,+BAAC,KACC,EAAA,EAAA,QAAA,EAAA;AAAA,0BAAA,GAAA,CAAC,IAAK,EAAA,EAAA,IAAA,EAAM,IAAM,EAAA,IAAA,EAAM,aAAe,EAAA,CAAA;AAAA,0BACtC,IAAA,CAAA,KAAA,EAAA,EAAI,SAAW,EAAA,MAAA,CAAO,YACrB,EAAA,QAAA,EAAA;AAAA,4BAAA,GAAA,CAAC,IAAK,EAAA,EAAA,IAAA,EAAM,IAAM,EAAA,IAAA,EAAM,iBAAmB,EAAA,CAAA;AAAA,YAAG,GAAA;AAAA,4BAC7C,GAAA,CAAA,MAAA,EAAA,EAAK,SAAW,EAAA,MAAA,CAAO,gBACrB,EAAA,QAAA,EAAA,eAAA,CAAgB,SAAU,CAAA,eAAA,CAAgB,WAAY,CAAA,GAAG,CAAI,GAAA,CAAC,CACjE,EAAA,CAAA;AAAA,4BACA,GAAA;AAAA,cAAC,UAAA;AAAA,cAAA;AAAA,gBACC,WAAW,MAAO,CAAA,eAAA;AAAA,gBAClB,IAAM,EAAA,OAAA;AAAA,gBACN,IAAM,EAAA,IAAA;AAAA,gBACN,OAAS,EAAA,mBAAA;AAAA,gBACT,OAAS,EAAA,sBAAA;AAAA,gBACT,YAAY,EAAA;AAAA;AAAA;AACd,WACF,EAAA;AAAA,SAAA,EACF,KAjBY,UAkBd;AAAA,OACF;AAAA;AAGF,IAAA,IAAI,WAAa,EAAA;AACf,MAAM,MAAA,YAAA,GAAe,UAAa,GAAA,CAAA,GAAI,IAAK,CAAA,KAAA,CAAM,GAAS,IAAA,WAAA,CAAY,IAAK,CAAA,KAAA,GAAQ,UAAW,CAAA,CAAA,GAAI,GAAM,GAAA,CAAA;AACxG,MAAM,MAAA,QAAA,GAAW,YAAe,GAAA,CAAA,GAAI,KAAQ,GAAA,oBAAA;AAE5C,MAAM,KAAA,CAAA,IAAA;AAAA,wBACJ,GAAA,CAAC,WAAsB,OAAS,EAAA,WAAA,CAAY,OAAO,SAAU,EAAA,KAAA,EAC3D,+BAAC,KACC,EAAA,EAAA,QAAA,EAAA;AAAA,0BAAA,GAAA,CAAC,IAAK,EAAA,EAAA,IAAA,EAAM,IAAM,EAAA,IAAA,EAAM,aAAe,EAAA,CAAA;AAAA,0BACtC,IAAA,CAAA,KAAA,EAAA,EAAI,SAAW,EAAA,MAAA,CAAO,YACrB,EAAA,QAAA,EAAA;AAAA,4BAAA,GAAA,CAAC,IAAK,EAAA,EAAA,IAAA,EAAM,IAAM,EAAA,IAAA,EAAM,QAAU,EAAA,CAAA;AAAA,YAAE,MAAA;AAAA,YAC7B,YAAA;AAAA,YAAa,YAAA;AAAA,4BACpB,GAAA;AAAA,cAAC,UAAA;AAAA,cAAA;AAAA,gBACC,WAAW,MAAO,CAAA,eAAA;AAAA,gBAClB,IAAM,EAAA,OAAA;AAAA,gBACN,IAAM,EAAA,IAAA;AAAA,gBACN,OAAS,EAAA,gBAAA;AAAA,gBACT,OAAS,EAAA,cAAA;AAAA,gBACT,YAAY,EAAA;AAAA;AAAA;AACd,WACF,EAAA;AAAA,SAAA,EACF,KAfY,OAgBd;AAAA,OACF;AAAA;AAGF,IAAA,uBAAQ,GAAA,CAAA,KAAA,EAAA,EAAI,SAAW,EAAA,MAAA,CAAO,UAAW,QAAM,EAAA,KAAA,EAAA,CAAA;AAAA;AAEnD;AAEA,kBAAA,CAAmB,WAAc,GAAA,oBAAA;AAEjC,MAAM,SAAA,GAAY,CAAC,KAA0B,MAAA;AAAA,EAC3C,cAAc,GAAI,CAAA;AAAA,IAChB,KAAO,EAAA,cAAA;AAAA,IACP,OAAS,EAAA,aAAA;AAAA,IACT,UAAY,EAAA,QAAA;AAAA,IACZ,UAAA,EAAY,KAAM,CAAA,MAAA,CAAO,UAAW,CAAA,SAAA;AAAA,IACpC,YAAc,EAAA,KAAA,CAAM,KAAM,CAAA,YAAA,CAAa,CAAC,CAAA;AAAA,IACxC,OAAS,EAAA,KAAA,CAAM,OAAQ,CAAA,GAAA,EAAK,CAAC,CAAA;AAAA,IAC7B,QAAA,EAAU,KAAM,CAAA,UAAA,CAAW,SAAU,CAAA,QAAA;AAAA,IACrC,UAAA,EAAY,MAAM,UAAW,CAAA,gBAAA;AAAA,IAC7B,UAAA,EAAY,KAAM,CAAA,UAAA,CAAW,SAAU,CAAA,UAAA;AAAA,IACvC,KAAA,EAAO,KAAM,CAAA,MAAA,CAAO,IAAK,CAAA;AAAA,GAC1B,CAAA;AAAA,EACD,iBAAiB,GAAI,CAAA;AAAA,IACnB,KAAO,EAAA,iBAAA;AAAA,IACP,aAAe,EAAA,aAAA;AAAA,IACf,MAAQ,EAAA,KAAA,CAAM,OAAQ,CAAA,CAAA,EAAG,GAAG;AAAA,GAC7B,CAAA;AAAA,EACD,UAAU,GAAI,CAAA;AAAA,IACZ,OAAS,EAAA,MAAA;AAAA,IACT,UAAY,EAAA,QAAA;AAAA,IACZ,cAAgB,EAAA,QAAA;AAAA,IAChB,MAAQ,EAAA;AAAA,GACT,CAAA;AAAA,EACD,kBAAkB,GAAI,CAAA;AAAA,IACpB,KAAO,EAAA,kBAAA;AAAA,IACP,QAAU,EAAA,OAAA;AAAA,IACV,QAAU,EAAA,QAAA;AAAA,IACV,YAAc,EAAA,UAAA;AAAA,IACd,UAAY,EAAA,QAAA;AAAA,IACZ,UAAA,EAAY,KAAM,CAAA,OAAA,CAAQ,GAAG;AAAA,GAC9B;AACH,CAAA,CAAA;;;;"}
@@ -159,4 +159,4 @@ const getStyles = (theme) => ({
159
159
  });
160
160
 
161
161
  export { FlameGraphTooltip as default, getDiffTooltipData, getTooltipData };
162
- //# sourceMappingURL=FlameGraphTooltip.js.map
162
+ //# sourceMappingURL=FlameGraphTooltip.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"FlameGraphTooltip.mjs","sources":["../../../src/FlameGraph/FlameGraphTooltip.tsx"],"sourcesContent":["import { css } from '@emotion/css';\n\nimport { DisplayValue, getValueFormat, GrafanaTheme2 } from '@grafana/data';\nimport { InteractiveTable, Portal, useStyles2, VizTooltipContainer } from '@grafana/ui';\n\nimport { CollapseConfig, FlameGraphDataContainer, LevelItem } from './dataTransform';\n\ntype Props = {\n data: FlameGraphDataContainer;\n totalTicks: number;\n position?: { x: number; y: number };\n item?: LevelItem;\n collapseConfig?: CollapseConfig;\n};\n\nconst FlameGraphTooltip = ({ data, item, totalTicks, position, collapseConfig }: Props) => {\n const styles = useStyles2(getStyles);\n\n if (!(item && position)) {\n return null;\n }\n\n let content;\n\n if (data.isDiffFlamegraph()) {\n const tableData = getDiffTooltipData(data, item, totalTicks);\n content = (\n <InteractiveTable\n className={styles.tooltipTable}\n columns={[\n { id: 'label', header: '' },\n { id: 'baseline', header: 'Baseline' },\n { id: 'comparison', header: 'Comparison' },\n { id: 'diff', header: 'Diff' },\n ]}\n data={tableData}\n getRowId={(originalRow) => originalRow.rowId}\n />\n );\n } else {\n const tooltipData = getTooltipData(data, item, totalTicks);\n content = (\n <p className={styles.lastParagraph}>\n {tooltipData.unitTitle}\n <br />\n Total: <b>{tooltipData.unitValue}</b> ({tooltipData.percentValue}%)\n <br />\n Self: <b>{tooltipData.unitSelf}</b> ({tooltipData.percentSelf}%)\n <br />\n Samples: <b>{tooltipData.samples}</b>\n </p>\n );\n }\n\n return (\n <Portal>\n <VizTooltipContainer className={styles.tooltipContainer} position={position} offset={{ x: 15, y: 0 }}>\n <div className={styles.tooltipContent}>\n <p className={styles.tooltipName}>\n {data.getLabel(item.itemIndexes[0])}\n {collapseConfig && collapseConfig.collapsed ? (\n <span>\n <br />\n and {collapseConfig.items.length} similar items\n </span>\n ) : (\n ''\n )}\n </p>\n {content}\n </div>\n </VizTooltipContainer>\n </Portal>\n );\n};\n\ntype TooltipData = {\n percentValue: number;\n percentSelf: number;\n unitTitle: string;\n unitValue: string;\n unitSelf: string;\n samples: string;\n};\n\nexport const getTooltipData = (data: FlameGraphDataContainer, item: LevelItem, totalTicks: number): TooltipData => {\n const displayValue = data.valueDisplayProcessor(item.value);\n const displaySelf = data.getSelfDisplay(item.itemIndexes);\n\n const percentValue = Math.round(10000 * (displayValue.numeric / totalTicks)) / 100;\n const percentSelf = Math.round(10000 * (displaySelf.numeric / totalTicks)) / 100;\n let unitValue = displayValue.text + displayValue.suffix;\n let unitSelf = displaySelf.text + displaySelf.suffix;\n\n const unitTitle = data.getUnitTitle();\n if (unitTitle === 'Count') {\n if (!displayValue.suffix) {\n // Makes sure we don't show 123undefined or something like that if suffix isn't defined\n unitValue = displayValue.text;\n }\n if (!displaySelf.suffix) {\n // Makes sure we don't show 123undefined or something like that if suffix isn't defined\n unitSelf = displaySelf.text;\n }\n }\n\n return {\n percentValue,\n percentSelf,\n unitTitle,\n unitValue,\n unitSelf,\n samples: displayValue.numeric.toLocaleString(),\n };\n};\n\ntype DiffTableData = {\n rowId: string;\n label: string;\n baseline: string | number;\n comparison: string | number;\n diff: string | number;\n};\n\nexport const getDiffTooltipData = (\n data: FlameGraphDataContainer,\n item: LevelItem,\n totalTicks: number\n): DiffTableData[] => {\n const levels = data.getLevels();\n const totalTicksRight = levels[0][0].valueRight!;\n const totalTicksLeft = totalTicks - totalTicksRight;\n const valueLeft = item.value - item.valueRight!;\n\n const percentageLeft = Math.round((10000 * valueLeft) / totalTicksLeft) / 100;\n const percentageRight = Math.round((10000 * item.valueRight!) / totalTicksRight) / 100;\n\n const diff = ((percentageRight - percentageLeft) / percentageLeft) * 100;\n\n const displayValueLeft = getValueWithUnit(data, data.valueDisplayProcessor(valueLeft));\n const displayValueRight = getValueWithUnit(data, data.valueDisplayProcessor(item.valueRight!));\n\n const shortValFormat = getValueFormat('short');\n\n return [\n {\n rowId: '1',\n label: '% of total',\n baseline: percentageLeft + '%',\n comparison: percentageRight + '%',\n diff: shortValFormat(diff).text + '%',\n },\n {\n rowId: '2',\n label: 'Value',\n baseline: displayValueLeft,\n comparison: displayValueRight,\n diff: getValueWithUnit(data, data.valueDisplayProcessor(item.valueRight! - valueLeft)),\n },\n {\n rowId: '3',\n label: 'Samples',\n baseline: shortValFormat(valueLeft).text,\n comparison: shortValFormat(item.valueRight!).text,\n diff: shortValFormat(item.valueRight! - valueLeft).text,\n },\n ];\n};\n\nfunction getValueWithUnit(data: FlameGraphDataContainer, displayValue: DisplayValue) {\n let unitValue = displayValue.text + displayValue.suffix;\n\n const unitTitle = data.getUnitTitle();\n if (unitTitle === 'Count') {\n if (!displayValue.suffix) {\n // Makes sure we don't show 123undefined or something like that if suffix isn't defined\n unitValue = displayValue.text;\n }\n }\n return unitValue;\n}\n\nconst getStyles = (theme: GrafanaTheme2) => ({\n tooltipContainer: css({\n title: 'tooltipContainer',\n overflow: 'hidden',\n }),\n tooltipContent: css({\n title: 'tooltipContent',\n fontSize: theme.typography.bodySmall.fontSize,\n width: '100%',\n }),\n tooltipName: css({\n title: 'tooltipName',\n marginTop: 0,\n wordBreak: 'break-all',\n }),\n lastParagraph: css({\n title: 'lastParagraph',\n marginBottom: 0,\n }),\n name: css({\n title: 'name',\n marginBottom: '10px',\n }),\n\n tooltipTable: css({\n title: 'tooltipTable',\n maxWidth: '400px',\n }),\n});\n\nexport default FlameGraphTooltip;\n"],"names":[],"mappings":"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"}
@@ -1,7 +1,7 @@
1
1
  import { scaleLinear } from 'd3';
2
2
  import color from 'tinycolor2';
3
- import { ColorSchemeDiff } from '../types.js';
4
- import murmurhash3_32_gc from './murmur3.js';
3
+ import { ColorSchemeDiff } from '../types.mjs';
4
+ import murmurhash3_32_gc from './murmur3.mjs';
5
5
 
6
6
  const packageColors = [
7
7
  color({ h: 24, s: 69, l: 60 }),
@@ -97,4 +97,4 @@ function getPackageName(name) {
97
97
  }
98
98
 
99
99
  export { byPackageGradient, byValueGradient, diffColorBlindColors, diffColorBlindGradient, diffDefaultColors, diffDefaultGradient, getBarColorByDiff, getBarColorByPackage, getBarColorByValue };
100
- //# sourceMappingURL=colors.js.map
100
+ //# sourceMappingURL=colors.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"colors.mjs","sources":["../../../src/FlameGraph/colors.ts"],"sourcesContent":["import { scaleLinear } from 'd3';\nimport color from 'tinycolor2';\n\nimport { GrafanaTheme2 } from '@grafana/data';\n\nimport { ColorSchemeDiff } from '../types';\n\nimport murmurhash3_32_gc from './murmur3';\n\n// Colors taken from pyroscope, they should be from Grafana originally, but I didn't find from where exactly.\nconst packageColors = [\n color({ h: 24, s: 69, l: 60 }),\n color({ h: 34, s: 65, l: 65 }),\n color({ h: 194, s: 52, l: 61 }),\n color({ h: 163, s: 45, l: 55 }),\n color({ h: 211, s: 48, l: 60 }),\n color({ h: 246, s: 40, l: 65 }),\n color({ h: 305, s: 63, l: 79 }),\n color({ h: 47, s: 100, l: 73 }),\n\n color({ r: 183, g: 219, b: 171 }),\n color({ r: 244, g: 213, b: 152 }),\n color({ r: 78, g: 146, b: 249 }),\n color({ r: 249, g: 186, b: 143 }),\n color({ r: 242, g: 145, b: 145 }),\n color({ r: 130, g: 181, b: 216 }),\n color({ r: 229, g: 168, b: 226 }),\n color({ r: 174, g: 162, b: 224 }),\n color({ r: 154, g: 196, b: 138 }),\n color({ r: 242, g: 201, b: 109 }),\n color({ r: 101, g: 197, b: 219 }),\n color({ r: 249, g: 147, b: 78 }),\n color({ r: 234, g: 100, b: 96 }),\n color({ r: 81, g: 149, b: 206 }),\n color({ r: 214, g: 131, b: 206 }),\n color({ r: 128, g: 110, b: 183 }),\n];\n\nconst byValueMinColor = getBarColorByValue(1, 100, 0, 1);\nconst byValueMaxColor = getBarColorByValue(100, 100, 0, 1);\nexport const byValueGradient = `linear-gradient(90deg, ${byValueMinColor} 0%, ${byValueMaxColor} 100%)`;\n\n// Handpicked some vaguely rainbow-ish colors\nexport const byPackageGradient = `linear-gradient(90deg, ${packageColors[0]} 0%, ${packageColors[2]} 30%, ${packageColors[6]} 50%, ${packageColors[7]} 70%, ${packageColors[8]} 100%)`;\n\nexport function getBarColorByValue(value: number, totalTicks: number, rangeMin: number, rangeMax: number) {\n // / (rangeMax - rangeMin) here so when you click a bar it will adjust the top (clicked)bar to the most 'intense' color\n const intensity = Math.min(1, value / totalTicks / (rangeMax - rangeMin));\n const h = 50 - 50 * intensity;\n const l = 65 + 7 * intensity;\n\n return color({ h, s: 100, l });\n}\n\nexport function getBarColorByPackage(label: string, theme: GrafanaTheme2) {\n const packageName = getPackageName(label);\n // TODO: similar thing happens in trace view with selecting colors of the spans, so maybe this could be unified.\n const hash = murmurhash3_32_gc(packageName || '', 0);\n const colorIndex = hash % packageColors.length;\n let packageColor = packageColors[colorIndex].clone();\n if (theme.isLight) {\n packageColor = packageColor.brighten(15);\n }\n return packageColor;\n}\n\n// green to red\nexport const diffDefaultColors = ['rgb(0, 170, 0)', 'rgb(148, 142, 142)', 'rgb(200, 0, 0)'];\nexport const diffDefaultGradient = `linear-gradient(90deg, ${diffDefaultColors[0]} 0%, ${diffDefaultColors[1]} 50%, ${diffDefaultColors[2]} 100%)`;\nexport const diffColorBlindColors = ['rgb(26, 133, 255)', 'rgb(148, 142, 142)', 'rgb(220, 50, 32)'];\nexport const diffColorBlindGradient = `linear-gradient(90deg, ${diffColorBlindColors[0]} 0%, ${diffColorBlindColors[1]} 50%, ${diffColorBlindColors[2]} 100%)`;\n\nexport function getBarColorByDiff(\n ticks: number,\n ticksRight: number,\n totalTicks: number,\n totalTicksRight: number,\n colorScheme: ColorSchemeDiff\n) {\n const range = colorScheme === ColorSchemeDiff.Default ? diffDefaultColors : diffColorBlindColors;\n const colorScale = scaleLinear()\n .domain([-100, 0, 100])\n // TODO types from DefinitelyTyped seem to mismatch\n // @ts-ignore\n .range(range);\n\n const ticksLeft = ticks - ticksRight;\n const totalTicksLeft = totalTicks - totalTicksRight;\n\n if (totalTicksRight === 0 || totalTicksLeft === 0) {\n // TODO types from DefinitelyTyped seem to mismatch\n // @ts-ignore\n const rgbString: string = colorScale(0);\n // Fallback to neutral color as we probably have no data for one of the sides.\n return color(rgbString);\n }\n\n const percentageLeft = Math.round((10000 * ticksLeft) / totalTicksLeft) / 100;\n const percentageRight = Math.round((10000 * ticksRight) / totalTicksRight) / 100;\n\n const diff = ((percentageRight - percentageLeft) / percentageLeft) * 100;\n\n // TODO types from DefinitelyTyped seem to mismatch\n // @ts-ignore\n const rgbString: string = colorScale(diff);\n return color(rgbString);\n}\n\n// const getColors = memoizeOne((theme) => getFilteredColors(colors, theme));\n\n// Different regexes to get the package name and function name from the label. We may at some point get an info about\n// the language from the backend and use the right regex but right now we just try all of them from most to least\n// specific.\nconst matchers = [\n ['phpspy', /^(?<packageName>([^\\/]*\\/)*)(?<filename>.*\\.php+)(?<line_info>.*)$/],\n ['pyspy', /^(?<packageName>([^\\/]*\\/)*)(?<filename>.*\\.py+)(?<line_info>.*)$/],\n ['rbspy', /^(?<packageName>([^\\/]*\\/)*)(?<filename>.*\\.rb+)(?<line_info>.*)$/],\n [\n 'nodespy',\n /^(\\.\\/node_modules\\/)?(?<packageName>[^/]*)(?<filename>.*\\.?(jsx?|tsx?)?):(?<functionName>.*):(?<line_info>.*)$/,\n ],\n ['gospy', /^(?<packageName>.*?\\/.*?\\.|.*?\\.|.+)(?<functionName>.*)$/], // also 'scrape'\n ['javaspy', /^(?<packageName>.+\\/)(?<filename>.+\\.)(?<functionName>.+)$/],\n ['dotnetspy', /^(?<packageName>.+)\\.(.+)\\.(.+)\\(.*\\)$/],\n ['tracing', /^(?<packageName>.+?):.*$/],\n ['pyroscope-rs', /^(?<packageName>[^::]+)/],\n ['ebpfspy', /^(?<packageName>.+)$/],\n ['unknown', /^(?<packageName>.+)$/],\n];\n\n// Get the package name from the symbol. Try matchers from the list and return first one that matches.\nfunction getPackageName(name: string): string | undefined {\n for (const [_, matcher] of matchers) {\n const match = name.match(matcher);\n if (match) {\n return match.groups?.packageName || '';\n }\n }\n return undefined;\n}\n"],"names":["rgbString"],"mappings":"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"}
@@ -1,6 +1,6 @@
1
1
  import { FieldType, getDisplayProcessor, createTheme } from '@grafana/data';
2
- import { SampleUnit } from '../types.js';
3
- import { mergeParentSubtrees, mergeSubtrees } from './treeTransforms.js';
2
+ import { SampleUnit } from '../types.mjs';
3
+ import { mergeParentSubtrees, mergeSubtrees } from './treeTransforms.mjs';
4
4
 
5
5
  function nestedSetToLevels(container, options) {
6
6
  const levels = [];
@@ -271,4 +271,4 @@ function fieldAccessor(field, index) {
271
271
  }
272
272
 
273
273
  export { CollapsedMap, CollapsedMapBuilder, FlameGraphDataContainer, checkFields, getMessageCheckFieldsResult, nestedSetToLevels };
274
- //# sourceMappingURL=dataTransform.js.map
274
+ //# sourceMappingURL=dataTransform.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dataTransform.mjs","sources":["../../../src/FlameGraph/dataTransform.ts"],"sourcesContent":["import {\n createTheme,\n DataFrame,\n DisplayProcessor,\n Field,\n FieldType,\n getDisplayProcessor,\n GrafanaTheme2,\n} from '@grafana/data';\n\nimport { SampleUnit } from '../types';\n\nimport { mergeParentSubtrees, mergeSubtrees } from './treeTransforms';\n\nexport type LevelItem = {\n // Offset from the start of the level.\n start: number;\n // Value here can be different from a value of items in the data frame as for callers tree in sandwich view we have\n // to trim the value to correspond only to the part used by the children in the subtree.\n // In case of diff profile this is actually left + right value.\n value: number;\n // Only exists for diff profiles.\n valueRight?: number;\n // Index into the data frame. It is an array because for sandwich views we may be merging multiple items into single\n // node.\n itemIndexes: number[];\n children: LevelItem[];\n level: number;\n parents?: LevelItem[];\n};\n\nexport type CollapseConfig = {\n items: LevelItem[];\n collapsed: boolean;\n};\n\n/**\n * Convert data frame with nested set format into array of level. This is mainly done for compatibility with current\n * rendering code.\n */\nexport function nestedSetToLevels(\n container: FlameGraphDataContainer,\n options?: Options\n): [LevelItem[][], Record<string, LevelItem[]>, CollapsedMap] {\n const levels: LevelItem[][] = [];\n let offset = 0;\n\n let parent: LevelItem | undefined = undefined;\n const uniqueLabels: Record<string, LevelItem[]> = {};\n\n for (let i = 0; i < container.data.length; i++) {\n const currentLevel = container.getLevel(i);\n const prevLevel = i > 0 ? container.getLevel(i - 1) : undefined;\n\n levels[currentLevel] = levels[currentLevel] || [];\n\n if (prevLevel && prevLevel >= currentLevel) {\n // We are going down a level or staying at the same level, so we are adding a sibling to the last item in a level.\n // So we have to compute the correct offset based on the last sibling.\n const lastSibling = levels[currentLevel][levels[currentLevel].length - 1];\n offset =\n lastSibling.start +\n container.getValue(lastSibling.itemIndexes[0]) +\n container.getValueRight(lastSibling.itemIndexes[0]);\n // we assume there is always a single root node so lastSibling should always have a parent.\n // Also it has to have the same parent because of how the items are ordered.\n parent = lastSibling.parents![0];\n }\n\n const newItem: LevelItem = {\n itemIndexes: [i],\n value: container.getValue(i) + container.getValueRight(i),\n valueRight: container.isDiffFlamegraph() ? container.getValueRight(i) : undefined,\n start: offset,\n parents: parent && [parent],\n children: [],\n level: currentLevel,\n };\n\n if (uniqueLabels[container.getLabel(i)]) {\n uniqueLabels[container.getLabel(i)].push(newItem);\n } else {\n uniqueLabels[container.getLabel(i)] = [newItem];\n }\n\n if (parent) {\n parent.children.push(newItem);\n }\n\n parent = newItem;\n levels[currentLevel].push(newItem);\n }\n\n const collapsedMapContainer = new CollapsedMapBuilder(options?.collapsingThreshold);\n if (options?.collapsing) {\n // We collapse similar items here, where it seems like parent and child are the same thing and so the distinction\n // isn't that important. We create a map of items that should be collapsed together. We need to do it with complete\n // tree as we need to know how many children an item has to know if we can collapse it.\n collapsedMapContainer.addTree(levels[0][0]);\n }\n\n return [levels, uniqueLabels, collapsedMapContainer.getCollapsedMap()];\n}\n\n/**\n * Small wrapper around the map of items that should be visually collapsed in the flame graph. Reason this is a wrapper\n * is that we want to make sure that when this is in the state we don't update the map directly but create a new map\n * and to have a place for the methods to collapse/expand either single item or all the items.\n */\nexport class CollapsedMap {\n // The levelItem used as a key is the item that will always be rendered in the flame graph. The config.items are all\n // the items that are in the group and if the config.collapsed is true they will be hidden.\n private map: Map<LevelItem, CollapseConfig> = new Map();\n\n constructor(map?: Map<LevelItem, CollapseConfig>) {\n this.map = map || new Map();\n }\n\n get(item: LevelItem) {\n return this.map.get(item);\n }\n\n keys() {\n return this.map.keys();\n }\n\n values() {\n return this.map.values();\n }\n\n size() {\n return this.map.size;\n }\n\n setCollapsedStatus(item: LevelItem, collapsed: boolean) {\n const newMap = new Map(this.map);\n const collapsedConfig = this.map.get(item)!;\n const newConfig = { ...collapsedConfig, collapsed };\n for (const item of collapsedConfig.items) {\n newMap.set(item, newConfig);\n }\n return new CollapsedMap(newMap);\n }\n\n setAllCollapsedStatus(collapsed: boolean) {\n const newMap = new Map(this.map);\n for (const item of this.map.keys()) {\n const collapsedConfig = this.map.get(item)!;\n const newConfig = { ...collapsedConfig, collapsed };\n newMap.set(item, newConfig);\n }\n\n return new CollapsedMap(newMap);\n }\n}\n\n/**\n * Similar to CollapsedMap but this one is mutable and used during transformation of the dataFrame data into structure\n * we use for rendering. This should not be passed to the React components.\n */\nexport class CollapsedMapBuilder {\n private map = new Map();\n private threshold = 0.99;\n\n constructor(threshold?: number) {\n if (threshold !== undefined) {\n this.threshold = threshold;\n }\n }\n\n addTree(root: LevelItem) {\n const stack = [root];\n while (stack.length) {\n const current = stack.shift()!;\n\n if (current.parents?.length) {\n this.addItem(current, current.parents[0]);\n }\n\n if (current.children.length) {\n stack.unshift(...current.children);\n }\n }\n }\n\n // The heuristics here is pretty simple right now. Just check if it's single child and if we are within threshold.\n // We assume items with small self just aren't too important while we cannot really collapse items with siblings\n // as it's not clear what to do with said sibling.\n addItem(item: LevelItem, parent?: LevelItem) {\n if (parent && item.value > parent.value * this.threshold && parent.children.length === 1) {\n if (this.map.has(parent)) {\n const config = this.map.get(parent)!;\n this.map.set(item, config);\n config.items.push(item);\n } else {\n const config = { items: [parent, item], collapsed: true };\n this.map.set(parent, config);\n this.map.set(item, config);\n }\n }\n }\n\n getCollapsedMap() {\n return new CollapsedMap(this.map);\n }\n}\n\nexport function getMessageCheckFieldsResult(wrongFields: CheckFieldsResult) {\n if (wrongFields.missingFields.length) {\n return `Data is missing fields: ${wrongFields.missingFields.join(', ')}`;\n }\n\n if (wrongFields.wrongTypeFields.length) {\n return `Data has fields of wrong type: ${wrongFields.wrongTypeFields\n .map((f) => `${f.name} has type ${f.type} but should be ${f.expectedTypes.join(' or ')}`)\n .join(', ')}`;\n }\n\n return '';\n}\n\nexport type CheckFieldsResult = {\n wrongTypeFields: Array<{ name: string; expectedTypes: FieldType[]; type: FieldType }>;\n missingFields: string[];\n};\n\nexport function checkFields(data: DataFrame): CheckFieldsResult | undefined {\n const fields: Array<[string, FieldType[]]> = [\n ['label', [FieldType.string, FieldType.enum]],\n ['level', [FieldType.number]],\n ['value', [FieldType.number]],\n ['self', [FieldType.number]],\n ];\n\n const missingFields = [];\n const wrongTypeFields = [];\n\n for (const field of fields) {\n const [name, types] = field;\n const frameField = data?.fields.find((f) => f.name === name);\n if (!frameField) {\n missingFields.push(name);\n continue;\n }\n if (!types.includes(frameField.type)) {\n wrongTypeFields.push({ name, expectedTypes: types, type: frameField.type });\n }\n }\n\n if (missingFields.length > 0 || wrongTypeFields.length > 0) {\n return {\n wrongTypeFields,\n missingFields,\n };\n }\n return undefined;\n}\n\nexport type Options = {\n collapsing: boolean;\n collapsingThreshold?: number;\n};\n\nexport class FlameGraphDataContainer {\n data: DataFrame;\n options: Options;\n\n labelField: Field;\n levelField: Field;\n valueField: Field;\n selfField: Field;\n\n // Optional fields for diff view\n valueRightField?: Field;\n selfRightField?: Field;\n\n labelDisplayProcessor: DisplayProcessor;\n valueDisplayProcessor: DisplayProcessor;\n uniqueLabels: string[];\n\n private levels: LevelItem[][] | undefined;\n private uniqueLabelsMap: Record<string, LevelItem[]> | undefined;\n private collapsedMap: CollapsedMap | undefined;\n\n constructor(data: DataFrame, options: Options, theme: GrafanaTheme2 = createTheme()) {\n this.data = data;\n this.options = options;\n\n const wrongFields = checkFields(data);\n if (wrongFields) {\n throw new Error(getMessageCheckFieldsResult(wrongFields));\n }\n\n this.labelField = data.fields.find((f) => f.name === 'label')!;\n this.levelField = data.fields.find((f) => f.name === 'level')!;\n this.valueField = data.fields.find((f) => f.name === 'value')!;\n this.selfField = data.fields.find((f) => f.name === 'self')!;\n\n this.valueRightField = data.fields.find((f) => f.name === 'valueRight')!;\n this.selfRightField = data.fields.find((f) => f.name === 'selfRight')!;\n\n if ((this.valueField || this.selfField) && !(this.valueField && this.selfField)) {\n throw new Error(\n 'Malformed dataFrame: both valueRight and selfRight has to be present if one of them is present.'\n );\n }\n\n const enumConfig = this.labelField?.config?.type?.enum;\n // Label can actually be an enum field so depending on that we have to access it through display processor. This is\n // both a backward compatibility but also to allow using a simple dataFrame without enum config. This would allow\n // users to use this panel with correct query from data sources that do not return profiles natively.\n if (enumConfig) {\n this.labelDisplayProcessor = getDisplayProcessor({ field: this.labelField, theme });\n this.uniqueLabels = enumConfig.text || [];\n } else {\n this.labelDisplayProcessor = (value) => ({\n text: value + '',\n numeric: 0,\n });\n this.uniqueLabels = [...new Set<string>(this.labelField.values)];\n }\n\n this.valueDisplayProcessor = getDisplayProcessor({\n field: this.valueField,\n theme,\n });\n }\n\n isDiffFlamegraph() {\n return Boolean(this.valueRightField && this.selfRightField);\n }\n\n getLabel(index: number) {\n return this.labelDisplayProcessor(this.labelField.values[index]).text;\n }\n\n getLevel(index: number) {\n return this.levelField.values[index];\n }\n\n getValue(index: number | number[]) {\n return fieldAccessor(this.valueField, index);\n }\n\n getValueRight(index: number | number[]) {\n return fieldAccessor(this.valueRightField, index);\n }\n\n getSelf(index: number | number[]) {\n return fieldAccessor(this.selfField, index);\n }\n\n getSelfRight(index: number | number[]) {\n return fieldAccessor(this.selfRightField, index);\n }\n\n getSelfDisplay(index: number | number[]) {\n return this.valueDisplayProcessor(this.getSelf(index));\n }\n\n getUniqueLabels() {\n return this.uniqueLabels;\n }\n\n getUnitTitle() {\n switch (this.valueField.config.unit) {\n case SampleUnit.Bytes:\n return 'RAM';\n case SampleUnit.Nanoseconds:\n return 'Time';\n }\n\n return 'Count';\n }\n\n getLevels() {\n this.initLevels();\n return this.levels!;\n }\n\n getSandwichLevels(label: string): [LevelItem[][], LevelItem[][]] {\n const nodes = this.getNodesWithLabel(label);\n\n if (!nodes?.length) {\n return [[], []];\n }\n\n const callers = mergeParentSubtrees(nodes, this);\n const callees = mergeSubtrees(nodes, this);\n\n return [callers, callees];\n }\n\n getNodesWithLabel(label: string) {\n this.initLevels();\n return this.uniqueLabelsMap![label];\n }\n\n getCollapsedMap() {\n this.initLevels();\n return this.collapsedMap!;\n }\n\n private initLevels() {\n if (!this.levels) {\n const [levels, uniqueLabelsMap, collapsedMap] = nestedSetToLevels(this, this.options);\n this.levels = levels;\n this.uniqueLabelsMap = uniqueLabelsMap;\n this.collapsedMap = collapsedMap;\n }\n }\n}\n\n// Access field value with either single index or array of indexes. This is needed as we sometimes merge multiple\n// into one, and we want to access aggregated values.\nfunction fieldAccessor(field: Field | undefined, index: number | number[]) {\n if (!field) {\n return 0;\n }\n let indexArray: number[] = typeof index === 'number' ? [index] : index;\n return indexArray.reduce((acc, index) => {\n return acc + field.values[index];\n }, 0);\n}\n"],"names":["item","index"],"mappings":"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"}
@@ -51,4 +51,4 @@ function murmurhash3_32_gc(key, seed = 0) {
51
51
  }
52
52
 
53
53
  export { murmurhash3_32_gc as default };
54
- //# sourceMappingURL=murmur3.js.map
54
+ //# sourceMappingURL=murmur3.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"murmur3.mjs","sources":["../../../src/FlameGraph/murmur3.ts"],"sourcesContent":["// eslint-disable-next-line @typescript-eslint/ban-ts-comment\n// @ts-nocheck\n/* eslint-disable @typescript-eslint/restrict-plus-operands */\n/*\n\nCopyright (c) 2011 Gary Court\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n*/\n\n/* eslint-disable no-plusplus */\n/* eslint-disable prefer-const */\n/* eslint-disable no-bitwise */\n/* eslint-disable camelcase */\n\nexport default function murmurhash3_32_gc(key: string, seed = 0) {\n let remainder;\n let bytes;\n let h1;\n let h1b;\n let c1;\n let c2;\n let k1;\n let i;\n\n remainder = key.length & 3; // key.length % 4\n bytes = key.length - remainder;\n h1 = seed;\n c1 = 0xcc9e2d51;\n c2 = 0x1b873593;\n i = 0;\n\n while (i < bytes) {\n k1 =\n (key.charCodeAt(i) & 0xff) |\n ((key.charCodeAt(++i) & 0xff) << 8) |\n ((key.charCodeAt(++i) & 0xff) << 16) |\n ((key.charCodeAt(++i) & 0xff) << 24);\n ++i;\n\n k1 = ((k1 & 0xffff) * c1 + ((((k1 >>> 16) * c1) & 0xffff) << 16)) & 0xffffffff;\n k1 = (k1 << 15) | (k1 >>> 17);\n k1 = ((k1 & 0xffff) * c2 + ((((k1 >>> 16) * c2) & 0xffff) << 16)) & 0xffffffff;\n\n h1 ^= k1;\n h1 = (h1 << 13) | (h1 >>> 19);\n h1b = ((h1 & 0xffff) * 5 + ((((h1 >>> 16) * 5) & 0xffff) << 16)) & 0xffffffff;\n h1 = (h1b & 0xffff) + 0x6b64 + ((((h1b >>> 16) + 0xe654) & 0xffff) << 16);\n }\n\n k1 = 0;\n\n switch (remainder) {\n case 3:\n k1 ^= (key.charCodeAt(i + 2) & 0xff) << 16;\n // fall through\n case 2:\n k1 ^= (key.charCodeAt(i + 1) & 0xff) << 8;\n // fall through\n case 1:\n k1 ^= key.charCodeAt(i) & 0xff;\n // fall through\n default:\n k1 = ((k1 & 0xffff) * c1 + ((((k1 >>> 16) * c1) & 0xffff) << 16)) & 0xffffffff;\n k1 = (k1 << 15) | (k1 >>> 17);\n k1 = ((k1 & 0xffff) * c2 + ((((k1 >>> 16) * c2) & 0xffff) << 16)) & 0xffffffff;\n h1 ^= k1;\n }\n\n h1 ^= key.length;\n\n h1 ^= h1 >>> 16;\n h1 = ((h1 & 0xffff) * 0x85ebca6b + ((((h1 >>> 16) * 0x85ebca6b) & 0xffff) << 16)) & 0xffffffff;\n h1 ^= h1 >>> 13;\n h1 = ((h1 & 0xffff) * 0xc2b2ae35 + ((((h1 >>> 16) * 0xc2b2ae35) & 0xffff) << 16)) & 0xffffffff;\n h1 ^= h1 >>> 16;\n\n return h1 >>> 0;\n}\n"],"names":[],"mappings":"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"}
@@ -1,9 +1,9 @@
1
1
  import { useMemo, useEffect, useCallback, useState } from 'react';
2
2
  import color from 'tinycolor2';
3
3
  import { useTheme2 } from '@grafana/ui';
4
- import { HIDE_THRESHOLD, PIXELS_PER_LEVEL, BAR_BORDER_WIDTH, LABEL_THRESHOLD, GROUP_STRIP_WIDTH, GROUP_STRIP_PADDING, MUTE_THRESHOLD, GROUP_STRIP_MARGIN_LEFT, GROUP_TEXT_OFFSET, BAR_TEXT_PADDING_LEFT } from '../constants.js';
5
- import { ColorSchemeDiff, ColorScheme } from '../types.js';
6
- import { getBarColorByDiff, getBarColorByValue, getBarColorByPackage } from './colors.js';
4
+ import { HIDE_THRESHOLD, PIXELS_PER_LEVEL, BAR_BORDER_WIDTH, LABEL_THRESHOLD, GROUP_STRIP_WIDTH, GROUP_STRIP_PADDING, MUTE_THRESHOLD, GROUP_STRIP_MARGIN_LEFT, GROUP_TEXT_OFFSET, BAR_TEXT_PADDING_LEFT } from '../constants.mjs';
5
+ import { ColorSchemeDiff, ColorScheme } from '../types.mjs';
6
+ import { getBarColorByDiff, getBarColorByValue, getBarColorByPackage } from './colors.mjs';
7
7
 
8
8
  function useFlameRender(options) {
9
9
  const {
@@ -242,4 +242,4 @@ function getBarX(offset, totalTicks, rangeMin, pixelsPerTick) {
242
242
  }
243
243
 
244
244
  export { getBarX, useFlameRender, walkTree };
245
- //# sourceMappingURL=rendering.js.map
245
+ //# sourceMappingURL=rendering.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rendering.mjs","sources":["../../../src/FlameGraph/rendering.ts"],"sourcesContent":["import { RefObject, useCallback, useEffect, useMemo, useState } from 'react';\nimport color from 'tinycolor2';\n\nimport { GrafanaTheme2 } from '@grafana/data';\nimport { useTheme2 } from '@grafana/ui';\n\nimport {\n BAR_BORDER_WIDTH,\n BAR_TEXT_PADDING_LEFT,\n MUTE_THRESHOLD,\n HIDE_THRESHOLD,\n LABEL_THRESHOLD,\n PIXELS_PER_LEVEL,\n GROUP_STRIP_WIDTH,\n GROUP_STRIP_PADDING,\n GROUP_STRIP_MARGIN_LEFT,\n GROUP_TEXT_OFFSET,\n} from '../constants';\nimport { ClickedItemData, ColorScheme, ColorSchemeDiff, TextAlign } from '../types';\n\nimport { getBarColorByDiff, getBarColorByPackage, getBarColorByValue } from './colors';\nimport { CollapseConfig, CollapsedMap, FlameGraphDataContainer, LevelItem } from './dataTransform';\n\ntype RenderOptions = {\n canvasRef: RefObject<HTMLCanvasElement>;\n data: FlameGraphDataContainer;\n root: LevelItem;\n direction: 'children' | 'parents';\n\n // Depth in number of levels\n depth: number;\n wrapperWidth: number;\n\n // If we are rendering only zoomed in part of the graph.\n rangeMin: number;\n rangeMax: number;\n\n matchedLabels: Set<string> | undefined;\n textAlign: TextAlign;\n\n // Total ticks that will be used for sizing\n totalViewTicks: number;\n // Total ticks that will be used for computing colors as some color scheme (like in diff view) should not be affected\n // by sandwich or focus view.\n totalColorTicks: number;\n // Total ticks used to compute the diff colors\n totalTicksRight: number | undefined;\n colorScheme: ColorScheme | ColorSchemeDiff;\n focusedItemData?: ClickedItemData;\n collapsedMap: CollapsedMap;\n};\n\nexport function useFlameRender(options: RenderOptions) {\n const {\n canvasRef,\n data,\n root,\n depth,\n direction,\n wrapperWidth,\n rangeMin,\n rangeMax,\n matchedLabels,\n textAlign,\n totalViewTicks,\n totalColorTicks,\n totalTicksRight,\n colorScheme,\n focusedItemData,\n collapsedMap,\n } = options;\n const ctx = useSetupCanvas(canvasRef, wrapperWidth, depth);\n const theme = useTheme2();\n\n // There is a bit of dependency injections here that does not add readability, mainly to prevent recomputing some\n // common stuff for all the nodes in the graph when only once is enough. perf/readability tradeoff.\n\n const mutedColor = useMemo(() => {\n const barMutedColor = color(theme.colors.background.secondary);\n return theme.isLight ? barMutedColor.darken(10).toHexString() : barMutedColor.lighten(10).toHexString();\n }, [theme]);\n\n const getBarColor = useColorFunction(\n totalColorTicks,\n totalTicksRight,\n colorScheme,\n theme,\n mutedColor,\n rangeMin,\n rangeMax,\n matchedLabels,\n focusedItemData ? focusedItemData.item.level : 0\n );\n\n const renderFunc = useRenderFunc(ctx, data, getBarColor, textAlign, collapsedMap);\n\n useEffect(() => {\n if (!ctx) {\n return;\n }\n\n ctx.clearRect(0, 0, ctx.canvas.width, ctx.canvas.height);\n\n const mutedPath2D = new Path2D();\n\n //\n // Walk the tree and compute the dimensions for each item in the flamegraph.\n //\n walkTree(\n root,\n direction,\n data,\n totalViewTicks,\n rangeMin,\n rangeMax,\n wrapperWidth,\n collapsedMap,\n (item, x, y, width, height, label, muted) => {\n if (muted) {\n // We do a bit of optimization for muted regions, and we render them all in single fill later on as they don't\n // have labels and are the same color.\n mutedPath2D.rect(x, y, width, height);\n } else {\n renderFunc(item, x, y, width, height, label);\n }\n }\n );\n\n // Only fill the muted rects\n ctx.fillStyle = mutedColor;\n ctx.fill(mutedPath2D);\n }, [\n ctx,\n data,\n root,\n wrapperWidth,\n rangeMin,\n rangeMax,\n totalViewTicks,\n direction,\n renderFunc,\n collapsedMap,\n mutedColor,\n ]);\n}\n\ntype RenderFunc = (item: LevelItem, x: number, y: number, width: number, height: number, label: string) => void;\n\ntype RenderFuncWrap = (\n item: LevelItem,\n x: number,\n y: number,\n width: number,\n height: number,\n label: string,\n muted: boolean\n) => void;\n\n/**\n * Create a render function with some memoization to prevent excesive repainting of the canvas.\n * @param ctx\n * @param data\n * @param getBarColor\n * @param textAlign\n * @param collapsedMap\n */\nfunction useRenderFunc(\n ctx: CanvasRenderingContext2D | undefined,\n data: FlameGraphDataContainer,\n getBarColor: (item: LevelItem, label: string, muted: boolean) => string,\n textAlign: TextAlign,\n collapsedMap: CollapsedMap\n) {\n return useMemo(() => {\n if (!ctx) {\n return () => {};\n }\n\n const renderFunc: RenderFunc = (item, x, y, width, height, label) => {\n ctx.beginPath();\n ctx.rect(x + BAR_BORDER_WIDTH, y, width, height);\n ctx.fillStyle = getBarColor(item, label, false);\n ctx.stroke();\n ctx.fill();\n\n const collapsedItemConfig = collapsedMap.get(item);\n let finalLabel = label;\n if (collapsedItemConfig && collapsedItemConfig.collapsed) {\n const numberOfCollapsedItems = collapsedItemConfig.items.length;\n finalLabel = `(${numberOfCollapsedItems}) ` + label;\n }\n\n if (width >= LABEL_THRESHOLD) {\n if (collapsedItemConfig) {\n renderLabel(\n ctx,\n data,\n finalLabel,\n item,\n width,\n textAlign === 'left' ? x + GROUP_STRIP_MARGIN_LEFT + GROUP_TEXT_OFFSET : x,\n y,\n textAlign\n );\n\n renderGroupingStrip(ctx, x, y, height, item, collapsedItemConfig);\n } else {\n renderLabel(ctx, data, finalLabel, item, width, x, y, textAlign);\n }\n }\n };\n\n return renderFunc;\n }, [ctx, getBarColor, textAlign, data, collapsedMap]);\n}\n\n/**\n * Render small strip on the left side of the bar to indicate that this item is part of a group that can be collapsed.\n * @param ctx\n * @param x\n * @param y\n * @param height\n * @param item\n * @param collapsedItemConfig\n */\nfunction renderGroupingStrip(\n ctx: CanvasRenderingContext2D,\n x: number,\n y: number,\n height: number,\n item: LevelItem,\n collapsedItemConfig: CollapseConfig\n) {\n const groupStripX = x + GROUP_STRIP_MARGIN_LEFT;\n\n // This is to mask the label in case we align it right to left.\n ctx.beginPath();\n ctx.rect(x, y, groupStripX - x + GROUP_STRIP_WIDTH + GROUP_STRIP_PADDING, height);\n ctx.fill();\n\n // For item in a group that can be collapsed, we draw a small strip to mark them. On the items that are at the\n // start or and end of a group we draw just half the strip so 2 groups next to each other are separated\n // visually.\n ctx.beginPath();\n if (collapsedItemConfig.collapsed) {\n ctx.rect(groupStripX, y + height / 4, GROUP_STRIP_WIDTH, height / 2);\n } else {\n if (collapsedItemConfig.items[0] === item) {\n // Top item\n ctx.rect(groupStripX, y + height / 2, GROUP_STRIP_WIDTH, height / 2);\n } else if (collapsedItemConfig.items[collapsedItemConfig.items.length - 1] === item) {\n // Bottom item\n ctx.rect(groupStripX, y, GROUP_STRIP_WIDTH, height / 2);\n } else {\n ctx.rect(groupStripX, y, GROUP_STRIP_WIDTH, height);\n }\n }\n\n ctx.fillStyle = '#666';\n ctx.fill();\n}\n\n/**\n * Exported for testing don't use directly\n * Walks the tree and computes coordinates, dimensions and other data needed for rendering. For each item in the tree\n * it defers the rendering to the renderFunc.\n */\nexport function walkTree(\n root: LevelItem,\n // In sandwich view we use parents direction to show all callers.\n direction: 'children' | 'parents',\n data: FlameGraphDataContainer,\n totalViewTicks: number,\n rangeMin: number,\n rangeMax: number,\n wrapperWidth: number,\n collapsedMap: CollapsedMap,\n renderFunc: RenderFuncWrap\n) {\n // The levelOffset here is to keep track if items that we don't render because they are collapsed into single row.\n // That means we have to render next items with an offset of some rows up in the stack.\n const stack: Array<{ item: LevelItem; levelOffset: number }> = [];\n stack.push({ item: root, levelOffset: 0 });\n\n const pixelsPerTick = (wrapperWidth * window.devicePixelRatio) / totalViewTicks / (rangeMax - rangeMin);\n let collapsedItemRendered: LevelItem | undefined = undefined;\n\n while (stack.length > 0) {\n const { item, levelOffset } = stack.shift()!;\n let curBarTicks = item.value;\n const muted = curBarTicks * pixelsPerTick <= MUTE_THRESHOLD;\n const width = curBarTicks * pixelsPerTick - (muted ? 0 : BAR_BORDER_WIDTH * 2);\n const height = PIXELS_PER_LEVEL;\n\n if (width < HIDE_THRESHOLD) {\n // We don't render nor it's children\n continue;\n }\n\n let offsetModifier = 0;\n let skipRender = false;\n const collapsedItemConfig = collapsedMap.get(item);\n const isCollapsedItem = collapsedItemConfig && collapsedItemConfig.collapsed;\n\n if (isCollapsedItem) {\n if (collapsedItemRendered === collapsedItemConfig.items[0]) {\n offsetModifier = direction === 'children' ? -1 : +1;\n skipRender = true;\n } else {\n // This is a case where we have another collapsed group right after different collapsed group, so we need to\n // reset.\n collapsedItemRendered = undefined;\n }\n } else {\n collapsedItemRendered = undefined;\n }\n\n if (!skipRender) {\n const barX = getBarX(item.start, totalViewTicks, rangeMin, pixelsPerTick);\n const barY = (item.level + levelOffset) * PIXELS_PER_LEVEL;\n\n let label = data.getLabel(item.itemIndexes[0]);\n if (isCollapsedItem) {\n collapsedItemRendered = item;\n }\n\n renderFunc(item, barX, barY, width, height, label, muted);\n }\n\n const nextList = direction === 'children' ? item.children : item.parents;\n if (nextList) {\n stack.unshift(...nextList.map((c) => ({ item: c, levelOffset: levelOffset + offsetModifier })));\n }\n }\n}\n\nfunction useColorFunction(\n totalTicks: number,\n totalTicksRight: number | undefined,\n colorScheme: ColorScheme | ColorSchemeDiff,\n theme: GrafanaTheme2,\n mutedColor: string,\n rangeMin: number,\n rangeMax: number,\n matchedLabels: Set<string> | undefined,\n topLevel: number\n) {\n return useCallback(\n function getColor(item: LevelItem, label: string, muted: boolean) {\n // If collapsed and no search we can quickly return the muted color\n if (muted && !matchedLabels) {\n // Collapsed are always grayed\n return mutedColor;\n }\n\n const barColor =\n item.valueRight !== undefined &&\n (colorScheme === ColorSchemeDiff.Default || colorScheme === ColorSchemeDiff.DiffColorBlind)\n ? getBarColorByDiff(item.value, item.valueRight!, totalTicks, totalTicksRight!, colorScheme)\n : colorScheme === ColorScheme.ValueBased\n ? getBarColorByValue(item.value, totalTicks, rangeMin, rangeMax)\n : getBarColorByPackage(label, theme);\n\n if (matchedLabels) {\n // Means we are searching, we use color for matches and gray the rest\n return matchedLabels.has(label) ? barColor.toHslString() : mutedColor;\n }\n\n // Mute if we are above the focused symbol\n return item.level > topLevel - 1 ? barColor.toHslString() : barColor.lighten(15).toHslString();\n },\n [totalTicks, totalTicksRight, colorScheme, theme, rangeMin, rangeMax, matchedLabels, topLevel, mutedColor]\n );\n}\n\nfunction useSetupCanvas(canvasRef: RefObject<HTMLCanvasElement>, wrapperWidth: number, numberOfLevels: number) {\n const [ctx, setCtx] = useState<CanvasRenderingContext2D>();\n\n useEffect(() => {\n if (!(numberOfLevels && canvasRef.current)) {\n return;\n }\n const ctx = canvasRef.current.getContext('2d')!;\n\n const height = PIXELS_PER_LEVEL * numberOfLevels;\n canvasRef.current.width = Math.round(wrapperWidth * window.devicePixelRatio);\n canvasRef.current.height = Math.round(height);\n canvasRef.current.style.width = `${wrapperWidth}px`;\n canvasRef.current.style.height = `${height / window.devicePixelRatio}px`;\n\n ctx.textBaseline = 'middle';\n ctx.font = 12 * window.devicePixelRatio + 'px monospace';\n ctx.strokeStyle = 'white';\n setCtx(ctx);\n }, [canvasRef, setCtx, wrapperWidth, numberOfLevels]);\n return ctx;\n}\n\n// Renders a text inside the node rectangle. It allows setting alignment of the text left or right which takes effect\n// when text is too long to fit in the rectangle.\nfunction renderLabel(\n ctx: CanvasRenderingContext2D,\n data: FlameGraphDataContainer,\n label: string,\n item: LevelItem,\n width: number,\n x: number,\n y: number,\n textAlign: TextAlign\n) {\n ctx.save();\n ctx.clip(); // so text does not overflow\n ctx.fillStyle = '#222';\n\n const displayValue = data.valueDisplayProcessor(item.value);\n const unit = displayValue.suffix ? displayValue.text + displayValue.suffix : displayValue.text;\n\n // We only measure name here instead of full label because of how we deal with the units and aligning later.\n const measure = ctx.measureText(label);\n const spaceForTextInRect = width - BAR_TEXT_PADDING_LEFT;\n\n let fullLabel = `${label} (${unit})`;\n let labelX = Math.max(x, 0) + BAR_TEXT_PADDING_LEFT;\n\n // We use the desired alignment only if there is not enough space for the text, otherwise we keep left alignment as\n // that will already show full text.\n if (measure.width > spaceForTextInRect) {\n ctx.textAlign = textAlign;\n // If aligned to the right we don't want to take the space with the unit label as the assumption is user wants to\n // mainly see the name. This also reflects how pyro/flamegraph works.\n if (textAlign === 'right') {\n fullLabel = label;\n labelX = x + width - BAR_TEXT_PADDING_LEFT;\n }\n }\n\n ctx.fillText(fullLabel, labelX, y + PIXELS_PER_LEVEL / 2 + 2);\n ctx.restore();\n}\n\n/**\n * Returns the X position of the bar. totalTicks * rangeMin is to adjust for any current zoom. So if we zoom to a\n * section of the graph we align and shift the X coordinates accordingly.\n * @param offset\n * @param totalTicks\n * @param rangeMin\n * @param pixelsPerTick\n */\nexport function getBarX(offset: number, totalTicks: number, rangeMin: number, pixelsPerTick: number) {\n return (offset - totalTicks * rangeMin) * pixelsPerTick;\n}\n"],"names":["ctx"],"mappings":";;;;;;;AAoDO,SAAS,eAAe,OAAwB,EAAA;AACrD,EAAM,MAAA;AAAA,IACJ,SAAA;AAAA,IACA,IAAA;AAAA,IACA,IAAA;AAAA,IACA,KAAA;AAAA,IACA,SAAA;AAAA,IACA,YAAA;AAAA,IACA,QAAA;AAAA,IACA,QAAA;AAAA,IACA,aAAA;AAAA,IACA,SAAA;AAAA,IACA,cAAA;AAAA,IACA,eAAA;AAAA,IACA,eAAA;AAAA,IACA,WAAA;AAAA,IACA,eAAA;AAAA,IACA;AAAA,GACE,GAAA,OAAA;AACJ,EAAA,MAAM,GAAM,GAAA,cAAA,CAAe,SAAW,EAAA,YAAA,EAAc,KAAK,CAAA;AACzD,EAAA,MAAM,QAAQ,SAAU,EAAA;AAKxB,EAAM,MAAA,UAAA,GAAa,QAAQ,MAAM;AAC/B,IAAA,MAAM,aAAgB,GAAA,KAAA,CAAM,KAAM,CAAA,MAAA,CAAO,WAAW,SAAS,CAAA;AAC7D,IAAA,OAAO,KAAM,CAAA,OAAA,GAAU,aAAc,CAAA,MAAA,CAAO,EAAE,CAAA,CAAE,WAAY,EAAA,GAAI,aAAc,CAAA,OAAA,CAAQ,EAAE,CAAA,CAAE,WAAY,EAAA;AAAA,GACxG,EAAG,CAAC,KAAK,CAAC,CAAA;AAEV,EAAA,MAAM,WAAc,GAAA,gBAAA;AAAA,IAClB,eAAA;AAAA,IACA,eAAA;AAAA,IACA,WAAA;AAAA,IACA,KAAA;AAAA,IACA,UAAA;AAAA,IACA,QAAA;AAAA,IACA,QAAA;AAAA,IACA,aAAA;AAAA,IACA,eAAA,GAAkB,eAAgB,CAAA,IAAA,CAAK,KAAQ,GAAA;AAAA,GACjD;AAEA,EAAA,MAAM,aAAa,aAAc,CAAA,GAAA,EAAK,IAAM,EAAA,WAAA,EAAa,WAAW,YAAY,CAAA;AAEhF,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,IAAI,CAAC,GAAK,EAAA;AACR,MAAA;AAAA;AAGF,IAAI,GAAA,CAAA,SAAA,CAAU,GAAG,CAAG,EAAA,GAAA,CAAI,OAAO,KAAO,EAAA,GAAA,CAAI,OAAO,MAAM,CAAA;AAEvD,IAAM,MAAA,WAAA,GAAc,IAAI,MAAO,EAAA;AAK/B,IAAA,QAAA;AAAA,MACE,IAAA;AAAA,MACA,SAAA;AAAA,MACA,IAAA;AAAA,MACA,cAAA;AAAA,MACA,QAAA;AAAA,MACA,QAAA;AAAA,MACA,YAAA;AAAA,MACA,YAAA;AAAA,MACA,CAAC,IAAM,EAAA,CAAA,EAAG,GAAG,KAAO,EAAA,MAAA,EAAQ,OAAO,KAAU,KAAA;AAC3C,QAAA,IAAI,KAAO,EAAA;AAGT,UAAA,WAAA,CAAY,IAAK,CAAA,CAAA,EAAG,CAAG,EAAA,KAAA,EAAO,MAAM,CAAA;AAAA,SAC/B,MAAA;AACL,UAAA,UAAA,CAAW,IAAM,EAAA,CAAA,EAAG,CAAG,EAAA,KAAA,EAAO,QAAQ,KAAK,CAAA;AAAA;AAC7C;AACF,KACF;AAGA,IAAA,GAAA,CAAI,SAAY,GAAA,UAAA;AAChB,IAAA,GAAA,CAAI,KAAK,WAAW,CAAA;AAAA,GACnB,EAAA;AAAA,IACD,GAAA;AAAA,IACA,IAAA;AAAA,IACA,IAAA;AAAA,IACA,YAAA;AAAA,IACA,QAAA;AAAA,IACA,QAAA;AAAA,IACA,cAAA;AAAA,IACA,SAAA;AAAA,IACA,UAAA;AAAA,IACA,YAAA;AAAA,IACA;AAAA,GACD,CAAA;AACH;AAsBA,SAAS,aACP,CAAA,GAAA,EACA,IACA,EAAA,WAAA,EACA,WACA,YACA,EAAA;AACA,EAAA,OAAO,QAAQ,MAAM;AACnB,IAAA,IAAI,CAAC,GAAK,EAAA;AACR,MAAA,OAAO,MAAM;AAAA,OAAC;AAAA;AAGhB,IAAA,MAAM,aAAyB,CAAC,IAAA,EAAM,GAAG,CAAG,EAAA,KAAA,EAAO,QAAQ,KAAU,KAAA;AACnE,MAAA,GAAA,CAAI,SAAU,EAAA;AACd,MAAA,GAAA,CAAI,IAAK,CAAA,CAAA,GAAI,gBAAkB,EAAA,CAAA,EAAG,OAAO,MAAM,CAAA;AAC/C,MAAA,GAAA,CAAI,SAAY,GAAA,WAAA,CAAY,IAAM,EAAA,KAAA,EAAO,KAAK,CAAA;AAC9C,MAAA,GAAA,CAAI,MAAO,EAAA;AACX,MAAA,GAAA,CAAI,IAAK,EAAA;AAET,MAAM,MAAA,mBAAA,GAAsB,YAAa,CAAA,GAAA,CAAI,IAAI,CAAA;AACjD,MAAA,IAAI,UAAa,GAAA,KAAA;AACjB,MAAI,IAAA,mBAAA,IAAuB,oBAAoB,SAAW,EAAA;AACxD,QAAM,MAAA,sBAAA,GAAyB,oBAAoB,KAAM,CAAA,MAAA;AACzD,QAAa,UAAA,GAAA,CAAA,CAAA,EAAI,sBAAsB,CAAO,EAAA,CAAA,GAAA,KAAA;AAAA;AAGhD,MAAA,IAAI,SAAS,eAAiB,EAAA;AAC5B,QAAA,IAAI,mBAAqB,EAAA;AACvB,UAAA,WAAA;AAAA,YACE,GAAA;AAAA,YACA,IAAA;AAAA,YACA,UAAA;AAAA,YACA,IAAA;AAAA,YACA,KAAA;AAAA,YACA,SAAc,KAAA,MAAA,GAAS,CAAI,GAAA,uBAAA,GAA0B,iBAAoB,GAAA,CAAA;AAAA,YACzE,CAAA;AAAA,YACA;AAAA,WACF;AAEA,UAAA,mBAAA,CAAoB,GAAK,EAAA,CAAA,EAAG,CAAG,EAAA,MAAA,EAAQ,MAAM,mBAAmB,CAAA;AAAA,SAC3D,MAAA;AACL,UAAA,WAAA,CAAY,KAAK,IAAM,EAAA,UAAA,EAAY,MAAM,KAAO,EAAA,CAAA,EAAG,GAAG,SAAS,CAAA;AAAA;AACjE;AACF,KACF;AAEA,IAAO,OAAA,UAAA;AAAA,KACN,CAAC,GAAA,EAAK,aAAa,SAAW,EAAA,IAAA,EAAM,YAAY,CAAC,CAAA;AACtD;AAWA,SAAS,oBACP,GACA,EAAA,CAAA,EACA,CACA,EAAA,MAAA,EACA,MACA,mBACA,EAAA;AACA,EAAA,MAAM,cAAc,CAAI,GAAA,uBAAA;AAGxB,EAAA,GAAA,CAAI,SAAU,EAAA;AACd,EAAA,GAAA,CAAI,KAAK,CAAG,EAAA,CAAA,EAAG,cAAc,CAAI,GAAA,iBAAA,GAAoB,qBAAqB,MAAM,CAAA;AAChF,EAAA,GAAA,CAAI,IAAK,EAAA;AAKT,EAAA,GAAA,CAAI,SAAU,EAAA;AACd,EAAA,IAAI,oBAAoB,SAAW,EAAA;AACjC,IAAA,GAAA,CAAI,KAAK,WAAa,EAAA,CAAA,GAAI,SAAS,CAAG,EAAA,iBAAA,EAAmB,SAAS,CAAC,CAAA;AAAA,GAC9D,MAAA;AACL,IAAA,IAAI,mBAAoB,CAAA,KAAA,CAAM,CAAC,CAAA,KAAM,IAAM,EAAA;AAEzC,MAAA,GAAA,CAAI,KAAK,WAAa,EAAA,CAAA,GAAI,SAAS,CAAG,EAAA,iBAAA,EAAmB,SAAS,CAAC,CAAA;AAAA,KACrE,MAAA,IAAW,oBAAoB,KAAM,CAAA,mBAAA,CAAoB,MAAM,MAAS,GAAA,CAAC,MAAM,IAAM,EAAA;AAEnF,MAAA,GAAA,CAAI,IAAK,CAAA,WAAA,EAAa,CAAG,EAAA,iBAAA,EAAmB,SAAS,CAAC,CAAA;AAAA,KACjD,MAAA;AACL,MAAA,GAAA,CAAI,IAAK,CAAA,WAAA,EAAa,CAAG,EAAA,iBAAA,EAAmB,MAAM,CAAA;AAAA;AACpD;AAGF,EAAA,GAAA,CAAI,SAAY,GAAA,MAAA;AAChB,EAAA,GAAA,CAAI,IAAK,EAAA;AACX;AAOgB,SAAA,QAAA,CACd,MAEA,SACA,EAAA,IAAA,EACA,gBACA,QACA,EAAA,QAAA,EACA,YACA,EAAA,YAAA,EACA,UACA,EAAA;AAGA,EAAA,MAAM,QAAyD,EAAC;AAChE,EAAA,KAAA,CAAM,KAAK,EAAE,IAAA,EAAM,IAAM,EAAA,WAAA,EAAa,GAAG,CAAA;AAEzC,EAAA,MAAM,aAAiB,GAAA,YAAA,GAAe,MAAO,CAAA,gBAAA,GAAoB,kBAAkB,QAAW,GAAA,QAAA,CAAA;AAC9F,EAAA,IAAI,qBAA+C,GAAA,SAAA;AAEnD,EAAO,OAAA,KAAA,CAAM,SAAS,CAAG,EAAA;AACvB,IAAA,MAAM,EAAE,IAAA,EAAM,WAAY,EAAA,GAAI,MAAM,KAAM,EAAA;AAC1C,IAAA,IAAI,cAAc,IAAK,CAAA,KAAA;AACvB,IAAM,MAAA,KAAA,GAAQ,cAAc,aAAiB,IAAA,cAAA;AAC7C,IAAA,MAAM,KAAQ,GAAA,WAAA,GAAc,aAAiB,IAAA,KAAA,GAAQ,IAAI,gBAAmB,GAAA,CAAA,CAAA;AAC5E,IAAA,MAAM,MAAS,GAAA,gBAAA;AAEf,IAAA,IAAI,QAAQ,cAAgB,EAAA;AAE1B,MAAA;AAAA;AAGF,IAAA,IAAI,cAAiB,GAAA,CAAA;AACrB,IAAA,IAAI,UAAa,GAAA,KAAA;AACjB,IAAM,MAAA,mBAAA,GAAsB,YAAa,CAAA,GAAA,CAAI,IAAI,CAAA;AACjD,IAAM,MAAA,eAAA,GAAkB,uBAAuB,mBAAoB,CAAA,SAAA;AAEnE,IAAA,IAAI,eAAiB,EAAA;AACnB,MAAA,IAAI,qBAA0B,KAAA,mBAAA,CAAoB,KAAM,CAAA,CAAC,CAAG,EAAA;AAC1D,QAAiB,cAAA,GAAA,SAAA,KAAc,aAAa,EAAK,GAAA,CAAA;AACjD,QAAa,UAAA,GAAA,IAAA;AAAA,OACR,MAAA;AAGL,QAAwB,qBAAA,GAAA,SAAA;AAAA;AAC1B,KACK,MAAA;AACL,MAAwB,qBAAA,GAAA,SAAA;AAAA;AAG1B,IAAA,IAAI,CAAC,UAAY,EAAA;AACf,MAAA,MAAM,OAAO,OAAQ,CAAA,IAAA,CAAK,KAAO,EAAA,cAAA,EAAgB,UAAU,aAAa,CAAA;AACxE,MAAM,MAAA,IAAA,GAAA,CAAQ,IAAK,CAAA,KAAA,GAAQ,WAAe,IAAA,gBAAA;AAE1C,MAAA,IAAI,QAAQ,IAAK,CAAA,QAAA,CAAS,IAAK,CAAA,WAAA,CAAY,CAAC,CAAC,CAAA;AAC7C,MAAA,IAAI,eAAiB,EAAA;AACnB,QAAwB,qBAAA,GAAA,IAAA;AAAA;AAG1B,MAAA,UAAA,CAAW,MAAM,IAAM,EAAA,IAAA,EAAM,KAAO,EAAA,MAAA,EAAQ,OAAO,KAAK,CAAA;AAAA;AAG1D,IAAA,MAAM,QAAW,GAAA,SAAA,KAAc,UAAa,GAAA,IAAA,CAAK,WAAW,IAAK,CAAA,OAAA;AACjE,IAAA,IAAI,QAAU,EAAA;AACZ,MAAA,KAAA,CAAM,OAAQ,CAAA,GAAG,QAAS,CAAA,GAAA,CAAI,CAAC,CAAA,MAAO,EAAE,IAAA,EAAM,CAAG,EAAA,WAAA,EAAa,WAAc,GAAA,cAAA,GAAiB,CAAC,CAAA;AAAA;AAChG;AAEJ;AAEA,SAAS,gBAAA,CACP,YACA,eACA,EAAA,WAAA,EACA,OACA,UACA,EAAA,QAAA,EACA,QACA,EAAA,aAAA,EACA,QACA,EAAA;AACA,EAAO,OAAA,WAAA;AAAA,IACL,SAAS,QAAA,CAAS,IAAiB,EAAA,KAAA,EAAe,KAAgB,EAAA;AAEhE,MAAI,IAAA,KAAA,IAAS,CAAC,aAAe,EAAA;AAE3B,QAAO,OAAA,UAAA;AAAA;AAGT,MAAA,MAAM,QACJ,GAAA,IAAA,CAAK,UAAe,KAAA,SAAA,KACnB,WAAgB,KAAA,eAAA,CAAgB,OAAW,IAAA,WAAA,KAAgB,eAAgB,CAAA,cAAA,CAAA,GACxE,iBAAkB,CAAA,IAAA,CAAK,OAAO,IAAK,CAAA,UAAA,EAAa,UAAY,EAAA,eAAA,EAAkB,WAAW,CAAA,GACzF,WAAgB,KAAA,WAAA,CAAY,aAC1B,kBAAmB,CAAA,IAAA,CAAK,KAAO,EAAA,UAAA,EAAY,QAAU,EAAA,QAAQ,CAC7D,GAAA,oBAAA,CAAqB,OAAO,KAAK,CAAA;AAEzC,MAAA,IAAI,aAAe,EAAA;AAEjB,QAAA,OAAO,cAAc,GAAI,CAAA,KAAK,CAAI,GAAA,QAAA,CAAS,aAAgB,GAAA,UAAA;AAAA;AAI7D,MAAO,OAAA,IAAA,CAAK,KAAQ,GAAA,QAAA,GAAW,CAAI,GAAA,QAAA,CAAS,WAAY,EAAA,GAAI,QAAS,CAAA,OAAA,CAAQ,EAAE,CAAA,CAAE,WAAY,EAAA;AAAA,KAC/F;AAAA,IACA,CAAC,YAAY,eAAiB,EAAA,WAAA,EAAa,OAAO,QAAU,EAAA,QAAA,EAAU,aAAe,EAAA,QAAA,EAAU,UAAU;AAAA,GAC3G;AACF;AAEA,SAAS,cAAA,CAAe,SAAyC,EAAA,YAAA,EAAsB,cAAwB,EAAA;AAC7G,EAAA,MAAM,CAAC,GAAA,EAAK,MAAM,CAAA,GAAI,QAAmC,EAAA;AAEzD,EAAA,SAAA,CAAU,MAAM;AACd,IAAI,IAAA,EAAE,cAAkB,IAAA,SAAA,CAAU,OAAU,CAAA,EAAA;AAC1C,MAAA;AAAA;AAEF,IAAA,MAAMA,IAAM,GAAA,SAAA,CAAU,OAAQ,CAAA,UAAA,CAAW,IAAI,CAAA;AAE7C,IAAA,MAAM,SAAS,gBAAmB,GAAA,cAAA;AAClC,IAAA,SAAA,CAAU,QAAQ,KAAQ,GAAA,IAAA,CAAK,KAAM,CAAA,YAAA,GAAe,OAAO,gBAAgB,CAAA;AAC3E,IAAA,SAAA,CAAU,OAAQ,CAAA,MAAA,GAAS,IAAK,CAAA,KAAA,CAAM,MAAM,CAAA;AAC5C,IAAA,SAAA,CAAU,OAAQ,CAAA,KAAA,CAAM,KAAQ,GAAA,CAAA,EAAG,YAAY,CAAA,EAAA,CAAA;AAC/C,IAAA,SAAA,CAAU,QAAQ,KAAM,CAAA,MAAA,GAAS,CAAG,EAAA,MAAA,GAAS,OAAO,gBAAgB,CAAA,EAAA,CAAA;AAEpE,IAAAA,KAAI,YAAe,GAAA,QAAA;AACnB,IAAAA,IAAI,CAAA,IAAA,GAAO,EAAK,GAAA,MAAA,CAAO,gBAAmB,GAAA,cAAA;AAC1C,IAAAA,KAAI,WAAc,GAAA,OAAA;AAClB,IAAA,MAAA,CAAOA,IAAG,CAAA;AAAA,KACT,CAAC,SAAA,EAAW,MAAQ,EAAA,YAAA,EAAc,cAAc,CAAC,CAAA;AACpD,EAAO,OAAA,GAAA;AACT;AAIA,SAAS,WAAA,CACP,KACA,IACA,EAAA,KAAA,EACA,MACA,KACA,EAAA,CAAA,EACA,GACA,SACA,EAAA;AACA,EAAA,GAAA,CAAI,IAAK,EAAA;AACT,EAAA,GAAA,CAAI,IAAK,EAAA;AACT,EAAA,GAAA,CAAI,SAAY,GAAA,MAAA;AAEhB,EAAA,MAAM,YAAe,GAAA,IAAA,CAAK,qBAAsB,CAAA,IAAA,CAAK,KAAK,CAAA;AAC1D,EAAA,MAAM,OAAO,YAAa,CAAA,MAAA,GAAS,aAAa,IAAO,GAAA,YAAA,CAAa,SAAS,YAAa,CAAA,IAAA;AAG1F,EAAM,MAAA,OAAA,GAAU,GAAI,CAAA,WAAA,CAAY,KAAK,CAAA;AACrC,EAAA,MAAM,qBAAqB,KAAQ,GAAA,qBAAA;AAEnC,EAAA,IAAI,SAAY,GAAA,CAAA,EAAG,KAAK,CAAA,EAAA,EAAK,IAAI,CAAA,CAAA,CAAA;AACjC,EAAA,IAAI,MAAS,GAAA,IAAA,CAAK,GAAI,CAAA,CAAA,EAAG,CAAC,CAAI,GAAA,qBAAA;AAI9B,EAAI,IAAA,OAAA,CAAQ,QAAQ,kBAAoB,EAAA;AACtC,IAAA,GAAA,CAAI,SAAY,GAAA,SAAA;AAGhB,IAAA,IAAI,cAAc,OAAS,EAAA;AACzB,MAAY,SAAA,GAAA,KAAA;AACZ,MAAA,MAAA,GAAS,IAAI,KAAQ,GAAA,qBAAA;AAAA;AACvB;AAGF,EAAA,GAAA,CAAI,SAAS,SAAW,EAAA,MAAA,EAAQ,CAAI,GAAA,gBAAA,GAAmB,IAAI,CAAC,CAAA;AAC5D,EAAA,GAAA,CAAI,OAAQ,EAAA;AACd;AAUO,SAAS,OAAQ,CAAA,MAAA,EAAgB,UAAoB,EAAA,QAAA,EAAkB,aAAuB,EAAA;AACnG,EAAQ,OAAA,CAAA,MAAA,GAAS,aAAa,QAAY,IAAA,aAAA;AAC5C;;;;"}
@@ -6649,4 +6649,4 @@ const data = {
6649
6649
  };
6650
6650
 
6651
6651
  export { data };
6652
- //# sourceMappingURL=dataNestedSet.js.map
6652
+ //# sourceMappingURL=dataNestedSet.mjs.map