Browse Source

refactor: 细节调整

master
wally 4 years ago
parent
commit
a2483f007c
  1. 60
      package-lock.json
  2. 1
      package.json
  3. 0
      src/components/config/device-select-and-status.vue
  4. 59
      src/components/config/function-config-pending.vue
  5. 6
      src/components/config/network-config-pending.vue
  6. 16
      src/components/history/data-history.vue
  7. 8
      src/components/history/data-report.vue
  8. 30
      src/components/history/search-bar-data.vue
  9. 126
      src/components/statistical/search-bar.vue
  10. 22
      src/config/config.js
  11. 5
      src/hooks/useDeviceCreate.js
  12. 25
      src/routers/index.js
  13. 6
      src/views/config.vue
  14. 2
      src/views/function-config.vue
  15. 18
      src/views/history.vue
  16. 2
      src/views/network-config.vue
  17. 2
      src/views/statistical-report.vue
  18. 20
      yarn.lock

60
package-lock.json

@ -12,6 +12,7 @@
"@vitejs/plugin-vue": "^1.9.3",
"axios": "^0.23.0",
"dayjs": "^1.10.7",
"echarts": "^5.2.2",
"element-plus": "^1.1.0-beta.24",
"lodash": "^4.17.21",
"vite": "^2.6.4",
@ -2301,6 +2302,21 @@
"ignored": "bin/ignored"
}
},
"node_modules/echarts": {
"version": "5.2.2",
"resolved": "https://registry.npmmirror.com/echarts/download/echarts-5.2.2.tgz",
"integrity": "sha1-7DyLKhUcu6cbo8LHz5svIEfOQ3A=",
"license": "Apache-2.0",
"dependencies": {
"tslib": "2.3.0",
"zrender": "5.2.1"
}
},
"node_modules/echarts/node_modules/tslib": {
"version": "2.3.0",
"resolved": "https://registry.nlark.com/tslib/download/tslib-2.3.0.tgz",
"integrity": "sha1-gDuM2rPhK6WBpMpByIObuw2ssJ4="
},
"node_modules/element-plus": {
"version": "1.1.0-beta.24",
"resolved": "https://registry.npmmirror.com/element-plus/download/element-plus-1.1.0-beta.24.tgz",
@ -6762,6 +6778,19 @@
"engines": {
"node": ">=10"
}
},
"node_modules/zrender": {
"version": "5.2.1",
"resolved": "https://registry.nlark.com/zrender/download/zrender-5.2.1.tgz",
"integrity": "sha1-X0u9qRW6bUErCxncJDG+qtBUF7s=",
"dependencies": {
"tslib": "2.3.0"
}
},
"node_modules/zrender/node_modules/tslib": {
"version": "2.3.0",
"resolved": "https://registry.nlark.com/tslib/download/tslib-2.3.0.tgz",
"integrity": "sha1-gDuM2rPhK6WBpMpByIObuw2ssJ4="
}
},
"dependencies": {
@ -8638,6 +8667,22 @@
"minimatch": "^3.0.4"
}
},
"echarts": {
"version": "5.2.2",
"resolved": "https://registry.npmmirror.com/echarts/download/echarts-5.2.2.tgz",
"integrity": "sha1-7DyLKhUcu6cbo8LHz5svIEfOQ3A=",
"requires": {
"tslib": "2.3.0",
"zrender": "5.2.1"
},
"dependencies": {
"tslib": {
"version": "2.3.0",
"resolved": "https://registry.nlark.com/tslib/download/tslib-2.3.0.tgz",
"integrity": "sha1-gDuM2rPhK6WBpMpByIObuw2ssJ4="
}
}
},
"element-plus": {
"version": "1.1.0-beta.24",
"resolved": "https://registry.npmmirror.com/element-plus/download/element-plus-1.1.0-beta.24.tgz",
@ -12028,6 +12073,21 @@
"resolved": "https://registry.nlark.com/yocto-queue/download/yocto-queue-0.1.0.tgz",
"integrity": "sha1-ApTrPe4FAo0x7hpfosVWpqrxChs=",
"dev": true
},
"zrender": {
"version": "5.2.1",
"resolved": "https://registry.nlark.com/zrender/download/zrender-5.2.1.tgz",
"integrity": "sha1-X0u9qRW6bUErCxncJDG+qtBUF7s=",
"requires": {
"tslib": "2.3.0"
},
"dependencies": {
"tslib": {
"version": "2.3.0",
"resolved": "https://registry.nlark.com/tslib/download/tslib-2.3.0.tgz",
"integrity": "sha1-gDuM2rPhK6WBpMpByIObuw2ssJ4="
}
}
}
}
}

