zhangwei 3 éve
szülő
commit
ffa8946e9f
4 módosított fájl, 485 hozzáadás és 109 törlés
  1. 3 0
      package.json
  2. 430 107
      pages/index.vue
  3. 4 0
      static/svg/icon-mobile.svg
  4. 48 2
      yarn.lock

+ 3 - 0
package.json

@@ -25,8 +25,11 @@
     "axios": "^0.26.1",
     "bootstrap": "^4.6.1",
     "bootstrap-vue": "^2.21.2",
+    "clipboard": "^2.0.10",
     "core-js": "^3.19.3",
     "cross-env": "^7.0.3",
+    "current-device": "^0.10.2",
+    "device": "^0.3.12",
     "js-cookie": "^3.0.1",
     "moment": "^2.29.2",
     "nuxt": "^2.15.8",

+ 430 - 107
pages/index.vue

@@ -1,60 +1,144 @@
 <template>
-	<div class="content" :style="{ 'background': `#F5FAFF` }" v-show="home_show" v-if="detail">
-		<div class="logo">
-			<img src="/svg/icon-logo.svg" alt />
-		</div>
-		<!-- 未开始 -->
-		<div class="not-open" v-show="status == 'not-open'">
-			<img src="/subject/001.gif">
-		</div>
+	<div style="width: 100%; height: 100%;">
+		<div class="content" :style="{ 'background': `#F5FAFF` }" v-show="show_home" v-if="detail">
+			<div class="logo">
+				<img src="/svg/icon-logo.svg" alt />
+			</div>
+			<!-- 未开始 -->
+			<div class="not-open" v-show="status == 'not-open'">
+				<img src="/subject/001.gif">
+			</div>
 
-		<!-- 红包打开 -->
-		<div class="redPacket" v-show="status != 'not-open'" :class="{ redPacket2: status != 'open', key_packet: status == 'open' }">
+			<!-- 红包打开 -->
+			<div class="redPacket" v-show="status != 'not-open'"
+				:class="{ redPacket2: status != 'open', key_packet: status == 'open' }">
 
-			<!-- 内容 -->
-			<div class="head">
-				<div class="head-title">
-					<img :src="detail.postBizData.postUserInfo.avatarUrl" alt />
-					<span>{{ detail.postBizData.postUserInfo.nickName }}</span>
-				</div>
+				<!-- 内容 -->
+				<div class="head">
+					<div class="head-title">
+						<img :src="detail.postBizData.postUserInfo.avatarUrl" alt />
+						<span>{{ detail.postBizData.postUserInfo.nickName }}</span>
+					</div>
 
-				<!-- <div class="head-txt" v-if="status == 'open' || status == 'opened'">Awesome! You Will Get</div> -->
-				<!-- <div class="head-area" v-else-if="status == 'opened'">opened!</div> -->
+					<!-- <div class="head-txt" v-if="status == 'open' || status == 'opened'">Awesome! You Will Get</div> -->
+					<!-- <div class="head-area" v-else-if="status == 'opened'">opened!</div> -->
 
-				<!-- 红包被领完了 -->
-				<div class="head-area" v-if="status == 'nothing'">
-					<div class="txt">Better luck next time!</div>
+					<!-- 红包被领完了 -->
+					<div class="head-area" v-if="status == 'nothing'">
+						<div class="txt">Better luck next time!</div>
+					</div>
+
+					<!-- 过期 -->
+					<div class="head-area expire" v-if="status == 'expire'">
+						<div class="txt">This Giveaways</div>
+						<div class="titme">expired on {{ formatTime(detail.postBizData.endTimestamp, 'MM-DD') }}</div>
+					</div>
+
+					<!-- 非chrome浏览器 -->
+					<div class="head-area expire" v-if="status == 'no-chrome'">
+						<div class="txt">Get Giveaways</div>
+						<div class="titme">with chrome</div>
+					</div>
+					<!-- 领取成功 -->
+					<div class="head-area head-money" v-if="status == 'open' || status == 'opened'">
+						<div class="txt">AWESOME! YOU Will GET</div>
+						<div class="head-money-area">
+							<img :src="currencyIconUrl" alt />
+							<span class="money-txt">{{ receiveAmount / 100 }}</span>
+						</div>
+					</div>
 				</div>
 
