John-Hong %!s(int64=2) %!d(string=hai) anos
pai
achega
5c0914d12c

+ 3 - 2
package.json

@@ -17,6 +17,7 @@
     "js-md5": "^0.7.3",
     "lodash": "^4.17.21",
     "moment": "^2.29.4",
+    "sa-sdk-javascript": "^1.24.13",
     "uuid": "^9.0.0",
     "vant": "^2.12.50",
     "vue": "^2.7.14",
@@ -48,9 +49,9 @@
     "prettier": "^2.8.3",
     "sass": "^1.56.2",
     "sass-loader": "^10.4.1",
+    "terser-webpack-plugin": "^4",
     "vue-template-compiler": "^2.7.14",
-    "webpack": "^4.36.0",
-    "terser-webpack-plugin": "^4"
+    "webpack": "^4.36.0"
   },
   "browserslist": [
     "Android >= 4.4",

+ 2 - 1
src/App.vue

@@ -31,13 +31,14 @@ import { getIsMin, getIsWxh5, getUrlParams } from '@/utils/index.js';
 import SockJS from '@/utils/sockjs';
 import uni from '@/utils/uniHooks';
 import { getAppIdByGroupIdAndMallId } from '@/utils/index.js';
-
+import sensorsFn from '@/plugins/sensors'
 export default {
   mixins: [loginMinix],
   async created() {
     await this.initEnv();
     await this.requestInit();
     await this.init();
+    // await sensorsFn(); // 埋点初始化
     // 初始化环境变量
   },
   computed: {

+ 26 - 2
src/common/js/BaseDictionary.js

@@ -87,9 +87,33 @@ export const lbsDictionary = {
 
 // 订单状态枚举数据
 export const ORDER_STATUS = {
-  CREATED:'已创建',
+  CREATED: '已创建',
   TO_BE_PAID: '待支付',
   PAID: '已支付',
   REFUND: '已退款',
   TIME_OUT: '已超时',
-}
+}
+
+// 不同环境的基础数据
+export const ENVIRONMENTS = {
+  dev: {
+    trackingBaseUrl: 'https://tq.kerryprops.com.cn/sa.gif',
+    trackingRemarkPre: 'dev'
+  },
+  qa: {
+    trackingBaseUrl: 'https://tq.kerryprops.com.cn/sa.gif',
+    trackingRemarkPre: 'qa'
+  },
+  sl: {
+    trackingBaseUrl: 'https://t.kerryplus.com/sa.gif',
+    trackingRemarkPre: 'online'
+  },
+  lt: {
+    trackingBaseUrl: 'https://tq.kerryprops.com.cn/sa.gif',
+    trackingRemarkPre: 'qa'
+  },
+  prod: {
+    trackingBaseUrl: 'https://t.kerryplus.com/sa.gif',
+    trackingRemarkPre: 'online'
+  },
+};

+ 162 - 0
src/lib/Sensorsdata-UniPlugin-JS/common-api.js

@@ -0,0 +1,162 @@
+/**
+ * uni-app sdk 公共方法
+ * 需要做类型检查,每个方法必须返回 true false,用来作为参数检查的结果
+ */
+
+let sa = {
+	// 提供扩展性
+	instance: null,
+	// 提供初始化和配置参数
+	init: () => {
+		console.log('common-api,当前平台不支持此方法 init');
+	},
+	setPara: () => {
+		/*
+		server_url:'setServerUrl'   字符串
+		show_log:'enableLog' 布尔
+	  
+		app_flush_network_policy:'setFlushNetworkPolicy'数字
+		app_flush_interval:'setFlushInterval'数字
+		app_flush_bulkSize:'setFlushBulkSize'数字
+		app_session_interval_time:'setSessionIntervalTime'数字
+		app_data_collect:'enableDataCollect'布尔
+	  
+		mp_auto_track: object
+		*/
+		console.log('common-api,当前平台不支持此方法 setPara');
+	},
+	// app专用的方法
+	getAppFlushInterval: () => {
+		console.log('common-api,当前平台不支持此方法 getAppFlushInterval');
+	},
+	getAppFlushBulkSize: () => {
+		console.log('common-api,当前平台不支持此方法 getAppFlushBulkSize');
+	},
+	getAppSessionIntervalTime: () => {
+		console.log('common-api,当前平台不支持此方法 getAppSessionIntervalTime');
+	},
+	trackAppInstall: () => {
+		console.log('common-api,当前平台不支持此方法 trackAppInstall');
+	},
+	appFlush: () => {
+		console.log('common-api,当前平台不支持此方法 appFlush');
+	},
+
+	removeTimer: () => {
+		console.log('common-api,当前平台不支持此方法 removeTimer');
+	},
+	trackTimerStart: () => {
+		console.log('common-api,当前平台不支持此方法 trackTimerStart');
+	},
+	trackTimerPause: () => {
+		console.log('common-api,当前平台不支持此方法 trackTimerPause');
+	},
+	trackTimerResume: () => {
+		console.log('common-api,当前平台不支持此方法 trackTimerResume');
+	},
+	trackTimerEnd: () => {
+		console.log('common-api,当前平台不支持此方法 trackTimerEnd');
+	},
+	clearTrackTimer: () => {
+		console.log('common-api,当前平台不支持此方法 clearTrackTimer');
+	},
+	trackViewScreen: () => {
+		console.log('common-api,当前平台不支持此方法 trackViewScreen');
+	},
+	getSuperProperties: () => {
+		console.log('common-api,当前平台不支持此方法 getSuperProperties');
+	},
+	enableTrackScreenOrientation: () => {
+		console.log('common-api,当前平台不支持此方法 enableTrackScreenOrientation');
+	},
+	resumeTrackScreenOrientation: () => {
+		console.log('common-api,当前平台不支持此方法 resumeTrackScreenOrientation');
+	},
+	stopTrackScreenOrientation: () => {
+		console.log('common-api,当前平台不支持此方法 stopTrackScreenOrientation');
+	},
+	getScreenOrientation: () => {
+		console.log('common-api,当前平台不支持此方法 getScreenOrientation');
+	},
+	profileUnsetPushId: () => {
+		console.log('common-api,当前平台不支持此方法 profileUnsetPushId');
+	},
+	profilePushId: () => {
+		console.log('common-api,当前平台不支持此方法 profilePushId');
+	},
+	enableDeepLinkInstallSource: () => {
+		console.log('common-api,当前平台不支持此方法 enableDeepLinkInstallSource');
+	},
+	trackDeepLinkLaunch: () => {
+		console.log('common-api,当前平台不支持此方法 trackDeepLinkLaunch');
+	},
+
+	// 各端通用的常用API
+	getDistinctID: () => {
+		console.log('common-api,当前平台不支持此方法 getDistinctID');
+	},
+	getAnonymousID: () => {
+		console.log('common-api,当前平台不支持此方法 getAnonymousID');
+	},
+
+	register: (para) => {
+		console.log('common-api,当前平台不支持此方法 register');
+	},
+	unRegister: () => {
+		console.log('common-api,当前平台不支持此方法 unRegister');
+	},
+	clearRegister: () => {
+		console.log('common-api,当前平台不支持此方法 clearRegister');
+	},
+
+	//各端通用的标准API
+	identify: () => {
+		console.log('common-api,当前平台不支持此方法 identify');
+	},
+	login: () => {
+		console.log('common-api,当前平台不支持此方法 login');
+	},
+	logout: () => {
+		console.log('common-api,当前平台不支持此方法 logout');
+	},
+	track: () => {
+		console.log('common-api,当前平台不支持此方法 track');
+	},
+	setProfile: () => {
+		console.log('common-api,当前平台不支持此方法 setProfile');
+	},
+	setOnceProfile: () => {
+		console.log('common-api,当前平台不支持此方法 setOnceProfile');
+	},
+	incrementProfile: () => {
+		console.log('common-api,当前平台不支持此方法 incrementProfile');
+	},
+	appendProfile: () => {
+		console.log('common-api,当前平台不支持此方法 appendProfile');
+	},
+	unsetProfile: () => {
+		console.log('common-api,当前平台不支持此方法 unsetProfile');
+	},
+	deleteProfile: () => {
+		console.log('common-api,当前平台不支持此方法 deleteProfile');
+	},
+
+	popupLoadSuccess: (callback) => {
+		console.log('common-api,当前平台不支持此方法 popupLoadSuccess');
+	},
+	popupClose: (callback) => {
+		console.log('common-api,当前平台不支持此方法 popupClose');
+	},
+	popupClick: (callback) => {
+		console.log('common-api,当前平台不支持此方法 popupClick');
+	},
+	popupLoadFailed: (callback) => {
+		console.log('common-api,当前平台不支持此方法 popupLoadFailed');
+	},
+	enablePopup: () => {
+		console.log('common-api,当前平台不支持此方法 enablePopup');
+	}
+
+};
+
+export default sa;

+ 47 - 0
src/lib/Sensorsdata-UniPlugin-JS/index.js

@@ -0,0 +1,47 @@
+import commonAPI from './common-api'
+import bridgeAPI from './middle/web.js'
+
+let sa = {};
+
+let lib_plugin_track_timer = 0;
+let js_uniapp_version = 'js_uniapp:0.0.6';
+
+
+sa = bridgeAPI;
+/*
+做一次common-api的遍历
+  如果bridgeAPI都实现了,就结束
+  如果bridgeAPI没有实现,从instance中获取,如果还没有就=common-api
+*/
+Object.keys(commonAPI).forEach((key) => {
+    if (!(key in bridgeAPI)) {
+        if (typeof bridgeAPI.instance === 'object' && typeof bridgeAPI.instance[key] === 'function') {
+            sa[key] = bridgeAPI.instance[key].bind(bridgeAPI.instance);
+        } else {
+            sa[key] = commonAPI[key].bind(commonAPI);
+        }
+    }
+    // 如果是track,先加属性
+    if (key === 'track') {
+        let oldTrack = sa.track;
+        sa.track = function () {
+            let arr = [].slice.call(arguments, 0);
+            if (++lib_plugin_track_timer === 1) {
+                if (typeof arr[1] === 'object' && arr[1] !== null) {
+                    arr[1]['$lib_plugin_version'] = [js_uniapp_version];
+                } else {
+                    arr[1] = {
+                        $lib_plugin_version: [js_uniapp_version]
+                    };
+                }
+            }
+            return oldTrack.apply(sa, arr);
+        };
+    }
+
+});
+
+
+
+
+export default sa;

A diferenza do arquivo foi suprimida porque é demasiado grande
+ 0 - 0
src/lib/Sensorsdata-UniPlugin-JS/jssdk/web.js


+ 37 - 0
src/lib/Sensorsdata-UniPlugin-JS/middle/web.js

@@ -0,0 +1,37 @@
+// 原生SDK提供的API
+import sensors from '../jssdk/web.js';
+
+let sa = {
+	// 提供扩展性
+	instance: sensors,
+	// 提供初始化和配置参数
+	init: (para) => {
+		para = para || sa.para;
+		let defaultValue = {
+			is_track_single_page: true
+		};
+		Object.assign(defaultValue, para);
+		sensors.init.call(sensors, defaultValue);
+	},
+	setPara: (para) => {
+		if (typeof para === 'object') {
+			sa.para = para;
+		}
+	},
+
+	// 各端通用的常用API
+	getDistinctID: sensors.store.getDistinctId.bind(sensors.store),
+	getAnonymousID: () => {
+		return sensors.quick('getAnonymousID');
+	},
+
+	register: sensors.registerPage.bind(sensors),
+	clearRegister: () => {
+		console.log('web 中不支持此方法 - clearRegister');
+	},
+	quick:(event,para) => {
+		sensors.quick(event,para);
+	},
+};
+
+export default sa;

+ 2 - 2
src/pages/parkingFee/components/base/parkingFeeDetailSuccess.vue

@@ -5,7 +5,7 @@
 
       <div class="parking-info">
         <div class="parking-price">
-          <div class="price">{{ (detail.payFee / 100) | currency }}</div>
+          <div class="price">{{ detail.actualPayFee | currency }}</div>
           <div class="price-text">
             <!-- {{ ['支付成功', '支付失败', '已退款'][detail.payStatus] }} -->
             {{ detail.orderStatus | orderStatus }}
@@ -14,7 +14,7 @@
         <div class="parking-part parking-detail">
           <div class="parking-info-item">
             <span class="info-key">支付方式</span>
-            <span class="info-value">{{ detail.paykind || '' }}</span>
+            <span class="info-value">{{ detail.paymentMethod || '' }}</span>
           </div>
 
           <div class="parking-info-item">

+ 1 - 1
src/pages/parkingFee/components/base/parkingFeeList.vue

@@ -25,7 +25,7 @@
           style="font-size: 30px; margin: 0 12px"
         >
           <div style="margin-left: 6px">
-            {{ item.id + '-' + item.vehicleNo }}
+            {{ item.orderNo + '-' + item.vehicleNo }}
           </div>
           <div style="color: red; margin-right: 6px">
             {{ (item.totalPaidAmount ) | currency }}

+ 3 - 3
src/pages/parkingFee/mixins/parkingFeeDetail.js

@@ -126,7 +126,7 @@ export default {
           },
         };
         // 积分
-        if (points.length && points[0].discountFee > 0) {
+        if (points?.length && points[0].discountFee > 0) {
           // 15 兑换 5元
           const { pointsPerUnit, unitAmount, discountFee, available } = points[0]
           params.discountInfo.points = {
@@ -136,7 +136,7 @@ export default {
           }
         }
         // 优惠券
-        if (coupons.length) {
+        if (coupons?.length) {
           const selectedCoupons = coupons.filter(elm => {
             const selected = elm.hasOwnProperty('selected') ? elm.selected : elm.defaultSelected;
             return selected
@@ -416,7 +416,7 @@ export default {
     // 获取成功缴费之后前往的页面
     getPagePath() {
       let pagePath = 'parkingFeeSuccess?vehicleNo=' + this.$route.query.vehicleNo
-      if (this.$route.query.vehicleNo.indexOf('临') > -1) {
+      if (this.$route.query.vehicleNo.indexOf('临') > -1 && this.endlessLoop) {
         pagePath = 'parkingFeeMsg?type=pay'
       }
       return pagePath

+ 13 - 0
src/pages/parkingFee/mixins/vehicleManagement.js

@@ -144,6 +144,19 @@ export default {
       this.$store.commit('cachedViews/DEL_CACHED_VIEW', {
         name: 'parkingFeeDetail',
       });
+      uni.setStorageSync('carList', [...new Set([carno, ...JSON.parse(uni.getStorageSync('carList'))])].slice(0, 6));
+      this.$store.commit('cachedViews/DEL_CACHED_VIEW', {
+        name: 'parkingFeeDetail',
+      });
+      this.$nextTick(() => {
+        this.$router.push({
+          path: 'parkingFeeDetail',
+          query: {
+            vehicleNo: carno,
+          },
+        });
+      });
+      return
       // 查询车费信息
       uni.showLoading({
         title: '加载中',

+ 0 - 1
src/pages/parkingFee/parkingFee.vue

@@ -16,7 +16,6 @@ export default {
   },
   mounted() {
     this.componentName = 'purpleCom';
-    console.log(19, this.theme);
   }
 };
 </script>

+ 264 - 0
src/plugins/sensors.js

@@ -0,0 +1,264 @@
+import { ENVIRONMENTS } from '@/common/js/BaseDictionary';
+import sensors from '@/lib/Sensorsdata-UniPlugin-JS';
+import Vue from 'vue';
+import uni from '@/utils/uniHooks';
+import store from '@/store/index'
+
+/**
+ * 上传埋点数据至神策(第三方埋点平台)
+ * param eventName   string  埋点事件名
+ * param properites  object  埋点数据 (包含action, current event duration)
+ * param eventEnable boolean 是否允许上传埋点数据,默认为true
+ * param owner       string  埋点负责人,默认为undefined
+ *  */
+const normalTrack = (eventName, properites, trackingEnable = true) => {
+    if (trackingEnable)
+        sensors.track(eventName, properites);
+}
+
+
+
+// 设置全埋点事件及埋点公共字段
+const trackingInit = () => {
+
+    const project = 'kerryplus';
+    const defaultLbs = uni.getStorageSync("DEFAULT_LBS");
+    const lbsId = defaultLbs.lbs?.id;
+    const lbsName = defaultLbs.lbs?.name;
+    const brandId = defaultLbs.lbs?.brand.id;
+    const brandName = defaultLbs.lbs?.brand.name;
+    const openId = uni.getStorageSync("OPENID");
+    const profileId = uni.getStorageSync("PROFILE_ID");
+
+    //设置全埋点事件和其他参数
+    sensors.setPara({
+        name: 'sensors',
+        server_url: `${environment.trackingBaseUrl}?project=${project}&remark=${environment.trackingRemarkPre}_${lbsId}`,
+        //全埋点控制开关
+        autoTrack: {
+            // $MPClick小程序元素点击,当 Page 中定义的事件处理函数被触发时采集。
+            // 目前只支持 tap、longtap、longpress 三类事件
+            mpClick: true,
+            // $MPLaunch小程序初始化完成时触发或者小程序进入后台一定时间后被微信杀死进程后再次启动小程序时触发
+            appLaunch: true,
+            // $MPShow小程序显示,小程序启动时触发或者从后台切换到前台时触发
+            appShow: true,
+            // $MPHide小程序从前台进入后台
+            appHide: true,
+            // $MPViewScreen小程序页面浏览,打开一个小程序页面时触发
+            pageShow: true,
+            // $MPShare小程序分享,设置 Page.onShareAppMessage 这个函数后,点击小程序右上角三个点,
+            // 然后点击”发送给朋友“触发上报
+            pageShare: true,
+            // $MPPageLeave 预置事件中会采集 event_duration 预置属性来记录页面浏览时长,单位为秒
+            pageLeave: true,
+            // $MPAddFavorites小程序收藏,在微信中,仅 Android 手机有”收藏“功能,所以只有 Android 手机支持此事件
+            // page.onAddToFavorites
+            mpFavorite: true, //默认为true
+        },
+        //自定义渠道追踪参数,如source_channel:['custom_param']
+        source_channel: ['tpName'],  //这里增加一个tpName。用来给tpName走UTM逻辑
+        //是否允许控制台打印查看埋点数据(建议打开)
+        show_log: false,
+        //是否允许修改onShareAppMessage里return的path,用来增加(登录ID,分享层级,当前的path),
+        //在app onShow中自动获取这些参数来查看具体分享来源、层级等
+        allow_amend_share_path: true,
+        //是否允许批量发送
+        batch_send: false,
+        app_flush_interval: 15000,         //设置两次数据发送的最小时间间隔 @Platform Android&iOS
+        app_flush_bulkSize: 100,           //设置本地缓存日志的最大条目数,最小 50 条 @Platform Android&iOS
+        app_flush_network_policy: 30,      //设置 flush 时网络发送策略,默认 3G、4G、WI-FI 环境下都会尝试 flush  @Platform Android&iOS
+        app_session_interval_time: 30000,  //Session 时长,若 App 在后台超过设定事件,则认为当前 Session 结束,发送 $AppEnd 事件,单位毫秒 @Platform Andorid
+        app_data_collect: true
+    });
+    //对于所有事件都需要添加的属性,可在初始化 SDK 前,调用 registerApp() 将属性注册为公共属性
+    sensors.register({
+        saglobal_product_name: project + '_c',
+        saglobal_digital_brand_id: brandId,
+        saglobal_digital_brand_name: brandName,
+        saglobal_lbs_id: lbsId,
+        saglobal_lbs_name: lbsName,
+        saglobal_open_id: openId,
+        saglobal_profile_id: profileId
+    });
+    //埋点初始化
+    sensors.init();
+}
+
+class TrackFactory {
+    /**
+     * 埋点数据初始化
+     * param eventName      string  埋点事件名
+     * param eventData   object  埋点数据
+     * param isUpload boolean 是否允许上传埋点数据,默认为true
+     * param owner       string  埋点负责人,默认为undefined
+     *  */
+    constructor(eventName, eventData, isUpload = true, owner = 'undefined') {
+        this.eventData = {};
+        this.isUpload = true;
+        this.eventName = '';
+        this.timeStart = new Date().getTime();
+        this.apiTimeStart = new Date().getTime();
+        this.instanceRecorder = {};
+
+
+        eventData = eventData || {};
+        eventData['owner'] = owner;
+        this.isUpload = isUpload;
+        this.eventName = eventName;
+        this.eventData = eventData;
+        // 记录页面展示action
+        this.track(1);
+    }
+
+    /**
+     * 获取埋点事件实例
+     * param eventName       string  埋点事件名
+     * param eventData   object  埋点数据
+     * param isForce     boolean 是否强制实例化
+     * param isUpload    boolean 是否允许上传埋点数据,默认为true
+     * param owner       string  埋点负责人,默认为undefined
+     *
+     * return object
+     *  */
+    static getInstance(eventName, eventData, isForce, isUpload, owner) {
+        // 判断埋点事件名是否被注册,利用instanceRecorder记录被注册埋点事件实例
+        // 如果已经实例化过,就直接返回实例,无需再new
+        // 如果要强制实例化,可以把forceInit设为true
+        if (!this.instanceRecorder.hasOwnProperty(eventName) || isForce) {
+            eventData = eventData || {};
+            this.instanceRecorder[eventName] = new TrackFactory(eventName, eventData, isUpload, owner);
+        }
+        return this.instanceRecorder[eventName];
+    }
+
+    /**
+     * 销毁埋点事件实例
+     * param eventName       string  埋点事件名
+     *  */
+    static destory(eventName) {
+        delete this.instanceRecorder[eventName];
+    }
+
+
+
+    /**
+     * 记录埋点的action
+     * param action     number  action code
+     * param onceData   object  针对指定action的埋点数据,具体见埋点需求
+     *  */
+    track(action, onceData = {}) {
+        if (action == 100 || action == 600) {
+            this.apiTimeStart = new Date().getTime();
+            this.eventData['user_mainstory_timecost'] = new Date().getTime() - this.timeStart;
+        }
+
+        const trackData = { ...this.eventData, ...onceData };
+        trackData['action'] = action;
+        trackData['current_event_duration'] = new Date().getTime() - this.timeStart;
+        if (action == 200 || action == 400 || action == 700 || action == 800)
+            trackData['api_timecost'] = new Date().getTime() - this.apiTimeStart;
+        if (this.isUpload) {
+            normalTrack(this.eventName, trackData);
+        }
+    }
+}
+
+
+
+/**
+ * 创建并返回一个 IntersectionObserver 对象实例。
+ * 该实例会观测 option.selector 节点。
+ * 当节点在 viewport 的观测区域停留 option.delayInSecond 秒,
+ * 就认为该节点已曝光,会触发 visibilityCb。
+ *
+ * 注意:
+ * 1. 节点多次曝光会触发多次 visibilityCb
+ * 2. 待观测的 option.selector 节点必须有唯一的 id
+ * 3. 调用该方法时,待观测的节点必须在已经在页面上渲染完成。一般在 onReady / mounted 方法中调用。
+ * 4. 在 onUnload / beforeDestroy 需要执行 observer.disconnect() 来释放资源。
+ * 5. observer 不能作为 vue 实例的响应式数据。
+ *
+ * https://uniapp.dcloud.net.cn/api/ui/intersection-observer.html#createintersectionobserver
+ *
+ * @param elContainer 自定义组件实例,一般传入 this
+ * @param visibilityCb 回调函数
+ * @param option
+ * @returns IntersectionObserver 对象实例。
+ */
+const getVisibilityObserver = (
+    elContainer,
+    visibilityCb,
+    option) => {
+
+    const opt = Object.assign({}, {
+        selector: '.watch-me',
+        threshold: 0.5,
+        delayInSecond: 1,
+        margin: {
+            bottom: 0,
+        }
+    }, option ? option : {});
+
+    let timer = 0;
+    const inMap = {};
+    const outMap = {};
+    const delay = opt.delayInSecond * 1000;
+
+    const observer = uni.createIntersectionObserver(elContainer, { observeAll: true, thresholds: [opt.threshold], initialRatio: opt.threshold });
+    observer.relativeToViewport(opt.margin).observe(opt.selector, (res) => {
+        // eslint-disable-next-line no-console
+        // console.log(res);
+
+        // res 身上除了 UniApp.ObserveResult 中列明的属性外
+        // 还有两个属性:
+        // - id:string,节点的 id
+        // - dataset:object,存放节点上面的 data-* 数据
+        // 所以我们可以用 id 来做 inMap 和 outMap 的 key。
+        const key = res.id;
+        // 进入 viewpoint
+        if (res.intersectionRatio > opt.threshold) {
+            inMap[key] = res;
+            if (outMap[key]) {
+                delete outMap[key];
+            }
+        } else { // 离开 viewpoint
+            outMap[key] = res;
+            if (inMap[key]) {
+                // 计算停留时间
+                if (outMap[key].time - inMap[key].time >= delay) {
+                    visibilityCb(key, outMap[key]);
+                    delete outMap[key];
+                }
+                delete inMap[key];
+            }
+        }
+
+        // 处理那些一直停留在 viewpoint 内的节点
+        if (timer) {
+            clearTimeout(timer);
+        }
+        timer = setTimeout(() => {
+            Object.keys(inMap).forEach(id => {
+                visibilityCb(id, inMap[id]);
+                delete inMap[id];
+            })
+        }, delay);
+    });
+
+    return observer;
+}
+
+// export {
+//     trackingInit,
+//     TrackFactory,
+//     getVisibilityObserver
+// }
+
+export default () => {
+    // console.log('ENVIRONMENTS', ENVIRONMENTS[window.env]);
+    // console.log('ENVIRONMENTS', sensors);
+    // 埋点参数设置及公共字段初始化
+    trackingInit();
+    Vue.prototype.trackFactory = TrackFactory;
+}

+ 48 - 0
uni-to-vue/rpx-to-px.js

@@ -0,0 +1,48 @@
+const loaderUtils = require('loader-utils');
+
+// 匹配到 template 标签
+const template = /<template>([\s\S]+)<\/template>/gi;
+const stylePXRegExp = /(\d+)px/;
+
+let defaultsProp = {
+    unitToConvert: 'px',
+    ignoreUnitCase: true, // 转换单位是否忽略大小写
+    viewportWidth: 750,
+    unitPrecision: 5,
+    viewportUnit: 'vw',
+    fontViewportUnit: 'vw',
+    minPixelValue: 1
+};
+
+module.exports = function(source) {
+
+    const opts = loaderUtils.getOptions(this);
+    const dpo = {...defaultsProp, ...opts};
+
+    let newSource = '';
+    if (template.test(source)) {
+        newSource = source.match(template)[0];
+    }
+
+    const pxReg = new RegExp(stylePXRegExp.source, dpo.ignoreUnitCase ? 'ig' : 'g');
+    if(pxReg.test(newSource)) {
+        const _source = newSource.replace(pxReg, createPxReplace(dpo.viewportWidth, dpo.minPixelValue, dpo.unitPrecision, dpo.viewportUnit))
+        return source.replace(template, _source)
+    }
+
+    return source
+}
+
+function createPxReplace (viewportSize, minPixelValue, unitPrecision, viewportUnit) {
+    return function ($0, $1) {
+        if (!$1) return
+        const pixels = parseFloat($1)
+        if (pixels <= minPixelValue) return
+        return toFixed((pixels / viewportSize * 100), unitPrecision) + viewportUnit
+    }
+}
+function toFixed (number, precision) {
+    const multiplier = Math.pow(10, precision + 1),
+        wholeNumber = Math.floor(number * multiplier)
+    return Math.round(wholeNumber / 10) * 10 / multiplier
+}

+ 217 - 6
yarn.lock

@@ -1002,6 +1002,11 @@
     exec-sh "^0.3.2"
     minimist "^1.2.0"
 
+"@gar/promisify@^1.0.1":
+  version "1.1.3"
+  resolved "https://nexus-internal.kerryonvip.com/repository/kerry-npm-group/@gar/promisify/-/promisify-1.1.3.tgz#555193ab2e3bb3b6adc3d551c9c030d9e860daf6"
+  integrity sha512-k2Ty1JcVojjJFwrg/ThKi2ujJ7XNLYaFGNB/bWT9wGR+oSMJHMa5w+CUq6p/pVrKeNNgA7pCqEcjSnHVoqJQFw==
+
 "@hapi/address@2.x.x":
   version "2.1.4"
   resolved "https://nexus-internal.kerryonvip.com/repository/kerry-npm-group/@hapi/address/-/address-2.1.4.tgz#5d67ed43f3fd41a69d4b9ff7b56e7c0d1d0a81e5"
@@ -1235,7 +1240,7 @@
     "@jridgewell/set-array" "^1.0.0"
     "@jridgewell/sourcemap-codec" "^1.4.10"
 
-"@jridgewell/gen-mapping@^0.3.2":
+"@jridgewell/gen-mapping@^0.3.0", "@jridgewell/gen-mapping@^0.3.2":
   version "0.3.2"
   resolved "https://nexus-internal.kerryonvip.com/repository/kerry-npm-group/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz#c1aedc61e853f2bb9f5dfe6d4442d3b565b253b9"
   integrity sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A==
@@ -1254,6 +1259,14 @@
   resolved "https://nexus-internal.kerryonvip.com/repository/kerry-npm-group/@jridgewell/set-array/-/set-array-1.1.2.tgz#7c6cf998d6d20b914c0a55a91ae928ff25965e72"
   integrity sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==
 
+"@jridgewell/source-map@^0.3.2":
+  version "0.3.2"
+  resolved "https://nexus-internal.kerryonvip.com/repository/kerry-npm-group/@jridgewell/source-map/-/source-map-0.3.2.tgz#f45351aaed4527a298512ec72f81040c998580fb"
+  integrity sha512-m7O9o2uR8k2ObDysZYzdfhb08VuEml5oWGiosa1VdaPZ/A6QyPkAJuwN0Q1lhULOf6B7MtQmHENS743hWtCrgw==
+  dependencies:
+    "@jridgewell/gen-mapping" "^0.3.0"
+    "@jridgewell/trace-mapping" "^0.3.9"
+
 "@jridgewell/sourcemap-codec@1.4.14", "@jridgewell/sourcemap-codec@^1.4.10":
   version "1.4.14"
   resolved "https://nexus-internal.kerryonvip.com/repository/kerry-npm-group/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz#add4c98d341472a289190b424efbdb096991bb24"
@@ -1287,6 +1300,22 @@
   resolved "https://nexus-internal.kerryonvip.com/repository/kerry-npm-group/@nodelib/fs.stat/-/fs.stat-1.1.3.tgz#2b5a3ab3f918cca48a8c754c08168e3f03eba61b"
   integrity sha512-shAmDyaQC4H92APFoIaVDHCx5bStIocgvbwQyxPRrbUY20V1EYTbSDchWbuwlMG3V17cprZhA6+78JfB+3DTPw==
 
+"@npmcli/fs@^1.0.0":
+  version "1.1.1"
+  resolved "https://nexus-internal.kerryonvip.com/repository/kerry-npm-group/@npmcli/fs/-/fs-1.1.1.tgz#72f719fe935e687c56a4faecf3c03d06ba593257"
+  integrity sha512-8KG5RD0GVP4ydEzRn/I4BNDuxDtqVbOdm8675T49OIG/NGhaK0pjPX7ZcDlvKYbA+ulvVK3ztfcF4uBdOxuJbQ==
+  dependencies:
+    "@gar/promisify" "^1.0.1"
+    semver "^7.3.5"
+
+"@npmcli/move-file@^1.0.1":
+  version "1.1.2"
+  resolved "https://nexus-internal.kerryonvip.com/repository/kerry-npm-group/@npmcli/move-file/-/move-file-1.1.2.tgz#1a82c3e372f7cae9253eb66d72543d6b8685c674"
+  integrity sha512-1SUf/Cg2GzGDyaf15aR9St9TWlb+XvbZXWpDx8YKs7MLzMH/BCeopv+y9vzrzgkfykCGuWOlSu3mZhj2+FQcrg==
+  dependencies:
+    mkdirp "^1.0.4"
+    rimraf "^3.0.2"
+
 "@sinonjs/commons@^1.7.0":
   version "1.8.3"
   resolved "https://nexus-internal.kerryonvip.com/repository/kerry-npm-group/@sinonjs/commons/-/commons-1.8.3.tgz#3802ddd21a50a949b6721ddd72da36e67e7f1b2d"
@@ -2029,11 +2058,24 @@ acorn@^7.1.0, acorn@^7.1.1, acorn@^7.4.0:
   resolved "https://nexus-internal.kerryonvip.com/repository/kerry-npm-group/acorn/-/acorn-7.4.1.tgz#feaed255973d2e77555b83dbc08851a6c63520fa"
   integrity sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==
 
+acorn@^8.5.0:
+  version "8.8.2"
+  resolved "https://nexus-internal.kerryonvip.com/repository/kerry-npm-group/acorn/-/acorn-8.8.2.tgz#1b2f25db02af965399b9776b0c2c391276d37c4a"
+  integrity sha512-xjIYgE8HBrkpd/sJqOGNspf8uHG+NOHGOw6a/Urj8taM2EXfdNAH2oFcPeIFfsv3+kz/mJrS5VuMqbNLjCa2vw==
+
 address@^1.1.2:
   version "1.2.1"
   resolved "https://nexus-internal.kerryonvip.com/repository/kerry-npm-group/address/-/address-1.2.1.tgz#25bb61095b7522d65b357baa11bc05492d4c8acd"
   integrity sha512-B+6bi5D34+fDYENiH5qOlA0cV2rAGKuWZ9LeyUUehbXy8e0VS9e498yO0Jeeh+iM+6KbfudHTFjXw2MmJD4QRA==
 
+aggregate-error@^3.0.0:
+  version "3.1.0"
+  resolved "https://nexus-internal.kerryonvip.com/repository/kerry-npm-group/aggregate-error/-/aggregate-error-3.1.0.tgz#92670ff50f5359bdb7a3e0d40d0ec30c5737687a"
+  integrity sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==
+  dependencies:
+    clean-stack "^2.0.0"
+    indent-string "^4.0.0"
+
 ajv-errors@^1.0.0:
   version "1.0.1"
   resolved "https://nexus-internal.kerryonvip.com/repository/kerry-npm-group/ajv-errors/-/ajv-errors-1.0.1.tgz#f35986aceb91afadec4102fbd85014950cefa64d"
@@ -2719,6 +2761,30 @@ cacache@^12.0.2, cacache@^12.0.3:
     unique-filename "^1.1.1"
     y18n "^4.0.0"
 
+cacache@^15.0.5:
+  version "15.3.0"
+  resolved "https://nexus-internal.kerryonvip.com/repository/kerry-npm-group/cacache/-/cacache-15.3.0.tgz#dc85380fb2f556fe3dda4c719bfa0ec875a7f1eb"
+  integrity sha512-VVdYzXEn+cnbXpFgWs5hTT7OScegHVmLhJIR8Ufqk3iFD6A6j5iSX1KuBTfNEv4tdJWE2PzA6IVFtcLC7fN9wQ==
+  dependencies:
+    "@npmcli/fs" "^1.0.0"
+    "@npmcli/move-file" "^1.0.1"
+    chownr "^2.0.0"
+    fs-minipass "^2.0.0"
+    glob "^7.1.4"
+    infer-owner "^1.0.4"
+    lru-cache "^6.0.0"
+    minipass "^3.1.1"
+    minipass-collect "^1.0.2"
+    minipass-flush "^1.0.5"
+    minipass-pipeline "^1.2.2"
+    mkdirp "^1.0.3"
+    p-map "^4.0.0"
+    promise-inflight "^1.0.1"
+    rimraf "^3.0.2"
+    ssri "^8.0.1"
+    tar "^6.0.2"
+    unique-filename "^1.1.1"
+
 cache-base@^1.0.1:
   version "1.0.1"
   resolved "https://nexus-internal.kerryonvip.com/repository/kerry-npm-group/cache-base/-/cache-base-1.0.1.tgz#0a7f46416831c8b662ee36fe4e7c59d76f666ab2"
@@ -2902,6 +2968,11 @@ chownr@^1.1.1:
   resolved "https://nexus-internal.kerryonvip.com/repository/kerry-npm-group/chownr/-/chownr-1.1.4.tgz#6fc9d7b42d32a583596337666e7d08084da2cc6b"
   integrity sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==
 
+chownr@^2.0.0:
+  version "2.0.0"
+  resolved "https://nexus-internal.kerryonvip.com/repository/kerry-npm-group/chownr/-/chownr-2.0.0.tgz#15bfbe53d2eab4cf70f18a8cd68ebe5b3cb1dece"
+  integrity sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==
+
 chrome-trace-event@^1.0.2:
   version "1.0.3"
   resolved "https://nexus-internal.kerryonvip.com/repository/kerry-npm-group/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz#1015eced4741e15d06664a957dbbf50d041e26ac"
@@ -2937,6 +3008,11 @@ clean-css@4.2.x:
   dependencies:
     source-map "~0.6.0"
 
+clean-stack@^2.0.0:
+  version "2.2.0"
+  resolved "https://nexus-internal.kerryonvip.com/repository/kerry-npm-group/clean-stack/-/clean-stack-2.2.0.tgz#ee8472dbb129e727b31e8a10a427dee9dfe4008b"
+  integrity sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==
+
 cli-cursor@^2.1.0:
   version "2.1.0"
   resolved "https://nexus-internal.kerryonvip.com/repository/kerry-npm-group/cli-cursor/-/cli-cursor-2.1.0.tgz#b35dac376479facc3e94747d41d0d0f5238ffcb5"
@@ -4465,6 +4541,13 @@ fs-extra@^7.0.1:
     jsonfile "^4.0.0"
     universalify "^0.1.0"
 
+fs-minipass@^2.0.0:
+  version "2.1.0"
+  resolved "https://nexus-internal.kerryonvip.com/repository/kerry-npm-group/fs-minipass/-/fs-minipass-2.1.0.tgz#7f5036fdbf12c63c169190cbe4199c852271f9fb"
+  integrity sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==
+  dependencies:
+    minipass "^3.0.0"
+
 fs-write-stream-atomic@^1.0.8:
   version "1.0.10"
   resolved "https://nexus-internal.kerryonvip.com/repository/kerry-npm-group/fs-write-stream-atomic/-/fs-write-stream-atomic-1.0.10.tgz#b47df53493ef911df75731e70a9ded0189db40c9"
@@ -5090,12 +5173,17 @@ imurmurhash@^0.1.4:
   resolved "https://nexus-internal.kerryonvip.com/repository/kerry-npm-group/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea"
   integrity sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==
 
+indent-string@^4.0.0:
+  version "4.0.0"
+  resolved "https://nexus-internal.kerryonvip.com/repository/kerry-npm-group/indent-string/-/indent-string-4.0.0.tgz#624f8f4497d619b2d9768531d58f4122854d7251"
+  integrity sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==
+
 indexes-of@^1.0.1:
   version "1.0.1"
   resolved "https://nexus-internal.kerryonvip.com/repository/kerry-npm-group/indexes-of/-/indexes-of-1.0.1.tgz#f30f716c8e2bd346c7b67d3df3915566a7c05607"
   integrity sha512-bup+4tap3Hympa+JBJUG7XuOsdNQ6fxt0MHyXMKuLBKn0OqsTfvUxkUrroEX1+B2VsSHvCjiIcZVxRtYa4nllA==
 
-infer-owner@^1.0.3:
+infer-owner@^1.0.3, infer-owner@^1.0.4:
   version "1.0.4"
   resolved "https://nexus-internal.kerryonvip.com/repository/kerry-npm-group/infer-owner/-/infer-owner-1.0.4.tgz#c4cefcaa8e51051c2a40ba2ce8a3d27295af9467"
   integrity sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A==
@@ -5939,6 +6027,15 @@ jest-worker@^25.5.0:
     merge-stream "^2.0.0"
     supports-color "^7.0.0"
 
+jest-worker@^26.5.0:
+  version "26.6.2"
+  resolved "https://nexus-internal.kerryonvip.com/repository/kerry-npm-group/jest-worker/-/jest-worker-26.6.2.tgz#7f72cbc4d643c365e27b9fd775f9d0eaa9c7a8ed"
+  integrity sha512-KWYVV1c4i+jbMpaBC+U++4Va0cp8OisU185o73T1vo99hqi7w8tSJfUXYswwqqrjzwxa6KpRK54WhPvwf5w6PQ==
+  dependencies:
+    "@types/node" "*"
+    merge-stream "^2.0.0"
+    supports-color "^7.0.0"
+
 jest@^25.4.0:
   version "25.5.4"
   resolved "https://nexus-internal.kerryonvip.com/repository/kerry-npm-group/jest/-/jest-25.5.4.tgz#f21107b6489cfe32b076ce2adcadee3587acb9db"
@@ -6519,6 +6616,34 @@ minimist@^1.1.1, minimist@^1.2.0, minimist@^1.2.5, minimist@^1.2.6:
   resolved "https://nexus-internal.kerryonvip.com/repository/kerry-npm-group/minimist/-/minimist-1.2.7.tgz#daa1c4d91f507390437c6a8bc01078e7000c4d18"
   integrity sha512-bzfL1YUZsP41gmu/qjrEk0Q6i2ix/cVeAhbCbqH9u3zYutS1cLg00qhrD0M2MVdCcx4Sc0UpP2eBWo9rotpq6g==
 
+minipass-collect@^1.0.2:
+  version "1.0.2"
+  resolved "https://nexus-internal.kerryonvip.com/repository/kerry-npm-group/minipass-collect/-/minipass-collect-1.0.2.tgz#22b813bf745dc6edba2576b940022ad6edc8c617"
+  integrity sha512-6T6lH0H8OG9kITm/Jm6tdooIbogG9e0tLgpY6mphXSm/A9u8Nq1ryBG+Qspiub9LjWlBPsPS3tWQ/Botq4FdxA==
+  dependencies:
+    minipass "^3.0.0"
+
+minipass-flush@^1.0.5:
+  version "1.0.5"
+  resolved "https://nexus-internal.kerryonvip.com/repository/kerry-npm-group/minipass-flush/-/minipass-flush-1.0.5.tgz#82e7135d7e89a50ffe64610a787953c4c4cbb373"
+  integrity sha512-JmQSYYpPUqX5Jyn1mXaRwOda1uQ8HP5KAT/oDSLCzt1BYRhQU0/hDtsB1ufZfEEzMZ9aAVmsBw8+FWsIXlClWw==
+  dependencies:
+    minipass "^3.0.0"
+
+minipass-pipeline@^1.2.2:
+  version "1.2.4"
+  resolved "https://nexus-internal.kerryonvip.com/repository/kerry-npm-group/minipass-pipeline/-/minipass-pipeline-1.2.4.tgz#68472f79711c084657c067c5c6ad93cddea8214c"
+  integrity sha512-xuIq7cIOt09RPRJ19gdi4b+RiNvDFYe5JH+ggNvBqGqpQXcru3PcRmOZuHBKWK1Txf9+cQ+HMVN4d6z46LZP7A==
+  dependencies:
+    minipass "^3.0.0"
+
+minipass@^3.0.0:
+  version "3.3.6"
+  resolved "https://nexus-internal.kerryonvip.com/repository/kerry-npm-group/minipass/-/minipass-3.3.6.tgz#7bba384db3a1520d18c9c0e5251c3444e95dd94a"
+  integrity sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==
+  dependencies:
+    yallist "^4.0.0"
+
 minipass@^3.1.1:
   version "3.3.4"
   resolved "https://nexus-internal.kerryonvip.com/repository/kerry-npm-group/minipass/-/minipass-3.3.4.tgz#ca99f95dd77c43c7a76bf51e6d200025eee0ffae"
@@ -6526,11 +6651,24 @@ minipass@^3.1.1:
   dependencies:
     yallist "^4.0.0"
 
+minipass@^4.0.0:
+  version "4.2.4"
+  resolved "https://nexus-internal.kerryonvip.com/repository/kerry-npm-group/minipass/-/minipass-4.2.4.tgz#7d0d97434b6a19f59c5c3221698b48bbf3b2cd06"
+  integrity sha512-lwycX3cBMTvcejsHITUgYj6Gy6A7Nh4Q6h9NP4sTHY1ccJlC7yKzDmiShEHsJ16Jf1nKGDEaiHxiltsJEvk0nQ==
+
 miniprogram-api-typings@*:
   version "3.6.0"
   resolved "https://nexus-internal.kerryonvip.com/repository/kerry-npm-group/miniprogram-api-typings/-/miniprogram-api-typings-3.6.0.tgz#1ba29d749ccd07ef710754430c37f45634ea0f76"
   integrity sha512-xwK3PzhhxnfWqDfBikHLdAbj7Wy4F887nBcQrzwuF758Fw2qC4ivpKPL9t0uJZk5QYnU28+NqA7Q3lzYGMHQnA==
 
+minizlib@^2.1.1:
+  version "2.1.2"
+  resolved "https://nexus-internal.kerryonvip.com/repository/kerry-npm-group/minizlib/-/minizlib-2.1.2.tgz#e90d3466ba209b932451508a11ce3d3632145931"
+  integrity sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==
+  dependencies:
+    minipass "^3.0.0"
+    yallist "^4.0.0"
+
 mississippi@^3.0.0:
   version "3.0.0"
   resolved "https://nexus-internal.kerryonvip.com/repository/kerry-npm-group/mississippi/-/mississippi-3.0.0.tgz#ea0a3291f97e0b5e8776b363d5f0a12d94c67022"
@@ -6562,6 +6700,11 @@ mkdirp@^0.5.1, mkdirp@^0.5.3, mkdirp@^0.5.6, mkdirp@~0.5.1:
   dependencies:
     minimist "^1.2.6"
 
+mkdirp@^1.0.3, mkdirp@^1.0.4:
+  version "1.0.4"
+  resolved "https://nexus-internal.kerryonvip.com/repository/kerry-npm-group/mkdirp/-/mkdirp-1.0.4.tgz#3eb5ed62622756d79a5f0e2a221dfebad75c2f7e"
+  integrity sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==
+
 moment@^2.29.4:
   version "2.29.4"
   resolved "https://nexus-internal.kerryonvip.com/repository/kerry-npm-group/moment/-/moment-2.29.4.tgz#3dbe052889fe7c1b2ed966fcb3a77328964ef108"
@@ -7002,6 +7145,13 @@ p-limit@^2.0.0, p-limit@^2.2.0, p-limit@^2.2.1:
   dependencies:
     p-try "^2.0.0"
 
+p-limit@^3.0.2:
+  version "3.1.0"
+  resolved "https://nexus-internal.kerryonvip.com/repository/kerry-npm-group/p-limit/-/p-limit-3.1.0.tgz#e1daccbe78d0d1388ca18c64fea38e3e57e3706b"
+  integrity sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==
+  dependencies:
+    yocto-queue "^0.1.0"
+
 p-locate@^3.0.0:
   version "3.0.0"
   resolved "https://nexus-internal.kerryonvip.com/repository/kerry-npm-group/p-locate/-/p-locate-3.0.0.tgz#322d69a05c0264b25997d9f40cd8a891ab0064a4"
@@ -7021,6 +7171,13 @@ p-map@^2.0.0:
   resolved "https://nexus-internal.kerryonvip.com/repository/kerry-npm-group/p-map/-/p-map-2.1.0.tgz#310928feef9c9ecc65b68b17693018a665cea175"
   integrity sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw==
 
+p-map@^4.0.0:
+  version "4.0.0"
+  resolved "https://nexus-internal.kerryonvip.com/repository/kerry-npm-group/p-map/-/p-map-4.0.0.tgz#bb2f95a5eda2ec168ec9274e06a747c3e2904d2b"
+  integrity sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==
+  dependencies:
+    aggregate-error "^3.0.0"
+
 p-retry@^3.0.1:
   version "3.0.1"
   resolved "https://nexus-internal.kerryonvip.com/repository/kerry-npm-group/p-retry/-/p-retry-3.0.1.tgz#316b4c8893e2c8dc1cfa891f406c4b422bebf328"
@@ -8216,7 +8373,7 @@ rimraf@^2.5.4, rimraf@^2.6.3:
   dependencies:
     glob "^7.1.3"
 
-rimraf@^3.0.0:
+rimraf@^3.0.0, rimraf@^3.0.2:
   version "3.0.2"
   resolved "https://nexus-internal.kerryonvip.com/repository/kerry-npm-group/rimraf/-/rimraf-3.0.2.tgz#f1a5402ba6220ad52cc1282bac1ae3aa49fd061a"
   integrity sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==
@@ -8243,6 +8400,11 @@ run-queue@^1.0.0, run-queue@^1.0.3:
   dependencies:
     aproba "^1.1.1"
 
+sa-sdk-javascript@^1.24.13:
+  version "1.24.13"
+  resolved "https://nexus-internal.kerryonvip.com/repository/kerry-npm-group/sa-sdk-javascript/-/sa-sdk-javascript-1.24.13.tgz#1e75f902efa9e7b934ccb7042c553f8e99d781bb"
+  integrity sha512-qnPDcwgyQCl76pyD0ImlMSNR+XMOpJlQf5SYSaDvGHzLk8aiBXBxIIlBaRZc8Xml+DIYCOyWXoVTMo8GCovS7Q==
+
 safe-buffer@5.1.2, safe-buffer@~5.1.0, safe-buffer@~5.1.1:
   version "5.1.2"
   resolved "https://nexus-internal.kerryonvip.com/repository/kerry-npm-group/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d"
@@ -8370,7 +8532,7 @@ semver@^6.0.0, semver@^6.1.0, semver@^6.1.1, semver@^6.1.2, semver@^6.3.0:
   resolved "https://nexus-internal.kerryonvip.com/repository/kerry-npm-group/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d"
   integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==
 
-semver@^7.3.2, semver@^7.3.4:
+semver@^7.3.2, semver@^7.3.4, semver@^7.3.5:
   version "7.3.8"
   resolved "https://nexus-internal.kerryonvip.com/repository/kerry-npm-group/semver/-/semver-7.3.8.tgz#07a78feafb3f7b32347d725e33de7e2a2df67798"
   integrity sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==
@@ -8403,6 +8565,13 @@ serialize-javascript@^4.0.0:
   dependencies:
     randombytes "^2.1.0"
 
+serialize-javascript@^5.0.1:
+  version "5.0.1"
+  resolved "https://nexus-internal.kerryonvip.com/repository/kerry-npm-group/serialize-javascript/-/serialize-javascript-5.0.1.tgz#7886ec848049a462467a97d3d918ebb2aaf934f4"
+  integrity sha512-SaaNal9imEO737H2c05Og0/8LUXG7EnsZyMa8MzkmuHoELfT6txuj0cMqRj6zfPKnmQ1yasR4PCJc8x+M4JSPA==
+  dependencies:
+    randombytes "^2.1.0"
+
 serve-index@^1.9.1:
   version "1.9.1"
   resolved "https://nexus-internal.kerryonvip.com/repository/kerry-npm-group/serve-index/-/serve-index-1.9.1.tgz#d3768d69b1e7d82e5ce050fff5b453bea12a9239"
@@ -8617,7 +8786,7 @@ source-map-resolve@^0.5.0:
     source-map-url "^0.4.0"
     urix "^0.1.0"
 
-source-map-support@^0.5.6, source-map-support@~0.5.12:
+source-map-support@^0.5.6, source-map-support@~0.5.12, source-map-support@~0.5.20:
   version "0.5.21"
   resolved "https://nexus-internal.kerryonvip.com/repository/kerry-npm-group/source-map-support/-/source-map-support-0.5.21.tgz#04fe7c7f9e1ed2d662233c28cb2b35b9f63f6e4f"
   integrity sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==
@@ -8983,6 +9152,18 @@ tapable@^1.0.0, tapable@^1.1.3:
   resolved "https://nexus-internal.kerryonvip.com/repository/kerry-npm-group/tapable/-/tapable-1.1.3.tgz#a1fccc06b58db61fd7a45da2da44f5f3a3e67ba2"
   integrity sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA==
 
+tar@^6.0.2:
+  version "6.1.13"
+  resolved "https://nexus-internal.kerryonvip.com/repository/kerry-npm-group/tar/-/tar-6.1.13.tgz#46e22529000f612180601a6fe0680e7da508847b"
+  integrity sha512-jdIBIN6LTIe2jqzay/2vtYLlBHa3JF42ot3h1dW8Q0PaAG4v8rm0cvpVePtau5C6OKXGGcgO9q2AMNSWxiLqKw==
+  dependencies:
+    chownr "^2.0.0"
+    fs-minipass "^2.0.0"
+    minipass "^4.0.0"
+    minizlib "^2.1.1"
+    mkdirp "^1.0.3"
+    yallist "^4.0.0"
+
 terminal-link@^2.0.0:
   version "2.1.1"
   resolved "https://nexus-internal.kerryonvip.com/repository/kerry-npm-group/terminal-link/-/terminal-link-2.1.1.tgz#14a64a27ab3c0df933ea546fba55f2d078edc994"
@@ -9006,6 +9187,21 @@ terser-webpack-plugin@^1.4.3, terser-webpack-plugin@^1.4.4:
     webpack-sources "^1.4.0"
     worker-farm "^1.7.0"
 
+terser-webpack-plugin@^4:
+  version "4.2.3"
+  resolved "https://nexus-internal.kerryonvip.com/repository/kerry-npm-group/terser-webpack-plugin/-/terser-webpack-plugin-4.2.3.tgz#28daef4a83bd17c1db0297070adc07fc8cfc6a9a"
+  integrity sha512-jTgXh40RnvOrLQNgIkwEKnQ8rmHjHK4u+6UBEi+W+FPmvb+uo+chJXntKe7/3lW5mNysgSWD60KyesnhW8D6MQ==
+  dependencies:
+    cacache "^15.0.5"
+    find-cache-dir "^3.3.1"
+    jest-worker "^26.5.0"
+    p-limit "^3.0.2"
+    schema-utils "^3.0.0"
+    serialize-javascript "^5.0.1"
+    source-map "^0.6.1"
+    terser "^5.3.4"
+    webpack-sources "^1.4.3"
+
 terser@^4.1.2:
   version "4.8.1"
   resolved "https://nexus-internal.kerryonvip.com/repository/kerry-npm-group/terser/-/terser-4.8.1.tgz#a00e5634562de2239fd404c649051bf6fc21144f"
@@ -9015,6 +9211,16 @@ terser@^4.1.2:
     source-map "~0.6.1"
     source-map-support "~0.5.12"
 
+terser@^5.3.4:
+  version "5.16.5"
+  resolved "https://nexus-internal.kerryonvip.com/repository/kerry-npm-group/terser/-/terser-5.16.5.tgz#1c285ca0655f467f92af1bbab46ab72d1cb08e5a"
+  integrity sha512-qcwfg4+RZa3YvlFh0qjifnzBHjKGNbtDo9yivMqMFDy9Q6FSaQWSB/j1xKhsoUFJIqDOM3TsN6D5xbrMrFcHbg==
+  dependencies:
+    "@jridgewell/source-map" "^0.3.2"
+    acorn "^8.5.0"
+    commander "^2.20.0"
+    source-map-support "~0.5.20"
+
 test-exclude@^6.0.0:
   version "6.0.0"
   resolved "https://nexus-internal.kerryonvip.com/repository/kerry-npm-group/test-exclude/-/test-exclude-6.0.0.tgz#04a8698661d805ea6fa293b6cb9e63ac044ef15e"
@@ -9730,7 +9936,7 @@ webpack-merge@^4.2.2:
   dependencies:
     lodash "^4.17.15"
 
-webpack-sources@^1.1.0, webpack-sources@^1.4.0, webpack-sources@^1.4.1:
+webpack-sources@^1.1.0, webpack-sources@^1.4.0, webpack-sources@^1.4.1, webpack-sources@^1.4.3:
   version "1.4.3"
   resolved "https://nexus-internal.kerryonvip.com/repository/kerry-npm-group/webpack-sources/-/webpack-sources-1.4.3.tgz#eedd8ec0b928fbf1cbfe994e22d2d890f330a933"
   integrity sha512-lgTS3Xhv1lCOKo7SA5TjKXMjpSM4sBjNV5+q2bqesbSPs5FjGmU6jjtBSkX9b4qW87vDIsCIlUPOEhbZrMdjeQ==
@@ -10009,3 +10215,8 @@ yargs@^16.0.0:
     string-width "^4.2.0"
     y18n "^5.0.5"
     yargs-parser "^20.2.2"
+
+yocto-queue@^0.1.0:
+  version "0.1.0"
+  resolved "https://nexus-internal.kerryonvip.com/repository/kerry-npm-group/yocto-queue/-/yocto-queue-0.1.0.tgz#0294eb3dee05028d31ee1a5fa2c556a6aaf10a1b"
+  integrity sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==

Algúns arquivos non se mostraron porque demasiados arquivos cambiaron neste cambio