This commit is contained in:
quantulr
2023-12-05 09:38:06 +08:00
parent 9bd8ee2899
commit 419adbcbe3
8 changed files with 562 additions and 396 deletions

View File

@ -13,6 +13,7 @@
"axios": "^1.1.3", "axios": "^1.1.3",
"core-js": "^3.8.3", "core-js": "^3.8.3",
"flv.js": "^1.6.2", "flv.js": "^1.6.2",
"jszip": "^3.10.1",
"lodash-es": "^4.17.21", "lodash-es": "^4.17.21",
"modern-normalize": "^1.1.0", "modern-normalize": "^1.1.0",
"pinia": "^2.0.33", "pinia": "^2.0.33",

View File

@ -7,6 +7,11 @@
<meta content="width=device-width,initial-scale=1.0" name="viewport"/> <meta content="width=device-width,initial-scale=1.0" name="viewport"/>
<link href="<%= BASE_URL %>favicon.ico" rel="icon"/> <link href="<%= BASE_URL %>favicon.ico" rel="icon"/>
<!-- <title><%= htmlWebpackPlugin.options.title %></title> --> <!-- <title><%= htmlWebpackPlugin.options.title %></title> -->
<script>
console.log(navigator.userAgent)
</script>
<script src="//cdn.jsdelivr.net/npm/eruda"></script>
<script>eruda.init();</script>
<script> <script>
var sid = '<#sid>'; var sid = '<#sid>';
</script> </script>

View File