-				<!-- 过期 -->
-				<div class="head-area expire" v-if="status == 'expire'">
-					<div class="txt">This Giveaways</div>
-					<div class="titme">expired on {{ formatTime(detail.postBizData.endTimestamp, 'MM-DD') }}</div>
+				<!-- 领取列表 -->
+				<div class="luck-list-title">
+					<div>{{ detail.postBizData.receiveCount || 0 }}/{{ detail.postBizData.totalCount || 0 }} Got</div>
+					<div> {{ detail.postBizData.receiveAmountValue / 100 }} / {{
+						detail.postBizData.amountValue / 100 || ''
+					}} {{ detail.postBizData.amountCurrencyCode || '' }}</div>
+				</div>
+				<div class="luck-list" @scroll="handleScroll($event)">
+					<div class="luck-item" v-for="item, i in luck_list" v-bind:key="i">
+						<img v-if="item.simpleUserInfoVO.avatarUrl" :src="item.simpleUserInfoVO.avatarUrl" alt />
+						<img v-else src="/svg/icon-twitter.svg" alt />
+						<div class="luck-content">
+							<div class="luck-title">{{ item.simpleUserInfoVO.nickName || 'Twitter User' }}</div>
+							<div class="luck-time">{{ formatTime(item.receiveTimestamp) }}</div>
+						</div>
+						<div class="luck-money">
+							<img :src="item.currencyIconUrl" alt />
+							<div class="luck-money-txt">{{ item.amountValue / 100 || 0 }}</div>
+						</div>
+						<div class="luck-king" v-if="item.maxAmount">
+							<img src="/svg/icon-king-hat.svg" alt />
+							<span>Luckiest Draw</span>
+						</div>
+					</div>
 				</div>
+			</div>
+
 
-				<!-- 非chrome浏览器 -->
-				<div class="head-area expire" v-if="status == 'no-chrome'">
-					<div class="txt">Get Giveaways</div>
-					<div class="titme">with chrome</div>
+			<!-- 安装 -->
+			<div class="install" v-if="status == 'open' || status == 'opened'"
+				:class="{ key_install: status == 'open' }">
+				<div class="title">Withdraw to Wallet</div>
+				<div class="validity">
+					<template v-if="validity_state">
+						<span>Validity</span>
+						<span style="color: red;">{{ validity }}</span>
+					</template>
+					<template v-else>
+						<span style="color: red;">Giveaways Validity</span>
+					</template>
 				</div>
-				<!-- 领取成功 -->
-				<div class="head-area head-money" v-if="status == 'open' || status == 'opened'">
-					<div class="txt">AWESOME! YOU Will GET</div>
-					<div class="head-money-area">
-						<img :src="currencyIconUrl" alt />
-						<span class="money-txt">{{ receiveAmount / 100 }}</span>
+
+				<div class="flow">
+					<div class="line"></div>
+
+					<div class="area_num">
+						<div class="num">1</div>
+						<span>Install DeNet</span>
+					</div>
+					<div class="tip">Used for Task Verification and Giveaways Withdrawal</div>
+					<div class="install_btn" @click="installExtension">Install</div>
+					<div class="area_num">
+						<div class="num">2</div>
+						<span>Complete Tasks by {{ detail.postBizData.postUserInfo.nickName }}</span>
 					</div>
+					<div class="tip">Follow、Like tweet、Retweet (Just 1-3 minutes)</div>
 				</div>
 			</div>
 
