Jelajahi Sumber

Merge branch 'test_1.1.8' of https://git.yishihui.com/DeNet/de-net-hotload into test_1.1.8

nieyuge 2 tahun lalu
induk
melakukan
b916a580fe

+ 2 - 0
package.json

@@ -19,6 +19,8 @@
     "core-js": "^3.8.3",
     "element-plus": "2.1.10",
     "moment": "^2.29.4",
+    "postcss-import": "^15.0.0",
+    "postcss-url": "^10.1.3",
     "vue": "^3.2.13",
     "vue-router": "^4.1.2"
   },

+ 94 - 0
src/denet/content/doTask.js

@@ -0,0 +1,94 @@
+import MESSAGE_ENUM from '@/uilts/messageCenter/messageEnum'
+import messageCenter from "@/uilts/messageCenter";
+import { getQueryString } from '@/uilts/help'
+const iframeId = getQueryString('iframeId')
+
+// 做任务
+const doTask = {
+    createTweet({ tweetId }, overTime) {
+        return new Promise((res, rej) => {
+            messageCenter.send({
+                info: {
+                    actionType: MESSAGE_ENUM.IFRAME_DO_TASK_CREATE_TWEET,
+                    iframeId //用于告诉父窗口会传消息给哪个iframe
+                },
+                data: {
+                    tweetId
+                },
+                overTime,
+                callback: (data) => {
+                    res(data);
+                },
+                failback: (e) => {
+                    rej(e)
+                }
+            })
+        })
+    },
+    like({ tweetId }, overTime) {
+        return new Promise((res, rej) => {
+            messageCenter.send({
+                info: {
+                    actionType: MESSAGE_ENUM.IFRAME_DO_TASK_LIKE,
+                    iframeId //用于告诉父窗口会传消息给哪个iframe
+                },
+                data: {
+                    tweetId,
+                },
+                overTime,
+                callback: (data) => {
+                    res(data);
+                },
+                failback: (e) => {
+                    rej(e)
+                }
+            })
+        })
+    },
+    follows({ follow_name, twitterUserId }, overTime) {
+        return new Promise((res, rej) => {
+            messageCenter.send({
+                info: {
+                    actionType: MESSAGE_ENUM.IFRAME_DO_TASK_FOLLOWS,
+                    iframeId //用于告诉父窗口会传消息给哪个iframe
+                },
+                data: {
+                  follow_name,
+                  twitterUserId
+                },
+                overTime,
+                callback: (data) => {
+                    res(data);
+                },
+                failback: (e) => {
+                    rej(e)
+                }
+            })
+        })
+    },
+    reTweet({ tweetId }, overTime) {
+        return new Promise((res, rej) => {
+            messageCenter.send({
+                info: {
+                    actionType: MESSAGE_ENUM.IFRAME_DO_TASK_RETWEET,
+                    iframeId //用于告诉父窗口会传消息给哪个iframe
+                },
+                data: {
+                    tweetId
+                },
+                overTime,
+                callback: (data) => {
+                    res(data);
+                },
+                failback: (e) => {
+                    rej(e)
+                }
+            })
+        })
+    }
+}
+
+export default doTask
+
+// iframe > dom id
+// iframe > createTweet  dom id

+ 30 - 0
src/denet/content/dom.js

@@ -0,0 +1,30 @@
+import MESSAGE_ENUM from '@/uilts/messageCenter/messageEnum'
+import messageCenter from "@/uilts/messageCenter";
+import { getQueryString } from '@/uilts/help'
+const iframeId = getQueryString('iframeId')
+
+const dom = {
+    // ---- 获取推文文案 ----
+    getTweetText({ tweetId }, overTime) {
+        return new Promise((res, rej) => {
+            messageCenter.send({
+                info: {
+                    actionType: MESSAGE_ENUM.IFRAME_DOM_GET_TWEET_TEXT,
+                    iframeId //用于告诉父窗口会传消息给哪个iframe
+                },
+                data: {
+                    tweetId
+                },
+                overTime,
+                callback: (data) => {
+                    res(data);
+                },
+                failback: (e) => {
+                    rej(e)
+                }
+            })
+        })
+    }
+}
+
+export default dom

+ 29 - 0
src/denet/content/getData.js

@@ -0,0 +1,29 @@
+import MESSAGE_ENUM from '@/uilts/messageCenter/messageEnum'
+import messageCenter from "@/uilts/messageCenter";
+import { getQueryString } from '@/uilts/help'
+const iframeId = getQueryString('iframeId')
+
+const getData = {
+  getUserInfoByName({screen_name}, overTime) {
+    return new Promise((res, rej) => {
+      messageCenter.send({
+          info: {
+              actionType: MESSAGE_ENUM.IFRAME_GET_TWITTER_USER_INFO,
+              iframeId
+          },
+          data: {
+            screen_name
+          },
+          overTime,
+          callback: (data) => {
+              res(data);
+          },
+          failback: (e) => {
+              rej(e)
+          }
+      })
+    })
+  }
+}
+
+export default getData

+ 9 - 0
src/denet/content/index.js

@@ -0,0 +1,9 @@
+import doTask from '@/denet/content/doTask'
+import dom from '@/denet/content/dom'
+import getData from '@/denet/content/getData'
+
+export default {
+    doTask,
+    dom,
+    getData
+}

+ 7 - 0
src/denet/index.js

@@ -0,0 +1,7 @@
+import content from '@/denet/content'
+
+const denet = {
+    content,
+}
+
+export default denet

+ 75 - 171
src/pages/red-packet/luck-draw.vue

@@ -471,6 +471,7 @@ import GlobalTip from '@/components/global-tip.vue';
 import customCardCover from '@/components/custom-card-cover.vue';
 import { RewardType, PlayType } from "@/types";
 import messageCenter from "@/uilts/messageCenter";
+import denet from '@/denet'
 
 var moment = require('moment');
 
