[APM] Replace react-vis with custom alternative (#153750)

## Summary

This commit removes `react-vis` dependency in favor of a custom
implementation of a simple duration axis.

`react-vis` was used only to render the axis tick labels, and the
vertical grid. I reused the existing xScale and generated the same axis
in a less and more compact way than using a full library.
There was no reason to use elastic-charts in this case because it was
essentially depicting a few labels on an SVG.

I've tested manually the marks (errror/agent) because I didn't find them
in the test data I've generated through `synthtrace` scenarios.

This is the visual output, which should be nearly pixel-perfect with the
previous implementation.

fix #133237
This commit is contained in:
Marco Vettorello 2023-03-30 14:56:06 +02:00 committed by GitHub
parent 25d578d0ad
commit d620e897ef
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
7 changed files with 144 additions and 255 deletions

View file

@ -882,7 +882,6 @@
"react-tiny-virtual-list": "^2.2.0",
"react-use": "^15.3.8",
"react-virtualized": "^9.22.3",
"react-vis": "^1.8.1",
"react-visibility-sensor": "^5.1.1",
"recompose": "^0.30.0",
"reduce-reducers": "^1.0.4",
@ -1252,7 +1251,6 @@
"@types/react-syntax-highlighter": "^15.4.0",
"@types/react-test-renderer": "^17.0.2",
"@types/react-virtualized": "^9.21.21",
"@types/react-vis": "^1.11.9",
"@types/recompose": "^0.30.10",
"@types/redux-actions": "^2.6.1",
"@types/redux-logger": "^3.0.8",

View file

@ -7,7 +7,6 @@
import React from 'react';
import ReactDOM from 'react-dom';
import 'react-vis/dist/style.css';
import type { ObservabilityRuleTypeRegistry } from '@kbn/observability-plugin/public';
import {
AppMountParameters,

View file

@ -5,9 +5,8 @@
* 2.0.
*/
import PropTypes from 'prop-types';
import React, { PureComponent, ReactNode } from 'react';
import { makeWidthFlexible } from 'react-vis';
import React, { useState } from 'react';
import { EuiResizeObserver } from '@elastic/eui';
import { AgentMark } from '../../../app/transaction_details/waterfall_with_summary/waterfall_container/marks/get_agent_marks';
import { ErrorMark } from '../../../app/transaction_details/waterfall_with_summary/waterfall_container/marks/get_error_marks';
import { getPlotValues } from './plot_utils';
@ -28,47 +27,49 @@ interface TimelineProps {
xMin?: number;
xMax?: number;
height: number;
header?: ReactNode;
margins: Margins;
width?: number;
}
class TL extends PureComponent<TimelineProps> {
// We normally do not define propTypes for TypeScript components, but the
// `makeWidthFlexible` HOC from react-vis depends on them.
static propTypes = {
marks: PropTypes.array,
xMin: PropTypes.number,
xMax: PropTypes.number,
height: PropTypes.number.isRequired,
header: PropTypes.node,
margins: PropTypes.object.isRequired,
width: PropTypes.number,
};
render() {
const { width, xMin, xMax, marks, height, margins } = this.props;
if (xMax == null || !width) {
return null;
}
const plotValues = getPlotValues({ width, xMin, xMax, height, margins });
const topTraceDuration = xMax - (xMin ?? 0);
return (
<div>
<TimelineAxis
plotValues={plotValues}
marks={marks}
topTraceDuration={topTraceDuration}
/>
<VerticalLines
plotValues={plotValues}
marks={marks}
topTraceDuration={topTraceDuration}
/>
</div>
);
function TimeLineContainer({
width,
xMin,
xMax,
height,
marks,
margins,
}: TimelineProps) {
if (xMax == null || !width) {
return null;
}
const plotValues = getPlotValues({ width, xMin, xMax, height, margins });
const topTraceDuration = xMax - (xMin ?? 0);
return (
<>
<TimelineAxis
plotValues={plotValues}
marks={marks}
topTraceDuration={topTraceDuration}
/>
<VerticalLines
plotValues={plotValues}
marks={marks}
topTraceDuration={topTraceDuration}
/>
</>
);
}
export const Timeline = makeWidthFlexible(TL);
export function Timeline(props: TimelineProps) {
const [width, setWidth] = useState(0);
return (
<EuiResizeObserver onResize={(size) => setWidth(size.width)}>
{(resizeRef) => (
<div style={{ width: '100%', height: '100%' }} ref={resizeRef}>
<TimeLineContainer {...props} width={width} />
</div>
)}
</EuiResizeObserver>
);
}

View file

@ -13,6 +13,7 @@ import {
toJson,
} from '../../../../utils/test_helpers';
import { Timeline } from '.';
import { AgentMark } from '../../../app/transaction_details/waterfall_with_summary/waterfall_container/marks/get_agent_marks';
describe('Timeline', () => {
let consoleMock: jest.SpyInstance;
@ -58,7 +59,7 @@ describe('Timeline', () => {
type: 'agentMark',
verticalLine: true,
},
],
] as AgentMark[],
};
const wrapper = mountWithTheme(<Timeline {...props} />);

View file

@ -7,11 +7,9 @@
import { inRange } from 'lodash';
import React, { ReactNode } from 'react';
import { XAxis, XYPlot } from 'react-vis';
import { getDurationFormatter } from '../../../../../common/utils/formatters';
import { useTheme } from '../../../../hooks/use_theme';
import { Mark } from '.';
import { LastTickValue } from './last_tick_value';
import { Marker } from './marker';
import { PlotValues } from './plot_utils';
@ -47,10 +45,20 @@ export function TimelineAxis({
topTraceDuration,
}: TimelineAxisProps) {
const theme = useTheme();
const { margins, tickValues, width, xDomain, xMax, xScale } = plotValues;
const { margins, tickValues, width, xMax, xScale } = plotValues;
const tickFormatter = getDurationFormatter(xMax);
const xAxisTickValues = getXAxisTickValues(tickValues, topTraceDuration);
const topTraceDurationFormatted = tickFormatter(topTraceDuration).formatted;
const tickPositionsAndLabels = getXAxisTickValues(
tickValues,
topTraceDuration
).reduce<Array<{ position: number; label: string }>>((ticks, tick) => {
const position = xScale(tick);
return Number.isFinite(position)
? [...ticks, { position, label: tickFormatter(tick).formatted }]
: ticks;
}, []);
const topTraceDurationPosition =
topTraceDuration > 0 ? xScale(topTraceDuration) : NaN;
return (
<div
@ -63,41 +71,41 @@ export function TimelineAxis({
width: '100%',
}}
>
<XYPlot
dontCheckIfEmpty
<svg
style={{ position: 'absolute', top: 0, left: 0 }}
width={width}
height={margins.top}
margin={{
top: margins.top,
left: margins.left,
right: margins.right,
}}
xDomain={xDomain}
>
<XAxis
hideLine
orientation="top"
tickSize={0}
tickValues={xAxisTickValues}
tickFormat={(time?: number) => tickFormatter(time).formatted}
tickPadding={20}
style={{
text: { fill: theme.eui.euiColorDarkShade },
}}
/>
<g transform={`translate(0 ${margins.top - 20})`}>
{tickPositionsAndLabels.map(({ position, label }) => (
<text
key={`tick-${position}`}
x={position}
y={0}
textAnchor="middle"
fill={theme.eui.euiColorDarkShade}
fontSize={11}
>
{label}
</text>
))}
{Number.isFinite(topTraceDurationPosition) && (
<text
key="topTrace"
x={topTraceDurationPosition}
y={0}
fill={theme.eui.euiTextColor}
textAnchor="middle"
>
{tickFormatter(topTraceDuration).formatted}
</text>
)}
</g>
</svg>
{topTraceDuration > 0 && (
<LastTickValue
x={xScale(topTraceDuration) ?? 0}
value={topTraceDurationFormatted}
marginTop={28}
/>
)}
{marks.map((mark) => (
<Marker key={mark.id} mark={mark} x={xScale(mark.offset) ?? 0} />
))}
</XYPlot>
{marks.map((mark) => (
<Marker key={mark.id} mark={mark} x={xScale(mark.offset) ?? 0} />
))}
</div>
);
}

View file

@ -6,7 +6,6 @@
*/
import React from 'react';
import { VerticalGridLines, XYPlot } from 'react-vis';
import { useTheme } from '../../../../hooks/use_theme';
import { Mark } from '../../../app/transaction_details/waterfall_with_summary/waterfall_container/marks';
import { PlotValues } from './plot_utils';
@ -22,7 +21,7 @@ export function VerticalLines({
plotValues,
marks = [],
}: VerticalLinesProps) {
const { width, height, margins, xDomain, tickValues } = plotValues;
const { width, height, margins, tickValues, xScale } = plotValues;
const markTimes = marks
.filter((mark) => mark.verticalLine)
@ -30,38 +29,61 @@ export function VerticalLines({
const theme = useTheme();
const tickPositions = tickValues.reduce<number[]>((positions, tick) => {
const position = xScale(tick);
return Number.isFinite(position) ? [...positions, position] : positions;
}, []);
const markPositions = markTimes.reduce<number[]>((positions, mark) => {
const position = xScale(mark);
return Number.isFinite(position) ? [...positions, position] : positions;
}, []);
const topTraceDurationPosition =
topTraceDuration > 0 ? xScale(topTraceDuration) : NaN;
return (
<div
<svg
width={width}
height={height + margins.top}
style={{
position: 'absolute',
top: 0,
left: 0,
}}
>
<XYPlot
dontCheckIfEmpty
width={width}
height={height + margins.top}
margin={margins}
xDomain={xDomain}
>
<VerticalGridLines
tickValues={tickValues}
style={{ stroke: theme.eui.euiColorLightestShade }}
/>
<VerticalGridLines
tickValues={markTimes}
style={{ stroke: theme.eui.euiColorMediumShade }}
/>
{topTraceDuration > 0 && (
<VerticalGridLines
tickValues={[topTraceDuration]}
style={{ stroke: theme.eui.euiColorMediumShade }}
<g transform={`translate(0 ${margins.top})`}>
{tickPositions.map((position) => (
<line
key={`tick-${position}`}
x1={position}
x2={position}
y1={0}
y2={height}
stroke={theme.eui.euiColorLightestShade}
/>
))}
{markPositions.map((position) => (
<line
key={`mark-${position}`}
x1={position}
x2={position}
y1={0}
y2={height}
stroke={theme.eui.euiColorMediumShade}
/>
))}
{Number.isFinite(topTraceDurationPosition) && (
<line
key="topTrace"
x1={topTraceDurationPosition}
x2={topTraceDurationPosition}
y1={0}
y2={height}
stroke={theme.eui.euiColorMediumShade}
/>
)}
</XYPlot>
</div>
</g>
</svg>
);
}

158
yarn.lock
View file

@ -8907,13 +8907,6 @@
"@types/prop-types" "*"
"@types/react" "^17"
"@types/react-vis@^1.11.9":
version "1.11.9"
resolved "https://registry.yarnpkg.com/@types/react-vis/-/react-vis-1.11.9.tgz#7d1534cf491d4563dd18c5ad0251d9ae66549323"
integrity sha512-n6sbTQuxpIzjf1FTIPhMdwBG0VNU96Oon7z3ASRSCnWT7ehL/zYJ/np0WAYFR/+c8OwNoSzny0OWlUmfvr/YCA==
dependencies:
"@types/react" "*"
"@types/react-window@^1.8.5":
version "1.8.5"
resolved "https://registry.yarnpkg.com/@types/react-window/-/react-window-1.8.5.tgz#285fcc5cea703eef78d90f499e1457e9b5c02fc1"
@ -12643,15 +12636,6 @@ create-hmac@^1.1.0, create-hmac@^1.1.2, create-hmac@^1.1.4:
safe-buffer "^5.0.1"
sha.js "^2.4.8"
create-react-class@^15.5.2:
version "15.6.3"
resolved "https://registry.yarnpkg.com/create-react-class/-/create-react-class-15.6.3.tgz#2d73237fb3f970ae6ebe011a9e66f46dbca80036"
integrity sha512-M+/3Q6E6DLO6Yx3OwrWjwHBnvfXXYA7W+dFjt/ZDBemHO1DDZhsalX/NUtnTYclN6GfnBDRh4qRHjcDHmlJBJg==
dependencies:
fbjs "^0.8.9"
loose-envify "^1.3.1"
object-assign "^4.1.1"
create-require@^1.1.0:
version "1.1.1"
resolved "https://registry.yarnpkg.com/create-require/-/create-require-1.1.1.tgz#c1d7e8f1e5f6cfc9ff65f9cd352d37348756c333"
@ -13070,11 +13054,6 @@ cytoscape@^3.10.0:
heap "^0.2.6"
lodash.debounce "^4.0.8"
d3-array@1, d3-array@^1.1.1, d3-array@^1.2.0, d3-array@^1.2.4:
version "1.2.4"
resolved "https://registry.yarnpkg.com/d3-array/-/d3-array-1.2.4.tgz#635ce4d5eea759f6f605863dbcfc30edc737f71f"
integrity sha512-KHW6M86R+FUPYGb3R5XiYjXPq7VzwxZ22buHhAEVG5ztoEcZZMLov530mmccaqA1GghZArjQV46fuc8kUqhhHw==
"d3-array@1 - 3", "d3-array@2 - 3", "d3-array@2.10.0 - 3", "d3-array@2.5.0 - 3", d3-array@3.2.2, d3-array@^3.2.2:
version "3.2.2"
resolved "https://registry.yarnpkg.com/d3-array/-/d3-array-3.2.2.tgz#f8ac4705c5b06914a7e0025bbf8d5f1513f6a86e"
@ -13089,6 +13068,11 @@ d3-array@2, d3-array@2.12.1, d3-array@^2.3.0:
dependencies:
internmap "^1.0.0"
d3-array@^1.2.4:
version "1.2.4"
resolved "https://registry.yarnpkg.com/d3-array/-/d3-array-1.2.4.tgz#635ce4d5eea759f6f605863dbcfc30edc737f71f"
integrity sha512-KHW6M86R+FUPYGb3R5XiYjXPq7VzwxZ22buHhAEVG5ztoEcZZMLov530mmccaqA1GghZArjQV46fuc8kUqhhHw==
d3-brush@^3.0.0:
version "3.0.0"
resolved "https://registry.yarnpkg.com/d3-brush/-/d3-brush-3.0.0.tgz#6f767c4ed8dcb79de7ede3e1c0f89e63ef64d31c"
@ -13107,16 +13091,11 @@ d3-cloud@1.2.5, d3-cloud@^1.2.5:
dependencies:
d3-dispatch "^1.0.3"
d3-collection@1, d3-collection@^1.0.3, d3-collection@^1.0.7:
d3-collection@^1.0.7:
version "1.0.7"
resolved "https://registry.yarnpkg.com/d3-collection/-/d3-collection-1.0.7.tgz#349bd2aa9977db071091c13144d5e4f16b5b310e"
integrity sha512-ii0/r5f4sjKNTfh84Di+DpztYwqKhEyUlKoPrzUFfeSkWxjW49xU2QzO9qrPrNkpdI0XJkfzvmTu8V2Zylln6A==
d3-color@1, d3-color@^1.0.3:
version "1.4.1"
resolved "https://registry.yarnpkg.com/d3-color/-/d3-color-1.4.1.tgz#c52002bf8846ada4424d55d97982fef26eb3bc8a"
integrity sha512-p2sTHSLCJI2QKunbGb7ocOh7DgTAn8IrLx21QRc/BSnodXM4sv6aLQlnfpvehFMLZEfBc6g9pH9SWQccFYfJ9Q==
"d3-color@1 - 2":
version "2.0.0"
resolved "https://registry.yarnpkg.com/d3-color/-/d3-color-2.0.0.tgz#8d625cab42ed9b8f601a1760a389f7ea9189d62e"
@ -13127,13 +13106,6 @@ d3-color@1, d3-color@^1.0.3:
resolved "https://registry.yarnpkg.com/d3-color/-/d3-color-3.1.0.tgz#395b2833dfac71507f12ac2f7af23bf819de24e2"
integrity sha512-zg/chbXyeBtMQ1LbD/WSoW2DpC3I0mpmPdW+ynRTj/x2DAWYrIY7qeZIHidozwV24m4iavr15lNwIwLxRmOxhA==
d3-contour@^1.1.0:
version "1.3.2"
resolved "https://registry.yarnpkg.com/d3-contour/-/d3-contour-1.3.2.tgz#652aacd500d2264cb3423cee10db69f6f59bead3"
integrity sha512-hoPp4K/rJCu0ladiH6zmJUEz6+u3lgR+GSm/QdM2BBvDraU39Vr7YdDCicJcxP1z8i9B/2dJLgDC1NcvlF8WCg==
dependencies:
d3-array "^1.1.1"
d3-delaunay@^6.0.2:
version "6.0.2"
resolved "https://registry.yarnpkg.com/d3-delaunay/-/d3-delaunay-6.0.2.tgz#7fd3717ad0eade2fc9939f4260acfb503f984e92"
@ -13186,11 +13158,6 @@ d3-force@^3.0.0:
d3-quadtree "1 - 3"
d3-timer "1 - 3"
d3-format@1, d3-format@^1.2.0:
version "1.4.4"
resolved "https://registry.yarnpkg.com/d3-format/-/d3-format-1.4.4.tgz#356925f28d0fd7c7983bfad593726fce46844030"
integrity sha512-TWks25e7t8/cqctxCmxpUuzZN11QxIA7YrMbram94zMQ0PXjE4LVIMe/f6a4+xxL8HQ3OsAFULOINQi1pE62Aw==
"d3-format@1 - 2":
version "2.0.0"
resolved "https://registry.yarnpkg.com/d3-format/-/d3-format-2.0.0.tgz#a10bcc0f986c372b729ba447382413aabf5b0767"
@ -13217,30 +13184,11 @@ d3-geo-projection@^4.0.0:
dependencies:
d3-array "2.5.0 - 3"
d3-geo@^1.6.4:
version "1.12.1"
resolved "https://registry.yarnpkg.com/d3-geo/-/d3-geo-1.12.1.tgz#7fc2ab7414b72e59fbcbd603e80d9adc029b035f"
integrity sha512-XG4d1c/UJSEX9NfU02KwBL6BYPj8YKHxgBEw5om2ZnTRSbIcego6dhHwcxuSR3clxh0EpE38os1DVPOmnYtTPg==
dependencies:
d3-array "1"
d3-hierarchy@^1.1.4:
version "1.1.9"
resolved "https://registry.yarnpkg.com/d3-hierarchy/-/d3-hierarchy-1.1.9.tgz#2f6bee24caaea43f8dc37545fa01628559647a83"
integrity sha512-j8tPxlqh1srJHAtxfvOUwKNYJkQuBFdM1+JAUfq6xqH5eAqf93L7oG1NVqDa4CpFZNvnNKtCYEUC8KY9yEn9lQ==
d3-hierarchy@^3.1.2:
version "3.1.2"
resolved "https://registry.yarnpkg.com/d3-hierarchy/-/d3-hierarchy-3.1.2.tgz#b01cd42c1eed3d46db77a5966cf726f8c09160c6"
integrity sha512-FX/9frcub54beBdugHjDCdikxThEqjnR93Qt7PvQTOHxyiNCAlvMrHhclk3cD5VeAaq9fxmfRp+CnWw9rEMBuA==
d3-interpolate@1, d3-interpolate@^1.1.4:
version "1.4.0"
resolved "https://registry.yarnpkg.com/d3-interpolate/-/d3-interpolate-1.4.0.tgz#526e79e2d80daa383f9e0c1c1c7dcc0f0583e987"
integrity sha512-V9znK0zc3jOPV4VD2zZn0sDhZU3WAE2bmlxdIwwQPPzPjvyLkd8B3JUVdS1IDUFDkWZ72c9qnv1GK2ZagTZ8EA==
dependencies:
d3-color "1"
"d3-interpolate@1 - 3", "d3-interpolate@1.2.0 - 3", d3-interpolate@^3.0.1:
version "3.0.1"
resolved "https://registry.yarnpkg.com/d3-interpolate/-/d3-interpolate-3.0.1.tgz#3c47aa5b32c5b3dfb56ef3fd4342078a632b400d"
@ -13255,11 +13203,6 @@ d3-interpolate@1, d3-interpolate@^1.1.4:
dependencies:
d3-color "1 - 2"
d3-path@1:
version "1.0.9"
resolved "https://registry.yarnpkg.com/d3-path/-/d3-path-1.0.9.tgz#48c050bb1fe8c262493a8caf5524e3e9591701cf"
integrity sha512-VLaYcn81dtHVTjEHd8B+pbe9yHWpXKZUC87PzoFmsFrJqgFwDe/qxfp5MlfsfM1V5E/iVt0MmEbWQ7FVIXh/bg==
"d3-path@1 - 2":
version "2.0.0"
resolved "https://registry.yarnpkg.com/d3-path/-/d3-path-2.0.0.tgz#55d86ac131a0548adae241eebfb56b4582dd09d8"
@ -13275,28 +13218,6 @@ d3-path@^3.1.0:
resolved "https://registry.yarnpkg.com/d3-quadtree/-/d3-quadtree-2.0.0.tgz#edbad045cef88701f6fee3aee8e93fb332d30f9d"
integrity sha512-b0Ed2t1UUalJpc3qXzKi+cPGxeXRr4KU9YSlocN74aTzp6R/Ud43t79yLLqxHRWZfsvWXmbDWPpoENK1K539xw==
d3-sankey@^0.7.1:
version "0.7.1"
resolved "https://registry.yarnpkg.com/d3-sankey/-/d3-sankey-0.7.1.tgz#d229832268fc69a7fec84803e96c2256a614c521"
integrity sha1-0imDImj8aaf+yEgD6WwiVqYUxSE=
dependencies:
d3-array "1"
d3-collection "1"
d3-shape "^1.2.0"
d3-scale@^1.0.5:
version "1.0.7"
resolved "https://registry.yarnpkg.com/d3-scale/-/d3-scale-1.0.7.tgz#fa90324b3ea8a776422bd0472afab0b252a0945d"
integrity sha512-KvU92czp2/qse5tUfGms6Kjig0AhHOwkzXG0+PqIJB3ke0WUv088AHMZI0OssO9NCkXt4RP8yju9rpH8aGB7Lw==
dependencies:
d3-array "^1.2.0"
d3-collection "1"
d3-color "1"
d3-format "1"
d3-interpolate "1"
d3-time "1"
d3-time-format "2"
d3-scale@^3.3.0:
version "3.3.0"
resolved "https://registry.yarnpkg.com/d3-scale/-/d3-scale-3.3.0.tgz#28c600b29f47e5b9cd2df9749c206727966203f3"
@ -13324,13 +13245,6 @@ d3-selection@3, d3-selection@^3.0.0:
resolved "https://registry.yarnpkg.com/d3-selection/-/d3-selection-3.0.0.tgz#c25338207efa72cc5b9bd1458a1a41901f1e1b31"
integrity sha512-fmTRWbNMmsmWq6xJV8D19U/gw/bwrHfNXxrIN+HfZgnzqTHp9jOmKMhsTUjXOJnZOdZY9Q28y4yebKzqDKlxlQ==
d3-shape@^1.1.0, d3-shape@^1.2.0:
version "1.3.7"
resolved "https://registry.yarnpkg.com/d3-shape/-/d3-shape-1.3.7.tgz#df63801be07bc986bc54f63789b4fe502992b5d7"
integrity sha512-EUkvKjqPFUAZyOlhY5gzCxCeI0Aep04LwIRpsZ/mLFelJiUfnK56jo5JMDSE7yyP2kLSb6LtF+S5chMk7uqPqw==
dependencies:
d3-path "1"
d3-shape@^2.0.0, d3-shape@^2.1.0:
version "2.1.0"
resolved "https://registry.yarnpkg.com/d3-shape/-/d3-shape-2.1.0.tgz#3b6a82ccafbc45de55b57fcf956c584ded3b666f"
@ -13345,13 +13259,6 @@ d3-shape@^3.2.0:
dependencies:
d3-path "^3.1.0"
d3-time-format@2:
version "2.2.3"
resolved "https://registry.yarnpkg.com/d3-time-format/-/d3-time-format-2.2.3.tgz#0c9a12ee28342b2037e5ea1cf0b9eb4dd75f29cb"
integrity sha512-RAHNnD8+XvC4Zc4d2A56Uw0yJoM7bsvOlJR33bclxq399Rak/b9bhvu/InjxdWhPtkgU53JJcleJTGkNRnN6IA==
dependencies:
d3-time "1"
"d3-time-format@2 - 3":
version "3.0.0"
resolved "https://registry.yarnpkg.com/d3-time-format/-/d3-time-format-3.0.0.tgz#df8056c83659e01f20ac5da5fdeae7c08d5f1bb6"
@ -13366,11 +13273,6 @@ d3-time-format@2:
dependencies:
d3-time "1 - 3"
d3-time@1:
version "1.1.0"
resolved "https://registry.yarnpkg.com/d3-time/-/d3-time-1.1.0.tgz#b1e19d307dae9c900b7e5b25ffc5dcc249a8a0f1"
integrity sha512-Xh0isrZ5rPYYdqhAVk8VLnMEidhz5aP7htAADH6MfzgmmicPkTo8LhkLxci61/lCB7n7UmE3bN0leRt+qvkLxA==
"d3-time@1 - 2", d3-time@^2.1.1:
version "2.1.1"
resolved "https://registry.yarnpkg.com/d3-time/-/d3-time-2.1.1.tgz#e9d8a8a88691f4548e68ca085e5ff956724a6682"
@ -13401,11 +13303,6 @@ d3-transition@3, d3-transition@^3.0.1:
d3-interpolate "1 - 3"
d3-timer "1 - 3"
d3-voronoi@^1.1.2:
version "1.1.4"
resolved "https://registry.yarnpkg.com/d3-voronoi/-/d3-voronoi-1.1.4.tgz#dd3c78d7653d2bb359284ae478645d95944c8297"
integrity sha512-dArJ32hchFsrQ8uMiTBLq256MpnZjeuBtdHpaDlYuQyjU0CVzCJl/BVW+SkszaAeH95D/8gxqAhgx0ouAWAfRg==
d3@3.5.17:
version "3.5.17"
resolved "https://registry.yarnpkg.com/d3/-/d3-3.5.17.tgz#bc46748004378b21a360c9fc7cf5231790762fb8"
@ -15728,7 +15625,7 @@ fb-watchman@^2.0.0:
dependencies:
bser "^2.0.0"
fbjs@^0.8.1, fbjs@^0.8.9:
fbjs@^0.8.1:
version "0.8.17"
resolved "https://registry.yarnpkg.com/fbjs/-/fbjs-0.8.17.tgz#c4d598ead6949112653d6588b01a5cdcd9f90fdd"
integrity sha1-xNWY6taUkRJlPWWIsBpc3Nn5D90=
@ -16616,7 +16513,7 @@ global-prefix@^3.0.0:
kind-of "^6.0.2"
which "^1.3.1"
global@^4.3.1, global@^4.4.0:
global@^4.4.0:
version "4.4.0"
resolved "https://registry.yarnpkg.com/global/-/global-4.4.0.tgz#3e7b105179006a323ed71aafca3e9c57a5cc6406"
integrity sha512-wv/LAoHdRE3BeTGz53FAamhGlPLhlssK45usmGFThIi4XqnBmjKQ16u+RNbP7WvigRZDxUsM0J3gcQ5yicaL0w==
@ -22745,11 +22642,6 @@ pend@~1.2.0:
resolved "https://registry.yarnpkg.com/pend/-/pend-1.2.0.tgz#7a57eb550a6783f9115331fcf4663d5c8e007a50"
integrity sha1-elfrVQpng/kRUzH89GY9XI4AelA=
performance-now@^0.2.0:
version "0.2.0"
resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-0.2.0.tgz#33ef30c5c77d4ea21c5a53869d91b56d8f2555e5"
integrity sha1-M+8wxcd9TqIcWlOGnZG1bY8lVeU=
performance-now@^2.1.0:
version "2.1.0"
resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-2.1.0.tgz#6309f4e0e5fa913ec1c69307ae364b4b377c9e7b"
@ -23804,7 +23696,7 @@ raf-schd@^4.0.2:
resolved "https://registry.yarnpkg.com/raf-schd/-/raf-schd-4.0.2.tgz#bd44c708188f2e84c810bf55fcea9231bcaed8a0"
integrity sha512-VhlMZmGy6A6hrkJWHLNTGl5gtgMUm+xfGza6wbwnE914yeQ5Ybm18vgM734RZhMgfw4tacUrWseGZlpUrrakEQ==
raf@^3.1.0, raf@^3.4.1:
raf@^3.4.1:
version "3.4.1"
resolved "https://registry.yarnpkg.com/raf/-/raf-3.4.1.tgz#0742e99a4a6552f445d73e3ee0328af0ff1ede39"
integrity sha512-Sq4CW4QhwOHE8ucn6J34MqtZCeWFP2aQSmrlroYgqAV1PjStIhJXxYuTgUIfkEk7zTLjmIjLmU5q+fbD1NnOJA==
@ -24182,16 +24074,6 @@ react-monaco-editor@^0.41.2:
monaco-editor "*"
prop-types "^15.7.2"
react-motion@^0.4.8:
version "0.4.8"
resolved "https://registry.yarnpkg.com/react-motion/-/react-motion-0.4.8.tgz#23bb2dd27c2d8e00d229e45572d105efcf40a35e"
integrity sha1-I7st0nwtjgDSKeRVctEF789Ao14=
dependencies:
create-react-class "^15.5.2"
performance-now "^0.2.0"
prop-types "^15.5.8"
raf "^3.1.0"
react-popper-tooltip@^3.1.1:
version "3.1.1"
resolved "https://registry.yarnpkg.com/react-popper-tooltip/-/react-popper-tooltip-3.1.1.tgz#329569eb7b287008f04fcbddb6370452ad3f9eac"
@ -24456,28 +24338,6 @@ react-virtualized@^9.22.3:
prop-types "^15.7.2"
react-lifecycles-compat "^3.0.4"
react-vis@^1.8.1:
version "1.8.2"
resolved "https://registry.yarnpkg.com/react-vis/-/react-vis-1.8.2.tgz#0e0aebc427e50856a01b666569ffad0411ef050f"
integrity sha512-rY22CBemGujB0BnymwBTPy6sdcxLUIj+qO0U2p42Y6dCCjOcfgL82OBM4MXVPU/O6uw8jHOgfX1pdbNgNLsg7Q==
dependencies:
d3-array "^1.2.0"
d3-collection "^1.0.3"
d3-color "^1.0.3"
d3-contour "^1.1.0"
d3-format "^1.2.0"
d3-geo "^1.6.4"
d3-hierarchy "^1.1.4"
d3-interpolate "^1.1.4"
d3-sankey "^0.7.1"
d3-scale "^1.0.5"
d3-shape "^1.1.0"
d3-voronoi "^1.1.2"
deep-equal "^1.0.1"
global "^4.3.1"
prop-types "^15.5.8"
react-motion "^0.4.8"
react-visibility-sensor@^5.1.1:
version "5.1.1"
resolved "https://registry.yarnpkg.com/react-visibility-sensor/-/react-visibility-sensor-5.1.1.tgz#5238380960d3a0b2be0b7faddff38541e337f5a9"