Merge pull request #361 from freqtrade/update_echarts

Update echarts
This commit is contained in:
Matthias 2021-05-26 16:09:47 +01:00 committed by GitHub
commit 678d314037
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
11 changed files with 200 additions and 108 deletions

View File

@ -18,11 +18,11 @@
"core-js": "^3.12.1",
"date-fns": "^2.21.3",
"date-fns-tz": "^1.1.4",
"echarts": "^4.9.0",
"echarts": "^5.1.0",
"humanize-duration": "^3.26.0",
"vue": "^2.6.12",
"vue-class-component": "^7.2.5",
"vue-echarts": "^5.0.0-beta.0",
"vue-echarts": "^6.0.0-rc.5",
"vue-grid-layout": "^2.3.12",
"vue-material-design-icons": "^4.11.0",
"vue-property-decorator": "^9.1.2",
@ -42,6 +42,7 @@
"@vue/cli-plugin-unit-jest": "~4.5.13",
"@vue/cli-plugin-vuex": "~4.5.12",
"@vue/cli-service": "~4.5.13",
"@vue/composition-api": "^1.0.0-rc.9",
"@vue/eslint-config-airbnb": "^5.1.0",
"@vue/eslint-config-prettier": "^6.0.0",
"@vue/eslint-config-typescript": "^5.1.0",

View File