@@ -580,31 +581,8 @@ async function clickLikeBtn() {
             break
         case '3':
             state.loading_show = true
-            messageCenter.send({
-                info: {
-                    actionType: "IFRAME_TWITTER_API_DO_TASK",
-                    iframeId
-                },
-                data: {
-                    task_data: {
-                        tweet_Id: state.tweetId
-                    },
-                    task_type: 'like'
-                },
-                overTime: 5000,
-                callback: (data) => {
-                    console.log('like success..', data)
-                    if (!data.task_type || state.tweetId != data.tweet_Id) {
-                        return
-                    }
-                    state.loading_show = false
-                    doTaskReport(data);
-                },
-                failback: e => { 
-                    state.loading_show = false
-                    console.log('like fail..', e)
-                }
-            })
+            let likeRes = await denet.content.doTask.like({ tweetId: state.tweetId });
+            likeRes && doTaskReport({...likeRes, task_type: 'like', do_type: 'api'}, {tab: {}});
             break
         default:
             window.open(`https://twitter.com/intent/like?tweet_id=${state.tweetId}`)
@@ -715,31 +693,8 @@ async function clickRetweetBtn() {
             break
         case '3':
             state.loading_show = true
-            messageCenter.send({
-                info: {
-                    actionType: "IFRAME_TWITTER_API_DO_TASK",
-                    iframeId
-                },
-                data: {
-                    task_data: {
-                        tweet_Id: state.tweetId
-                    },
-                    task_type: 'retweet'
-                },
-                overTime: 5000,
-                callback: (data) => {
-                    console.log('retweet success..', data)
-                    if (!data.task_type || state.tweetId != data.tweet_Id) {
-                        return
-                    }
-                    state.loading_show = false
-                    doTaskReport(data);
-                },
-                failback: e => { 
-                    state.loading_show = false
-                    console.log('retweet fail..', e)
-                }
-            })
+            let retweetRes = await denet.content.doTask.reTweet({ tweetId: state.tweetId });
+            retweetRes && doTaskReport({...retweetRes, task_type: 'retweet', do_type: 'api'}, {tab: {}});
             break
         default:
             window.open(`https://twitter.com/intent/retweet?tweet_id=${state.tweetId}`)
@@ -762,6 +717,7 @@ async function clickRetweetBtn() {
 function onTweetReplyClick(params) {
     let replyData = {
         postId: state.postId,
+        iframeId,
         type: params.type,
         taskLuckdropId: state.detail.taskLuckdropId
     }
@@ -798,6 +754,7 @@ async function clickReply(params) {
 
     let replyData = {
         postId: state.postId,
+        iframeId,
         type: params.type,
         taskLuckdropId: state.detail.taskLuckdropId
     }
@@ -863,7 +820,8 @@ async function clickRepostFacebook(params) {
     // })
 
     let shareUrl = feacebookShareUrl(shareUrlparams);
-    openShareFacebookWindow({ url: shareUrl });
+    window.open(shareUrl);
+    // openShareFacebookWindow({ url: shareUrl });
 
     // 埋点
     Report.reportLog({
@@ -888,7 +846,7 @@ function openShareFacebookWindow({ url }) {
     openUrlInNewWindow({
         width,
         type: 'normal',
-        url
+        url,
     })
 }
 
@@ -1000,6 +958,7 @@ const openFollowTabs = (arr_name) => {
         // 打开标签页的方法
         array_finish.forEach((item) => {
             url = `https://twitter.com/intent/follow?screen_name=${item.name}&tweet_id=${state.tweetId}`
+            // todo
             chrome.tabs.create({ url }, (tab) => {
                 if (follow_open_tabs.filter((item) => { return item.url == tab.url }).length == 0) {
                     follow_open_tabs.push(tab)
@@ -1062,31 +1021,19 @@ async function clickFollowAll(item, is_all) {
             arr_name.forEach((item) => {
                 follow_data.push(item)
             })
-            state.loading_show = true
-            messageCenter.send({
-                info: {
-                    actionType: "IFRAME_TWITTER_API_DO_TASK",
-                    iframeId
-                },
-                data: {
-                    task_data: {
-                        tweet_Id: state.tweetId,
-                        follow_data: follow_data,
-                    },
-                    task_type: 'follow'
-                },
-                overTime: 5000,
-                callback: (data) => { 
-                    console.log('follow success..', data)
-                    if (!data.task_type || state.tweetId != data.tweet_Id) {
-                        return
+            state.loading_show = true;
+            let promiseList = [];
+            for (let i = 0; i < follow_data.length; i++) {
+                promiseList[i] = denet.content.doTask.follows({ follow_name: follow_data[i]['name'], twitterUserId: follow_data[i]['twitterUserId'] });
+            }
+
+            Promise.allSettled(promiseList).then((res) => {
+                if (res && res.length) {
+                    let resList = res.filter(item => item.status == 'fulfilled');
+                    for (let i = 0; i < resList.length; i++) {
+                      let item = resList[i].value;
+                      item && doTaskReport({...item, task_type: 'follow', task_data: {follow_name: item.follow_name}, do_type: 'api'}, {tab: {}});
                     }
-                    state.loading_show = false
-                    doTaskReport(data);
-                },
-                failback: e => { 
-                    state.loading_show = false
-                    console.log('follow fail..', e)
                 }
             })
             break
@@ -1135,59 +1082,38 @@ const reSetBindTwtterId = async (_params) => {
         }
 }
 
-const reportBindTweetSuccess = (params) => {
+const reportBindTweetSuccess = async (params) => {
     let { discordTask, srcUserId } = params || {};
     discordTaskDetail = discordTask;
-    messageCenter.send({
-        info: {
-            actionType: "IFRAME_API_GET_TWEET_USER_INFO_REQ",
-            iframeId
-        },
-        data: {
-            screen_name: srcUserId,
-            tweetId: state.tweetId
-        },
-        callback: (req) => {
-            let { user } = req.data || {};
-                if (req.tweetId == state.tweetId && user && user.result && user.result.legacy) {
-                    let legacy = user.result.legacy;
-                    reportParams.twitterFans = legacy ? legacy.followers_count : 0;
-
-                    if (!discordTaskDetail) {
-                        if (reportParams.hasReport) return;
-                        reportParams.hasReport = true;
-                        Report.reportLog({
-                            objectType: Report.objectType.tweetPostBinded,
-                            twitterFans: reportParams.twitterFans,
-                            redPacketType: 1,
-                            postId: state.postId
-                        });
-                    } else {
-                        if (reportParams.discordFans !== '') {
-                            if (reportParams.hasReport) return;
-                            reportParams.hasReport = true;
-                            Report.reportLog({
-                                objectType: Report.objectType.tweetPostBinded,
-                                twitterFans: reportParams.twitterFans,
-                                discordFans: reportParams.discordFans,
-                                redPacketType: 1,
-                                postId: state.postId
-                            });
-                        }
-                    }
-                }
-        },
-        failback: (e) => {
-            console.log('reportBindTweetSuccess fail', e)
-        }
-    })
-    sendCurrentTabMessage({
-        actionType: "IFRAME_API_GET_TWEET_USER_INFO_REQ",
-        data: {
-            screen_name: srcUserId,
-            tweetId: state.tweetId
-        }
-    })
+
+    let {user = {}} = await denet.content.getData.getUserInfoByName({ screen_name: srcUserId });
+    if (user && user.result && user.result.legacy) {
+      let legacy = user.result.legacy;
+      reportParams.twitterFans = legacy ? legacy.followers_count : 0;
+
+      if (!discordTaskDetail) {
+          if (reportParams.hasReport) return;
+          reportParams.hasReport = true;
+          Report.reportLog({
+              objectType: Report.objectType.tweetPostBinded,
+              twitterFans: reportParams.twitterFans,
+              redPacketType: 1,
+              postId: state.postId
+          });
+      } else {
+          if (reportParams.discordFans !== '') {
+              if (reportParams.hasReport) return;
+              reportParams.hasReport = true;
+              Report.reportLog({
+                  objectType: Report.objectType.tweetPostBinded,
+                  twitterFans: reportParams.twitterFans,
+                  discordFans: reportParams.discordFans,
+                  redPacketType: 1,
+                  postId: state.postId
+              });
+          }
+      }
+    }
 
     if (discordTask) {
         getDiscordInfo({ inviteUrl: JSON.parse(discordTask.bizData).inviteUrl }, (res) => {
@@ -1469,9 +1395,6 @@ function setFrontConfig() {
 
 function init(initParams) {
     let { type } = initParams || {};
-    onPageVisbile();
-    onWindowMessage();
-    setFrontConfig();
     getPostDetail({
         params: {
             postId: state.postId
@@ -1562,7 +1485,8 @@ async function initTaskDetail(cb) {
 let tab_index = 0
 const doTaskReport = (req, sender) => {
     state.loading_show = false
-    let follow_name = req.task_data.follow_name || ''
+    let follow_name = req.task_data ? req.task_data.follow_name : '';
+
     // 1 Twitter follow Twitter ScreenName
     // 2 Tweet like
     // 3 Retweet
@@ -1669,15 +1593,17 @@ const getUserSetting = () => {
 onMounted(() => {
     state.process_mode = process.env.NODE_ENV
     state.postId = getQueryString('postId')
+    state.iframeId = getQueryString('iframeId') || ''
     state.window_origin = getQueryString('window_origin') || '';
     if (state.window_origin.indexOf('twitter.com') > -1) {
         state.tweetId = getQueryString('tweetId')
         state.tweet_author = getQueryString('tweet_author');
     }
-
-    getTweetAuthor()
     init()
+    getTweetAuthor()
     onRuntimeMsg();
+    onPageVisbile();
+    setFrontConfig();
     // state.loading_show = true
     // state.status = 'not-open'
     // state.status = 'success'
@@ -1700,7 +1626,7 @@ function getTweetAuthor() {
                 postId: state.postId,
                 taskLuckdropId: state.detail.taskLuckdropId
             },
-            callback: (data) => { 
+            callback: (data) => {
                 console.log('getTweetAuthor', data)
                 fullName = data.fullName
             },
@@ -1719,7 +1645,7 @@ function checkFacebookReply() {
                 iframeId
             },
             data: { postId: state.postId },
-            callback: (data) => { 
+            callback: (data) => {
                 clickReply(data)
             },
             failback: (e) => {
@@ -2094,34 +2020,20 @@ function handleErrorCode(res) {
 //     businessType: Report.businessType.pageView
 //   });
 // }
-function onWindowMessage() {
-    // window.addEventListener("message", function (event) {
-    //     if (event.data) {
-    //         switch (event.data.actionType) {
-    //             // case 'CONTENT_RED_PACKET_REPLY_RASK_FINSH':
-    //             //     state.done.reply = true;
-    //             //     state.done.reply_red = false;
-    //             //     break;
-    //             // case 'CONTENT_RED_PACKET_FACEBOOK_REPLY':
-    //             //     clickReply(event.data.data)
-    //             //     break;
-    //         }
-    //     }
-    // });
-}
 
 function onPageVisbile() {
     document.addEventListener('visibilitychange', function () {
         let isHidden = document.hidden;
         if (!isHidden) {
-            checkJoinDiscord();
+            // checkJoinDiscord();
+            init();
         }
     });
 }
 
 function onRuntimeMsg() {
-    messageCenter.listen('CONTENT_RED_PACKET_REPLY_RASK_FINSH', (req) => {
-        if (req.data && req.data.postId == state.postId) {
+    messageCenter.listen('CONTENT_RED_PACKET_REPLY_RASK_FINSH', (data) => {
+        if (data && data.postId == state.postId) {
             state.done.reply = true;
             state.done.reply_red = false;
         }
@@ -2132,17 +2044,14 @@ function onRuntimeMsg() {
         discordLoginSuccess();
     })
 
-    // chrome.runtime.onMessage.addListener((req, sender, sendResponse) => {
-    //     switch (req.actionType) {
-    //         case 'BG_FACEBOOK_SHARE_SUCCESS':
-    //             facebookShareSuccess(req.data);
-    //             break;
-    //         case 'USER_SETTING':
-    //             setNotification(req.data)
-    //             break;
-    //     }
-    //     sendResponse && sendResponse();
-    // })
+    messageCenter.listen('BG_FACEBOOK_SHARE_SUCCESS', (data) => {
+        facebookShareSuccess(data);
+    })
+
+    messageCenter.listen('USER_SETTING', (data) => {
+        console.log('USER_SETTING', data)
+        setNotification(data)
+    })
 }
 
 /**
@@ -2259,15 +2168,10 @@ function discordAuth(actionState = 'default') {
             if (authorizeUrl) {
                 joinDiscordActionState = actionState;
                 const width = 500;
-                chrome.windows.create({
+                openUrlInNewWindow({
                     width,
                     type: 'normal',
-                    url: authorizeUrl
-                }, function (window) {
-                    let windowId = window.id;
-                    callEventPageMethod("RED_PACKET_SAVE_DISCORD_AUTH_WINDOW_ID", {
-                        windowId: windowId
-                    });
+                    url: authorizeUrl,
                 })
             }
         }

+ 217 - 216
src/pages/red-packet/red-packet.vue

@@ -410,12 +410,12 @@ export default {
 <script setup>
 import { onMounted, reactive, ref, computed } from "vue";
 import { getPostDetail, getRedPacket, finishRedPacket, oneKeyLike, oneKeyReTweet, oneKeyFollow, getTaskDetail, getReceivedList, addFinishEvent } from '@/http/redPacket.js'
-import { getQueryString, guid, getBit } from '@/uilts/help.js'
+import { getQueryString, guid, getBit, iframeId } from '@/uilts/help.js'
 import { message } from 'ant-design-vue';
 import FontAmount from '@/components/font-amount.vue'
 import FontZoom from '@/components/font-zoom.vue'
 import GetMore from '@/components/get-more.vue'
-import { setChromeStorage, getChromeStorage, sendCurrentTabMessage, chromeExtensionUrl } from '@/uilts/chromeExtension.js'
+import { setChromeStorage, getChromeStorage, sendCurrentTabMessage, chromeExtensionUrl, getChromeStorageFromExtension, setChromeStoragetoExtension, openUrlInNewWindow } from '@/uilts/chromeExtension.js'
 import Report from "@/log-center/log"
 import { srcPublishSuccess } from '@/http/publishApi'
 import { discordAuthUrl, checkGuildJoined } from '@/http/discordApi'
@@ -425,7 +425,8 @@ import { getInviteGuildInfo } from "@/http/discordApi";
 import GlobalTip from '@/components/global-tip.vue'
 import customCardCover from '@/components/custom-card-cover.vue';
 import { RewardType, PlayType } from '@/types';
-import { messageCenter } from '@/uilts/messageCenter';
+import messageCenter from '@/uilts/messageCenter';
+import denet from '@/denet'
 
 var moment = require('moment');
 
@@ -530,13 +531,8 @@ async function clickLikeBtn() {
       break
     case '3':
       state.loading_show = true
-      chrome.tabs.getCurrent((tab) => {
-        chrome.tabs.sendMessage(tab.id, {
-          actionType: "IFRAME_TWITTER_API_DO_TASK", task_data: {
-            tweet_Id: state.tweetId
-          }, task_type: 'like'
-        }, (res) => { console.log(res) });
-      })
+      let likeRes = await denet.content.doTask.like({ tweetId: state.tweetId });
+      likeRes && doTaskReport({...likeRes, task_type: 'like', do_type: 'api'}, {tab: {}});
       break
     default:
       window.open(`https://twitter.com/intent/like?tweet_id=${state.tweetId}`)
@@ -645,13 +641,8 @@ async function clickRetweetBtn() {
       break
     case '3':
       state.loading_show = true
-      chrome.tabs.getCurrent((tab) => {
-        chrome.tabs.sendMessage(tab.id, {
-          actionType: "IFRAME_TWITTER_API_DO_TASK", task_data: {
-            tweet_Id: state.tweetId
-          }, task_type: 'retweet'
-        }, (res) => { console.log(res) });
-      })
+      let retweetRes = await denet.content.doTask.reTweet({ tweetId: state.tweetId });
+      retweetRes && doTaskReport({...retweetRes, task_type: 'retweet', do_type: 'api'}, {tab: {}});
       break
     default:
       window.open(`https://twitter.com/intent/retweet?tweet_id=${state.tweetId}`)
@@ -673,6 +664,7 @@ async function clickRetweetBtn() {
 function onTweetReplyClick(params) {
   let replyData = {
     postId: state.postId,
+    iframeId,
     type: params.type,
     taskLuckdropId: state.detail.taskLuckdropId
   }
@@ -689,13 +681,21 @@ async function clickReply(params) {
   let replyData = {
     postId: state.postId,
     type: params.type,
+    iframeId,
     taskLuckdropId: state.detail.taskLuckdropId
   }
   if (state.window_origin.indexOf('facebook.com') > -1) {
     let url = `https://twitter.com/${state.tweet_author}/status/${state.tweetId}?actionType=denetFacebookToTwitterReply&deReplyParams=${JSON.stringify(replyData)}`
     window.open(url)
   } else {
-    window.parent.postMessage({ actionType: "IFRAME_RED_PACKET_REPLY_CLICK", data: replyData }, "*");
+    messageCenter.send({
+        info: {
+            actionType: "IFRAME_RED_PACKET_REPLY_CLICK",
+            iframeId
+        },
+        data: replyData
+    })
+    // window.parent.postMessage({ actionType: "IFRAME_RED_PACKET_REPLY_CLICK", data: replyData }, "*");
   }
   // 埋点
   Report.reportLog({
@@ -730,15 +730,15 @@ async function clickRepostFacebook(params) {
     type: params.type,
     taskLuckdropId: state.detail.taskLuckdropId
   }
-
-  setChromeStorage({
-    shareFacebookData: JSON.stringify({
-      contentStr: state.srcContent
-    })
+  setChromeStoragetoExtension({
+      shareFacebookData: JSON.stringify({
+          contentStr: state.srcContent
+      })
   })
 
   let shareUrl = feacebookShareUrl(shareUrlparams);
-  openShareFacebookWindow({ url: shareUrl });
+  window.open(shareUrl);
+  // openShareFacebookWindow({ url: shareUrl });
 
   // 埋点
   Report.reportLog({
@@ -758,12 +758,10 @@ async function clickRepostFacebook(params) {
  */
 function openShareFacebookWindow({ url }) {
   const width = 800;
-  chrome.windows.create({
-    width,
-    type: 'normal',
-    url
-  }, function (window) {
-
+  openUrlInNewWindow({
+      width,
+      type: 'normal',
+      url,
   })
 }
 
@@ -896,17 +894,20 @@ async function clickFollowAll(item, is_all) {
         follow_data.push(item)
       })
       state.loading_show = true
-      chrome.tabs.getCurrent((tab) => {
-        chrome.tabs.sendMessage(tab.id, {
-          actionType: "IFRAME_TWITTER_API_DO_TASK",
-          task_data: {
-            tweet_Id: state.tweetId,
-            follow_data: follow_data,
-          },
-          task_type: 'follow'
-        }, (res) => { console.log(res) });
-      })
+      let promiseList = [];
+      for (let i = 0; i < follow_data.length; i++) {
+          promiseList[i] = denet.content.doTask.follows({ follow_name: follow_data[i]['name'], twitterUserId: follow_data[i]['twitterUserId'] });
+      }
 
+      Promise.allSettled(promiseList).then((res) => {
+          if (res && res.length) {
+              let resList = res.filter(item => item.status == 'fulfilled');
+              for (let i = 0; i < resList.length; i++) {
+                let item = resList[i].value;
+                item && doTaskReport({...item, task_type: 'follow', task_data: {follow_name: item.follow_name}, do_type: 'api'}, {tab: {}});
+              }
+          }
+      })
       break
     default:
       openFollowTabs(arr_name)
@@ -931,39 +932,58 @@ async function clickFollowAll(item, is_all) {
 
 
 // 重新绑定
-const reSetBindTwtterId = (_params) => {
+const reSetBindTwtterId = async (_params) => {
   let postBizData = JSON.parse(_params.postBizData);
   let { taskCondition } = postBizData;
   let discordTask = JSON.parse(taskCondition).find(item => item.type == 7);
-
-  getChromeStorage('userInfo', (_userInfo = {}) => {
-    // if (_userInfo.uid == _params.uid) {
-    if (_userInfo.uid) {
-      srcPublishSuccess({
-        params: {
-          postId: state.postId,
-          srcContentId: state.tweetId
-        }
-      }).then((res) => {
-        if (res.code == 0 || res.code == 3003) {
-          init({ from: 'reSetBindTwtterId' })
-          reportBindTweetSuccess({ discordTask, ..._params });
-        }
-      })
-    }
-  })
+  const _userInfo = await getChromeStorageFromExtension('userInfo')
+  if (_userInfo && _userInfo.uid) {
+    srcPublishSuccess({
+      params: {
+        postId: state.postId,
+        srcContentId: state.tweetId
+      }
+    }).then((res) => {
+      if (res.code == 0 || res.code == 3003) {
+        init({ from: 'reSetBindTwtterId' })
+        reportBindTweetSuccess({ discordTask, ..._params });
+      }
+    })
+  }
 }
 
-const reportBindTweetSuccess = (params) => {
+const reportBindTweetSuccess = async (params) => {
   let { discordTask, srcUserId } = params || {};
   discordTaskDetail = discordTask;
-  sendCurrentTabMessage({
-    actionType: "IFRAME_API_GET_TWEET_USER_INFO_REQ",
-    data: {
-      screen_name: srcUserId,
-      tweetId: state.tweetId
+
+  let {user = {}} = await denet.content.getData.getUserInfoByName({ screen_name: srcUserId });
+  if (user && user.result && user.result.legacy) {
+    let legacy = user.result.legacy;
+    reportParams.twitterFans = legacy ? legacy.followers_count : 0;
+
+    if (!discordTaskDetail) {
+        if (reportParams.hasReport) return;
+        reportParams.hasReport = true;
+        Report.reportLog({
+            objectType: Report.objectType.tweetPostBinded,
+            twitterFans: reportParams.twitterFans,
+            redPacketType: 1,
+            postId: state.postId
+        });
+    } else {
+        if (reportParams.discordFans !== '') {
+            if (reportParams.hasReport) return;
+            reportParams.hasReport = true;
+            Report.reportLog({
+                objectType: Report.objectType.tweetPostBinded,
+                twitterFans: reportParams.twitterFans,
+                discordFans: reportParams.discordFans,
+                redPacketType: 1,
+                postId: state.postId
+            });
+        }
     }
-  })
+  }
 
   if (discordTask) {
     getDiscordInfo({ inviteUrl: JSON.parse(discordTask.bizData).inviteUrl }, (res) => {
@@ -1200,9 +1220,6 @@ function setFrontConfig() {
 function init(initParams) {
   state.loading_show = true;
   let { type } = initParams || {};
-  onPageVisbile();
-  onWindowMessage();
-  setFrontConfig();
   getPostDetail({
     params: {
       postId: state.postId
@@ -1243,56 +1260,57 @@ function init(initParams) {
   })
 }
 
-function initTaskDetail(cb) {
-  getChromeStorage('userInfo', (_userInfo) => {
-    if (_userInfo.uid) {
-      // 任务详情
-      getTaskDetail({
-        params: {
-          postId: state.postId
-        }
-      }).then((res) => {
-        if (res.code.toString()) {
-          for (let i in res.data) {
-            switch (res.data[i].type) {
-              case 1:
-                state.done.follow = res.data[i].finished
-                state.detail.taskCondition[0].relatedUsers = res.data[i].detail
-                break
-              case 2:
-                state.done.like = res.data[i].finished
-                break
-              case 3:
-                state.done.retweet = res.data[i].finished
-                break
-              case 7:
-                state.done.join_discord = res.data[i].finished
-                discordAuthorizeRequired = res.data[i].discordAuthorizeRequired
-                break
-              case 8:
-                state.done.repost_facebook = res.data[i].finished;
-                break;
-              case 9:
-                state.done.reply = res.data[i].finished;
-                if (!state.done.reply) {
-                  onTweetReplyClick({ type: 9 });
-                }
-                break;
-            }
+async function initTaskDetail(cb) {
+  const _userInfo = await getChromeStorageFromExtension('userInfo')
+
+  if (_userInfo && _userInfo.uid) {
+    // 任务详情
+    getTaskDetail({
+      params: {
+        postId: state.postId
+      }
+    }).then((res) => {
+      if (res.code.toString()) {
+        for (let i in res.data) {
+          switch (res.data[i].type) {
+            case 1:
+              state.done.follow = res.data[i].finished
+              state.detail.taskCondition[0].relatedUsers = res.data[i].detail
+              break
+            case 2:
+              state.done.like = res.data[i].finished
+              break
+            case 3:
+              state.done.retweet = res.data[i].finished
+              break
+            case 7:
+              state.done.join_discord = res.data[i].finished
+              discordAuthorizeRequired = res.data[i].discordAuthorizeRequired
+              break
+            case 8:
+              state.done.repost_facebook = res.data[i].finished;
+              break;
+            case 9:
+              state.done.reply = res.data[i].finished;
+              if (!state.done.reply) {
+                onTweetReplyClick({ type: 9 });
+              }
+              break;
           }
-        } else {
-          handleErrorCode(res)
         }
-        cb && cb()
-      })
-    }
-  })
+      } else {
+        handleErrorCode(res)
+      }
+      cb && cb()
+    })
+  }
 }
 
 let tab_index = 0
 const doTaskReport = (req, sender) => {
   state.loading_show = false
-  let follow_name = req.task_data.follow_name || ''
+  let follow_name = req.task_data ? req.task_data.follow_name : '';
+
   // 1 Twitter follow Twitter ScreenName
   // 2 Tweet like
   // 3 Retweet
@@ -1364,6 +1382,7 @@ const doTaskReport = (req, sender) => {
 onMounted(() => {
   state.process_mode = process.env.NODE_ENV
   state.postId = getQueryString('postId')
+  state.iframeId = getQueryString('iframeId') || ''
   state.window_origin = getQueryString('window_origin') || '';
   if (state.window_origin.indexOf('twitter.com') > -1) {
     state.tweetId = getQueryString('tweetId')
@@ -1372,34 +1391,60 @@ onMounted(() => {
 
   getTweetAuthor();
   init()
-  // onRuntimeMsg();
+  onPageVisbile();
+  setFrontConfig();
+  onRuntimeMsg();
 })
 
 function getTweetAuthor() {
   if (state.window_origin.indexOf('twitter.com') > -1) {
-    window.parent.postMessage({
-      actionType: "IFRAME_RED_PACKET_GET_TWEET_AUTHOR", data: {
-        postId: state.postId,
-        taskLuckdropId: state.detail.taskLuckdropId
-      }
-    }, "*");
+    messageCenter.send({
+        info: {
+            actionType: "IFRAME_RED_PACKET_GET_TWEET_AUTHOR",
+            iframeId
+        },
+        data: {
+            postId: state.postId,
+            taskLuckdropId: state.detail.taskLuckdropId
+        },
+        callback: (data) => {
+            console.log('getTweetAuthor', data)
+            fullName = data.fullName
+        },
+        failback: (e) => {
+            console.log('getTweetAuthor fail..', e)
+        }
+    })
   }
 }
 
 function checkFacebookReply() {
   console.log('checkFacebookReply')
   if (state.window_origin.indexOf('twitter.com') > -1) {
-    window.parent.postMessage({
-      actionType: "IFRAME_RED_PACKET_CHECK_FACEBOOK_REPLY", data: {
-        postId: state.postId
-      }
-    }, "*");
+    messageCenter.send({
+        info: {
+            actionType: "IFRAME_RED_PACKET_CHECK_FACEBOOK_REPLY",
+            iframeId
+        },
+        data: { postId: state.postId },
+        callback: (data) => {
+            clickReply(data)
+        },
+        failback: (e) => {
+            console.log('checkFacebookReply fail', e)
+        }
+    })
   }
 }
 
 // 点击领取
 function clickOpenRedPacket() {
-  callEventPageMethod('CONTENT_GET_PINED', {})
+  messageCenter.send({
+      info: {
+          actionType: 'CONTENT_GET_PINED',
+      },
+      data: {}
+  })
   handleRedPacket()
 }
 
@@ -1442,27 +1487,23 @@ function handleRedPacket() {
 // })
 
 // 校验是否封路
-function checkIsLogin() {
-
-  return new Promise((resolve) => {
-    getChromeStorage('userInfo', (_userInfo) => {
-      if (!_userInfo) {
+async function checkIsLogin() {
+    const userInfo = await getChromeStorageFromExtension('userInfo').catch((e) => { console.log(e)})
+    if (userInfo) {
+        return userInfo
+    } else {
         state.loading_show = true
         setTimeout(() => {
-          state.loading_show = false
+            state.loading_show = false
         }, 3000)
-        chrome.runtime.sendMessage(
-          { actionType: "POPUP_LOGIN", data: "" },
-          (response) => {
-            console.log("res", response);
-          }
-        )
-        resolve(_userInfo)
-      } else {
-        resolve(_userInfo)
-      }
-    })
-  })
+        messageCenter.send({
+            info: {
+                actionType: 'POPUP_LOGIN',
+            },
+            data: {}
+        })
+        return null
+    }
 }
 
 async function clickGetGiveaways() {
@@ -1756,83 +1797,38 @@ function handleErrorCode(res) {
 //     businessType: Report.businessType.pageView
 //   });
 // }
-function onWindowMessage() {
-  window.addEventListener("message", function (event) {
-    if (event.data) {
-      switch (event.data.actionType) {
-        case 'CONTENT_RED_PACKET_REPLY_RASK_FINSH':
-          state.done.reply = true;
-          state.done.reply_red = false;
-          break;
-        case 'CONTENT_RED_PACKET_GET_TWEET_AUTHOR':
-          fullName = event.data.data.fullName
-          break;
-        case 'CONTENT_RED_PACKET_FACEBOOK_REPLY':
-          clickReply(event.data.data)
-          break;
-      }
-    }
-  });
-}
 
 function onPageVisbile() {
   document.addEventListener('visibilitychange', function () {
     let isHidden = document.hidden;
     if (!isHidden) {
-      checkJoinDiscord();
+      // checkJoinDiscord();
+      init();
     }
   });
 }
 
 function onRuntimeMsg() {
-  chrome.runtime.onMessage.addListener((req, sender, sendResponse) => {
-    switch (req.actionType) {
-      case 'BACK_DISCORD_LOGIN_SUCCESS':
-        discordLoginSuccess();
-        break;
-      case 'BG_FACEBOOK_SHARE_SUCCESS':
-        facebookShareSuccess(req.data);
-        break;
-      case 'CONTENT_RED_PACKET_REPLY_RASK_FINSH':
-        if (req.data && req.data.postId == state.postId) {
-          state.done.reply = true;
-          state.done.reply_red = false;
+  messageCenter.listen('CONTENT_RED_PACKET_REPLY_RASK_FINSH', (data) => {
+        if (data && data.postId == state.postId) {
+            state.done.reply = true;
+            state.done.reply_red = false;
         }
-        break;
-      case 'CONTENT_API_GET_TWEET_USER_INFO_RES':
-        let { user } = req.data || {};
-        if (req.tweetId == state.tweetId && user && user.result && user.result.legacy) {
-          let legacy = user.result.legacy;
-          reportParams.twitterFans = legacy ? legacy.followers_count : 0;
-
-          if (!discordTaskDetail) {
-            if (reportParams.hasReport) return;
-            reportParams.hasReport = true;
-            Report.reportLog({
-              objectType: Report.objectType.tweetPostBinded,
-              twitterFans: reportParams.twitterFans,
-              redPacketType: 0,
-              postId: state.postId
-            });
-          } else {
-            if (reportParams.discordFans !== '') {
-              if (reportParams.hasReport) return;
-              reportParams.hasReport = true;
-              Report.reportLog({
-                objectType: Report.objectType.tweetPostBinded,
-                twitterFans: reportParams.twitterFans,
-                discordFans: reportParams.discordFans,
-                redPacketType: 0,
-                postId: state.postId
-              });
-            }
-          }
+    })
 
-        }
-        break;
-    }
-    sendResponse && sendResponse();
-  })
+    messageCenter.listen('BACK_DISCORD_LOGIN_SUCCESS', () => {
+        console.log('on success in frame');
+        discordLoginSuccess();
+    })
+
+    messageCenter.listen('BG_FACEBOOK_SHARE_SUCCESS', (data) => {
+        facebookShareSuccess(data);
+    })
+
+    messageCenter.listen('USER_SETTING', (data) => {
+        console.log('USER_SETTING', data)
+        setNotification(data)
+    })
 }
 
 /**
@@ -1949,16 +1945,21 @@ function discordAuth(actionState = 'default') {
       if (authorizeUrl) {
         joinDiscordActionState = actionState;
         const width = 500;
-        chrome.windows.create({
-          width,
-          type: 'normal',
-          url: authorizeUrl
-        }, function (window) {
-          let windowId = window.id;
-          callEventPageMethod("RED_PACKET_SAVE_DISCORD_AUTH_WINDOW_ID", {
-            windowId: windowId
-          });
+        openUrlInNewWindow({
+            width,
+            type: 'normal',
+            url: authorizeUrl,
         })
+        // chrome.windows.create({
+        //   width,
+        //   type: 'normal',
+        //   url: authorizeUrl
+        // }, function (window) {
+        //   let windowId = window.id;
+        //   callEventPageMethod("RED_PACKET_SAVE_DISCORD_AUTH_WINDOW_ID", {
+        //     windowId: windowId
+        //   });
+        // })
       }
     }
   })

+ 7 - 17
src/uilts/chromeExtension.js

@@ -79,23 +79,13 @@ export async function getChromeStorageFromExtension(key = '') {
     // window.postMessage({actionType: 'iframe_test', data: key})
 }
 
-export const openUrlInNewWindow = async (data, successCallback) => { 
-    return new Promise((res, rej) => {
-        messageCenter.send({
-            info: {
-                iframeId,//用于告诉父窗口会传消息给哪个iframe
-                actionType: 'OPEN_URL_IN_NEW_WINDOW',
-            },
-            data,
-            callback: (window) => {
-                successCallback && successCallback(data)
-                res(window);
-            },
-            failback: (e) => {
-                console.log('openUrlInNewWindow fail', e)
-                rej(null)
-            }
-        })
+export const openUrlInNewWindow = (data) => { 
+    messageCenter.send({
+        info: {
+            iframeId,//用于告诉父窗口会传消息给哪个iframe
+            actionType: 'OPEN_URL_IN_NEW_WINDOW',
+        },
+        data
     })
 }
 

+ 13 - 1
src/uilts/messageCenter/messageEnum.js

@@ -14,6 +14,18 @@ const SEND_MESSAGE_ENUM =  {
     IFRAME_RUNTIME_CONNECT_POPUP: 'IFRAME_RUNTIME_CONNECT_POPUP',
     IFRAME_SHOW_FOOTER_MENU: 'IFRAME_SHOW_FOOTER_MENU',
     POPUP_SHOW_DENET_PUBLISH_DIALOG: 'POPUP_SHOW_DENET_PUBLISH_DIALOG',
+
+    // ---- 做任务 ----
+    IFRAME_DO_TASK_CREATE_TWEET: 'IFRAME_DO_TASK_CREATE_TWEET',
+    IFRAME_DO_TASK_LIKE: 'IFRAME_DO_TASK_LIKE',
+    IFRAME_DO_TASK_FOLLOWS: 'IFRAME_DO_TASK_FOLLOWS',
+    IFRAME_DO_TASK_RETWEET: 'IFRAME_DO_TASK_RETWEET',
+
+    // ---- 获取推文内容 ----
+    IFRAME_DOM_GET_TWEET_TEXT: 'IFRAME_DOM_GET_TWEET_TEXT',
+
+    // ---- 获取twitter用户信息 ----
+    IFRAME_GET_TWITTER_USER_INFO: 'IFRAME_GET_TWITTER_USER_INFO',
 }
 
 /** 接收父窗口的事件定义 */
@@ -27,4 +39,4 @@ const RECEIVE_MESSAGE_ENUM = {
     CONTENT_POPUP_PAGE_SHOW: 'CONTENT_POPUP_PAGE_SHOW',
 }
 
-export default { ...SEND_MESSAGE_ENUM, ...RECEIVE_MESSAGE_ENUM }
+export default { ...SEND_MESSAGE_ENUM, ...RECEIVE_MESSAGE_ENUM }

+ 58 - 3
yarn.lock

@@ -2836,6 +2836,11 @@ csstype@^2.6.8:
   resolved "https://registry.yarnpkg.com/csstype/-/csstype-2.6.20.tgz#9229c65ea0b260cf4d3d997cb06288e36a8d6dda"
   integrity sha512-/WwNkdXfckNgw6S5R125rrW8ez139lBHWouiBvX8dfMFtcn6V81REDqnH7+CRpRipfYlyU1CmOnOxrmGcFOjeA==
 
+cuint@^0.2.2:
+  version "0.2.2"
+  resolved "https://registry.yarnpkg.com/cuint/-/cuint-0.2.2.tgz#408086d409550c2631155619e9fa7bcadc3b991b"
+  integrity sha512-d4ZVpCW31eWwCMe1YT3ur7mUDnTXbgwyzaL320DrcRT45rfjYxkt5QWLrmOJ+/UEAI2+fQgKe/fCjR8l4TpRgw==
+
 dayjs@^1.10.5, dayjs@^1.11.0:
   version "1.11.5"
   resolved "https://registry.yarnpkg.com/dayjs/-/dayjs-1.11.5.tgz#00e8cc627f231f9499c19b38af49f56dc0ac5e93"
@@ -4337,7 +4342,7 @@ magic-string@^0.25.7:
   dependencies:
     sourcemap-codec "^1.4.8"
 
-make-dir@^3.0.2, make-dir@^3.1.0:
+make-dir@^3.0.2, make-dir@^3.1.0, make-dir@~3.1.0:
   version "3.1.0"
   resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-3.1.0.tgz#415e967046b3a7f1d185277d84aa58203726a13f"
   integrity sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==
@@ -4418,6 +4423,11 @@ mime@1.6.0:
   resolved "https://registry.yarnpkg.com/mime/-/mime-1.6.0.tgz#32cd9e5c64553bd58d19a568af452acff04981b1"
   integrity sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==
 
+mime@~2.5.2:
+  version "2.5.2"
+  resolved "https://registry.yarnpkg.com/mime/-/mime-2.5.2.tgz#6e3dc6cc2b9510643830e5f19d5cb753da5eeabe"
+  integrity sha512-tqkh47FzKeCPD2PUiPB6pkbMzsCasjxAfC62/Wap5qrUWcb+sFasXUC5I3gYM5iBM8v/Qpn4UK0x+j0iHyFPDg==
+
 mimic-fn@^1.0.0:
   version "1.2.0"
   resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-1.2.0.tgz#820c86a39334640e99516928bd03fca88057d022"
@@ -4447,6 +4457,13 @@ minimatch@^3.0.4, minimatch@^3.1.1:
   dependencies:
     brace-expansion "^1.1.7"
 
+minimatch@~3.0.4:
+  version "3.0.8"
+  resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.8.tgz#5e6a59bd11e2ab0de1cfb843eb2d82e546c321c1"
+  integrity sha512-6FsRAQsxQ61mw+qP1ZzbL9Bc78x2p5OqNgNpnoAFLTrX8n5Kxph0CsnhmKKNXTWjXqU5L0pGPR7hYk+XWZr60Q==
+  dependencies:
+    brace-expansion "^1.1.7"
+
 minimist@^1.2.0, minimist@^1.2.5, minimist@^1.2.6:
   version "1.2.6"
   resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.6.tgz#8637a5b759ea0d6e98702cfb3a9283323c93af44"
@@ -4865,6 +4882,11 @@ picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.3.1:
   resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42"
   integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==
 
+pify@^2.3.0:
+  version "2.3.0"
+  resolved "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c"
+  integrity sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==
+
 pkg-dir@^4.1.0:
   version "4.2.0"
   resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-4.2.0.tgz#f099133df7ede422e81d1d8448270eeb3e4261f3"
@@ -4927,6 +4949,15 @@ postcss-discard-overridden@^5.1.0:
   resolved "https://registry.yarnpkg.com/postcss-discard-overridden/-/postcss-discard-overridden-5.1.0.tgz#7e8c5b53325747e9d90131bb88635282fb4a276e"
   integrity sha512-21nOL7RqWR1kasIVdKs8HNqQJhFxLsyRfAnUDm4Fe4t4mCWL9OJiHvlHPjcd8zc5Myu89b/7wZDnOSjFgeWRtw==
 
+postcss-import@^15.0.0:
+  version "15.0.0"
+  resolved "https://registry.yarnpkg.com/postcss-import/-/postcss-import-15.0.0.tgz#0b66c25fdd9c0d19576e63c803cf39e4bad08822"
+  integrity sha512-Y20shPQ07RitgBGv2zvkEAu9bqvrD77C9axhj/aA1BQj4czape2MdClCExvB27EwYEJdGgKZBpKanb0t1rK2Kg==
+  dependencies:
+    postcss-value-parser "^4.0.0"
+    read-cache "^1.0.0"
+    resolve "^1.1.7"
+
 postcss-loader@^6.1.1:
   version "6.2.1"
   resolved "https://registry.yarnpkg.com/postcss-loader/-/postcss-loader-6.2.1.tgz#0895f7346b1702103d30fdc66e4d494a93c008ef"
@@ -5123,7 +5154,17 @@ postcss-unique-selectors@^5.1.1:
   dependencies:
     postcss-selector-parser "^6.0.5"
 
-postcss-value-parser@^4.1.0, postcss-value-parser@^4.2.0:
+postcss-url@^10.1.3:
+  version "10.1.3"
+  resolved "https://registry.yarnpkg.com/postcss-url/-/postcss-url-10.1.3.tgz#54120cc910309e2475ec05c2cfa8f8a2deafdf1e"
+  integrity sha512-FUzyxfI5l2tKmXdYc6VTu3TWZsInayEKPbiyW+P6vmmIrrb4I6CGX0BFoewgYHLK+oIL5FECEK02REYRpBvUCw==
+  dependencies:
+    make-dir "~3.1.0"
+    mime "~2.5.2"
+    minimatch "~3.0.4"
+    xxhashjs "~0.2.2"
+
+postcss-value-parser@^4.0.0, postcss-value-parser@^4.1.0, postcss-value-parser@^4.2.0:
   version "4.2.0"
   resolved "https://registry.yarnpkg.com/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz#723c09920836ba6d3e5af019f92bc0971c02e514"
   integrity sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==
@@ -5242,6 +5283,13 @@ raw-body@2.5.1:
     iconv-lite "0.4.24"
     unpipe "1.0.0"
 
+read-cache@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/read-cache/-/read-cache-1.0.0.tgz#e664ef31161166c9751cdbe8dbcf86b5fb58f774"
+  integrity sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==
+  dependencies:
+    pify "^2.3.0"
+
 read-pkg-up@^7.0.1:
   version "7.0.1"
   resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-7.0.1.tgz#f3a6135758459733ae2b95638056e1854e7ef507"
@@ -5384,7 +5432,7 @@ resolve-from@^4.0.0:
   resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-4.0.0.tgz#4abcd852ad32dd7baabfe9b40e00a36db5f392e6"
   integrity sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==
 
-resolve@^1.10.0, resolve@^1.14.2:
+resolve@^1.1.7, resolve@^1.10.0, resolve@^1.14.2:
   version "1.22.1"
   resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.1.tgz#27cb2ebb53f91abb49470a928bba7558066ac177"
   integrity sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==
@@ -6430,6 +6478,13 @@ ws@^8.4.2:
   resolved "https://registry.yarnpkg.com/ws/-/ws-8.8.1.tgz#5dbad0feb7ade8ecc99b830c1d77c913d4955ff0"
   integrity sha512-bGy2JzvzkPowEJV++hF07hAD6niYSr0JzBNo/J29WsB57A2r7Wlc1UFcTR9IzrPvuNVO4B8LGqF8qcpsVOhJCA==
 
+xxhashjs@~0.2.2:
+  version "0.2.2"
+  resolved "https://registry.yarnpkg.com/xxhashjs/-/xxhashjs-0.2.2.tgz#8a6251567621a1c46a5ae204da0249c7f8caa9d8"
+  integrity sha512-AkTuIuVTET12tpsVIQo+ZU6f/qDmKuRUcjaqR+OIvm+aCBsZ95i7UVY5WJ9TMsSaZ0DA2WxoZ4acu0sPH+OKAw==
+  dependencies:
+    cuint "^0.2.2"
+
 y18n@^5.0.5:
   version "5.0.8"
   resolved "https://registry.yarnpkg.com/y18n/-/y18n-5.0.8.tgz#7f4934d0f7ca8c56f95314939ddcd2dd91ce1d55"