@ -14,21 +14,19 @@
<script> <script>
// import {NConfigProvider, zhCN,dateZhCN} from 'naive-ui' // import {NConfigProvider, zhCN,dateZhCN} from 'naive-ui'
import CameraList from "./components/CameraList.vue"; import CameraList from "./components/CameraList.vue";
import CameraItem from "@/components/CameraItem.vue";
import {useTokenStore} from "@/store/token"; import {useTokenStore} from "@/store/token";
// import List from "./infinite-list-vue.umd.cjs"; // import List from "./infinite-list-vue.umd.cjs";
export default { export default {
name: "App", name: "App",
computed: { computed: {},
zhCN() {
return zhCN
}
},
components: { components: {
CameraItem,
CameraList, CameraList,
}, },
created() {
console.log("created")
},
mounted() { mounted() {
console.log("mounted")
const tokenStore = useTokenStore(); const tokenStore = useTokenStore();
tokenStore.fetchToken(); tokenStore.fetchToken();
}, },

View File

@ -19,7 +19,7 @@
class="quit-fullscreen iconfont icon-quxiaoquanping_o" class="quit-fullscreen iconfont icon-quxiaoquanping_o"
@click.stop="exitFullscreen" @click.stop="exitFullscreen"
></span> ></span>
<n-slider v-if="isFullscreen && playbackFlvUrl" v-model="playbackProcess" :format-tooltip="formatSeconds" <n-slider v-if="isFullscreen && playbackFlvUrl" v-model:value="playbackProcess" :format-tooltip="formatSeconds"
:marks="sliderMarks" :marks="sliderMarks"
:max="isToday? getNowSeconds()-600 :86399" :min="0" :step="300" :max="isToday? getNowSeconds()-600 :86399" :min="0" :step="300"
class="time-slider" class="time-slider"
@ -46,7 +46,8 @@
</template> </template>
<div> <div>
<n-config-provider :date-locale="dateZhCN" :locale="zhCN"> <n-config-provider :date-locale="dateZhCN" :locale="zhCN">
<n-date-picker v-model="playbackDate" format="yyyy-MM-dd HH:mm:ss" panel type="date" <!-- v-model="playbackDate"-->
<n-date-picker v-model:value="playbackDate" format="yyyy-MM-dd HH:mm:ss" panel type="date"
@update-formatted-value="handleConfirmRange"/> @update-formatted-value="handleConfirmRange"/>
</n-config-provider> </n-config-provider>
@ -56,6 +57,14 @@
@click="playbackFlvUrl=null"> @click="playbackFlvUrl=null">
<log-out-outline/> <log-out-outline/>
</n-icon> </n-icon>
<!-- -->
<div class="snapshot" v-if="isFullscreen">
<n-icon v-if="!snapshotDownloading" color="#18a058" @click="handleClickGetSnapshot">
<camera-outline/>
</n-icon>
<n-spin v-else size="medium"/>
</div>
<!--right-bottom 控制转动-->
<div <div
v-if="isFullscreen && !playbackFlvUrl &&props.name.includes('球机')" v-if="isFullscreen && !playbackFlvUrl &&props.name.includes('球机')"
class="arrow-control" class="arrow-control"
@ -106,13 +115,13 @@
<script name="camera" setup> <script name="camera" setup>
import {nextTick, onMounted, onUnmounted, reactive, ref, toRefs, watch} from "vue"; import {nextTick, onMounted, onUnmounted, reactive, ref, toRefs, watch} from "vue";
import {dateZhCN, NConfigProvider, NDatePicker, NIcon, NPopover, NSlider, zhCN} from 'naive-ui' import {dateZhCN, NConfigProvider, NDatePicker, NIcon, NPopover, NSlider, NSpin, zhCN} from 'naive-ui'
import {CalendarOutline, LogOutOutline} from '@vicons/ionicons5' import {CalendarOutline, LogOutOutline, CameraOutline} from '@vicons/ionicons5'
import flvjs from "flv.js"; import flvjs from "flv.js";
import axios from "axios"; import axios from "axios";
import {useTokenStore} from "@/store/token"; import {useTokenStore} from "@/store/token";
import {debounce} from "lodash-es"; import {debounce} from "lodash-es";
import JSZip from 'jszip'
// eslint-disable-next-line no-undef // eslint-disable-next-line no-undef
const props = defineProps({ const props = defineProps({
name: { name: {
@ -120,7 +129,9 @@ const props = defineProps({
}, },
source: { source: {
type: String, type: String,
default: null, default: null
// FIXME
// default: "https://sf1-hscdn-tos.pstatp.com/obj/media-fe/xgplayer_doc_video/flv/xgplayer-demo-720p.flv",
}, },
}); });
const {source} = toRefs(props); const {source} = toRefs(props);
@ -217,12 +228,15 @@ const closePlayModal = async () => {
if (!tokenStore.token) { if (!tokenStore.token) {
await tokenStore.fetchToken(); await tokenStore.fetchToken();
} }
playbackDate.value = null
playbackFlvUrl.value = null
playbackProcess.value = 0
const serial = source.value.split("/flv/hls/")[1].split("_")[0]; const serial = source.value.split("/flv/hls/")[1].split("_")[0];
const url = new URL(source.value); const url = new URL(source.value);
axios.get( axios.get(
`${url.protocol}//${url.host}/api/v1/playback/stop?serial=${serial}&code=${serial}&streamid=${playbackStreamId.value}&token=${tokenStore.token}` `${url.protocol}//${url.host}/api/v1/playback/stop?serial=${serial}&code=${serial}&streamid=${playbackStreamId.value}&token=${tokenStore.token}`
); );
exitFullscreen()
}; };
// url: "https://sf1-hscdn-tos.pstatp.com/obj/media-fe/xgplayer_doc_video/flv/xgplayer-demo-360p.flv", // url: "https://sf1-hscdn-tos.pstatp.com/obj/media-fe/xgplayer_doc_video/flv/xgplayer-demo-360p.flv",
@ -351,8 +365,110 @@ onUnmounted(() => {
} }
}); });
const formatTime = (_date) => {
// _date.setSeconds(_date.getSeconds() + playbackProcess.value)
const year = _date.getFullYear()
const month = (_date.getMonth() + 1).toString().padStart(2, '0')
const day = _date.getDate().toString().padStart(2, '0')
const hour = _date.getHours().toString().padStart(2, '0')
const minute = _date.getMinutes().toString().padStart(2, '0')
const second = _date.getSeconds().toString().padStart(2, '0')
return `${year}-${month}-${day} ${hour}:${minute}:${second}`
}
/**
* 保存文件
* @param blob
* @param filename
* @returns {Promise<unknown>}
*/
const saveAs = (blob, filename) =>
new Promise((resolve, reject) => {
const reader = new FileReader();
const a = document.createElement("a");
const zip = new JSZip()
zip.file(filename, blob)
zip.generateAsync({type: "blob"}).then((content) => {
reader.readAsDataURL(content);
})
reader.addEventListener("load", () => {
a.href = reader.result;
a.click();
resolve();
});
reader.addEventListener("error", reject);
});
const snapshotDownloading = ref(false)
const handleClickGetSnapshot = async () => {
snapshotDownloading.value = true
try {
await getCameraSnapshot()
} catch (e) {
console.log(e)
}
snapshotDownloading.value = false
}
/**
* 获取摄像头快照
* @returns {Promise<void>}
*/
const getCameraSnapshot = async () => {
if (!tokenStore.token) {
await tokenStore.fetchToken();
}
let stime = null;
let filename;
const serial = source.value.split("/flv/hls/")[1].split("_")[0];
const url = new URL(source.value);
if (playbackFlvUrl.value) {
const _date = new Date(playbackDate.value);
_date.setSeconds(_date.getSeconds() + playbackProcess.value)
const year = _date.getFullYear()
const month = (_date.getMonth() + 1).toString().padStart(2, '0')
const day = _date.getDate().toString().padStart(2, '0')
const hour = _date.getHours().toString().padStart(2, '0')
const minute = _date.getMinutes().toString().padStart(2, '0')
const second = _date.getSeconds().toString().padStart(2, '0')
stime = `${year}${month}${day}${hour}${minute}${second}`
filename = `${serial}_${year}-${month}-${day}-${hour}-${minute}-${second}.jpg`
} else {
filename = `${serial}_${formatTime(new Date()).replace(' ', '-').replace(':', "-")}.jpg`
}
// 如果正在播放回放,则先停止回放
if (playbackFlvUrl.value) {
await axios.get(
`${url.protocol}//${url.host}/api/v1/playback/stop?serial=${serial}&code=${serial}&streamid=${playbackStreamId.value}&token=${tokenStore.token}`
);
playbackStreamId.value = null
}
try {
if (stime === null) {
stime = 'now'
}
const snapshot = await axios.get(
`${url.protocol}//${url.host}/api/v1/device/channelsnap?serial=${serial}&code=${serial}&stime=${stime}&format=jpeg&w=-1&h=-1&token=${tokenStore.token}`,
{
responseType: "blob",
}
);
await saveAs(snapshot.data, filename)
} catch (e) {
console.log(e)
}
if (playbackFlvUrl.value) {
const startDate = new Date(playbackDate.value)
startDate.setSeconds(startDate.getSeconds() + playbackProcess.value)
const starttime = formatTime(startDate)
await startPlayHistory(starttime)
setPlaybackProcess(playbackProcess.value)
}
}
const isToday = ref(false) const isToday = ref(false)
const handleConfirmRange = (value) => { const handleConfirmRange = (value) => {
@ -364,7 +480,6 @@ const handleConfirmRange = (value) => {
const _date = new Date(value) const _date = new Date(value)
const now = new Date() const now = new Date()
isToday.value = _date.getDate() === now.getDate() isToday.value = _date.getDate() === now.getDate()
console.log(playbackDate.value)
} }
const playbackFlvUrl = ref(null)/*回放视频url*/ const playbackFlvUrl = ref(null)/*回放视频url*/
const playbackStreamId = ref(null)/*回放id*/ const playbackStreamId = ref(null)/*回放id*/
@ -381,8 +496,9 @@ const startPlayHistory = async (value) => {
} }
const serial = source.value.split("/flv/hls/")[1].split("_")[0]; const serial = source.value.split("/flv/hls/")[1].split("_")[0];
const url = new URL(source.value); const url = new URL(source.value);
const endTime = starttime.split('T')[0] + 'T23:59:59'
const resp = await axios.get( const resp = await axios.get(
`${url.protocol}//${url.host}/api/v1/playback/start?serial=${serial}&code=${serial}&starttime=${starttime}&endtime=${starttime.replace('00:00:00', '23:59:59')}&token=${tokenStore.token}` `${url.protocol}//${url.host}/api/v1/playback/start?serial=${serial}&code=${serial}&starttime=${starttime.split('T')[0] + 'T00:00:00'}&endtime=${endTime}&token=${tokenStore.token}`
); );
playbackStreamId.value = resp.data.StreamID playbackStreamId.value = resp.data.StreamID
playbackFlvUrl.value = resp.data.FLV playbackFlvUrl.value = resp.data.FLV
@ -391,12 +507,12 @@ const startPlayHistory = async (value) => {
/*监听回放url,销毁原播放器,如果有值则播放回放,没有则播放原视频*/ /*监听回放url,销毁原播放器,如果有值则播放回放,没有则播放原视频*/
watch(playbackFlvUrl, async (url, oldUrl) => { watch(playbackFlvUrl, async (url, oldUrl) => {
flvDestroy() flvDestroy()
if (url) { if (url !== null) {
flvCreate(url) flvCreate(url)
} else { } else {
flvCreate(props.source) flvCreate(props.source)
} }
if (oldUrl) { if (oldUrl && url === null) {
if (!playbackStreamId.value) { if (!playbackStreamId.value) {
return return
} }
@ -409,7 +525,6 @@ watch(playbackFlvUrl, async (url, oldUrl) => {
`${_url.protocol}//${_url.host}/api/v1/playback/stop?serial=${serial}&code=${serial}&streamid=${playbackStreamId.value}&token=${tokenStore.token}` `${_url.protocol}//${_url.host}/api/v1/playback/stop?serial=${serial}&code=${serial}&streamid=${playbackStreamId.value}&token=${tokenStore.token}`
); );
} }
}) })
</script> </script>
@ -531,11 +646,19 @@ watch(playbackFlvUrl, async (url, oldUrl) => {
left: 0; left: 0;
top: 0; top: 0;
.snapshot {
position: absolute;
left: 20px;
top: 50%;
transform: translateY(-50%);
display: flex;
}
.close-button { .close-button {
position: absolute; position: absolute;
top: 6px; top: 6px;
right: 6px; right: 6px;
color: #fff; color: #e7f5ee;
font-size: 48px; font-size: 48px;
border-radius: 50%; border-radius: 50%;
} }

View File

@ -95,58 +95,55 @@ const queryParams = reactive({
// const activeIndex = ref(0); // const activeIndex = ref(0);
const loadProjectList = async () => { const loadProjectList = async () => {
// const resp = await axios.get(`http://localhost:3000/project-list`); // const resp = await axios.get(`http://localhost:3000/project-list`);
// TODO:test // FIXME:test
// const resp = await axios.get( /*const resp = {
// "/api/portal/r/jd?cmd=com.awspaas.user.apps.cmp_screen_getProjectList&sid=b9e99f78-2f6e-4d1c-aea9-4364f4191d30" data: [{
// ); "SUPERVISORID": "",
// const resp = { "MAP": "40.763291,111.971932",
// data: [{ "PROID": "HT6YXM-202303232023030010",
// "SUPERVISORID": "", "PROTYPE": "",
// "MAP": "40.763291,111.971932", "UPDATEDATE": 1679559863000,
// "PROID": "HT6YXM-202303232023030010", "SUPERVISOR": "",
// "PROTYPE": "", "DESIGNERID": "",
// "UPDATEDATE": 1679559863000, "STCV": 800000,
// "SUPERVISOR": "", "PROOWNER": "六院本部/资产运营部/",
// "DESIGNERID": "", "SURVEY": "",
// "STCV": 800000, "UPDATEUSER": "13088880001",
// "PROOWNER": "六院本部/资产运营部/", "SURVEYID": "",
// "SURVEY": "", "APPENDIX": "",
// "UPDATEUSER": "13088880001", "PROCOST": 800000,
// "SURVEYID": "", "PRICELEADERID": "13088880004",
// "APPENDIX": "", "PRODEPTLEADERID": "13088880003",
// "PROCOST": 800000, "PROLEADERID": "13088880002",
// "PRICELEADERID": "13088880004", "PROLEADER": "建设单位项目管理人员",
// "PRODEPTLEADERID": "13088880003", "CONTRACTOR": "",
// "PROLEADERID": "13088880002", "FLOORAREA": 2000,
// "PROLEADER": "建设单位项目管理人员", "CREATEUSER": "13088880001",
// "CONTRACTOR": "", "ISEND": 0,
// "FLOORAREA": 2000, "RSTATUS": "1",
// "CREATEUSER": "13088880001", "LEADERID": "13088880007",
// "ISEND": 0, "PRICELEADER": "工程造价主管部门领导",
// "RSTATUS": "1", "PROSTATUS": "1",
// "LEADERID": "13088880007", "CBDATE": 1677600000000,
// "PRICELEADER": "工程造价主管部门领导", "CONTRACTORID": "",
// "PROSTATUS": "1", "LEADER": "主要领导",
// "CBDATE": 1677600000000, "PRODEPTLEADER": "建设单位项目管理部门领导",
// "CONTRACTORID": "", "PRONAME": "A区科创园",
// "LEADER": "主要领导", "ASSETLEADER": "固定资产投资主管领导",
// "PRODEPTLEADER": "建设单位项目管理部门领导", "BINDID": "47856a34-afa4-4a9b-ae28-ba450a4ab798",
// "PRONAME": "A区科创园", "ORGID": "d8ee92f8-c80f-4741-b92c-cbc60c91d754",
// "ASSETLEADER": "固定资产投资主管领导", "PROADDRESS": "内蒙古自治区呼和浩特市赛罕区黄合少镇南地村",
// "BINDID": "47856a34-afa4-4a9b-ae28-ba450a4ab798", "DESIGNER": "",
// "ORGID": "d8ee92f8-c80f-4741-b92c-cbc60c91d754", "PROCESSDEFID": "obj_a48ef53d7a2f4492bf440174e32bef3a",
// "PROADDRESS": "内蒙古自治区呼和浩特市赛罕区黄合少镇南地村", "PROPIC": "",
// "DESIGNER": "", "CREATEDATE": 1679559863000,
// "PROCESSDEFID": "obj_a48ef53d7a2f4492bf440174e32bef3a", "ASSETLEADERID": "13088880005",
// "PROPIC": "", "CEDATE": 1703260800000,
// "CREATEDATE": 1679559863000, "PROFILE": "",
// "ASSETLEADERID": "13088880005", "ACCDATE": 1703260800000,
// "CEDATE": 1703260800000, "ID": "a0fb6df5-48e4-442f-8b9d-da5861c1bf41"
// "PROFILE": "", }]
// "ACCDATE": 1703260800000, }*/
// "ID": "a0fb6df5-48e4-442f-8b9d-da5861c1bf41"q
// }]
// }
const resp = await axios.get( const resp = await axios.get(
"./jd?cmd=com.awspaas.user.apps.cmp_screen_getProjectList&sid=" + sid "./jd?cmd=com.awspaas.user.apps.cmp_screen_getProjectList&sid=" + sid
); );
@ -164,41 +161,39 @@ const projectClicked = () => {
const loadCameraList = async () => { const loadCameraList = async () => {
cameraLoading.value = true; cameraLoading.value = true;
// TODO:test // FIXME:test
// const resp = await axios(`/api/portal/r/jd`, { /*const resp = {
// params: queryParams, data: {
// }); "code": 0,
// const resp = { "rows": [{
// data: { "address": "A区-科创园南门内",
// "code": 0,
// "rows": [{
// "address": "A区-科创园南门内",
// "flvUrl": "http://106.74.152.123:10000/sms/34020000002020000001/flv/hls/34020000001320000009_34020000001320000009.flv", // "flvUrl": "http://106.74.152.123:10000/sms/34020000002020000001/flv/hls/34020000001320000009_34020000001320000009.flv",
// "id": "2e627e9a-afe8-4065-9196-423467396401", flvUrl: "https://sf1-hscdn-tos.pstatp.com/obj/media-fe/xgplayer_doc_video/flv/xgplayer-demo-720p.flv",
// "projectId": "HT6YXM-202303232023030010", "id": "2e627e9a-afe8-4065-9196-423467396401",
// "projectName": "A区科创园" "projectId": "HT6YXM-202303232023030010",
// }, { "projectName": "A区科创园"
// "address": "A区科创园东门内", }, {
// "flvUrl": "http://106.74.152.123:10000/sms/34020000002020000001/flv/hls/34020000001320000008_34020000001320000008.flv", "address": "A区科创园东门内",
// "id": "7ff7ba05-05e4-48e6-a43a-a0983ff1aa2b", "flvUrl": "http://106.74.152.123:10000/sms/34020000002020000001/flv/hls/34020000001320000008_34020000001320000008.flv",
// "projectId": "HT6YXM-202303232023030010", "id": "7ff7ba05-05e4-48e6-a43a-a0983ff1aa2b",
// "projectName": "A区科创园" "projectId": "HT6YXM-202303232023030010",
// }, { "projectName": "A区科创园"
// "address": "A区科创园东塔吊东北角球机", }, {
// "flvUrl": "http://106.74.152.123:10000/sms/34020000002020000001/flv/hls/34020000001320000010_34020000001320000010.flv", "address": "A区科创园东塔吊东北角球机",
// "id": "e410e322-cceb-40b9-899b-4f3d2e8215eb", "flvUrl": "http://106.74.152.123:10000/sms/34020000002020000001/flv/hls/34020000001320000010_34020000001320000010.flv",
// "projectId": "HT6YXM-202303232023030010", "id": "e410e322-cceb-40b9-899b-4f3d2e8215eb",
// "projectName": "A区科创园" "projectId": "HT6YXM-202303232023030010",
// }, { "projectName": "A区科创园"
// "address": "A区科创园东塔吊西南角球机", }, {
// "flvUrl": "http://106.74.152.123:10000/sms/34020000002020000001/flv/hls/34020000001320000011_34020000001320000011.flv", "address": "A区科创园东塔吊西南角球机",
// "id": "ff3e0079-068c-49f0-b1fe-3fa8544d91f2", "flvUrl": "http://106.74.152.123:10000/sms/34020000002020000001/flv/hls/34020000001320000011_34020000001320000011.flv",
// "projectId": "HT6YXM-202303232023030010", "id": "ff3e0079-068c-49f0-b1fe-3fa8544d91f2",
// "projectName": "A区科创园" "projectId": "HT6YXM-202303232023030010",
// }], "projectName": "A区科创园"
// "total": 4 }],
// } "total": 4
// } }
}*/
const resp = await axios.get("./jd", { const resp = await axios.get("./jd", {
params: queryParams, params: queryParams,
}); });
@ -208,10 +203,6 @@ const loadCameraList = async () => {
}; };
const loadImageList = async () => { const loadImageList = async () => {
// const resp = await axios.get(
// `./jd?cmd=com.awspaas.user.apps.cmp_photo_list&sid=${sid}&proId=${queryParams.query}`
// ); // 摄像头列表为空时,获取图片列表
// TODO:test
const resp = await axios.get( const resp = await axios.get(
`./jd?cmd=com.awspaas.user.apps.cmp_photo_list&sid=${sid}&proId=${queryParams.query}` `./jd?cmd=com.awspaas.user.apps.cmp_photo_list&sid=${sid}&proId=${queryParams.query}`
); // 摄像头列表为空时,获取图片列表 ); // 摄像头列表为空时,获取图片列表

View File

@ -8,6 +8,7 @@ import "./assets/fonts/iconfont.css";
import { createPinia } from "pinia"; import { createPinia } from "pinia";
// const Home = { template: "<div>Home</div>" }; // const Home = { template: "<div>Home</div>" };
// const About = { template: "<div>About</div>" }; // const About = { template: "<div>About</div>" };
console.log('load end')
const pinia = createPinia(); const pinia = createPinia();
// 2. 定义一些路由 // 2. 定义一些路由
// 每个路由都需要映射到一个组件。 // 每个路由都需要映射到一个组件。
@ -25,5 +26,6 @@ const pinia = createPinia();
// history: createWebHashHistory(), // history: createWebHashHistory(),
// routes, // `routes: routes` 的缩写 // routes, // `routes: routes` 的缩写
// }); // });
console.log('create pinia')
createApp(App).use(pinia).mount("#app"); createApp(App).use(pinia).mount("#app");
console.log('create app')

View File

@ -20,6 +20,7 @@ module.exports = defineConfig({
} }
}, },
}, },
// FIXME
publicPath: "./", publicPath: "./",
assetsDir: "../apps/com.awspaas.user.apps.cmp/monitor", assetsDir: "../apps/com.awspaas.user.apps.cmp/monitor",
}); });

View File

@ -3888,6 +3888,11 @@ ignore@^5.2.0:
resolved "https://registry.npmmirror.com/ignore/-/ignore-5.2.0.tgz#6d3bac8fa7fe0d45d9f9be7bac2fc279577e345a" resolved "https://registry.npmmirror.com/ignore/-/ignore-5.2.0.tgz#6d3bac8fa7fe0d45d9f9be7bac2fc279577e345a"
integrity sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ== integrity sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ==
immediate@~3.0.5:
version "3.0.6"
resolved "https://registry.npmmirror.com/immediate/-/immediate-3.0.6.tgz#9db1dbd0faf8de6fbe0f5dd5e56bb606280de69b"
integrity sha512-XXOFtyqDjNDAQxVfYxuF7g9Il/IbWmmlQg2MYKOH8ExIT1qg6xc4zyS3HaEEATgs1btfzxq15ciUiY7gjSXRGQ==
immutable@^4.0.0: immutable@^4.0.0:
version "4.1.0" version "4.1.0"
resolved "https://registry.npmmirror.com/immutable/-/immutable-4.1.0.tgz#f795787f0db780183307b9eb2091fcac1f6fafef" resolved "https://registry.npmmirror.com/immutable/-/immutable-4.1.0.tgz#f795787f0db780183307b9eb2091fcac1f6fafef"
@ -4173,6 +4178,16 @@ jsonfile@^6.0.1:
optionalDependencies: optionalDependencies:
graceful-fs "^4.1.6" graceful-fs "^4.1.6"
jszip@^3.10.1:
version "3.10.1"
resolved "https://registry.npmmirror.com/jszip/-/jszip-3.10.1.tgz#34aee70eb18ea1faec2f589208a157d1feb091c2"
integrity sha512-xXDvecyTpGLrqFrvkrUSoxxfJI5AH7U8zxxtVclpsUtMCq4JQ290LY8AW5c7Ggnr/Y/oK+bQMbqK2qmtk3pN4g==
dependencies:
lie "~3.3.0"
pako "~1.0.2"
readable-stream "~2.3.6"
setimmediate "^1.0.5"
kind-of@^6.0.2: kind-of@^6.0.2:
version "6.0.3" version "6.0.3"
resolved "https://registry.npmmirror.com/kind-of/-/kind-of-6.0.3.tgz#07c05034a6c349fa06e24fa35aa76db4580ce4dd" resolved "https://registry.npmmirror.com/kind-of/-/kind-of-6.0.3.tgz#07c05034a6c349fa06e24fa35aa76db4580ce4dd"
@ -4206,6 +4221,13 @@ levn@^0.4.1:
prelude-ls "^1.2.1" prelude-ls "^1.2.1"
type-check "~0.4.0" type-check "~0.4.0"
lie@~3.3.0:
version "3.3.0"
resolved "https://registry.npmmirror.com/lie/-/lie-3.3.0.tgz#dcf82dee545f46074daf200c7c1c5a08e0f40f6a"
integrity sha512-UaiMJzeWRlEujzAuw5LokY1L5ecNQYZKfmyZ9L7wDHb/p5etKaxXhohBcrw0EYby+G/NA52vRSN4N39dxHAIwQ==
dependencies:
immediate "~3.0.5"
lilconfig@^2.0.3: lilconfig@^2.0.3:
version "2.0.6" version "2.0.6"
resolved "https://registry.npmmirror.com/lilconfig/-/lilconfig-2.0.6.tgz#32a384558bd58af3d4c6e077dd1ad1d397bc69d4" resolved "https://registry.npmmirror.com/lilconfig/-/lilconfig-2.0.6.tgz#32a384558bd58af3d4c6e077dd1ad1d397bc69d4"
@ -4779,6 +4801,11 @@ p-try@^2.0.0:
resolved "https://registry.npmmirror.com/p-try/-/p-try-2.2.0.tgz#cb2868540e313d61de58fafbe35ce9004d5540e6" resolved "https://registry.npmmirror.com/p-try/-/p-try-2.2.0.tgz#cb2868540e313d61de58fafbe35ce9004d5540e6"
integrity sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ== integrity sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==
pako@~1.0.2:
version "1.0.11"
resolved "https://registry.npmmirror.com/pako/-/pako-1.0.11.tgz#6c9599d340d54dfd3946380252a35705a6b992bf"
integrity sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==
param-case@^3.0.4: param-case@^3.0.4:
version "3.0.4" version "3.0.4"
resolved "https://registry.npmmirror.com/param-case/-/param-case-3.0.4.tgz#7d17fe4aa12bde34d4a77d91acfb6219caad01c5" resolved "https://registry.npmmirror.com/param-case/-/param-case-3.0.4.tgz#7d17fe4aa12bde34d4a77d91acfb6219caad01c5"
@ -5357,6 +5384,19 @@ readable-stream@^3.0.6, readable-stream@^3.4.0:
string_decoder "^1.1.1" string_decoder "^1.1.1"
util-deprecate "^1.0.1" util-deprecate "^1.0.1"
readable-stream@~2.3.6:
version "2.3.8"
resolved "https://registry.npmmirror.com/readable-stream/-/readable-stream-2.3.8.tgz#91125e8042bba1b9887f49345f6277027ce8be9b"
integrity sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==
dependencies:
core-util-is "~1.0.0"
inherits "~2.0.3"
isarray "~1.0.0"
process-nextick-args "~2.0.0"
safe-buffer "~5.1.1"
string_decoder "~1.1.1"
util-deprecate "~1.0.1"
readdirp@~3.6.0: readdirp@~3.6.0:
version "3.6.0" version "3.6.0"
resolved "https://registry.npmmirror.com/readdirp/-/readdirp-3.6.0.tgz#74a370bd857116e245b29cc97340cd431a02a6c7" resolved "https://registry.npmmirror.com/readdirp/-/readdirp-3.6.0.tgz#74a370bd857116e245b29cc97340cd431a02a6c7"
@ -5657,6 +5697,11 @@ serve-static@1.15.0:
parseurl "~1.3.3" parseurl "~1.3.3"
send "0.18.0" send "0.18.0"
setimmediate@^1.0.5:
version "1.0.5"
resolved "https://registry.npmmirror.com/setimmediate/-/setimmediate-1.0.5.tgz#290cbb232e306942d7d7ea9b83732ab7856f8285"
integrity sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==
setprototypeof@1.1.0: setprototypeof@1.1.0:
version "1.1.0" version "1.1.0"
resolved "https://registry.npmmirror.com/setprototypeof/-/setprototypeof-1.1.0.tgz#d0bd85536887b6fe7c0d818cb962d9d91c54e656" resolved "https://registry.npmmirror.com/setprototypeof/-/setprototypeof-1.1.0.tgz#d0bd85536887b6fe7c0d818cb962d9d91c54e656"