mirror of
https://github.com/elastic/kibana.git
synced 2025-04-23 17:28:26 -04:00
[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:
parent
25d578d0ad
commit
d620e897ef
7 changed files with 144 additions and 255 deletions
|
@ -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",
|
||||
|
|
|
@ -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,
|
||||
|
|
|
@ -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>
|
||||
);
|
||||
}
|
||||
|
|
|
@ -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} />);
|
||||
|
|
|
@ -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>
|
||||
);
|
||||
}
|
||||
|
|
|
@ -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
158
yarn.lock
|
@ -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"
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue