+
{this.props.children}
-
+
{// TODO reenable when SVG rendered is aligned with canvas one
@@ -79,11 +98,9 @@ export class Chart extends React.Component
{
{renderer === 'canvas' && }
-
-
-
+
);
}
diff --git a/src/components/legend/_index.scss b/src/components/legend/_index.scss
index 8caba8f13e..6b6f3997ff 100644
--- a/src/components/legend/_index.scss
+++ b/src/components/legend/_index.scss
@@ -1,5 +1,3 @@
@import 'variables';
@import 'legend';
-@import 'legend_button';
-@import 'legend_list';
@import 'legend_item';
diff --git a/src/components/legend/_legend.scss b/src/components/legend/_legend.scss
index 32703da480..fcb5d4671c 100644
--- a/src/components/legend/_legend.scss
+++ b/src/components/legend/_legend.scss
@@ -1,67 +1,46 @@
-// Legend
-
.echLegend {
- // Margin supplied in JS to match chart margins
- position: absolute !important; // Override shadow
- overflow-y: hidden;
-}
-
-.echLegend--collapsed {
- display: none;
-}
-
-.echLegend--debug {
- background: red;
-}
-
-.echLegend--top,
-.echLegend--bottom {
- left: $euiSizeL;
- right: 0;
- height: $echLegendMaxHeight;
-
- .echLegendList {
- flex-direction: row;
- flex-wrap: wrap;
+ &--top,
+ &--bottom {
+ .echLegendList {
+ display: grid;
+ grid-column-gap: $echLegendColumnGap;
+ grid-row-gap: $echLegendRowGap;
+ margin-top: $echLegendRowGap;
+ margin-bottom: $echLegendRowGap;
+
+ @include internetExplorerOnly {
+ display: flex;
+ flex-direction: row;
+ flex-wrap: wrap;
+ }
+ }
}
- .echLegendItem {
- margin-right: $euiSizeL;
- width: $echLegendMaxWidth;
+ &--left,
+ &--right {
+ .echLegendList {
+ flex-direction: column;
+ }
}
-}
-.echLegend--top {
- top: 0;
-}
-.echLegend--bottom {
- bottom: 0;
-}
+ &--top,
+ &--left {
+ order: 0;
+ }
-.echLegend--left,
-.echLegend--right {
- top: 0;
- bottom: 0;
- width: $echLegendMaxWidth;
+ &--bottom,
+ &--right {
+ order: 1;
+ }
- .echLegendList {
- flex-direction: column;
+ &--debug {
+ background: red;
}
- .echLegendItem {
+ .echLegendListContainer {
+ @include euiYScrollWithShadows;
width: 100%;
+ overflow-y: auto;
+ overflow-x: hidden;
}
}
-
-.echLegend--left {
- left: 0;
-}
-.echLegend--right {
- right: 0;
-}
-
-.echLegendListContainer {
- @include euiYScrollWithShadows;
- width: 100%;
- overflow-y: auto;
-}
diff --git a/src/components/legend/_legend_button.scss b/src/components/legend/_legend_button.scss
deleted file mode 100644
index e634285241..0000000000
--- a/src/components/legend/_legend_button.scss
+++ /dev/null
@@ -1,23 +0,0 @@
-.echLegendButton {
- padding: $euiSizeXS;
- line-height: 1;
- opacity: 0.35;
- border-radius: $euiBorderRadius;
- background-color: $euiColorEmptyShade;
- position: absolute;
- bottom: 0;
- left: 0;
- transition:
- opacity $euiAnimSpeedFast $euiAnimSlightResistance,
- background-color $euiAnimSpeedFast $euiAnimSlightResistance;
-
- &:hover,
- &:focus {
- opacity: 1;
- background-color: $euiFocusBackgroundColor;
- }
-}
-
-.echLegendButton--isOpen {
- opacity: 1;
-}
diff --git a/src/components/legend/_legend_item.scss b/src/components/legend/_legend_item.scss
index cd3c4e31a7..e312e19eb3 100644
--- a/src/components/legend/_legend_item.scss
+++ b/src/components/legend/_legend_item.scss
@@ -1,62 +1,81 @@
+$legendItemVerticalPadding: $echLegendRowGap / 2;
+
.echLegendItem {
color: $euiTextColor;
- height: $echLegendItemHeight;
- width: 100%;
display: flex;
flex-wrap: nowrap;
justify-content: space-between;
user-select: none;
align-items: center;
+ width: 100%;
&:hover {
.echLegendItem__title {
text-decoration: underline;
}
}
-}
-.echLegendItem__color {
- margin-right: $euiSizeXS;
-}
+ &__color {
+ margin-right: $euiSizeXS;
+ }
-.echLegendItem__visibility {
- margin-right: $euiSizeXS;
+ &__visibility {
+ margin-right: $euiSizeXS;
- &:hover {
- cursor: pointer;
+ &:hover {
+ cursor: pointer;
+ }
}
-}
-.echLegendItem__title {
- @include euiFontSizeXS;
- @include euiTextTruncate;
- margin-right: $euiSizeXS;
- flex: 1;
- &:hover {
- cursor: pointer;
+ &__title {
+ @include euiFontSizeXS;
+ @include euiTextTruncate;
+ flex: 1 1 auto;
+
+ &:hover {
+ cursor: pointer;
+ }
}
-}
-.echLegendItem__title--selected {
- text-decoration: underline;
-}
+ &__title--selected {
+ text-decoration: underline;
+ }
-.echLegendItem__title--hasClickListener {
- &:hover {
- cursor: pointer;
+ &__title--hasClickListener {
+ &:hover {
+ cursor: pointer;
+ }
}
-}
-.echLegendItem__displayValue {
- @include euiFontSizeXS;
- text-align: right;
- font-feature-settings: 'tnum';
+ &__displayValue {
+ @include euiFontSizeXS;
+ text-align: right;
+ margin-left: $euiSizeXS;
+ font-feature-settings: 'tnum';
- &--hidden {
- display: none;
+ &--hidden {
+ display: none;
+ }
}
-}
-.echLegendItem-isHidden {
- color: $euiColorDarkShade;
+ &--right,
+ &--left {
+ padding-top: $legendItemVerticalPadding;
+ padding-bottom: $legendItemVerticalPadding;
+ }
+
+ @include internetExplorerOnly {
+ &--bottom,
+ &--top {
+ width: $echLegendMaxWidth;
+ margin-right: $euiSizeL;
+ }
+
+ padding-top: $legendItemVerticalPadding;
+ padding-bottom: $legendItemVerticalPadding;
+ }
+
+ &--hidden {
+ color: $euiColorDarkShade;
+ }
}
diff --git a/src/components/legend/_legend_list.scss b/src/components/legend/_legend_list.scss
deleted file mode 100644
index 41d95552fe..0000000000
--- a/src/components/legend/_legend_list.scss
+++ /dev/null
@@ -1,3 +0,0 @@
-.echLegendList {
- display: flex;
-}
diff --git a/src/components/legend/_variables.scss b/src/components/legend/_variables.scss
index 9eb2df5292..c8543808be 100644
--- a/src/components/legend/_variables.scss
+++ b/src/components/legend/_variables.scss
@@ -1,3 +1,3 @@
$echLegendMaxWidth: 200px;
-$echLegendMaxHeight: $euiSizeXL * 2;
-$echLegendItemHeight: ($echLegendMaxHeight / 2) - 6px;
+$echLegendRowGap: 8px;
+$echLegendColumnGap: 24px;
diff --git a/src/components/legend/legend.tsx b/src/components/legend/legend.tsx
index 79049e824e..751c580ca6 100644
--- a/src/components/legend/legend.tsx
+++ b/src/components/legend/legend.tsx
@@ -1,59 +1,133 @@
import classNames from 'classnames';
import { inject, observer } from 'mobx-react';
-import React from 'react';
-import { isVertical } from '../../chart_types/xy_chart/utils/axis_utils';
+import React, { createRef } from 'react';
+import { isVertical, isHorizontal } from '../../chart_types/xy_chart/utils/axis_utils';
import { LegendItem as SeriesLegendItem } from '../../chart_types/xy_chart/legend/legend';
import { ChartStore } from '../../chart_types/xy_chart/store/chart_state';
+import { Position } from '../../chart_types/xy_chart/utils/specs';
import { LegendItem } from './legend_item';
+import { Theme } from '../../utils/themes/theme';
interface LegendProps {
chartStore?: ChartStore; // FIX until we find a better way on ts mobx
- legendId: string;
}
-class LegendComponent extends React.Component
{
+interface LegendState {
+ width?: number;
+}
+
+interface LegendStyle {
+ maxHeight?: string;
+ maxWidth?: string;
+ width?: string;
+}
+
+interface LegendListStyle {
+ paddingTop?: number | string;
+ paddingBottom?: number | string;
+ paddingLeft?: number | string;
+ paddingRight?: number | string;
+ gridTemplateColumns?: string;
+}
+
+class LegendComponent extends React.Component {
static displayName = 'Legend';
- onCollapseLegend = () => {
- this.props.chartStore!.toggleLegendCollapsed();
+ state = {
+ width: undefined,
};
+ private echLegend = createRef();
+
+ componentDidUpdate() {
+ const { chartInitialized, chartTheme, legendPosition } = this.props.chartStore!;
+ if (
+ this.echLegend.current &&
+ isVertical(legendPosition.get()) &&
+ this.state.width === undefined &&
+ !chartInitialized.get()
+ ) {
+ const buffer = chartTheme.legend.spacingBuffer;
+
+ this.setState({
+ width: this.echLegend.current.offsetWidth + buffer,
+ });
+ }
+ }
+
render() {
- const { legendId } = this.props;
const {
- initialized,
+ legendInitialized,
+ chartInitialized,
legendItems,
legendPosition,
showLegend,
- legendCollapsed,
debug,
chartTheme,
} = this.props.chartStore!;
+ const postion = legendPosition.get();
- if (!showLegend.get() || !initialized.get() || legendItems.size === 0 || legendPosition === undefined) {
+ if (!showLegend.get() || !legendInitialized.get() || legendItems.size === 0) {
return null;
}
- const legendClasses = classNames('echLegend', `echLegend--${legendPosition}`, {
- 'echLegend--collapsed': legendCollapsed.get(),
+ const legendContainerStyle = this.getLegendStyle(postion, chartTheme);
+ const legendListStyle = this.getLegendListStyle(postion, chartTheme);
+ const legendClasses = classNames('echLegend', `echLegend--${postion}`, {
'echLegend--debug': debug,
+ invisible: !chartInitialized.get(),
});
- let paddingStyle;
- if (isVertical(legendPosition)) {
- paddingStyle = {
- paddingTop: chartTheme.chartMargins.top,
- paddingBottom: chartTheme.chartMargins.bottom,
- };
- }
+
return (
-
-
-
{[...legendItems.values()].map(this.renderLegendElement)}
+
+
+
+ {[...legendItems.values()].map(this.renderLegendElement)}
+
);
}
+ getLegendListStyle = (position: Position, { chartMargins, legend }: Theme): LegendListStyle => {
+ const { top: paddingTop, bottom: paddingBottom, left: paddingLeft, right: paddingRight } = chartMargins;
+
+ if (isHorizontal(position)) {
+ return {
+ paddingLeft,
+ paddingRight,
+ gridTemplateColumns: `repeat(auto-fill, minmax(${legend.verticalWidth}px, 1fr))`,
+ };
+ }
+
+ return {
+ paddingTop,
+ paddingBottom,
+ };
+ };
+
+ getLegendStyle = (position: Position, { legend }: Theme): LegendStyle => {
+ if (isVertical(position)) {
+ if (this.state.width !== undefined) {
+ const threshold = Math.min(this.state.width!, legend.verticalWidth);
+ const width = `${threshold}px`;
+
+ return {
+ width,
+ maxWidth: width,
+ };
+ }
+
+ return {
+ maxWidth: `${legend.verticalWidth}px`,
+ };
+ }
+
+ return {
+ maxHeight: `${legend.horizontalHeight}px`,
+ };
+ };
+
onLegendItemMouseover = (legendItemKey: string) => () => {
this.props.chartStore!.onLegendItemOver(legendItemKey);
};
@@ -64,7 +138,8 @@ class LegendComponent extends React.Component
{
private renderLegendElement = (item: SeriesLegendItem) => {
const { key, displayValue } = item;
- const tooltipValues = this.props.chartStore!.legendItemTooltipValues.get();
+ const { legendPosition, legendItemTooltipValues } = this.props.chartStore!;
+ const tooltipValues = legendItemTooltipValues.get();
let tooltipValue;
if (tooltipValues && tooltipValues.get(key)) {
@@ -78,6 +153,7 @@ class LegendComponent extends React.Component {
{...item}
key={key}
legendItemKey={key}
+ legendPosition={legendPosition.get()}
displayValue={newDisplayValue}
onMouseEnter={this.onLegendItemMouseover(key)}
onMouseLeave={this.onLegendItemMouseout}
diff --git a/src/components/legend/legend_button.tsx b/src/components/legend/legend_button.tsx
deleted file mode 100644
index 7fd0cd9466..0000000000
--- a/src/components/legend/legend_button.tsx
+++ /dev/null
@@ -1,44 +0,0 @@
-import classNames from 'classnames';
-import { inject, observer } from 'mobx-react';
-import React from 'react';
-import { ChartStore } from '../../chart_types/xy_chart/store/chart_state';
-import { Icon } from '../icons/icon';
-
-interface LegendButtonProps {
- chartStore?: ChartStore;
- legendId: string;
-}
-
-class LegendButtonComponent extends React.Component {
- static displayName = 'Legend';
- onCollapseLegend = () => {
- this.props.chartStore!.toggleLegendCollapsed();
- };
-
- render() {
- const { initialized, legendItems, legendCollapsed, showLegend } = this.props.chartStore!;
-
- if (!showLegend.get() || !initialized.get() || legendItems.size === 0) {
- return null;
- }
- const isOpen = !legendCollapsed.get();
- const className = classNames('echLegendButton', {
- 'echLegendButton--isOpen': isOpen,
- });
- return (
-
-
-
- );
- }
-}
-
-export const LegendButton = inject('chartStore')(observer(LegendButtonComponent));
diff --git a/src/components/legend/legend_item.tsx b/src/components/legend/legend_item.tsx
index d23ac9df9c..6dc2cb6c3b 100644
--- a/src/components/legend/legend_item.tsx
+++ b/src/components/legend/legend_item.tsx
@@ -4,10 +4,12 @@ import React from 'react';
import { Icon } from '../icons/icon';
import { ChartStore } from '../../chart_types/xy_chart/store/chart_state';
+import { Position } from '../../chart_types/xy_chart/utils/specs';
interface LegendItemProps {
chartStore?: ChartStore; // FIX until we find a better way on ts mobx
legendItemKey: string;
+ legendPosition: Position;
color: string | undefined;
label: string | undefined;
isSeriesVisible?: boolean;
@@ -44,17 +46,26 @@ class LegendItemComponent extends React.Component {
}
render() {
- const { initialized } = this.props.chartStore!;
- if (!initialized.get()) {
+ const { chartInitialized } = this.props.chartStore!;
+ if (!chartInitialized.get()) {
return null;
}
@@ -354,29 +354,12 @@ class Chart extends React.Component {
debug,
setCursorPosition,
isChartEmpty,
- legendCollapsed,
- legendPosition,
- chartTheme,
} = this.props.chartStore!;
if (isChartEmpty) {
- const isLegendCollapsed = legendCollapsed.get();
- const { verticalWidth, horizontalHeight } = chartTheme.legend;
-
- const paddingStyle =
- legendPosition && isVertical(legendPosition)
- ? legendPosition === Position.Right
- ? { paddingLeft: -verticalWidth }
- : { paddingLeft: verticalWidth }
- : legendPosition === Position.Top
- ? { paddingTop: horizontalHeight }
- : { paddingTop: -horizontalHeight };
-
- const style = isLegendCollapsed ? undefined : paddingStyle;
-
return (
-
No data to display
+
No data to display
);
}
diff --git a/src/specs/settings.test.tsx b/src/specs/settings.test.tsx
index f5d1b0525f..6844b86f55 100644
--- a/src/specs/settings.test.tsx
+++ b/src/specs/settings.test.tsx
@@ -47,7 +47,7 @@ describe('Settings spec component', () => {
expect(chartStore.showLegend.get()).toEqual(true);
expect(chartStore.tooltipType.get()).toEqual(TooltipType.None);
expect(chartStore.tooltipSnap.get()).toEqual(false);
- expect(chartStore.legendPosition).toBe(Position.Bottom);
+ expect(chartStore.legendPosition.get()).toBe(Position.Bottom);
expect(chartStore.showLegendDisplayValue.get()).toEqual(false);
expect(chartStore.debug).toBe(true);
expect(chartStore.customXDomain).toEqual({ min: 0, max: 10 });
@@ -64,7 +64,7 @@ describe('Settings spec component', () => {
expect(chartStore.tooltipType.get()).toEqual(DEFAULT_TOOLTIP_TYPE);
expect(chartStore.tooltipSnap.get()).toEqual(DEFAULT_TOOLTIP_SNAP);
expect(chartStore.showLegendDisplayValue.get()).toEqual(true);
- expect(chartStore.legendPosition).toBeUndefined();
+ expect(chartStore.legendPosition.get()).toBe(Position.Right);
expect(chartStore.debug).toBe(false);
expect(chartStore.customXDomain).toBeUndefined();
@@ -93,7 +93,7 @@ describe('Settings spec component', () => {
expect(chartStore.showLegend.get()).toEqual(true);
expect(chartStore.tooltipType.get()).toEqual(TooltipType.None);
expect(chartStore.tooltipSnap.get()).toEqual(false);
- expect(chartStore.legendPosition).toBe(Position.Bottom);
+ expect(chartStore.legendPosition.get()).toBe(Position.Bottom);
expect(chartStore.showLegendDisplayValue.get()).toEqual(false);
expect(chartStore.debug).toBe(true);
expect(chartStore.customXDomain).toEqual({ min: 0, max: 10 });
diff --git a/src/specs/settings.tsx b/src/specs/settings.tsx
index 3d5c80465b..1bd412aef9 100644
--- a/src/specs/settings.tsx
+++ b/src/specs/settings.tsx
@@ -130,7 +130,10 @@ function updateChartStore(props: SettingSpecProps) {
}
chartStore.setShowLegend(showLegend);
- chartStore.legendPosition = legendPosition;
+
+ if (legendPosition) {
+ chartStore.legendPosition.set(legendPosition);
+ }
chartStore.showLegendDisplayValue.set(showLegendDisplayValue);
chartStore.customXDomain = xDomain;
diff --git a/src/specs/specs_parser.test.tsx b/src/specs/specs_parser.test.tsx
index 1423438bbe..c68e8bdd1d 100644
--- a/src/specs/specs_parser.test.tsx
+++ b/src/specs/specs_parser.test.tsx
@@ -28,9 +28,9 @@ describe('Specs parser', () => {
});
test('updates initialization state on unmount', () => {
const chartStore = new ChartStore();
- chartStore.initialized.set(true);
+ chartStore.chartInitialized.set(true);
const component = mount( );
component.unmount();
- expect(chartStore.initialized.get()).toBe(false);
+ expect(chartStore.chartInitialized.get()).toBe(false);
});
});
diff --git a/src/specs/specs_parser.tsx b/src/specs/specs_parser.tsx
index b7412cdddb..aaa827e891 100644
--- a/src/specs/specs_parser.tsx
+++ b/src/specs/specs_parser.tsx
@@ -7,11 +7,6 @@ export interface SpecProps {
}
export class SpecsSpecRootComponent extends PureComponent {
- static getDerivedStateFromProps(props: SpecProps) {
- props.chartStore!.specsInitialized.set(false);
- return null;
- }
- state = {};
componentDidMount() {
this.props.chartStore!.specsInitialized.set(true);
this.props.chartStore!.computeChart();
@@ -21,7 +16,7 @@ export class SpecsSpecRootComponent extends PureComponent {
this.props.chartStore!.computeChart();
}
componentWillUnmount() {
- this.props.chartStore!.initialized.set(false);
+ this.props.chartStore!.chartInitialized.set(false);
}
render() {
return this.props.children || null;
diff --git a/src/utils/themes/dark_theme.ts b/src/utils/themes/dark_theme.ts
index a88486918e..ea9a64f829 100644
--- a/src/utils/themes/dark_theme.ts
+++ b/src/utils/themes/dark_theme.ts
@@ -97,6 +97,7 @@ export const DARK_THEME: Theme = {
legend: {
verticalWidth: 200,
horizontalHeight: 64,
+ spacingBuffer: 40,
},
crosshair: {
band: {
diff --git a/src/utils/themes/light_theme.ts b/src/utils/themes/light_theme.ts
index 2f07bf1526..01ef26cd8d 100644
--- a/src/utils/themes/light_theme.ts
+++ b/src/utils/themes/light_theme.ts
@@ -97,6 +97,7 @@ export const LIGHT_THEME: Theme = {
legend: {
verticalWidth: 200,
horizontalHeight: 64,
+ spacingBuffer: 40,
},
crosshair: {
band: {
diff --git a/src/utils/themes/theme.ts b/src/utils/themes/theme.ts
index dce8319318..cddfb4b416 100644
--- a/src/utils/themes/theme.ts
+++ b/src/utils/themes/theme.ts
@@ -75,8 +75,24 @@ export interface ColorConfig {
defaultVizColor: string;
}
export interface LegendStyle {
+ /**
+ * Max width used for left/right legend
+ *
+ * or
+ *
+ * Width of `LegendItem` for top/bottom legend
+ */
verticalWidth: number;
+ /**
+ * Max height used for top/bottom legend
+ */
horizontalHeight: number;
+ /**
+ * Added buffer between label and value.
+ *
+ * Smaller values render a more compact legend
+ */
+ spacingBuffer: number;
}
export interface Theme {
/**
diff --git a/stories/legend.tsx b/stories/legend.tsx
index 1886b671a6..7eea1fa8d9 100644
--- a/stories/legend.tsx
+++ b/stories/legend.tsx
@@ -1,4 +1,4 @@
-import { array, boolean, select } from '@storybook/addon-knobs';
+import { array, boolean, select, number } from '@storybook/addon-knobs';
import { storiesOf } from '@storybook/react';
import React from 'react';
import {
@@ -13,6 +13,7 @@ import {
Position,
ScaleType,
Settings,
+ PartialTheme,
} from '../src/';
import * as TestDatasets from '../src/utils/data_samples/test_dataset';
import { TSVB_DATASET } from '../src/utils/data_samples/test_dataset_tsvb';
@@ -227,4 +228,48 @@ storiesOf('Legend', module)
{seriesComponents}
);
- });
+ })
+ .add(
+ 'legend spacingBuffer',
+ () => {
+ const theme: PartialTheme = {
+ legend: {
+ spacingBuffer: number('legend buffer value', 80),
+ },
+ };
+
+ return (
+
+
+
+ Number(d).toFixed(2)}
+ />
+
+
+
+
+ );
+ },
+ {
+ info:
+ 'For high variability in values it may be necessary to increase the `spacingBuffer` to account for larger numbers.',
+ },
+ );
diff --git a/yarn.lock b/yarn.lock
index 0fd779fe4a..a91051f487 100644
--- a/yarn.lock
+++ b/yarn.lock
@@ -4765,7 +4765,7 @@ commander@2.17.x:
resolved "https://registry.yarnpkg.com/commander/-/commander-2.17.1.tgz#bd77ab7de6de94205ceacc72f1716d29f20a77bf"
integrity sha512-wPMUt6FnH2yzG95SA6mzjQOEKUU3aLaDEmzs1ti+1E9h+CsrZghRlqEM/EJ4KscsQVG8uNN4uVreUeT8+drlgg==
-commander@^2.19.0, commander@^2.20.0, commander@~2.20.0:
+commander@^2.17.1, commander@^2.19.0, commander@^2.20.0, commander@~2.20.0:
version "2.20.0"
resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.0.tgz#d58bb2b5c1ee8f87b0d340027e9e94e222c5a422"
integrity sha512-7j2y+40w61zy6YC2iRNpUe/NwhNyoXrYpHMrSunaMG64nRnaf96zO/KMQR4OyN/UnE5KLyEBnKHd4aG3rskjpQ==
@@ -9686,6 +9686,13 @@ loose-envify@^1.0.0, loose-envify@^1.1.0, loose-envify@^1.3.0, loose-envify@^1.3
dependencies:
js-tokens "^3.0.0 || ^4.0.0"
+lorem-ipsum@^2.0.3:
+ version "2.0.3"
+ resolved "https://registry.yarnpkg.com/lorem-ipsum/-/lorem-ipsum-2.0.3.tgz#9f1fa634780c9f58a349d4e091c3ba74f733164e"
+ integrity sha512-CX2r84DMWjW/DWiuzicTI9aRaJPAw2cvAGMJYZh/nx12OkTGqloj8y8FU0S8ZkKwOdqhfxEA6Ly8CW2P6Yxjwg==
+ dependencies:
+ commander "^2.17.1"
+
loud-rejection@^1.0.0:
version "1.6.0"
resolved "https://registry.yarnpkg.com/loud-rejection/-/loud-rejection-1.6.0.tgz#5b46f80147edee578870f086d04821cf998e551f"