1
package.json

@ -18,6 +18,7 @@
"@vitejs/plugin-vue": "^1.9.3",
"axios": "^0.23.0",
"dayjs": "^1.10.7",
"echarts": "^5.2.2",
"element-plus": "^1.1.0-beta.24",
"lodash": "^4.17.21",
"vite": "^2.6.4",

0
src/components/device-select-and-status.vue → src/components/config/device-select-and-status.vue

59
src/components/config/function-config-pending.vue

@ -121,14 +121,20 @@
</el-col>
</el-row>
<!-- 定时上报输入-->
<el-row v-if="data.report.type === 'POINT'" :gutter="20">
<el-col v-for="(item, index) in data.report.timePoints" :key="index" :lg="6" :md="8" :sm="12" :xl="4">
<el-form-item prop="report.timePoints" style="margin-bottom: 10px !important">
<el-time-picker v-model="data.report.timePoints[index]" :placeholder="`上报时间点${index + 1}`" format="HH:mm"></el-time-picker>
</el-form-item>
</el-col>
<el-col v-if="!data.report.timePoints || data.report.timePoints.length < 6" :lg="6" :md="8" :sm="12" :xl="4">
<el-button plain @click="addTimePoints">
<i class="el-icon-plus px-6"></i>
</el-button>
</el-col>
</el-row>
<!--周期上报输入-->
<el-row v-else :gutter="20">
<el-col :span="12">
<el-form-item prop="report.cycle">
@ -155,7 +161,7 @@ import { useStore } from 'vuex';
import { ElMessage } from 'element-plus';
import cloneDeep from 'lodash/cloneDeep';
import isDate from 'lodash/isDate';
import { createConfigFunction, getConfigFunction } from 'apis';
import { createConfigFunction, getConfigAppliedFunction } from 'apis';
import Refresh from 'components/refresh.vue';
import { corrosiveTypes, functionConfig } from '@/config/config';
@ -189,8 +195,7 @@ async function onSearch(deviceId, type = 0) {
deviceId,
type,
};
const resData = await getConfigFunction(params);
data.value = resData || functionConfig;
const resData = await getConfigAppliedFunction(params);
if (resData && resData.time) {
// ms
resData.time = new Date(+resData.time);
@ -216,14 +221,17 @@ async function onSearch(deviceId, type = 0) {
resData.report.timePoints[i] = '';
}
}
} else {
resData.report = [''];
}
}
data.value = resData || functionConfig;
}
watch(
currentDeviceId,
newDeviceId => {
newDeviceId && props.activeName === 'pending' && onSearch(newDeviceId);
newDeviceId && props.activeName === 'function' && onSearch(newDeviceId);
},
{ immediate: true },
);
@ -243,11 +251,19 @@ const onSubmit = () => {
if (param.report.type === 'POINT') {
//
const points = [...param.report.timePoints];
for (let i = 0; i < points.length; i++) {
if (points[i]) {
points[i] = formatTime(points[i]);
}
}
const validated = validateTimePoints(points);
if (!validated) {
ElMessage.error('上报时间点不能重复');
return;
}
param.report.timePoints = points;
}
await createConfigFunction(param);
@ -264,4 +280,37 @@ const onReset = () => {
};
// currentDeviceId && onSearch(currentDeviceId.value);
//
function addTimePoints() {
const { timePoints } = data.value.report;
console.log(data.value.report);
if (!timePoints || !timePoints.length) {
data.value.report.timePoints = [''];
} else {
if (timePoints.length >= 6) return;
data.value.report.timePoints.push('');
}
}
/**
* 验证上报时间点是否重复
* @param {array|null} points ["时:分"]
* @returns {boolean}
*/
function validateTimePoints(points) {
if (!points || !points.length) return true;
const obj = {};
points.forEach(item => {
if (obj[item]) {
obj[item] += 1;
} else {
obj[item] = 1;
}
});
// eslint-disable-next-line no-restricted-syntax
for (const key in obj) {
if (obj[key] > 1) return false;
}
return true;
}
</script>

6
src/components/config/network-config-pending.vue

@ -79,7 +79,7 @@
import { computed, defineEmits, defineProps, ref, watch } from 'vue';
import { useStore } from 'vuex';
import { ElMessage } from 'element-plus';
import { createConfigNetwork, getConfigNetwork } from 'apis';
import { createConfigNetwork, getConfigAppliedNetwork } from 'apis';
import Refresh from 'components/refresh.vue';
import { networkConfig } from '@/config/config';
@ -101,7 +101,7 @@ async function onSearch(deviceId, type = 0) {
deviceId,
type,
};
const resData = await getConfigNetwork(params);
const resData = await getConfigAppliedNetwork(params);
data.value = resData || networkConfig;
if (resData && resData.status) {
emit('status', resData.status);
@ -116,7 +116,7 @@ async function onSearch(deviceId, type = 0) {
watch(
currentDeviceId,
newDeviceId => {
newDeviceId && props.activeName === 'pending' && onSearch(newDeviceId);
newDeviceId && props.activeName === 'network' && onSearch(newDeviceId);
},
{ immediate: true },
);

16
src/views/data-history.vue → src/components/history/data-history.vue

@ -1,7 +1,7 @@
<script setup>
import { computed, onMounted, ref } from 'vue';
import { useStore } from 'vuex';
import SearchBar from 'components/search-bar-data.vue';
import SearchBar from 'components/history/search-bar-data.vue';
import { getHistory, sendCommand } from 'apis';
import { ElMessage } from 'element-plus';
import dayjs from 'dayjs';
@ -61,7 +61,7 @@ const getData = async () => {
//
onMounted(() => {
const winHeight = document.documentElement.clientHeight;
contentHeight.value = winHeight - 250;
contentHeight.value = winHeight - 350;
});
/**
@ -135,8 +135,8 @@ function formatTime(time) {
<SearchBar :show-export="true" :show-type-select="true" @search="onSearch" />
<el-row class="mb-4">
<el-button type="primary" @click="onSend('DATA')">发送查询指令(历史数据)</el-button>
<el-button type="primary" @click="onSend('EVENT')">发送查询指令(历史事件)</el-button>
<el-button plain type="primary" @click="onSend('DATA')">发送查询指令(历史数据)</el-button>
<el-button plain type="primary" @click="onSend('EVENT')">发送查询指令(历史事件)</el-button>
</el-row>
<template v-if="data">
@ -151,10 +151,10 @@ function formatTime(time) {
<el-table-column align="center" label="SO2(ppb)" min-width="90" prop="so2" />
<el-table-column align="center" label="盐温(℃)" min-width="80" prop="salt" />
<el-table-column align="center" label="盐阻(Ω)" min-width="80" prop="salt" />
<el-table-column align="center" label="锌(nA)" min-width="80" prop="corrosion1" />
<el-table-column align="center" label="铜(nA)" min-width="80" prop="corrosion2" />
<el-table-column align="center" label="铝(nA)" min-width="80" prop="corrosion3" />
<el-table-column align="center" label="钢(nA)" min-width="80" prop="corrosion4" />
<el-table-column align="center" label="锌腐蚀电流(nA)" min-width="130" prop="corrosion1" />
<el-table-column align="center" label="铜腐蚀电流(nA)" min-width="130" prop="corrosion2" />
<el-table-column align="center" label="铝腐蚀电流(nA)" min-width="130" prop="corrosion3" />
<el-table-column align="center" label="钢腐蚀电流(nA)" min-width="130" prop="corrosion4" />
<el-table-column align="center" label="采集时间" min-width="170">
<template #default="scope">
{{ formatTime(+scope.row.time) }}

8
src/views/data-report.vue → src/components/history/data-report.vue

@ -1,7 +1,7 @@
<script setup>
import { computed, onMounted, ref } from 'vue';
import { useStore } from 'vuex';
import SearchBar from 'components/search-bar-data.vue';
import SearchBar from 'components/history/search-bar-data.vue';
import { getDatas } from 'apis';
import { ElMessage } from 'element-plus';
import dayjs from 'dayjs';
@ -65,7 +65,7 @@ const getData = async () => {
//
onMounted(() => {
const winHeight = document.documentElement.clientHeight;
contentHeight.value = winHeight - 170;
contentHeight.value = winHeight - 260;
});
/**
@ -114,10 +114,10 @@ function formatTime(time) {
</script>
<template>
<SearchBar :show-export="true" @search="onSearch" :loading-search="loadingSearch" />
<SearchBar :loading-search="loadingSearch" :show-export="true" @search="onSearch" />
<template v-if="data">
<el-table :data="data" border stripe style="width: 100%" :max-height="contentHeight">
<el-table :data="data" :max-height="contentHeight" border stripe style="width: 100%">
<el-table-column align="center" fixed label="设备编号" min-width="80" prop="deviceNo" />
<el-table-column align="center" label="ICCID" min-width="190" prop="iccid" />
<el-table-column align="center" label="IMEI" min-width="150" prop="imei" />

30
src/components/search-bar-data.vue → src/components/history/search-bar-data.vue

@ -1,23 +1,12 @@
<template>
<el-form ref="searchDeviceForm" :inline="true" :model="searchDevice">
<el-form-item label="选择站点">
<el-form-item label="选择站点">
<el-select v-model="searchDevice.deviceId" placeholder="请选择站点" @change="change">
<!-- <el-option label="全部" value></el-option> -->
<el-option v-for="item in devices" :key="item.deviceId" :label="item.address" :value="item.deviceId"></el-option>
</el-select>
</el-form-item>
<el-form-item label="选择日期">
<el-date-picker
v-model="searchDevice.date"
end-placeholder="结束日期"
range-separator="-"
start-placeholder="开始日期"
type="daterange"
></el-date-picker>
</el-form-item>
<el-form-item v-if="showTypeSelect" label="类型">
<el-form-item v-if="showTypeSelect" label="类型:">
<el-select v-model="searchDevice.dataType" placeholder="选择查询类型">
<el-option label="全部" value=""></el-option>
<el-option label="事件上报" value="ReportHistoryEvent"></el-option>
@ -25,6 +14,14 @@
</el-select>
</el-form-item>
<el-form-item label="起始时间:">
<el-date-picker v-model="searchDevice.date[0]" format="YYYY-MM-DD HH:mm" placeholder="起始时间" type="datetime"></el-date-picker>
</el-form-item>
<el-form-item label="截止时间:">
<el-date-picker v-model="searchDevice.date[1]" format="YYYY-MM-DD HH:mm" placeholder="截止时间" type="datetime"></el-date-picker>
</el-form-item>
<el-form-item>
<el-button :loading="loadingSearch" type="primary" @click="onSubmit">
<i class="el-icon-search mr-2"></i>
@ -33,7 +30,10 @@
</el-form-item>
<el-form-item v-if="showExport">
<el-button :loading="loadingExport" type="primary" @click="onExport"><i class="el-icon-download mr-2"></i>导出</el-button>
<el-button :loading="loadingExport" type="success" @click="onExport">
<i class="el-icon-download mr-2"></i>
导出
</el-button>
</el-form-item>
</el-form>
</template>
@ -47,7 +47,7 @@ import { exportHistory } from 'apis';
const emit = defineEmits(['search']);
const searchDevice = reactive({
deviceId: '',
date: [dayjs().subtract(7, 'day'), new Date()],
date: ['', new Date()],
dataType: 'ReportHistoryData',
});
const searchDeviceForm = ref(null); // form

126
src/components/statistical/search-bar.vue

@ -0,0 +1,126 @@
<template>
<el-form ref="searchDeviceForm" :inline="true" :model="searchDevice">
<el-form-item label="选择站点:">
<el-select v-model="searchDevice.deviceId" placeholder="请选择站点" @change="change">
<!-- <el-option label="全部" value></el-option> -->
<el-option v-for="item in devices" :key="item.deviceId" :label="item.address" :value="item.deviceId"></el-option>
</el-select>
</el-form-item>
<el-form-item v-if="showTypeSelect" label="类型:">
<el-select v-model="searchDevice.dataType" placeholder="选择查询类型">
<el-option label="全部" value=""></el-option>
<el-option label="事件上报" value="ReportHistoryEvent"></el-option>
<el-option label="业务上报" value="ReportHistoryData"></el-option>
</el-select>
</el-form-item>
<el-form-item label="起始时间:">
<el-date-picker v-model="searchDevice.date[0]" format="YYYY-MM-DD HH:mm" placeholder="起始时间" type="datetime"></el-date-picker>
</el-form-item>
<el-form-item label="截止时间:">
<el-date-picker v-model="searchDevice.date[1]" format="YYYY-MM-DD HH:mm" placeholder="截止时间" type="datetime"></el-date-picker>
</el-form-item>
<el-form-item>
<el-button :loading="loadingSearch" type="primary" @click="onSubmit">
<i class="el-icon-search mr-2"></i>
查询
</el-button>
</el-form-item>
<el-form-item v-if="showExport">
<el-button :loading="loadingExport" type="success" @click="onExport">
<i class="el-icon-download mr-2"></i>
导出
</el-button>
</el-form-item>
</el-form>
</template>
<script setup>
import { computed, defineEmits, defineProps, reactive, ref, watch } from 'vue';
import { useStore } from 'vuex';
import dayjs from 'dayjs';
import { exportHistory } from 'apis';
const emit = defineEmits(['search']);
const searchDevice = reactive({
deviceId: '',
date: ['', new Date()],
dataType: 'ReportHistoryData',
});
const searchDeviceForm = ref(null); // form
const store = useStore();
const devices = computed(() => store.state.device.devices);
const currentDeviceId = computed(() => store.state.device.currentDeviceId); // id
const loadingExport = ref(false);
defineProps({
showExport: Boolean,
showTypeSelect: Boolean,
loadingSearch: Boolean,
});
// currentDeviceId
watch(
() => currentDeviceId.value,
newValue => {
if (newValue) {
searchDevice.deviceId !== newValue && (searchDevice.deviceId = newValue);
}
},
{ immediate: true },
);
const change = e => {
store.commit('device/setCurrentDeviceId', e);
};
//
function generateParams() {
const { deviceId, date, dataType } = searchDevice;
let params = {
deviceId,
date,
dataType,
};
if (date) {
const start = +dayjs(date[0]).format('x');
const end = +dayjs(date[1]).format('x');
const daterange = [start, end];
params = {
deviceId,
date: daterange,
dataType,
};
}
return params;
}
//
const onSubmit = () => {
searchDeviceForm.value.validate(valid => {
if (valid) {
const params = generateParams();
emit('search', params);
}
});
};
//
async function onExport() {
try {
loadingExport.value = true;
const params = generateParams();
const resData = await exportHistory(params);
loadingExport.value = false;
resData && (window.location.href = resData);
} catch (error) {
loadingExport.value = false;
throw new Error(error);
}
}
</script>

22
src/config/config.js

@ -37,7 +37,7 @@ export const functionConfig = {
corrosiveType4: '', // 金属腐蚀类型
report: {
type: 'CYCLE', // 上报周期类型 0->时间点 1->周期
timePoints: [0, 0, 0, 0, 0, 0], // 设置时间点
timePoints: [''], // 设置时间点
cycle: 240, // 上报周期分钟数
},
status: '',
@ -45,10 +45,22 @@ export const functionConfig = {
// 金属腐蚀类型
export const corrosiveTypes = [
{ value: 'XIN', type: '锌' },
{ value: 'LV', type: '铝' },
{ value: 'TONG', type: '铜' },
{ value: 'GANG', type: '钢' },
{
value: 'XIN',
type: '锌',
},
{
value: 'LV',
type: '铝',
},
{
value: 'TONG',
type: '铜',
},
{
value: 'GANG',
type: '钢',
},
];
// 添加设备

5
src/hooks/useDeviceCreate.js

@ -3,10 +3,6 @@ import { ref } from 'vue';
export default function useDeviceCreate() {
const display = ref(false);
function toggle() {
display.value = !display.value;
}
function hide() {
display.value = false;
}
@ -17,7 +13,6 @@ export default function useDeviceCreate() {
return {
display,
toggle,
hide,
show,
};

25
src/routers/index.js

@ -39,32 +39,23 @@ export const routes = [
component: () => import('@/views/data-realtime.vue'),
},
{
path: '/corrosion/statistical-realtime',
name: 'statistical-realtime',
path: '/corrosion/history',
name: 'history',
meta: {
title: '实时数据统计',
icon: 'el-icon-data-analysis',
title: '历史数据',
icon: 'el-icon-document',
},
component: () => import('@/views/statistical-realtime.vue'),
component: () => import('@/views/history.vue'),
},
{
path: '/corrosion/statistical-report',
name: 'statistical-report',
path: '/corrosion/statistical',
name: 'statistical',
meta: {
title: '上报数据统计',
title: '数据统计',
icon: 'el-icon-data-line',
},
component: () => import('@/views/statistical-report.vue'),
},
{
path: '/corrosion/data-history',
name: 'data-history',
meta: {
title: '历史数据',
icon: 'el-icon-document-copy',
},
component: () => import('@/views/data-history.vue'),
},
{
path: '/corrosion/commands',
name: 'commands',

6
src/views/config.vue

@ -1,4 +1,7 @@
<template>
<!-- 设置站点选择 设备下发状态 -->
<DeviceSelectAndStatus :status="status" />
<el-tabs v-model="activeName">
<el-tab-pane :lazy="true" label="运动参数" name="function">
<FunctionConfigPending v-if="activeName === 'function'" :active-name="activeName" />
@ -13,6 +16,9 @@
import { ref } from 'vue';
import FunctionConfigPending from 'components/config/function-config-pending.vue';
import NetworkConfigPending from 'components/config/network-config-pending.vue';
import DeviceSelectAndStatus from 'components/config/device-select-and-status.vue';
const status = ref('');
const activeName = ref('function');
</script>

2
src/views/function-config.vue

@ -14,7 +14,7 @@
<script setup>
import { ref } from 'vue';
import DeviceSelectAndStatus from 'components/device-select-and-status.vue';
import DeviceSelectAndStatus from 'components/config/device-select-and-status.vue';
import FunctionConfigPending from 'components/config/function-config-pending.vue';
import FunctionConfigApplied from 'components/function-config-applied.vue';

18
src/views/history.vue

@ -0,0 +1,18 @@
<template>
<el-tabs v-model="activeName">
<el-tab-pane :lazy="true" label="本地数据" name="local">
<Local v-if="activeName === 'local'" :active-name="activeName" />
</el-tab-pane>
<el-tab-pane :lazy="true" label="设备数据" name="device">
<Device v-if="activeName === 'device'" :active-name="activeName" />
</el-tab-pane>
</el-tabs>
</template>
<script setup>
import { ref } from 'vue';
import Local from 'components/history/data-history.vue';
import Device from 'components/history/data-report.vue';
const activeName = ref('local');
</script>

2
src/views/network-config.vue

@ -14,7 +14,7 @@
<script setup>
import { ref } from 'vue';
import DeviceSelectAndStatus from 'components/device-select-and-status.vue';
import DeviceSelectAndStatus from 'components/config/device-select-and-status.vue';
import NetworkConfigPending from 'components/config/network-config-pending.vue';
import NetworkConfigApplied from 'components/network-config-applied.vue';

2
src/views/statistical-report.vue

@ -4,7 +4,7 @@
</template>
<script setup>
import SearchBar from 'components/search-bar-data.vue';
import SearchBar from 'components/statistical/search-bar.vue';
import HistoryData from 'components/chart/data-report.vue';
import { computed, ref } from 'vue';
import { useStore } from 'vuex';

20
yarn.lock

@ -1389,6 +1389,14 @@
dependencies:
"minimatch" "^3.0.4"
"echarts@^5.2.2":
"integrity" "sha1-7DyLKhUcu6cbo8LHz5svIEfOQ3A="
"resolved" "https://registry.npmmirror.com/echarts/download/echarts-5.2.2.tgz"
"version" "5.2.2"
dependencies:
"tslib" "2.3.0"
"zrender" "5.2.1"
"element-plus@^1.1.0-beta.24":
"integrity" "sha1-hYsFky68C+FUGdOXTRW+Kk9LaWw="
"resolved" "https://registry.npmmirror.com/element-plus/download/element-plus-1.1.0-beta.24.tgz"
@ -3764,6 +3772,11 @@
"resolved" "https://registry.nlark.com/tslib/download/tslib-2.3.1.tgz?cache=0&sync_timestamp=1628722580350&other_urls=https%3A%2F%2Fregistry.nlark.com%2Ftslib%2Fdownload%2Ftslib-2.3.1.tgz"
"version" "2.3.1"
"tslib@2.3.0":
"integrity" "sha1-gDuM2rPhK6WBpMpByIObuw2ssJ4="
"resolved" "https://registry.nlark.com/tslib/download/tslib-2.3.0.tgz"
"version" "2.3.0"
"type-check@^0.4.0", "type-check@~0.4.0":
"integrity" "sha1-B7ggO/pwVsBlcFDjzNLDdzC6uPE="
"resolved" "https://registry.nlark.com/type-check/download/type-check-0.4.0.tgz"
@ -4093,3 +4106,10 @@
"integrity" "sha1-ApTrPe4FAo0x7hpfosVWpqrxChs="
"resolved" "https://registry.nlark.com/yocto-queue/download/yocto-queue-0.1.0.tgz"
"version" "0.1.0"
"zrender@5.2.1":
"integrity" "sha1-X0u9qRW6bUErCxncJDG+qtBUF7s="
"resolved" "https://registry.nlark.com/zrender/download/zrender-5.2.1.tgz"
"version" "5.2.1"
dependencies:
"tslib" "2.3.0"

Loading…
Cancel
Save