+			<!-- 过期 -->
+			<div class="install install-error" v-if="status == 'nothing' || status == 'expire'">
+				<div class="title">Install DeNet</div>
+				<div class="title">Don't miss the next Giveaway</div>
+				<div class="tip">Used for Task Verification and Giveaways Withdrawal</div>
+				<div class="install_btn" @click="installExtension">Install</div>
+			</div>
+
+
+			<!-- 非chrome 浏览器状态 -->
+			<div class="install install-error" v-if="status == 'no-chrome'">
+				<div class="title">Open Giveaways</div>
+				<div class="title">with chrome</div>
+				<div class="tip">Only supports getting Giveaways through chrome</div>
+				<div class="install_chrome">
+					<img src="/svg/icon-chrome.svg" alt />
+					Install Chrome
+				</div>
+			</div>
+			<div v-if="status == 'error'"></div>
+		</div>
+		<div v-if="show_moblie" class="moblie">
+			<div class="head-area">
+				<div class="txt">GET GIVEAWAY</div>
+			</div>
 			<!-- 领取列表 -->
 			<div class="luck-list-title">
 				<div>{{ detail.postBizData.receiveCount || 0 }}/{{ detail.postBizData.totalCount || 0 }} Got</div>
 				<div> {{ detail.postBizData.receiveAmountValue / 100 }} / {{
 					detail.postBizData.amountValue / 100 || ''
-				}} {{
-	detail.postBizData.amountCurrencyCode || ''
-}}</div>
+				}} {{ detail.postBizData.amountCurrencyCode || '' }}</div>
 			</div>
 			<div class="luck-list" @scroll="handleScroll($event)">
 				<div class="luck-item" v-for="item, i in luck_list" v-bind:key="i">
@@ -74,59 +158,29 @@
 					</div>
 				</div>
 			</div>
-		</div>
-
-
-		<!-- 安装 -->
-		<div class="install" v-if="status == 'open' || status == 'opened'" :class="{ key_install: status == 'open' }">
-			<div class="title">Withdraw to Wallet</div>
-			<div class="validity">
-				<template v-if="validity_state">
-					<span>Validity</span>
-					<span style="color: red;">{{ validity }}</span>
-				</template>
-				<template v-else>
-					<span style="color: red;">Giveaways Validity</span>
-				</template>
-			</div>
-
-			<div class="flow">
-				<div class="line"></div>
-
-				<div class="area_num">
-					<div class="num">1</div>
-					<span>Install DeNet</span>
+			<div class="area-cp-link">
+				<div class="area-title">
+					<img src="/svg/icon-mobile.svg" alt="">
+					<div class="right">
+						<div class="right-title">Get Giveaway on PC</div>
+						<div class="right-content">You need to use a computer to complete tasks, and Get Giveaways (Just
+							2-3 minutes)</div>
+					</div>
 				</div>
-				<div class="tip">Used for Task Verification and Giveaways Withdrawal</div>
-				<div class="install_btn" @click="installExtension">Install</div>
-				<div class="area_num">
-					<div class="num">2</div>
-					<span>Complete Tasks by {{ detail.postBizData.postUserInfo.nickName }}</span>
+				<div class="area-content">
+					{{ cp_link }}
+				</div>
+				<div class="area-btn">
+					<div class="btn" :data-clipboard-text="cp_link">Copy Link</div>
 				</div>
-				<div class="tip">Follow、Like tweet、Retweet (Just 1-3 minutes)</div>
 			</div>
-		</div>
-
-		<!-- 过期 -->
-		<div class="install install-error" v-if="status == 'nothing' || status == 'expire'">
-			<div class="title">Install DeNet</div>
-			<div class="title">Don't miss the next Giveaway</div>
-			<div class="tip">Used for Task Verification and Giveaways Withdrawal</div>
-			<div class="install_btn" @click="installExtension">Install</div>
-		</div>
-
-
-		<!-- 非chrome 浏览器状态 -->
-		<div class="install install-error" v-if="status == 'no-chrome'">
-			<div class="title">Open Giveaways</div>
-			<div class="title">with chrome</div>
-			<div class="tip">Only supports getting Giveaways through chrome</div>
-			<div class="install_chrome">
-				<img src="/svg/icon-chrome.svg" alt />
-				Install Chrome
+			<div class="layer" v-show="layer_show">
+				<div class="layer-box">
+					<div class="layer-txt">Unable to copy, please enter the link manually</div>
+					<div class="layer-btn" @click="layer_show = false">Done</div>
+				</div>
 			</div>
 		</div>