@ -1,18 +1,55 @@
<template>
<div class="row flex-grow-1 chart-wrapper">
<v-chart v-if="hasData" :theme="theme" autoresize :options="chartOptions" />
<v-chart v-if="hasData" ref="candleChart" :theme="theme" autoresize manual-update />
</div>
</template>
<script lang="ts">
import { Component, Vue, Prop, Watch } from 'vue-property-decorator';
import ECharts from 'vue-echarts';
import * as echarts from 'echarts';
import { Trade, PairHistory, PlotConfig } from '@/types';
import randomColor from '@/shared/randomColor';
import { roundTimeframe } from '@/shared/timemath';
import ECharts from 'vue-echarts';
import 'echarts';
import { use } from 'echarts/core';
import { EChartsOption, SeriesOption, ScatterSeriesOption } from 'echarts';
import { CanvasRenderer } from 'echarts/renderers';
import { CandlestickChart, LineChart, BarChart, ScatterChart } from 'echarts/charts';
import {
AxisPointerComponent,
CalendarComponent,
DatasetComponent,
DataZoomComponent,
GridComponent,
LegendComponent,
TimelineComponent,
TitleComponent,
TooltipComponent,
ToolboxComponent,
VisualMapComponent,
VisualMapPiecewiseComponent,
} from 'echarts/components';
use([
AxisPointerComponent,
CalendarComponent,
DatasetComponent,
DataZoomComponent,
GridComponent,
LegendComponent,
ToolboxComponent,
TimelineComponent,
TitleComponent,
TooltipComponent,
VisualMapComponent,
VisualMapPiecewiseComponent,
CandlestickChart,
BarChart,
LineChart,
ScatterChart,
CanvasRenderer,
]);
// Chart default options
const MARGINLEFT = '4%';
@ -33,6 +70,10 @@ const tradeSellColor = 'pink';
components: { 'v-chart': ECharts },
})
export default class CandleChart extends Vue {
$refs!: {
candleChart: typeof ECharts;
};
@Prop({ required: false, default: [] }) readonly trades!: Array<Trade>;
@Prop({ required: true }) readonly dataset!: PairHistory;
@ -47,7 +88,7 @@ export default class CandleChart extends Vue {
sellData = [] as Array<number>[];
chartOptions: echarts.EChartOption = {};
chartOptions: EChartsOption = {};
@Watch('dataset')
datasetChanged() {
@ -103,7 +144,7 @@ export default class CandleChart extends Vue {
show: true,
},
],
// backgroundColor: '#1b1b1b',
backgroundColor: 'rgba(0, 0, 0, 0)',
useUTC: this.useUTC,
animation: false,
legend: {
@ -206,6 +247,7 @@ export default class CandleChart extends Vue {
// ],
// },
};
console.log('Initialized');
this.updateChart(true);
}
@ -248,7 +290,7 @@ export default class CandleChart extends Vue {
}
}
const options: echarts.EChartOption = {
const options: EChartsOption = {
dataset: {
source: this.dataset.data,
},
@ -340,10 +382,10 @@ export default class CandleChart extends Vue {
Object.entries(this.plotConfig.main_plot).forEach(([key, value]) => {
const col = this.dataset.columns.findIndex((el) => el === key);
if (col > 1) {
if (this.chartOptions.legend && this.chartOptions.legend.data) {
if (!Array.isArray(this.chartOptions.legend) && this.chartOptions.legend?.data) {
this.chartOptions.legend.data.push(key);
}
const sp: echarts.EChartOption.Series = {
const sp: SeriesOption = {
name: key,
type: value.type || 'line',
xAxisIndex: 0,
@ -357,7 +399,7 @@ export default class CandleChart extends Vue {
},
showSymbol: false,
};
if (this.chartOptions.series) {
if (Array.isArray(this.chartOptions.series)) {
this.chartOptions.series.push(sp);
}
} else {
@ -371,7 +413,7 @@ export default class CandleChart extends Vue {
let plotIndex = 2;
Object.entries(this.plotConfig.subplots).forEach(([key, value]) => {
// define yaxis
if (this.chartOptions.yAxis && Array.isArray(this.chartOptions.yAxis)) {
if (Array.isArray(this.chartOptions.yAxis)) {
this.chartOptions.yAxis.push({
scale: true,
gridIndex: plotIndex,
@ -384,7 +426,7 @@ export default class CandleChart extends Vue {
splitLine: { show: false },
});
}
if (this.chartOptions.xAxis && Array.isArray(this.chartOptions.xAxis)) {
if (Array.isArray(this.chartOptions.xAxis)) {
this.chartOptions.xAxis.push({
type: 'time',
scale: true,
@ -397,7 +439,7 @@ export default class CandleChart extends Vue {
splitNumber: 20,
});
}
if (this.chartOptions.dataZoom) {
if (Array.isArray(this.chartOptions.dataZoom)) {
this.chartOptions.dataZoom.forEach((el) =>
el.xAxisIndex && Array.isArray(el.xAxisIndex) ? el.xAxisIndex.push(plotIndex) : null,
);
@ -411,17 +453,13 @@ export default class CandleChart extends Vue {
});
}
Object.entries(value).forEach(([sk, sv]) => {
if (
this.chartOptions.legend &&
this.chartOptions.legend.data &&
Array.isArray(this.chartOptions.legend.data)
) {
this.chartOptions.legend.data.push(sk);
}
// entries per subplot
const col = this.dataset.columns.findIndex((el) => el === sk);
if (col > 0) {
const sp: echarts.EChartOption.Series = {
if (!Array.isArray(this.chartOptions.legend) && this.chartOptions.legend?.data) {
this.chartOptions.legend.data.push(sk);
}
const sp: SeriesOption = {
name: sk,
type: sv.type || 'line',
xAxisIndex: plotIndex,
@ -461,10 +499,10 @@ export default class CandleChart extends Vue {
const name = 'Trades';
const nameClose = 'Trades Close';
if (this.chartOptions.legend && this.chartOptions.legend.data) {
if (!Array.isArray(this.chartOptions.legend) && this.chartOptions.legend?.data) {
this.chartOptions.legend.data.push(name);
}
const sp: echarts.EChartOption.SeriesScatter = {
const sp: ScatterSeriesOption = {
name,
type: 'scatter',
xAxisIndex: 0,
@ -474,13 +512,13 @@ export default class CandleChart extends Vue {
},
data: trades,
};
if (this.chartOptions.series) {
if (Array.isArray(this.chartOptions?.series)) {
this.chartOptions.series.push(sp);
}
if (this.chartOptions.legend && this.chartOptions.legend.data) {
if (!Array.isArray(this.chartOptions.legend) && this.chartOptions.legend?.data) {
this.chartOptions.legend.data.push(nameClose);
}
const closeSeries: echarts.EChartOption.SeriesScatter = {
const closeSeries: ScatterSeriesOption = {
name: nameClose,
type: 'scatter',
xAxisIndex: 0,
@ -490,11 +528,13 @@ export default class CandleChart extends Vue {
},
data: tradesClose,
};
if (this.chartOptions.series) {
if (this.chartOptions.series && Array.isArray(this.chartOptions.series)) {
this.chartOptions.series.push(closeSeries);
}
console.log('chartOptions', this.chartOptions);
this.$refs.candleChart.setOption(this.chartOptions);
}
/** Return trade entries for charting */

View File

@ -1,5 +1,5 @@
<template>
<v-chart v-if="trades.length > 0" :options="chartOptions" autoresize :theme="getChartTheme" />
<v-chart v-if="trades.length > 0" :option="chartOptions" autoresize :theme="getChartTheme" />
</template>
<script lang="ts">
@ -7,19 +7,17 @@ import { Component, Vue, Prop } from 'vue-property-decorator';
import { Getter } from 'vuex-class';
import ECharts from 'vue-echarts';
import { EChartOption } from 'echarts';
import { EChartsOption } from 'echarts';
import 'echarts/lib/chart/bar';
import 'echarts/lib/chart/line';
import 'echarts/lib/component/title';
import 'echarts/lib/component/tooltip';
import 'echarts/lib/component/legend';
import 'echarts/lib/component/dataZoom';
import 'echarts/lib/component/visualMap';
import 'echarts/lib/component/visualMapPiecewise';
import { use } from 'echarts/core';
import { CanvasRenderer } from 'echarts/renderers';
import { LineChart, BarChart } from 'echarts/charts';
import { TitleComponent, TooltipComponent, LegendComponent } from 'echarts/components';
import { ClosedTrade, CumProfitData } from '@/types';
use([BarChart, LineChart, CanvasRenderer, TitleComponent, TooltipComponent, LegendComponent]);
// Define Column labels here to avoid typos
const CHART_PROFIT = 'Profit';
const CHART_TRADE_COUNT = 'Trade Count';
@ -40,8 +38,6 @@ export default class CumProfitChart extends Vue {
get cumulativeData() {
const res: CumProfitData[] = [];
// const closedTrades = [...this.trades]; // .filter((t) => t.close_timestamp);
const closedTrades = this.trades
.slice()
.sort((a, b) => (a.close_timestamp > b.close_timestamp ? 1 : -1));
@ -50,18 +46,19 @@ export default class CumProfitChart extends Vue {
const trade = closedTrades[i];
if (trade.close_timestamp && trade[this.profitColumn]) {
profit += trade[this.profitColumn];
res.push({ date: trade.close_timestamp, profit, raising: trade[this.profitColumn] > 0 });
res.push({ date: trade.close_timestamp, profit });
}
}
return res;
}
get chartOptions(): EChartOption {
get chartOptions(): EChartsOption {
return {
title: {
text: 'Cumulative Profit',
show: this.showTitle,
},
backgroundColor: 'rgba(0, 0, 0, 0)',
dataset: {
dimensions: ['date', 'profit'],
source: this.cumulativeData,

View File

@ -1,21 +1,22 @@
<template>
<v-chart v-if="dailyStats.data" :options="dailyChartOptions" :theme="getChartTheme" autoresize />
<v-chart v-if="dailyStats.data" :option="dailyChartOptions" :theme="getChartTheme" autoresize />
</template>
<script lang="ts">
import { Component, Vue, Prop } from 'vue-property-decorator';
import { Getter } from 'vuex-class';
import ECharts from 'vue-echarts';
import { EChartOption } from 'echarts';
import { EChartsOption } from 'echarts';
import 'echarts/lib/chart/bar';
import 'echarts/lib/chart/line';
import 'echarts/lib/component/title';
import 'echarts/lib/component/tooltip';
import 'echarts/lib/component/legend';
import { use } from 'echarts/core';
import { CanvasRenderer } from 'echarts/renderers';
import { LineChart, BarChart } from 'echarts/charts';
import { TitleComponent, TooltipComponent, LegendComponent } from 'echarts/components';
import { DailyReturnValue } from '@/types';
use([BarChart, LineChart, CanvasRenderer, TitleComponent, TooltipComponent, LegendComponent]);
// Define Column labels here to avoid typos
const CHART_ABS_PROFIT = 'Absolute profit';
const CHART_TRADE_COUNT = 'Trade Count';
@ -50,12 +51,13 @@ export default class DailyChart extends Vue {
);
}
get dailyChartOptions(): EChartOption {
get dailyChartOptions(): EChartsOption {
return {
title: {
text: 'Daily profit',
show: this.showTitle,
},
backgroundColor: 'rgba(0, 0, 0, 0)',
dataset: {
dimensions: ['date', 'abs_profit', 'trade_count'],
source: this.dailyStats.data,

View File

@ -1,7 +1,7 @@
<template>
<v-chart
v-if="trades.length > 0"
:options="hourlyChartOptions"
:option="hourlyChartOptions"
autoresize
:theme="getChartTheme"
/>
@ -13,17 +13,31 @@ import { Getter } from 'vuex-class';
import ECharts from 'vue-echarts';
import 'echarts/lib/chart/bar';
import 'echarts/lib/chart/line';
import 'echarts/lib/component/title';
import 'echarts/lib/component/tooltip';
import 'echarts/lib/component/legend';
import 'echarts/lib/component/visualMap';
import 'echarts/lib/component/visualMapPiecewise';
import { Trade } from '@/types';
import { timestampHour } from '@/shared/formatters';
import { EChartOption } from 'echarts';
import { EChartsOption } from 'echarts';
import { use } from 'echarts/core';
import { CanvasRenderer } from 'echarts/renderers';
import { LineChart, BarChart } from 'echarts/charts';
import {
TitleComponent,
TooltipComponent,
LegendComponent,
VisualMapComponent,
VisualMapPiecewiseComponent,
} from 'echarts/components';
use([
BarChart,
LineChart,
CanvasRenderer,
TitleComponent,
TooltipComponent,
LegendComponent,
VisualMapComponent,
VisualMapPiecewiseComponent,
]);
// Define Column labels here to avoid typos
const CHART_PROFIT = 'Profit %';
@ -59,12 +73,13 @@ export default class HourlyChart extends Vue {
return res;
}
get hourlyChartOptions(): EChartOption {
get hourlyChartOptions(): EChartsOption {
return {
title: {
text: 'Hourly Profit',
show: this.showTitle,
},
backgroundColor: 'rgba(0, 0, 0, 0)',
dataset: {
dimensions: ['hourDesc', 'profit', 'count'],
source: this.hourlyData,

View File

@ -1,5 +1,5 @@
<template>
<v-chart v-if="trades.length > 0" :options="chartOptions" autoresize :theme="getChartTheme" />
<v-chart v-if="trades.length > 0" :option="chartOptions" autoresize :theme="getChartTheme" />
</template>
<script lang="ts">
@ -7,19 +7,32 @@ import { Component, Vue, Prop } from 'vue-property-decorator';
import { Getter } from 'vuex-class';
import ECharts from 'vue-echarts';
import { EChartOption } from 'echarts';
import { EChartsOption } from 'echarts';
import 'echarts/lib/chart/bar';
import 'echarts/lib/chart/line';
import 'echarts/lib/component/title';
import 'echarts/lib/component/tooltip';
import 'echarts/lib/component/legend';
import 'echarts/lib/component/dataZoom';
import 'echarts/lib/component/visualMap';
import 'echarts/lib/component/visualMapPiecewise';
import { use } from 'echarts/core';
import { CanvasRenderer } from 'echarts/renderers';
import { LineChart, BarChart } from 'echarts/charts';
import {
TitleComponent,
TooltipComponent,
LegendComponent,
VisualMapComponent,
VisualMapPiecewiseComponent,
} from 'echarts/components';
import { ClosedTrade } from '@/types';
use([
BarChart,
LineChart,
CanvasRenderer,
TitleComponent,
TooltipComponent,
LegendComponent,
VisualMapComponent,
VisualMapPiecewiseComponent,
]);
// Define Column labels here to avoid typos
const CHART_PROFIT = 'Profit %';
const CHART_COLOR = '#9be0a8';
@ -48,7 +61,7 @@ export default class TradesLogChart extends Vue {
return res;
}
get chartOptions(): EChartOption {
get chartOptions(): EChartsOption {
const { chartData } = this;
// Show a maximum of 50 trades by default - allowing to zoom out further.
const datazoomStart = chartData.length > 0 ? (1 - 50 / chartData.length) * 100 : 100;
@ -57,6 +70,7 @@ export default class TradesLogChart extends Vue {
text: 'Trades log',
show: true,
},
backgroundColor: 'rgba(0, 0, 0, 0)',
dataset: {
dimensions: ['date', 'profit'],
source: chartData,
@ -126,7 +140,6 @@ export default class TradesLogChart extends Vue {
{
type: 'bar',
name: CHART_PROFIT,
step: 'start',
barGap: '0%',
barCategoryGap: '0%',
animation: false,
@ -143,9 +156,6 @@ export default class TradesLogChart extends Vue {
y: 1,
},
areaStyle: {
// color: CHART_COLOR,
},
itemStyle: {
color: CHART_COLOR,
},

View File

@ -20,13 +20,10 @@
timestampms(trade.close_timestamp)
}}</ValuePair>
<ValuePair
v-if="trade.current_profit && trade.current_profit_abs"
description="Current Profit"
v-if="trade.profit_ratio && trade.profit_abs"
:description="`${trade.is_open ? 'Current Profit' : 'Close Profit'}`"
>
{{ formatPercent(trade.current_profit) }} | {{ trade.current_profit_abs }}
</ValuePair>
<ValuePair v-if="trade.close_profit" description="Close Profit">
{{ formatPercent(trade.close_profit) }} | {{ trade.close_profit_abs }}
{{ formatPercent(trade.profit_ratio) }} | {{ trade.profit_abs }}
</ValuePair>
</div>
<div class="col-lg-7">

View File

@ -1,5 +1,4 @@
export interface CumProfitData {
date: number;
[date: string]: number;
profit: number;
raising: boolean;
}

View File

@ -4,6 +4,7 @@ export interface DailyPayload {
export interface DailyRecord {
/** Date in the format yyyy-mm-dd */
[key: string]: string | number;
date: string;
abs_profit: number;
fiat_value: number;
@ -11,7 +12,7 @@ export interface DailyRecord {
}
export interface DailyReturnValue {
data: Array<DailyRecord>;
data: DailyRecord[];
fiat_display_currency: string;
stake_currency: string;
}

View File

@ -1,6 +1,12 @@
export enum ChartType {
line = 'line',
bar = 'bar',
scatter = 'scatter',
}
export interface IndicatorConfig {
color?: string;
type?: string;
type?: ChartType;
}
export interface PlotConfig {

View File

@ -1961,6 +1961,13 @@
optionalDependencies:
prettier "^1.18.2"
"@vue/composition-api@^1.0.0-rc.9":
version "1.0.0-rc.9"
resolved "https://registry.yarnpkg.com/@vue/composition-api/-/composition-api-1.0.0-rc.9.tgz#ddfcaa13040add84edab918573dfc999b5f03cf3"
integrity sha512-U//BqmGRVaPyZbYsPfRlmCKnnFkhRzUBu7cjrWn4PSwQ5Oh+M0KcYIHlupUd+Qmd8KwaiYiuUpJLncl3wFsrdg==
dependencies:
tslib "^2.2.0"
"@vue/eslint-config-airbnb@^5.1.0":
version "5.3.0"
resolved "https://registry.yarnpkg.com/@vue/eslint-config-airbnb/-/eslint-config-airbnb-5.3.0.tgz#896551d600816a06dff13fdd7d04fd5153379817"
@ -3623,7 +3630,7 @@ core-js@^2.4.0:
resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.6.12.tgz#d9333dfa7b065e347cc5682219d6f690859cc2ec"
integrity sha512-Kb2wC0fvsWfQrgk8HU5lW6U/Lcs8+9aaYcy4ZFc6DDlo4nZ7n70dEgE5rtR0oG6ufKDUnrwfWL1mXR5ljDatrQ==
core-js@^3.12.1, core-js@^3.4.4, core-js@^3.6.5:
core-js@^3.12.1, core-js@^3.6.5:
version "3.12.1"
resolved "https://registry.yarnpkg.com/core-js/-/core-js-3.12.1.tgz#6b5af4ff55616c08a44d386f1f510917ff204112"
integrity sha512-Ne9DKPHTObRuB09Dru5AjwKjY4cJHVGu+y5f7coGn1E9Grkc3p2iBwE9AI/nJzsE29mQF7oq+mhYYRqOMFN1Bw==
@ -4287,12 +4294,13 @@ ecc-jsbn@~0.1.1:
jsbn "~0.1.0"
safer-buffer "^2.1.0"
echarts@^4.9.0:
version "4.9.0"
resolved "https://registry.yarnpkg.com/echarts/-/echarts-4.9.0.tgz#a9b9baa03f03a2a731e6340c55befb57a9e1347d"
integrity sha512-+ugizgtJ+KmsJyyDPxaw2Br5FqzuBnyOWwcxPKO6y0gc5caYcfnEUIlNStx02necw8jmKmTafmpHhGo4XDtEIA==
echarts@^5.1.0:
version "5.1.1"
resolved "https://registry.yarnpkg.com/echarts/-/echarts-5.1.1.tgz#b186f162f017c555cfd67b12ede6762bdc3ddfda"
integrity sha512-b3nP8M9XwZM2jISuA+fP0EuJv8lcfgWrinel185Npy8bE/UhXTDIPJcqgQOCWdvk0c5CeT6Dsm1xBjmJXAGlxQ==
dependencies:
zrender "4.3.2"
tslib "2.0.3"
zrender "5.1.0"
editorconfig@^0.15.3:
version "0.15.3"
@ -9189,10 +9197,10 @@ requires-port@^1.0.0:
resolved "https://registry.yarnpkg.com/requires-port/-/requires-port-1.0.0.tgz#925d2601d39ac485e091cf0da5c6e694dc3dcaff"
integrity sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8=
resize-detector@^0.1.10:
version "0.1.10"
resolved "https://registry.yarnpkg.com/resize-detector/-/resize-detector-0.1.10.tgz#1da3f961aa5f914ccbcfd3752d52fd45beeb692c"
integrity sha512-iLcXC8A6Fb0DfA+TRiywrK/0A22bFqkhntjMJMEzXDA4XkcEkfwpNbv7W8iewUiD0xYIaeiXOfiEehTqGKsUFw==
resize-detector@^0.3.0:
version "0.3.0"
resolved "https://registry.yarnpkg.com/resize-detector/-/resize-detector-0.3.0.tgz#fe495112e184695500a8f51e0389f15774cb1cfc"
integrity sha512-R/tCuvuOHQ8o2boRP6vgx8hXCCy87H1eY9V5imBYeVNyNVpuL9ciReSccLj2gDcax9+2weXy3bc8Vv+NRXeEvQ==
resolve-cwd@^2.0.0:
version "2.0.0"
@ -10352,11 +10360,21 @@ tsconfig@^7.0.0:
strip-bom "^3.0.0"
strip-json-comments "^2.0.0"
tslib@2.0.3:
version "2.0.3"
resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.0.3.tgz#8e0741ac45fc0c226e58a17bfc3e64b9bc6ca61c"
integrity sha512-uZtkfKblCEQtZKBF6EBXVZeQNl82yqtDQdv+eck8u7tdPxjLu2/lp5/uPW+um2tpuxINHWy3GhiccY7QgEaVHQ==
tslib@^1.8.0, tslib@^1.8.1, tslib@^1.9.0:
version "1.14.1"
resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.14.1.tgz#cf2d38bdc34a134bcaf1091c41f6619e2f672d00"
integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==
tslib@^2.2.0:
version "2.2.0"
resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.2.0.tgz#fb2c475977e35e241311ede2693cee1ec6698f5c"
integrity sha512-gS9GVHRU+RGn5KQM2rllAlR3dU6m7AcpJKdtH8gFvQiC4Otgk98XnmMU+nZenHt/+VhnBPWwgrJsyrdcw6i23w==
tslint@^5.20.1:
version "5.20.1"
resolved "https://registry.yarnpkg.com/tslint/-/tslint-5.20.1.tgz#e401e8aeda0152bc44dd07e614034f3f80c67b7d"
@ -10712,14 +10730,18 @@ vue-cli-plugin-bootstrap-vue@~0.7.0:
resolved "https://registry.yarnpkg.com/vue-cli-plugin-bootstrap-vue/-/vue-cli-plugin-bootstrap-vue-0.7.0.tgz#b44ed7180e59aca2846e981fc67f59d7c77298e3"
integrity sha512-KYP7CpwbM6Xw94LR2G6y8ZqqTDKlYTgLDwsxaNUj8NyuAo/mpo2y6Q67T9CXjiPgJYVbWH5IzkhE0gHc+9xZKA==
vue-echarts@^5.0.0-beta.0:
version "5.0.0-beta.0"
resolved "https://registry.yarnpkg.com/vue-echarts/-/vue-echarts-5.0.0-beta.0.tgz#438dd4b0fc5ccea281709c1f7c6321b05352bdf4"
integrity sha512-QZFKGXDAYFQo+F20REpzcdLx79nsl4kOorJRpN+08aYq4YiIlmtWss1Lxadm7Fo+NYyWm8nnT+h4xHv3uqWIDQ==
vue-demi@^0.7.4:
version "0.7.5"
resolved "https://registry.yarnpkg.com/vue-demi/-/vue-demi-0.7.5.tgz#88dee7492fc99a0f911ff03fc02c658fa2a79af8"
integrity sha512-eFSQSvbQdY7C9ujOzvM6tn7XxwLjn0VQDXQsiYBLBwf28Na+2nTQR4BBBcomhmdP6mmHlBKAwarq6a0BPG87hQ==
vue-echarts@^6.0.0-rc.5:
version "6.0.0-rc.5"
resolved "https://registry.yarnpkg.com/vue-echarts/-/vue-echarts-6.0.0-rc.5.tgz#4e06289927d03d289c368fa09b740d82e6ded528"
integrity sha512-qG7jM4tz2Ipygn5r88s2nHFftakQyWpoM2IXwpzWrQwl/UZIQ1bbqyyLHqMLtgzEU/QhD/maFG9tnMkjVR75sg==
dependencies:
core-js "^3.4.4"
lodash "^4.17.15"
resize-detector "^0.1.10"
resize-detector "^0.3.0"
vue-demi "^0.7.4"
vue-eslint-parser@^7.0.0, vue-eslint-parser@^7.6.0:
version "7.6.0"
@ -11296,7 +11318,9 @@ yorkie@^2.0.0:
normalize-path "^1.0.0"
strip-indent "^2.0.0"
zrender@4.3.2:
version "4.3.2"
resolved "https://registry.yarnpkg.com/zrender/-/zrender-4.3.2.tgz#ec7432f9415c82c73584b6b7b8c47e1b016209c6"
integrity sha512-bIusJLS8c4DkIcdiK+s13HiQ/zjQQVgpNohtd8d94Y2DnJqgM1yjh/jpDb8DoL6hd7r8Awagw8e3qK/oLaWr3g==
zrender@5.1.0:
version "5.1.0"
resolved "https://registry.yarnpkg.com/zrender/-/zrender-5.1.0.tgz#b6a84c3aa7ccc6642ee0519901ca4c0835c4d85e"
integrity sha512-c+8VRx52ycbmqwHeHLlo/BAfIHBl/JZNLM6cfDQFgzIH05yb+f5J9F/fbRsP+zGc8dW9XHuhdt8/iqukgMZSeg==
dependencies:
tslib "2.0.3"