-		<div v-if="status == 'error'"></div>
 	</div>
 </template>
 
@@ -135,6 +189,7 @@ import axios from 'axios';
 import Cookies from 'js-cookie'
 import { isBrowser } from '../utils/help.js'
 var moment = require('moment');
+var ClipboardJS = require('clipboard')
 
 const api = {
 	prod: 'https://api.denetme.net',
@@ -154,10 +209,12 @@ export default {
 	name: "index",
 	data() {
 		return {
+			cp_link: '',
 			appVersionCode: 1,
 			mid: '',
-			area_show: true,
-			home_show: false,
+			show_moblie: false,
+			show_home: false,
+			layer_show: false,
 			validity: '',
 			receiveAmount: 0,
 			validity_state: true,
@@ -215,6 +272,10 @@ export default {
 		}
 	},
 	methods: {
+		isMobile() {
+			let flag = navigator.userAgent.match(/(phone|pad|pod|iPhone|iPod|ios|iPad|Android|Mobile|BlackBerry|IEMobile|MQQBrowser|JUC|Fennec|wOSBrowser|BrowserNG|WebOS|Symbian|Windows Phone)/i);
+			return flag;
+		},
 		installExtension() {
 			let url = 'https://d3d9wvhy948gxx.cloudfront.net/extensions/chrome/denet.zip'
 			location.href = url;
@@ -261,7 +322,7 @@ export default {
 					postId: this.detail.postId || ''
 				}
 			})
-			this.home_show = true
+			this.show_home = true
 			switch (data.code.toString()) {
 				case '0':
 					if (data.data.newReceived) {
@@ -289,7 +350,7 @@ export default {
 					break
 				default:
 					console.log('getRedPacket', data)
-					this.home_show = false
+					this.show_home = false
 					break;
 			}
 			// 领取列表分页
@@ -376,28 +437,49 @@ export default {
 			return
 		}
 		//改变font-size
-		(function (doc, win) {
-			var docEI = doc.documentElement,
-				resizeEvt = 'orientationchange' in window ? 'orientataionchange' : 'resize',
-				recalc = function () {
-					var clientWidth = docEI.clientWidth;
-					if (!clientWidth) return;
-					//100是字体大小,1510是开发时浏览器窗口的宽度,等比计算
-					docEI.style.fontSize = 10 * (clientWidth / 1510) + 'px';
-				}
-
-			if (!doc.addEventListener) return;
-			win.addEventListener(resizeEvt, recalc, false);
-			doc.addEventListener('DOMContentLoaded', recalc, false);
-		})(document, window);
+		// (function (doc, win) {
+		// 	var docEI = doc.documentElement,
+		// 		resizeEvt = 'orientationchange' in window ? 'orientataionchange' : 'resize',
+		// 		recalc = function () {
+		// 			var clientWidth = docEI.clientWidth;
+		// 			if (!clientWidth) return;
+		// 			//100是字体大小,1510是开发时浏览器窗口的宽度,等比计算
+		// 			docEI.style.fontSize = 10 * (clientWidth / 1510) + 'px';
+		// 		}
+
+		// 	if (!doc.addEventListener) return;
+		// 	win.addEventListener(resizeEvt, recalc, false);
+		// 	doc.addEventListener('DOMContentLoaded', recalc, false);
+		// })(document, window);
+		
+		document.documentElement.style.fontSize = '62.5%'
+		if (this.isMobile()) {
+			this.show_moblie = true
+			this.cp_link = window.location.href
+			// 复制链接
+			var clipboard = new ClipboardJS('.btn');
+			clipboard.on('success', function (e) {
+				console.info('Action:', e.action);
+				console.info('Text:', e.text);
+				console.info('Trigger:', e.trigger);
+
+				e.clearSelection();
+			});
 
-		if (isBrowser() == 'chrome') {
+			clipboard.on('error', function (e) {
+				this.layer_show = true
+				console.error('Action:', e.action);
+				console.error('Trigger:', e.trigger);
+			});
+			// 领取列表分页
+			this.getReceivedList()
+		} else if (isBrowser() == 'chrome') {
 			// 领取任务红包
 			this.setCookieMid()
 			this.getRedPacket()
 			this.setPickupInfo()
 		} else {
-			this.home_show = true
+			this.show_home = true
 			this.status = 'no-chrome'
 		}
 	}
@@ -415,6 +497,246 @@ body,
 	margin: 0;
 }
 
+.moblie {
+	display: flex;
+    flex-wrap: wrap;
+    height: 100%;
+	align-content: flex-start;
+	flex-direction: column;
+	.layer {
+		position: fixed;
+		width: 100%;
+		height: 100%;
+		top: 0;
+		left: 0;
+		background: rgba(0, 0, 0, .5);
+
+		.layer-box {
+			width: 30rem;
+			height: 17rem;
+			background: #FFFFFF;
+			border-radius: 11px;
+			opacity: 1;
+			position: absolute;
+			top: 25rem;
+			left: 50%;
+			margin-left: -15rem;
+
+			.layer-txt {
+				margin: 3rem 0;
+				width: 100%;
+				padding: 0 2.7rem;
+				font-weight: 600;
+				font-size: 1.8rem;
+				text-align: center;
+			}
+
+			.layer-btn {
+				width: 19rem;
+				height: 4rem;
+				background: #389AFF;
+				border-radius: 100px;
+				margin: 0 auto;
+				text-align: center;
+				line-height: 4rem;
+				color: #fff;
+				font-weight: 600;
+				font-size: 1.8rem;
+			}
+		}
+	}
+
+	.head-area {
+		width: 100%;
+		height: 8rem;
+		text-align: center;
+		letter-spacing: 0.3px;
+		font-size: 2rem;
+		text-align: center;
+		color: #fff;
+		background: #389AFF;
+		border-radius: 0 586px 586px/0 0 104px 104px;
+		display: flex;
+		align-items: center;
+
+		.txt {
+			width: 100%;
+			text-align: center;
+		}
+	}
+
+	.luck-list-title {
+		/*      margin-top: 47px;*/
+		margin: 0 16px;
+		padding: 14px 0 11px 0;
+		background: #fff;
+		display: flex;
+		justify-content: space-between;
+		color: #B0B0B0;
+		border-bottom: 1px solid #D1D1D1;
+	}
+
+
+
+	.luck-list {
+		flex: 1;
+		width: 100%;
+		background: #fff;
+		overflow: auto;
+
+		.luck-item {
+			display: flex;
+			padding: 12px 0;
+			margin: 0 16px;
+			border-bottom: 1px solid #d1d1d1;
+			justify-content: space-between;
+			position: relative;
+
+			img:first-child {
+				border-radius: 50%;
+			}
+
+			.luck-king {
+				position: absolute;
+				top: 36px;
+				right: 0px;
+				display: flex;
+				align-items: center;
+
+				img {
+					width: 22px;
+					height: 19px;
+					margin: 0;
+				}
+
+				span {
+					font-weight: 500;
+					font-size: 12px;
+					line-height: 14px;
+					letter-spacing: 0.3px;
+					color: #f5b945;
+				}
+			}
+
+			img {
+				width: 42px;
+				height: 42px;
+				margin-right: 12px;
+			}
+
+			.luck-content {
+				flex: auto;
+
+				.luck-title {
+					font-weight: 500;
+					font-size: 16px;
+					letter-spacing: 0.3px;
+					color: #444444;
+				}
+
+				.luck-time {
+					font-weight: 400;
+					font-size: 12px;
+					line-height: 14px;
+
+					color: #9b9b9b;
+				}
+			}
+
+			.luck-money {
+				display: flex;
+				height: 17px;
+				align-items: center;
+
+				img {
+					width: 14px;
+					height: 14px;
+					margin-right: 6px;
+				}
+
+				.luck-money-txt {
+					font-weight: 500;
+					font-size: 14px;
+					/* identical to box height */
+
+					text-align: right;
+					letter-spacing: 0.3px;
+
+					color: #444444;
+				}
+			}
+		}
+
+		.luck-item:last-child {
+			border: 0;
+		}
+	}
+
+	.area-cp-link {
+		background: #fff;
+		display: flex;
+		width: 100%;
+		flex-wrap: wrap;
+		position: fixed;
+		bottom: 0;
+		height: 20rem;
+		box-shadow: 0px -4px 10px rgba(0, 0, 0, 0.1);
+		border-top-left-radius: 2rem;
+		border-top-right-radius: 2rem;
+
+		.area-title {
+			display: flex;
+
+			img {
+				width: 6.4rem;
+				height: 6.4rem;
+				margin: 1.5rem;
+			}
+
+			.right {
+				flex: 1;
+				letter-spacing: 0.3px;
+
+				.right-title {
+					font-size: 1.7rem;
+					color: #000000;
+					margin-top: 1.7rem;
+
+				}
+
+				.right-content {
+					font-size: 1.2rem;
+					color: #989898;
+				}
+			}
+		}
+
+		.area-content {
+			background: #F4F4F4;
+			height: 4.6rem;
+			padding: 0 1rem;
+			width: 100%;
+			font-size: 1.3rem;
+			word-break: break-all;
+		}
+
+		.area-btn {
+			flex: 1;
+			display: flex;
+			justify-content: center;
+
+			.btn {
+				width: 34.3rem;
+				height: 4rem;
+				background: #389AFF;
+				border-radius: 100px;
+				font-size: 1.8rem;
+				color: #FFFFFF;
+			}
+		}
+	}
+}
+
 .content {
 	width: 100%;
 	height: 100%;
@@ -455,6 +777,8 @@ body,
 		animation-fill-mode: forwards;
 	}
 
+
+
 	.redPacket {
 		display: flex;
 		justify-content: flex-start;
@@ -883,5 +1207,4 @@ body,
 		margin-left: -18rem;
 	}
 }
-
 </style>

+ 4 - 0
static/svg/icon-mobile.svg

@@ -0,0 +1,4 @@
+<svg width="64" height="64" viewBox="0 0 64 64" fill="none" xmlns="http://www.w3.org/2000/svg">
+<rect opacity="0.1" width="64" height="64" rx="32" fill="#389AFF"/>
+<path opacity="0.6" d="M46.4833 18.4219H19.0167C18.4819 18.4219 17.9689 18.6344 17.5907 19.0126C17.2125 19.3908 17 19.9037 17 20.4386V37.37C17 37.9049 17.2125 38.4179 17.5907 38.7961C17.9689 39.1743 18.4819 39.3868 19.0167 39.3868H31.5987V43.1945H26.4064C26.111 43.1945 25.8277 43.3118 25.6188 43.5206C25.41 43.7295 25.2926 44.0128 25.2926 44.3082C25.2926 44.6035 25.41 44.8868 25.6188 45.0957C25.8277 45.3045 26.111 45.4219 26.4064 45.4219H39.0485C39.3439 45.4219 39.6271 45.3045 39.836 45.0957C40.0449 44.8868 40.1622 44.6035 40.1622 44.3082C40.1622 44.0128 40.0449 43.7295 39.836 43.5206C39.6271 43.3118 39.3439 43.1945 39.0485 43.1945H33.8261V39.3868H46.4833C47.0181 39.3868 47.5311 39.1743 47.9093 38.7961C48.2875 38.4179 48.5 37.9049 48.5 37.37V20.4386C48.5 19.9037 48.2875 19.3908 47.9093 19.0126C47.5311 18.6344 47.0181 18.4219 46.4833 18.4219V18.4219Z" fill="#389AFF"/>
+</svg>

+ 48 - 2
yarn.lock

@@ -3142,6 +3142,15 @@ cli-width@^3.0.0:
   resolved "https://registry.npmmirror.com/cli-width/-/cli-width-3.0.0.tgz#a2f48437a2caa9a22436e794bf071ec9e61cedf6"
   integrity sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw==
 
+clipboard@^2.0.10:
+  version "2.0.10"
+  resolved "https://registry.npmmirror.com/clipboard/-/clipboard-2.0.10.tgz#e61f6f7139ac5044c58c0484dcac9fb2a918bfd6"
+  integrity sha512-cz3m2YVwFz95qSEbCDi2fzLN/epEN9zXBvfgAoGkvGOJZATMl9gtTDVOtBYkx2ODUJl2kvmud7n32sV2BpYR4g==
+  dependencies:
+    good-listener "^1.2.2"
+    select "^1.1.2"
+    tiny-emitter "^2.0.0"
+
 cliui@^7.0.2:
   version "7.0.4"
   resolved "https://registry.npmmirror.com/cliui/-/cliui-7.0.4.tgz#a0265ee655476fc807aea9df3df8df7783808b4f"
@@ -3874,6 +3883,11 @@ delayed-stream@~1.0.0:
   resolved "https://registry.npmmirror.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619"
   integrity sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==
 
+delegate@^3.1.2:
+  version "3.2.0"
+  resolved "https://registry.npmmirror.com/delegate/-/delegate-3.2.0.tgz#b66b71c3158522e8ab5744f720d8ca0c2af59166"
+  integrity sha512-IofjkYBZaZivn0V8nnsMJGBr4jVLxHDheKSW88PyxS5QC4Vo9ZbZVvhzlSxY87fVq3STR6r+4cGepyHkcWOQSw==
+
 depd@2.0.0:
   version "2.0.0"
   resolved "https://registry.yarnpkg.com/depd/-/depd-2.0.0.tgz#b696163cc757560d09cf22cc8fad1571b79e76df"
@@ -3922,6 +3936,13 @@ devalue@^2.0.1:
   resolved "https://registry.npmmirror.com/devalue/-/devalue-2.0.1.tgz#5d368f9adc0928e47b77eea53ca60d2f346f9762"
   integrity sha512-I2TiqT5iWBEyB8GRfTDP0hiLZ0YeDJZ+upDxjBfOC2lebO5LezQMv7QvIUTzdb64jQyAKLf1AHADtGN+jw6v8Q==
 
+device@^0.3.12:
+  version "0.3.12"
+  resolved "https://registry.npmmirror.com/device/-/device-0.3.12.tgz#c6f8b951ecc38c32ba24ee00da93655f2d2988dc"
+  integrity sha512-iN7zef86PSMbMgQTA6pBpy2re1XgnFRExO87IsZA1wgDXI03C6wWv2tiXTfE1zsQytETW+S+wn2TpKSzXgqHfA==
+  dependencies:
+    useragent "*"
+
 diff-sequences@^27.5.1:
   version "27.5.1"
   resolved "https://registry.npmmirror.com/diff-sequences/-/diff-sequences-27.5.1.tgz#eaecc0d327fd68c8d9672a1e64ab8dccb2ef5327"
@@ -4847,6 +4868,13 @@ globby@^11.0.3, globby@^11.0.4:
     merge2 "^1.4.1"
     slash "^3.0.0"
 
+good-listener@^1.2.2:
+  version "1.2.2"
+  resolved "https://registry.npmmirror.com/good-listener/-/good-listener-1.2.2.tgz#d53b30cdf9313dffb7dc9a0d477096aa6d145c50"
+  integrity sha512-goW1b+d9q/HIwbVYZzZ6SsTr4IgE+WA44A0GmPIQstuOrgsFcT7VEJ48nmr9GaRtNu0XTKacFLGnBPAM6Afouw==
+  dependencies:
+    delegate "^3.1.2"
+
 graceful-fs@^4.1.11, graceful-fs@^4.1.15, graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.2.0, graceful-fs@^4.2.4, graceful-fs@^4.2.9:
   version "4.2.9"
   resolved "https://registry.npmmirror.com/graceful-fs/-/graceful-fs-4.2.9.tgz#041b05df45755e587a24942279b9d113146e1c96"
@@ -6398,7 +6426,7 @@ lower-case@^2.0.2:
   dependencies:
     tslib "^2.0.3"
 
-lru-cache@^4.1.2, lru-cache@^4.1.5:
+lru-cache@4.1.x, lru-cache@^4.1.2, lru-cache@^4.1.5:
   version "4.1.5"
   resolved "https://registry.npmmirror.com/lru-cache/-/lru-cache-4.1.5.tgz#8bbe50ea85bed59bc9e33dcab8235ee9bcf443cd"
   integrity sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==
@@ -8844,6 +8872,11 @@ scule@^0.2.1:
   resolved "https://registry.npmmirror.com/scule/-/scule-0.2.1.tgz#0c1dc847b18e07219ae9a3832f2f83224e2079dc"
   integrity sha512-M9gnWtn3J0W+UhJOHmBxBTwv8mZCan5i1Himp60t6vvZcor0wr+IM0URKmIglsWJ7bRujNAVVN77fp+uZaWoKg==
 
+select@^1.1.2:
+  version "1.1.2"
+  resolved "https://registry.npmmirror.com/select/-/select-1.1.2.tgz#0e7350acdec80b1108528786ec1d4418d11b396d"
+  integrity sha512-OwpTSOfy6xSs1+pwcNrv0RBMOzI39Lp3qQKUTPVVPRjCdNa5JH/oPRiqsesIskK8TVgmRiHwO4KXlV2Li9dANA==
+
 semver@6.3.0, semver@^6.0.0, semver@^6.1.1, semver@^6.1.2, semver@^6.3.0:
   version "6.3.0"
   resolved "https://registry.npmmirror.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d"
@@ -9598,7 +9631,12 @@ timsort@^0.3.0:
   resolved "https://registry.npmmirror.com/timsort/-/timsort-0.3.0.tgz#405411a8e7e6339fe64db9a234de11dc31e02bd4"
   integrity sha512-qsdtZH+vMoCARQtyod4imc2nIJwg9Cc7lPRrw9CzF8ZKR0khdr8+2nX80PBhET3tcyTtJDxAffGh2rXH4tyU8A==
 
-tmp@^0.0.33:
+tiny-emitter@^2.0.0:
+  version "2.1.0"
+  resolved "https://registry.npmmirror.com/tiny-emitter/-/tiny-emitter-2.1.0.tgz#1d1a56edfc51c43e863cbb5382a72330e3555423"
+  integrity sha512-NB6Dk1A9xgQPMoGqC5CVXn123gWyte215ONT5Pp5a0yt4nlEoO1ZWeCwpncaekPHXO60i47ihFnZPiRPjRMq4Q==
+
+tmp@0.0.x, tmp@^0.0.33:
   version "0.0.33"
   resolved "https://registry.npmmirror.com/tmp/-/tmp-0.0.33.tgz#6d34335889768d21b2bcda0aa277ced3b1bfadf9"
   integrity sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==
@@ -9933,6 +9971,14 @@ use@^3.1.0:
   resolved "https://registry.npmmirror.com/use/-/use-3.1.1.tgz#d50c8cac79a19fbc20f2911f56eb973f4e10070f"
   integrity sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==
 
+useragent@*:
+  version "2.3.0"
+  resolved "https://registry.npmmirror.com/useragent/-/useragent-2.3.0.tgz#217f943ad540cb2128658ab23fc960f6a88c9972"
+  integrity sha512-4AoH4pxuSvHCjqLO04sU6U/uE65BYza8l/KKBS0b0hnUPWi+cQ2BpeTEwejCSx9SPV5/U03nniDTrWx5NrmKdw==
+  dependencies:
+    lru-cache "4.1.x"
+    tmp "0.0.x"
+
 util-deprecate@^1.0.1, util-deprecate@^1.0.2, util-deprecate@~1.0.1:
   version "1.0.2"
   resolved "https://registry.npmmirror.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf"