xhs-mp-shared 2.0.21 → 2.0.22
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.js +1 -2
- package/package.json +1 -1
- package/dist/index.js.map +0 -1
package/dist/index.js
CHANGED
|
@@ -1,2 +1 @@
|
|
|
1
|
-
"use strict";var e=require("chalk"),t=require("cos-nodejs-sdk-v5"),o=require("path"),s=require("fs"),r=require("uuid"),i=require("node-fetch"),n=require("child_process"),a=require("os"),l=require("crypto");function c(e){var t=Object.create(null);return e&&Object.keys(e).forEach((function(o){if("default"!==o){var s=Object.getOwnPropertyDescriptor(e,o);Object.defineProperty(t,o,s.get?s:{enumerable:!0,get:function(){return e[o]}})}})),t.default=e,Object.freeze(t)}var u=c(t);class p{constructor(e){this.prefix=e||"[@xhs-toolkit]",this.verbose=global.verbose}setVerbose(e){this.verbose=e}info(...t){console.info(e.blue(this.prefix),...t)}log(...t){console.log(e.blue(this.prefix),...t)}debug(...t){this.verbose&&console.debug(e.yellow(this.prefix),...t)}warn(...t){this.verbose&&console.warn(e.yellow(this.prefix),...t)}error(...t){console.error(e.red(this.prefix),...t)}}class d{static getLogger(){return window.eaglet.sendApm&&window.eaglet||global.eaglet}constructor({success:e=!0,code:t=0,info:o}){this.success=e,this.code=t,this.info=o}setCode(e){return this.code=e,this}setMsg(e){return this.msg=e,this}setData(e){return this.data=e,this}setInfo(e){return this.info=e,this}fail(){return this.success=!1,this.code=-1,this}log(e,t){var o;try{const s={bizName:e.bizName,scene:e.scene,customerHost:window.location.host,routePath:window.location.pathname,uploadSuccess:this.success,code:this.code,errorMsg:this.msg,successData:JSON.stringify(this.data),fileType:this.info.fileType,fileSize:this.info.fileSize,startTime:d.formatDate(this.info.startTime),endTime:d.formatDate(Date.now()),tokenStartTime:d.formatDate(this.info.startTime),tokenEndTime:d.formatDate(this.info.tokenEndTime||Date.now()),tokenTimestamp:(this.info.tokenEndTime||Date.now())-this.info.startTime,uploadTimestamp:Date.now()-this.info.startTime,...t};s.uploadSuccess&&0!==s.uploadTimestamp&&(s.uploadSpeed=s.fileSize/s.uploadTimestamp);const r=d.getLogger();if(r)r.push({type:"InfraUploader",value:s},"ApmJSONTracker");else{console.warn.bind(console)("[APM Warning]: eaglet is undefined, web app please install @xhs/launcher-plugin-eaglet, react-native app use eaglet plugin from asgard!")}const i=(null===(o=null===window||void 0===window?void 0:window.insight)||void 0===o?void 0:o.sendCustomPoint.bind(null===window||void 0===window?void 0:window.insight))||(null==r?void 0:r.flushApm);i&&(Object.keys(s).forEach((e=>{"boolean"==typeof s[e]&&(s[e]=Number(s[e]))})),i({measurement_name:"infraUploader",measurement_data:s},"ApmXrayTracker"))}finally{return this}}static formatDate(e){return new Date(e).toISOString().replace(/T/," ").replace(/\..+/,"")}}var m;!function(e){e.SECRET_ID="AKIDopc9PQM41h6VeVhqKRIsnRoy77sOe18z",e.SECRET_KEY="kEUTCdR0IOMuBONjlkUO4VgZiaCappql",e.BUCKET_NAME="fe-static",e.APP_ID="1251524319",e.REGION="ap-shanghai",e.HOST="eva-1251524319.cos.ap-shanghai.myqcloud.com",e.FILE_KEY="mp/red/map"}(m||(m={}));const h=new t({SecretId:m.SECRET_ID,SecretKey:m.SECRET_KEY}),f=`${m.BUCKET_NAME}-${m.APP_ID}`,g=(e,t)=>{const s=o.basename(e),r=o.extname(s);if(!r||"."===r)throw new Error(`fileName: '${e}' is not validata, please check extname`);const i=`${`${m.FILE_KEY}`}/${t}/${s}`;return{Bucket:f,Region:m.REGION,Key:i,FilePath:e}},v=async e=>{const t=e.map((({Key:e})=>({Key:e})));try{await h.deleteMultipleObject({Bucket:f,Region:m.REGION,Objects:t})}catch(e){console.log("===== 腾讯云中已存在同名文件,且删除时报错: =====",e)}};var w=Object.freeze({__proto__:null,Bucket:f,deleteExistingFiles:v,qcloudClient:h,upload2Qcloud:async(e,t)=>{if(!e||!e.length)throw new Error("上传地址不能为空!");const o=Array.isArray(e)?e.map((e=>g(e,t))):[g(e,t)];if(!o.every((e=>s.existsSync(e.FilePath))))throw new Error(`上传地址不合法: ${JSON.stringify(o,null,2)}`);return await v(o),await((e,t)=>new Promise(((t,o)=>{h.uploadFiles({files:e,SliceSize:1024,onProgress:e=>{Number(e.speed/1024/1024*100)}},((e,s)=>{e?o(e):t(s)}))})))(o)}});const x={darwin:"ioreg -rd1 -c IOPlatformExpertDevice",win32:"%windir%\\System32\\REG.exe QUERY HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Cryptography /v MachineGuid",linux:"( cat /var/lib/dbus/machine-id /etc/machine-id 2> /dev/null || hostname ) | head -n 1 || :"};function S(e){return l.createHash("sha256").update(e).digest("hex")}function y(){var e,t;try{return"darwin"===process.platform?null===(e=n.execSync("sw_vers -productVersion",{encoding:"utf-8"}))||void 0===e?void 0:e.trim():null===(t=a.release())||void 0===t?void 0:t.trim()}catch(e){}return""}function b(e,t){var o;const s=Number(e);return Number("arm64"===t&&s<100?null===(o=100*s)||void 0===o?void 0:o.toFixed(0):null==s?void 0:s.toFixed(0))}function _(){var e,t;const o=a.cpus(),s=null==o?void 0:o[0];return{os_platform:(null===(t=null===(e=process.platform)||void 0===e?void 0:e[0])||void 0===t?void 0:t.toUpperCase())+process.platform.slice(1),os_arch:process.arch,cpu_speed:b(null==s?void 0:s.speed,process.arch),cpu_model:null==s?void 0:s.model,machine_memory:Math.round(a.totalmem()/1024/1024),os_version:y()}}function T(){return"mp-compiler/2.0.20"}const E=_(),k={context_nameTracker:"nodeT",context_platform:E.os_platform,context_appVersion:"mp-compiler/2.0.20",context_osVersion:E.os_version,context_deviceModel:"",context_deviceId:function(){try{return function(e){switch(process.platform){case"darwin":return e.split("IOPlatformUUID")[1].split("\n")[0].replace(/\=|\s+|\"/gi,"").toLowerCase();case"win32":return e.toString().split("REG_SZ")[1].replace(/\r+|\n+|\s+/gi,"").toLowerCase();case"linux":return e.toString().replace(/\r+|\n+|\s+/gi,"").toLowerCase();default:throw new Error(`Unsupported platform: ${process.platform}`)}}(n.execSync(x[process.platform]).toString())}catch(e){}return JSON.stringify({..._(),login_user:S(a.userInfo().username||process.env.username),node_version:process.version})}(),context_package:"",context_networkType:"unknow",context_matchedPath:"cli",context_route:"xhsmp://cli",context_userAgent:[void 0!==(null===(C=null===process||void 0===process?void 0:process.versions)||void 0===C?void 0:C.electron)?`Electron/${null===(N=null===process||void 0===process?void 0:process.versions)||void 0===N?void 0:N.electron}`:"",`Node/${process.version}`,`${E.os_platform}/${E.os_version}`,`CPU/${E.cpu_speed}mhz (${E.cpu_model}; ${E.os_arch})`,`Memory/${E.machine_memory}mb`,"mp-compiler/2.0.20"].map((e=>{var t;return null===(t=null==e?void 0:e.trim)||void 0===t?void 0:t.call(e)})).filter(Boolean).join(" ").trim(),context_artifactName:"miniprogram",context_networkQuality:"UNKNOWN",context_artifactVersion:"UNKNOWN",context_userId:""};var C,N;const O="https://apm-fe.xiaohongshu.com/api/data";var I,R,P,D,z,$,M;exports.FeatureReporter=void 0,I=exports.FeatureReporter||(exports.FeatureReporter={}),(R=I.MODULE||(I.MODULE={})).appJSON="json-app",R.extJSON="json-ext",R.componentJSON="json-component",R.pageJSON="json-page",R.ml="ml",R.thirdFramework="third-framework",R.developMode="develop-mode",(P=I.AppExtJSON||(I.AppExtJSON={})).pages="pages",P.subpackages="subpackages",P.subPackages="subPackages",P.lazyCodeLoading="lazyCodeLoading",P.tabBar="tabBar",P.preloadRule="preloadRule",P.usingComponents="usingComponents",P.extPages="extPages",(D=I.ComponentJSON||(I.ComponentJSON={})).styleIsolation="styleIsolation",D.componentPlaceholder="componentPlaceholder",(I.PageJSON||(I.PageJSON={})).skeleton="skeleton",(z=I.ML||(I.ML={})).WebComponent="web-component",z.animation="animation",z.template="template",z.sjs="sjs",($=I.ThirdFramework||(I.ThirdFramework={})).taroReact="taro-react",$.taroVue="taro-vue",$.taro="taro",$.uniapp3="uniapp3",$.uniapp2="uniapp2",$.weimeng="weimeng",(M=I.DevelopMode||(I.DevelopMode={})).customDevelopment="custom-development",M.templateDevelopment="template-development";exports.COS=u,exports.APM=class{constructor(){this.reportQueue=[],this.allowReport=!1,this.eventSeq=1,this.context={...k},this.baseData={},this.logger=new p("[apm]: "),this.timer=null}setContext(e,t={}){this.context={...this.context,context_userId:e},this.baseData=t,this.startReport()}startReport(){this.allowReport=!0,this.bactchReport()}getSequence(){return{context_sdkSeqId:this.eventSeq++,context_sdkSessionId:r.v4(),context_pageSessionId:r.v4(),clientTime:Date.now()}}_request(e,t=!0){var o;const s=(Array.isArray(e)?e:[e]).map((e=>({...this.context,...e.suquence,measurement_name:e.measurement_name,measurement_data:{...this.baseData,...e.measurement_data}})));return null===(o=this.logger)||void 0===o||o.debug("apm before send",`${JSON.stringify(s)}`,"warning"),i(O,{method:"post",body:JSON.stringify(s),headers:{accept:"*/*","accept-language":"zh-CN,zh;q=0.9",batch:"true","biz-type":"apm_fe","cache-control":"no-cache","content-type":"application/json",pragma:"no-cache"}}).then((e=>e.json())).then((e=>{var t;if(!(null==e?void 0:e.success))throw new Error(null==e?void 0:e.msg);null===(t=this.logger)||void 0===t||t.debug("apm send success","")})).catch((e=>{var o;t&&setTimeout((()=>this._request(s,!1)),1e3),null===(o=this.logger)||void 0===o||o.log("apm send failed",`${(null==e?void 0:e.message)||null}`,"error")}))}bactchReport(){const e=[...this.reportQueue];for(this.reportQueue=[];e.length;)this._request(e.splice(0,5))}report(e,t={}){const o={suquence:this.getSequence(),measurement_name:e,measurement_data:t};this.reportQueue.push(o),clearTimeout(this.timer),this.allowReport&&(this.reportQueue.length>=10?this.bactchReport():this.timer=setTimeout((()=>{this.bactchReport()}),200))}},exports.CSS_REG=/(?<!\.skeleton)\.(wxss|css)$/,exports.Logger=p,exports.ML_COMMON_EXT=/\.(xhs|wx)ml$/,exports.ML_OPERATOR=/^(xhs|wx):/,exports.ML_REG=/(?<!\.skeleton)\.(xhs|wx)ml$/,exports.SKETCH_CSS_REG=/\.skeleton\.(wxss|css)$/,exports.SKETCH_ML_REG=/\.skeleton\.(xhs|wx)ml$/,exports.SKETCH_NAMESPACE="skeleton",exports.Uploader=class{constructor(e){this.useCache=!1,this.bizName=e.bizName,this.scene=e.scene,this.getToken=e.getToken,this.enableResume=e.enableResume}get cacheKey(){return`uploader-permit-${this.scene}-${this.bizName}`}getCachePermit(e,t){try{const o=`${t.name}-${t.size}`,s=localStorage.getItem(this.cacheKey);if(!s)return null;const r=JSON.parse(s)[o];return r?r.expireTime-12e4<Date.now()?(this.setCachePermit(e,t,null),null):r:null}catch(e){return localStorage.setItem(this.cacheKey,""),null}}setCachePermit(e,t,o){try{const e=`${t.name}-${t.size}`,s=localStorage.getItem(this.cacheKey),r=s?JSON.parse(s):{};r[e]=o,localStorage.setItem(this.cacheKey,JSON.stringify(r))}catch(e){}}getPermit(e,t,o,s,r){if(this.enableResume){const o=this.getCachePermit(e,t);if(o)return this.useCache=!0,Promise.resolve(o)}return this.useCache=!1,this.getToken({bizName:this.bizName,scene:this.scene,fileCount:1,fileFormat:o,persistentOps:s,persistentNotifyUrl:r}).then((({uploadTempPermits:o,uploadLimitPolicy:s})=>{const r=t.type,i=t.size;if(s){const{fileTypes:e,maxSize:t}=s;if((null==e?void 0:e.length)&&!e.reduce(((e,t)=>[...e,...t.split("/")]),[]).some((e=>r.endsWith(e))))throw new Error(`文件类型 ${r} 不在可上传的文件类型 ${e.join(", ")} 中。`);if(void 0!==t&&i>t)throw new Error(`文件尺寸(${i/1048576} mb)超过最大尺寸(${t/1048576} mb)。`)}if(!(null==o?void 0:o.length))throw new Error("token 获取失败。");const[n]=o.sort(((e,t)=>t.qos-e.qos));return this.enableResume&&this.setCachePermit(e,t,n),n}))}post(e){const o=Date.now(),{fileFormat:s,onInstanceCreated:r,...i}=e,n=new d({info:{fileType:e.fileInfo.type,fileSize:e.fileInfo.size,startTime:o}});return this.getPermit(e.Body,e.fileInfo,s).then((s=>{n.setInfo({...n.info,tokenEndTime:Date.now()});const[a]=s.fileIds,l={Domain:s.uploadAddr,getAuthorization(e,t){t({TmpSecretId:s.secretId||"null",TmpSecretKey:s.secretKey||"null",SecurityToken:s.token,StartTime:Math.floor(o/1e3),ExpiredTime:Math.floor(s.expireTime/1e3)})}};"unknown"===s.bucket&&(l.AppId="1251524319");const c=new t(l);return r&&r(c),c.uploadFile({Bucket:s.bucket,Region:s.region,Key:a,...i}).then((t=>{var o,r;const l={...t,bizName:this.bizName,scene:this.scene,cloudType:s.cloudType,fileId:a,useCache:this.useCache};if(s.cdnDomain){const e=`${s.cdnDomain}/${a}`;l.cdnDomain=s.cdnDomain,l.url=e,l.previewUrl=e,l.staticUrl=e}(null==t?void 0:t.headers)&&Object.keys(t.headers).forEach((e=>{var o;if(e.startsWith("x-ros-")){const s=e.split("x-ros-")[1].replace(/\-(\w)/g,(e=>e[1].toUpperCase()));l[s]=null===(o=t.headers)||void 0===o?void 0:o[e]}}));const c={fileId:a,cloudType:s.cloudType,uploaderAddr:s.uploadAddr,sliceSize:i.SliceSize||1048576,isSlice:e.fileInfo.size>(i.SliceSize||1048576),tokenFail:!1};return(null===(o=null==t?void 0:t.headers)||void 0===o?void 0:o["x-tracer"])&&(c.tracerId=null===(r=t.headers)||void 0===r?void 0:r["x-tracer"]),this.setCachePermit(e.Body,e.fileInfo,null),n.setData(l).log(this,c)})).catch((t=>{var o;return this.enableResume&&!(null===(o=null==t?void 0:t.message)||void 0===o?void 0:o.includes("network error"))&&this.setCachePermit(e.Body,e.fileInfo,null),n.fail().setCode(Number((null==t?void 0:t.code)||-1)).setMsg(null==t?void 0:t.message).log(this,{fileId:a,cloudType:s.cloudType,uploaderAddr:s.uploadAddr,sliceSize:i.SliceSize||1048576,isSlice:e.fileInfo.size>(i.SliceSize||1048576),tokenFail:!1,serverFail:!0})}))})).catch((e=>n.fail().setInfo({...n.info,tokenEndTime:Date.now()}).setMsg(e.message).log(this,{tokenFail:!0})))}},exports.getBundleVersion=T,exports.getLegacyBundleVersion=function(){return"mp-compiler/2.0.20 @xhs/mp-ide/2.3.0"},exports.publicCos=w;
|
|
2
|
-
//# sourceMappingURL=index.js.map
|
|
1
|
+
"use strict";var e=require("chalk"),t=require("cos-nodejs-sdk-v5"),o=require("path"),s=require("fs"),r=require("uuid"),i=require("node-fetch"),n=require("child_process"),a=require("os"),l=require("crypto");function c(e){var t=Object.create(null);return e&&Object.keys(e).forEach((function(o){if("default"!==o){var s=Object.getOwnPropertyDescriptor(e,o);Object.defineProperty(t,o,s.get?s:{enumerable:!0,get:function(){return e[o]}})}})),t.default=e,Object.freeze(t)}var u=c(t);class p{constructor(e){this.prefix=e||"[@xhs-toolkit]",this.verbose=global.verbose}setVerbose(e){this.verbose=e}info(...t){console.info(e.blue(this.prefix),...t)}log(...t){console.log(e.blue(this.prefix),...t)}debug(...t){this.verbose&&console.debug(e.yellow(this.prefix),...t)}warn(...t){this.verbose&&console.warn(e.yellow(this.prefix),...t)}error(...t){console.error(e.red(this.prefix),...t)}}class d{static getLogger(){return window.eaglet.sendApm&&window.eaglet||global.eaglet}constructor({success:e=!0,code:t=0,info:o}){this.success=e,this.code=t,this.info=o}setCode(e){return this.code=e,this}setMsg(e){return this.msg=e,this}setData(e){return this.data=e,this}setInfo(e){return this.info=e,this}fail(){return this.success=!1,this.code=-1,this}log(e,t){var o;try{const s={bizName:e.bizName,scene:e.scene,customerHost:window.location.host,routePath:window.location.pathname,uploadSuccess:this.success,code:this.code,errorMsg:this.msg,successData:JSON.stringify(this.data),fileType:this.info.fileType,fileSize:this.info.fileSize,startTime:d.formatDate(this.info.startTime),endTime:d.formatDate(Date.now()),tokenStartTime:d.formatDate(this.info.startTime),tokenEndTime:d.formatDate(this.info.tokenEndTime||Date.now()),tokenTimestamp:(this.info.tokenEndTime||Date.now())-this.info.startTime,uploadTimestamp:Date.now()-this.info.startTime,...t};s.uploadSuccess&&0!==s.uploadTimestamp&&(s.uploadSpeed=s.fileSize/s.uploadTimestamp);const r=d.getLogger();if(r)r.push({type:"InfraUploader",value:s},"ApmJSONTracker");else{console.warn.bind(console)("[APM Warning]: eaglet is undefined, web app please install @xhs/launcher-plugin-eaglet, react-native app use eaglet plugin from asgard!")}const i=(null===(o=null===window||void 0===window?void 0:window.insight)||void 0===o?void 0:o.sendCustomPoint.bind(null===window||void 0===window?void 0:window.insight))||(null==r?void 0:r.flushApm);i&&(Object.keys(s).forEach((e=>{"boolean"==typeof s[e]&&(s[e]=Number(s[e]))})),i({measurement_name:"infraUploader",measurement_data:s},"ApmXrayTracker"))}finally{return this}}static formatDate(e){return new Date(e).toISOString().replace(/T/," ").replace(/\..+/,"")}}var m;!function(e){e.SECRET_ID="AKIDopc9PQM41h6VeVhqKRIsnRoy77sOe18z",e.SECRET_KEY="kEUTCdR0IOMuBONjlkUO4VgZiaCappql",e.BUCKET_NAME="fe-static",e.APP_ID="1251524319",e.REGION="ap-shanghai",e.HOST="eva-1251524319.cos.ap-shanghai.myqcloud.com",e.FILE_KEY="mp/red/map"}(m||(m={}));const h=new t({SecretId:m.SECRET_ID,SecretKey:m.SECRET_KEY}),f=`${m.BUCKET_NAME}-${m.APP_ID}`,g=(e,t)=>{const s=o.basename(e),r=o.extname(s);if(!r||"."===r)throw new Error(`fileName: '${e}' is not validata, please check extname`);const i=`${`${m.FILE_KEY}`}/${t}/${s}`;return{Bucket:f,Region:m.REGION,Key:i,FilePath:e}},v=async e=>{const t=e.map((({Key:e})=>({Key:e})));try{await h.deleteMultipleObject({Bucket:f,Region:m.REGION,Objects:t})}catch(e){console.log("===== 腾讯云中已存在同名文件,且删除时报错: =====",e)}};var w=Object.freeze({__proto__:null,Bucket:f,deleteExistingFiles:v,qcloudClient:h,upload2Qcloud:async(e,t)=>{if(!e||!e.length)throw new Error("上传地址不能为空!");const o=Array.isArray(e)?e.map((e=>g(e,t))):[g(e,t)];if(!o.every((e=>s.existsSync(e.FilePath))))throw new Error(`上传地址不合法: ${JSON.stringify(o,null,2)}`);return await v(o),await((e,t)=>new Promise(((t,o)=>{h.uploadFiles({files:e,SliceSize:1024,onProgress:e=>{Number(e.speed/1024/1024*100)}},((e,s)=>{e?o(e):t(s)}))})))(o)}});const x={darwin:"ioreg -rd1 -c IOPlatformExpertDevice",win32:"%windir%\\System32\\REG.exe QUERY HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Cryptography /v MachineGuid",linux:"( cat /var/lib/dbus/machine-id /etc/machine-id 2> /dev/null || hostname ) | head -n 1 || :"};function S(e){return l.createHash("sha256").update(e).digest("hex")}function y(){var e,t;try{return"darwin"===process.platform?null===(e=n.execSync("sw_vers -productVersion",{encoding:"utf-8"}))||void 0===e?void 0:e.trim():null===(t=a.release())||void 0===t?void 0:t.trim()}catch(e){}return""}function b(e,t){var o;const s=Number(e);return Number("arm64"===t&&s<100?null===(o=100*s)||void 0===o?void 0:o.toFixed(0):null==s?void 0:s.toFixed(0))}function _(){var e,t;const o=a.cpus(),s=null==o?void 0:o[0];return{os_platform:(null===(t=null===(e=process.platform)||void 0===e?void 0:e[0])||void 0===t?void 0:t.toUpperCase())+process.platform.slice(1),os_arch:process.arch,cpu_speed:b(null==s?void 0:s.speed,process.arch),cpu_model:null==s?void 0:s.model,machine_memory:Math.round(a.totalmem()/1024/1024),os_version:y()}}function T(){return"mp-compiler/2.0.22"}const E=_(),k={context_nameTracker:"nodeT",context_platform:E.os_platform,context_appVersion:"mp-compiler/2.0.22",context_osVersion:E.os_version,context_deviceModel:"",context_deviceId:function(){try{return function(e){switch(process.platform){case"darwin":return e.split("IOPlatformUUID")[1].split("\n")[0].replace(/\=|\s+|\"/gi,"").toLowerCase();case"win32":return e.toString().split("REG_SZ")[1].replace(/\r+|\n+|\s+/gi,"").toLowerCase();case"linux":return e.toString().replace(/\r+|\n+|\s+/gi,"").toLowerCase();default:throw new Error(`Unsupported platform: ${process.platform}`)}}(n.execSync(x[process.platform]).toString())}catch(e){}return JSON.stringify({..._(),login_user:S(a.userInfo().username||process.env.username),node_version:process.version})}(),context_package:"",context_networkType:"unknow",context_matchedPath:"cli",context_route:"xhsmp://cli",context_userAgent:[void 0!==(null===(C=null===process||void 0===process?void 0:process.versions)||void 0===C?void 0:C.electron)?`Electron/${null===(N=null===process||void 0===process?void 0:process.versions)||void 0===N?void 0:N.electron}`:"",`Node/${process.version}`,`${E.os_platform}/${E.os_version}`,`CPU/${E.cpu_speed}mhz (${E.cpu_model}; ${E.os_arch})`,`Memory/${E.machine_memory}mb`,"mp-compiler/2.0.22"].map((e=>{var t;return null===(t=null==e?void 0:e.trim)||void 0===t?void 0:t.call(e)})).filter(Boolean).join(" ").trim(),context_artifactName:"miniprogram",context_networkQuality:"UNKNOWN",context_artifactVersion:"UNKNOWN",context_userId:""};var C,N;const O="https://apm-fe.xiaohongshu.com/api/data";var I,R,P,D,z,$,M;exports.FeatureReporter=void 0,I=exports.FeatureReporter||(exports.FeatureReporter={}),(R=I.MODULE||(I.MODULE={})).appJSON="json-app",R.extJSON="json-ext",R.componentJSON="json-component",R.pageJSON="json-page",R.ml="ml",R.thirdFramework="third-framework",R.developMode="develop-mode",(P=I.AppExtJSON||(I.AppExtJSON={})).pages="pages",P.subpackages="subpackages",P.subPackages="subPackages",P.lazyCodeLoading="lazyCodeLoading",P.tabBar="tabBar",P.preloadRule="preloadRule",P.usingComponents="usingComponents",P.extPages="extPages",(D=I.ComponentJSON||(I.ComponentJSON={})).styleIsolation="styleIsolation",D.componentPlaceholder="componentPlaceholder",(I.PageJSON||(I.PageJSON={})).skeleton="skeleton",(z=I.ML||(I.ML={})).WebComponent="web-component",z.animation="animation",z.template="template",z.sjs="sjs",($=I.ThirdFramework||(I.ThirdFramework={})).taroReact="taro-react",$.taroVue="taro-vue",$.taro="taro",$.uniapp3="uniapp3",$.uniapp2="uniapp2",$.weimeng="weimeng",(M=I.DevelopMode||(I.DevelopMode={})).customDevelopment="custom-development",M.templateDevelopment="template-development";exports.COS=u,exports.APM=class{constructor(){this.reportQueue=[],this.allowReport=!1,this.eventSeq=1,this.context={...k},this.baseData={},this.logger=new p("[apm]: "),this.timer=null}setContext(e,t={}){this.context={...this.context,context_userId:e},this.baseData=t,this.startReport()}startReport(){this.allowReport=!0,this.bactchReport()}getSequence(){return{context_sdkSeqId:this.eventSeq++,context_sdkSessionId:r.v4(),context_pageSessionId:r.v4(),clientTime:Date.now()}}_request(e,t=!0){var o;const s=(Array.isArray(e)?e:[e]).map((e=>({...this.context,...e.suquence,measurement_name:e.measurement_name,measurement_data:{...this.baseData,...e.measurement_data}})));return null===(o=this.logger)||void 0===o||o.debug("apm before send",`${JSON.stringify(s)}`,"warning"),i(O,{method:"post",body:JSON.stringify(s),headers:{accept:"*/*","accept-language":"zh-CN,zh;q=0.9",batch:"true","biz-type":"apm_fe","cache-control":"no-cache","content-type":"application/json",pragma:"no-cache"}}).then((e=>e.json())).then((e=>{var t;if(!(null==e?void 0:e.success))throw new Error(null==e?void 0:e.msg);null===(t=this.logger)||void 0===t||t.debug("apm send success","")})).catch((e=>{var o;t&&setTimeout((()=>this._request(s,!1)),1e3),null===(o=this.logger)||void 0===o||o.log("apm send failed",`${(null==e?void 0:e.message)||null}`,"error")}))}bactchReport(){const e=[...this.reportQueue];for(this.reportQueue=[];e.length;)this._request(e.splice(0,5))}report(e,t={}){const o={suquence:this.getSequence(),measurement_name:e,measurement_data:t};this.reportQueue.push(o),clearTimeout(this.timer),this.allowReport&&(this.reportQueue.length>=10?this.bactchReport():this.timer=setTimeout((()=>{this.bactchReport()}),200))}},exports.CSS_REG=/(?<!\.skeleton)\.(wxss|css)$/,exports.Logger=p,exports.ML_COMMON_EXT=/\.(xhs|wx)ml$/,exports.ML_OPERATOR=/^(xhs|wx):/,exports.ML_REG=/(?<!\.skeleton)\.(xhs|wx)ml$/,exports.SKETCH_CSS_REG=/\.skeleton\.(wxss|css)$/,exports.SKETCH_ML_REG=/\.skeleton\.(xhs|wx)ml$/,exports.SKETCH_NAMESPACE="skeleton",exports.Uploader=class{constructor(e){this.useCache=!1,this.bizName=e.bizName,this.scene=e.scene,this.getToken=e.getToken,this.enableResume=e.enableResume}get cacheKey(){return`uploader-permit-${this.scene}-${this.bizName}`}getCachePermit(e,t){try{const o=`${t.name}-${t.size}`,s=localStorage.getItem(this.cacheKey);if(!s)return null;const r=JSON.parse(s)[o];return r?r.expireTime-12e4<Date.now()?(this.setCachePermit(e,t,null),null):r:null}catch(e){return localStorage.setItem(this.cacheKey,""),null}}setCachePermit(e,t,o){try{const e=`${t.name}-${t.size}`,s=localStorage.getItem(this.cacheKey),r=s?JSON.parse(s):{};r[e]=o,localStorage.setItem(this.cacheKey,JSON.stringify(r))}catch(e){}}getPermit(e,t,o,s,r){if(this.enableResume){const o=this.getCachePermit(e,t);if(o)return this.useCache=!0,Promise.resolve(o)}return this.useCache=!1,this.getToken({bizName:this.bizName,scene:this.scene,fileCount:1,fileFormat:o,persistentOps:s,persistentNotifyUrl:r}).then((({uploadTempPermits:o,uploadLimitPolicy:s})=>{const r=t.type,i=t.size;if(s){const{fileTypes:e,maxSize:t}=s;if((null==e?void 0:e.length)&&!e.reduce(((e,t)=>[...e,...t.split("/")]),[]).some((e=>r.endsWith(e))))throw new Error(`文件类型 ${r} 不在可上传的文件类型 ${e.join(", ")} 中。`);if(void 0!==t&&i>t)throw new Error(`文件尺寸(${i/1048576} mb)超过最大尺寸(${t/1048576} mb)。`)}if(!(null==o?void 0:o.length))throw new Error("token 获取失败。");const[n]=o.sort(((e,t)=>t.qos-e.qos));return this.enableResume&&this.setCachePermit(e,t,n),n}))}post(e){const o=Date.now(),{fileFormat:s,onInstanceCreated:r,...i}=e,n=new d({info:{fileType:e.fileInfo.type,fileSize:e.fileInfo.size,startTime:o}});return this.getPermit(e.Body,e.fileInfo,s).then((s=>{n.setInfo({...n.info,tokenEndTime:Date.now()});const[a]=s.fileIds,l={Domain:s.uploadAddr,getAuthorization(e,t){t({TmpSecretId:s.secretId||"null",TmpSecretKey:s.secretKey||"null",SecurityToken:s.token,StartTime:Math.floor(o/1e3),ExpiredTime:Math.floor(s.expireTime/1e3)})}};"unknown"===s.bucket&&(l.AppId="1251524319");const c=new t(l);return r&&r(c),c.uploadFile({Bucket:s.bucket,Region:s.region,Key:a,...i}).then((t=>{var o,r;const l={...t,bizName:this.bizName,scene:this.scene,cloudType:s.cloudType,fileId:a,useCache:this.useCache};if(s.cdnDomain){const e=`${s.cdnDomain}/${a}`;l.cdnDomain=s.cdnDomain,l.url=e,l.previewUrl=e,l.staticUrl=e}(null==t?void 0:t.headers)&&Object.keys(t.headers).forEach((e=>{var o;if(e.startsWith("x-ros-")){const s=e.split("x-ros-")[1].replace(/\-(\w)/g,(e=>e[1].toUpperCase()));l[s]=null===(o=t.headers)||void 0===o?void 0:o[e]}}));const c={fileId:a,cloudType:s.cloudType,uploaderAddr:s.uploadAddr,sliceSize:i.SliceSize||1048576,isSlice:e.fileInfo.size>(i.SliceSize||1048576),tokenFail:!1};return(null===(o=null==t?void 0:t.headers)||void 0===o?void 0:o["x-tracer"])&&(c.tracerId=null===(r=t.headers)||void 0===r?void 0:r["x-tracer"]),this.setCachePermit(e.Body,e.fileInfo,null),n.setData(l).log(this,c)})).catch((t=>{var o;return this.enableResume&&!(null===(o=null==t?void 0:t.message)||void 0===o?void 0:o.includes("network error"))&&this.setCachePermit(e.Body,e.fileInfo,null),n.fail().setCode(Number((null==t?void 0:t.code)||-1)).setMsg(null==t?void 0:t.message).log(this,{fileId:a,cloudType:s.cloudType,uploaderAddr:s.uploadAddr,sliceSize:i.SliceSize||1048576,isSlice:e.fileInfo.size>(i.SliceSize||1048576),tokenFail:!1,serverFail:!0})}))})).catch((e=>n.fail().setInfo({...n.info,tokenEndTime:Date.now()}).setMsg(e.message).log(this,{tokenFail:!0})))}},exports.getBundleVersion=T,exports.getLegacyBundleVersion=function(){return"mp-compiler/2.0.22 @xhs/mp-ide/2.3.0"},exports.publicCos=w;
|
package/package.json
CHANGED
package/dist/index.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sources":["../src/utils/logger.ts","../src/utils/uploader/utils.ts","../src/config/cos.config.ts","../src/utils/uploader/cos-upload.ts","../src/utils/tracker/device.ts","../src/utils/platform.ts","../src/utils/tracker/index.ts","../src/utils/reporter.ts","../src/constants/platform.ts","../src/utils/uploader/uploader.ts"],"sourcesContent":["import chalk from 'chalk'\n\nexport class Logger {\n prefix: string\n private verbose: boolean\n\n constructor(prefix: string) {\n this.prefix = prefix || '[@xhs-toolkit]'\n // @ts-ignore\n this.verbose = global.verbose\n }\n\n setVerbose(verbose) {\n this.verbose = verbose\n }\n\n info(...args) {\n console.info(chalk.blue(this.prefix), ...args)\n }\n\n log(...args) {\n console.log(chalk.blue(this.prefix), ...args)\n }\n\n debug(...args) {\n if (this.verbose) {\n console.debug(chalk.yellow(this.prefix), ...args)\n }\n }\n\n warn(...args) {\n if (this.verbose) {\n console.warn(chalk.yellow(this.prefix), ...args)\n }\n }\n\n error(...args) {\n console.error(chalk.red(this.prefix), ...args)\n }\n}\n","import { Uploader } from './uploader'\n\ninterface Info {\n fileType: string\n fileSize: number\n startTime: number\n tokenEndTime?: number\n}\n\nexport class Response<T = Record<string, any>> {\n success: boolean\n\n code: number\n\n msg?: string\n\n data?: T\n\n info: Info\n\n static getLogger(): any {\n // @ts-ignore\n return (window.eaglet.sendApm && window.eaglet) || global.eaglet\n }\n\n constructor(\n {\n success = true,\n code = 0,\n info,\n }: {\n success?: boolean\n code?: number\n info: Info\n },\n ) {\n this.success = success\n this.code = code\n this.info = info\n }\n\n setCode(code: number): Response<T> {\n this.code = code\n\n return this\n }\n\n setMsg(msg?: string): Response<T> {\n this.msg = msg\n\n return this\n }\n\n setData(data?: T): Response<T> {\n this.data = data\n\n return this\n }\n\n setInfo(info: Info): Response<T> {\n this.info = info\n return this\n }\n\n fail(): Response<T> {\n this.success = false\n this.code = -1\n\n return this\n }\n\n // eslint-disable-next-line\n log(uploader: Uploader, metrics?: any): Response<T> {\n\n try {\n const payload = {\n // 业务名称\n bizName: uploader.bizName,\n // 业务线\n scene: uploader.scene,\n customerHost: window.location.host,\n routePath: window.location.pathname,\n uploadSuccess: this.success,\n // 状态码\n code: this.code,\n // error信息\n errorMsg: this.msg,\n // uploader 传给业务方的 data\n successData: JSON.stringify(this.data),\n fileType: this.info.fileType,\n fileSize: this.info.fileSize,\n startTime: Response.formatDate(this.info.startTime),\n endTime: Response.formatDate(Date.now()),\n tokenStartTime: Response.formatDate(this.info.startTime),\n tokenEndTime: Response.formatDate(this.info.tokenEndTime || Date.now()),\n tokenTimestamp: (this.info.tokenEndTime || Date.now()) - this.info.startTime,\n uploadTimestamp: Date.now() - this.info.startTime,\n ...metrics,\n }\n\n if (payload.uploadSuccess && payload.uploadTimestamp !== 0) {\n payload.uploadSpeed = payload.fileSize / payload.uploadTimestamp\n }\n\n const logger = Response.getLogger()\n\n if (logger) {\n logger\n .push(\n {\n type: 'InfraUploader',\n value: payload,\n },\n 'ApmJSONTracker',\n )\n } else {\n const noConsole = console.warn.bind(console)\n noConsole('[APM Warning]: eaglet is undefined, web app please install @xhs/launcher-plugin-eaglet, react-native app use eaglet plugin from asgard!')\n }\n\n const reportToXray = (window as any)?.insight?.sendCustomPoint.bind((window as any)?.insight) || logger?.flushApm\n\n if (reportToXray) {\n // apm 不支持 bool\n Object.keys(payload).forEach(key => {\n if (typeof payload[key] === 'boolean') payload[key] = Number(payload[key])\n })\n\n reportToXray({\n measurement_name: 'infraUploader',\n measurement_data: payload,\n }, 'ApmXrayTracker')\n }\n } finally {\n // eslint-disable-next-line no-unsafe-finally\n return this\n }\n }\n\n static formatDate(timestamp: number): string {\n return new Date(timestamp)\n .toISOString()\n .replace(/T/, ' ')\n .replace(/\\..+/, '')\n }\n}\n// eslint-disable-next-line no-useless-escape\nexport const toHump = (str: string): string => str.replace(/\\-(\\w)/g, letter => letter[1].toUpperCase())\n","export enum MP_UPLOAD_INFO {\n SECRET_ID = 'AKIDopc9PQM41h6VeVhqKRIsnRoy77sOe18z',\n SECRET_KEY = 'kEUTCdR0IOMuBONjlkUO4VgZiaCappql',\n BUCKET_NAME = 'fe-static',\n APP_ID = '1251524319',\n REGION = 'ap-shanghai',\n HOST = 'eva-1251524319.cos.ap-shanghai.myqcloud.com',\n FILE_KEY = 'mp/red/map'\n}\n","import path from 'path'\nimport fs from 'fs'\nimport COS, { UploadFilesResult } from 'cos-nodejs-sdk-v5'\nimport { MP_UPLOAD_INFO } from '../../config/cos.config'\n\ntype TFiles = ReturnType<typeof generFile>\n\nexport const qcloudClient = new COS({\n SecretId: MP_UPLOAD_INFO.SECRET_ID,\n SecretKey: MP_UPLOAD_INFO.SECRET_KEY\n})\nexport const Bucket = `${MP_UPLOAD_INFO.BUCKET_NAME}-${MP_UPLOAD_INFO.APP_ID}`\n\nconst generFile = (filePath: string, uuidKey: any) => {\n const basename = path.basename(filePath)\n const extname = path.extname(basename)\n if (!extname || extname === '.') {\n throw new Error(`fileName: '${filePath}' is not validata, please check extname`)\n }\n // 设置文件上传前缀,根据环境选择不同的路径\n const prefix = `${MP_UPLOAD_INFO.FILE_KEY}`\n // 文件上传到 COS 的唯一标识,包括前缀、UUID和文件名\n const Key = `${prefix}/${uuidKey}/${basename}`\n return {\n Bucket,\n Region: MP_UPLOAD_INFO.REGION,\n Key,\n FilePath: filePath\n }\n}\n\n// 删除已存在的同名文件\nexport const deleteExistingFiles = async (files: TFiles[]) => {\n const delFileKeyList = files.map(({ Key }) => ({ Key }))\n try {\n // 删除多个文件\n const deletionResult = await qcloudClient.deleteMultipleObject({\n Bucket,\n Region: MP_UPLOAD_INFO.REGION,\n Objects: delFileKeyList\n })\n\n // if (deletionResult.Deleted && deletionResult.Deleted.length > 0) {\n // // console.log('===== 已成功删除腾讯云中已存在的同名文件 =====')\n // } else {\n // console.log('===== 腾讯云中不存在同名文件或删除时没有成功: =====', deletionResult)\n // }\n } catch (err) {\n console.log('===== 腾讯云中已存在同名文件,且删除时报错: =====', err)\n }\n}\n\n// 上传文件到腾讯云 COS\nconst uploadFiles = (files: TFiles[], onProgress?) => new Promise<UploadFilesResult>((resolve, reject) => {\n // 使用腾讯云 COS SDK 上传文件\n qcloudClient.uploadFiles(\n {\n files,\n SliceSize: 1024,\n onProgress: (info) => {\n // 上传进度回调,用于更新进度条\n const speed = Number((info.speed / 1024 / 1024) * 100) / 100\n onProgress?.({\n completed: info.loaded,\n total: info.total,\n speed: `${speed.toFixed(2)}Mb/s`\n })\n }\n },\n (err, data) => {\n if (err) {\n // console.log('腾讯上传失败:', err)\n reject(err)\n } else {\n // console.log('=== 腾讯云上传成功 ===')\n resolve(data)\n }\n }\n )\n })\n\n// 主要的上传逻辑\nexport const upload2Qcloud = async (filePath: string | string[], uuidKey): Promise<UploadFilesResult> => {\n if (!filePath || !filePath.length) {\n throw new Error('上传地址不能为空!')\n }\n\n // 将输入的文件路径转换为数组\n const files: TFiles[] = Array.isArray(filePath)\n ? filePath.map((filePath) => generFile(filePath, uuidKey))\n : [generFile(filePath, uuidKey)]\n\n // 检查文件是否存在\n if (!files.every((file) => fs.existsSync(file.FilePath))) {\n throw new Error(`上传地址不合法: ${JSON.stringify(files, null, 2)}`)\n }\n // console.log('===== 开始上传文件: =====', files)\n\n // 删除已存在的同名文件\n await deleteExistingFiles(files)\n\n // 上传文件到腾讯云 COS\n return await uploadFiles(files)\n}\n","import { execSync } from 'child_process';\nimport os from 'os'\nimport { createHash } from 'crypto';\nimport { IDeviceInfo, IDeviceUA } from './tracker';\n\nconst guid: Object = {\n darwin: 'ioreg -rd1 -c IOPlatformExpertDevice',\n win32: '%windir%\\\\System32\\\\REG.exe QUERY HKEY_LOCAL_MACHINE\\\\SOFTWARE\\\\Microsoft\\\\Cryptography /v MachineGuid',\n linux: '( cat /var/lib/dbus/machine-id /etc/machine-id 2> /dev/null || hostname ) | head -n 1 || :'\n};\n\nfunction hash(guid) {\n return createHash('sha256').update(guid).digest('hex');\n}\n\nfunction expose(result: string): string {\n switch (process.platform) {\n case 'darwin':\n return result\n .split('IOPlatformUUID')[1]\n .split('\\n')[0].replace(/\\=|\\s+|\\\"/ig, '')\n .toLowerCase();\n case 'win32':\n return result\n .toString()\n .split('REG_SZ')[1]\n .replace(/\\r+|\\n+|\\s+/ig, '')\n .toLowerCase();\n case 'linux':\n return result\n .toString()\n .replace(/\\r+|\\n+|\\s+/ig, '')\n .toLowerCase();\n default:\n throw new Error(`Unsupported platform: ${process.platform}`);\n }\n}\n\nfunction getOsVersion(){\n try {\n if (process.platform === 'darwin') {\n return execSync('sw_vers -productVersion', { encoding: 'utf-8' })?.trim()\n }\n return os.release()?.trim()\n } catch (error) {\n \n }\n return ''\n}\n\nfunction formatCupSpeed(speed: number, arch: string){\n // cpu 1000mhz ~ 10Ghz \n const num = Number(speed)\n if (arch === \"arm64\" && num < 100) {\n // apple cpu 显示不准确\n return Number((num * 100)?.toFixed(0))\n }\n return Number(num?.toFixed(0))\n}\n\nexport function getDeviceInfo(): IDeviceInfo {\n const cpus = os.cpus()\n const cpuInfo = cpus?.[0]\n\n const result = {\n os_platform: process.platform?.[0]?.toUpperCase() + process.platform.slice(1),\n os_arch: process.arch,\n cpu_speed: formatCupSpeed(cpuInfo?.speed ,process.arch),\n cpu_model: cpuInfo?.model,\n machine_memory: Math.round(os.totalmem() / 1024 / 1024), // mb\n os_version: getOsVersion(),\n }\n return result\n}\n\nexport function deviceUA(): IDeviceUA {\n return {\n ...getDeviceInfo(),\n login_user: hash(os.userInfo().username || process.env.username),\n node_version: process.version\n }\n}\n\nexport function machineId(): string {\n try {\n return expose(execSync(guid[process.platform]).toString());\n } catch (error) {\n }\n // 兜底\n return JSON.stringify(deviceUA())\n}","declare global {\n const BUNDLE_VERSION: string;\n}\n\n// 统一ua版本\nexport function getBundleVersion() {\n return `mp-compiler/${BUNDLE_VERSION}`\n}\n\nexport function getLegacyBundleVersion() {\n // 目前没有 @xhs/mp-ide 线上过不了校验\n return `${getBundleVersion()} @xhs/mp-ide/2.3.0`\n}","import uuid from 'uuid'\nimport fetch from 'node-fetch'\nimport { Logger } from '../logger'\nimport { machineId, getDeviceInfo } from './device'\nimport { IBase } from './tracker'\nimport { getBundleVersion } from '../platform'\n\nconst deviceInfo = getDeviceInfo()\n\nconst getUserAgent = () => {\n // 后续用于设备分级\n // Node/v16.20.2 Darwin/14.1.2 CPU/2400mhz (Apple M2 Pro; arm64) Memory/16384mb\n const electronStr = typeof process?.versions?.electron !== 'undefined' ? `Electron/${process?.versions?.electron}` : ''\n const nodeStr = `Node/${process.version}`\n const os_version = `${deviceInfo.os_platform}/${deviceInfo.os_version}`\n const cpu = `CPU/${deviceInfo.cpu_speed}mhz (${deviceInfo.cpu_model}; ${deviceInfo.os_arch})`\n const mem = `Memory/${deviceInfo.machine_memory}mb`\n return [electronStr, nodeStr, os_version, cpu, mem, getBundleVersion()]\n .map(i => i?.trim?.())\n .filter(Boolean)\n .join(' ')\n .trim()\n}\n\nconst CONTEXT = {\n context_nameTracker: \"nodeT\",\n context_platform: deviceInfo.os_platform,\n context_appVersion: getBundleVersion(),\n context_osVersion: deviceInfo.os_version,\n\n context_deviceModel: \"\",\n context_deviceId: machineId(),\n context_package: \"\",\n context_networkType: \"unknow\",\n\n context_matchedPath: \"cli\",\n context_route: \"xhsmp://cli\",\n context_userAgent: getUserAgent(),\n // context_userAgent: \"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/125.0.0.0 Safari/537.36\",\n context_artifactName: \"miniprogram\",\n context_networkQuality: \"UNKNOWN\",\n context_artifactVersion: \"UNKNOWN\",\n context_userId: \"\",\n}\n\nconst ENDPOINT = {\n development: 'https://apm-fe.xiaohongshu.com/api/data',\n production: 'https://apm-fe.xiaohongshu.com/api/data',\n}\n\ninterface ISequence {\n context_sdkSeqId: number\n context_sdkSessionId: string\n context_pageSessionId: string\n clientTime: number\n}\n\ninterface IReqItem {\n suquence: ISequence,\n measurement_name: string,\n measurement_data: Record<string, any>\n}\n\n\nexport class APM {\n // 缓存队列\n private reportQueue: IReqItem[] = []\n\n // 是否允许上报\n private allowReport = false\n\n // 事件序列号\n private eventSeq = 1\n\n private context: any = { ...CONTEXT }\n\n // 通用指标\n private baseData = {}\n\n private logger = new Logger('[apm]: ')\n\n /**\n * @param base // app信息\n */\n setContext(userId: string, base: IBase = {}) {\n this.context = {\n ...this.context,\n context_userId: userId\n }\n this.baseData = base\n this.startReport()\n }\n\n\n private startReport() {\n this.allowReport = true\n this.bactchReport()\n }\n\n private getSequence() {\n return {\n context_sdkSeqId: this.eventSeq++,\n context_sdkSessionId: uuid.v4(),\n context_pageSessionId: uuid.v4(),\n clientTime: Date.now(),\n }\n }\n\n private _request(params: IReqItem | IReqItem[], retry = true) {\n const list = Array.isArray(params) ? params : [params]\n\n const merged = list.map(i => {\n return {\n ...this.context,\n ...i.suquence,\n measurement_name: i.measurement_name,\n measurement_data: {\n // device_info: '',\n ...this.baseData,\n ...i.measurement_data,\n }\n }\n }) \n this.logger?.debug(`apm before send`, `${JSON.stringify(merged)}`, 'warning')\n\n return fetch(ENDPOINT.production, {\n method: 'post',\n body: JSON.stringify(merged),\n headers: {\n \"accept\": \"*/*\",\n \"accept-language\": \"zh-CN,zh;q=0.9\",\n \"batch\": \"true\",\n \"biz-type\": \"apm_fe\",\n \"cache-control\": \"no-cache\",\n \"content-type\": \"application/json\",\n \"pragma\": \"no-cache\",\n }\n })\n .then(res => res.json())\n .then((res) => {\n // @ts-ignore\n if (res?.success) {\n this.logger?.debug('apm send success', '')\n } else {\n // @ts-ignore\n throw new Error(res?.msg)\n }\n }).catch((err) => {\n if (retry) {\n setTimeout(() => this._request(merged, false), 1000)\n }\n this.logger?.log(`apm send failed`, `${err?.message || null}`, 'error')\n })\n }\n \n\n private bactchReport () {\n // 清空缓存队列\n const queue = [...this.reportQueue]\n this.reportQueue = []\n while(queue.length) {\n this._request(queue.splice(0, 5))\n }\n }\n\n private timer: any = null\n\n report(measurement_name: string, measurement_data: IReqItem['measurement_data'] = {}) {\n const params: IReqItem = {\n suquence: this.getSequence(),\n measurement_name,\n measurement_data,\n }\n this.reportQueue.push(params)\n clearTimeout(this.timer)\n if (this.allowReport) {\n // 10条立即上报\n if(this.reportQueue.length >= 10) {\n this.bactchReport()\n } else {\n this.timer = setTimeout(() => {\n this.bactchReport()\n }, 200)\n }\n }\n }\n}\n","export namespace FeatureReporter {\n export enum MODULE {\n appJSON = 'json-app',\n extJSON = 'json-ext',\n componentJSON = 'json-component',\n pageJSON = 'json-page',\n\n ml = 'ml',\n\n thirdFramework = 'third-framework',\n\n developMode = 'develop-mode',\n }\n \n // app.json 中使用的功能\n export enum AppExtJSON {\n pages = 'pages',\n subpackages = 'subpackages',\n subPackages = 'subPackages',\n lazyCodeLoading = 'lazyCodeLoading',\n tabBar = 'tabBar',\n preloadRule = 'preloadRule',\n usingComponents = 'usingComponents',\n extPages = 'extPages', // ext.json 独有\n }\n \n export enum ComponentJSON {\n styleIsolation = \"styleIsolation\", // 组件样式隔离\n componentPlaceholder = 'componentPlaceholder', // 占位组件\n }\n\n export enum PageJSON { \n skeleton = 'skeleton', // 骨架屏\n }\n \n export enum ML {\n WebComponent = 'web-component', // 标签\n // model = 'model', // 双向绑定\n animation = 'animation', // animation 属性\n template = 'template', // template is\n sjs = 'sjs', // sjs 标签\n }\n \n export enum ThirdFramework {\n taroReact = 'taro-react',\n taroVue = 'taro-vue',\n taro = 'taro', // 识别 <template name=\"taro_tmpl\" />\n uniapp3 = 'uniapp3', // 识别 u-p u-i 属性\n uniapp2 = 'uniapp2', // 识别 vue-id vue-slots 属性\n weimeng = 'weimeng', // 识别 data-_key_ data-_pkey_ 属性\n }\n\n // 开发模式\n export enum DevelopMode {\n customDevelopment = 'custom-development', // 定制开发\n templateDevelopment = 'template-development', // 模板开发\n }\n \n export interface IReporter {\n reportThirdFramework: (a: ThirdFramework) => void\n reportDevelopMode: (a: DevelopMode) => void\n\n reportMlFeature: (a: ML) => void\n reportMlWebComponent: (a: string) => void\n\n // 报告 json 配置中使用的功能\n reportComponentJSON: (a: ComponentJSON, value?: unknown) => void\n reportPageJSON: (a: PageJSON, value?: unknown) => void\n reportAppJSON: (a: AppExtJSON, value?: unknown) => void\n reportExtJSON: (a: AppExtJSON, value?: unknown) => void\n }\n}\n","// 文件后缀规则\nexport const CSS_REG = /(?<!\\.skeleton)\\.(wxss|css)$/\n\nexport const SKETCH_CSS_REG = /\\.skeleton\\.(wxss|css)$/\n\nexport const ML_REG = /(?<!\\.skeleton)\\.(xhs|wx)ml$/\n\nexport const SKETCH_ML_REG = /\\.skeleton\\.(xhs|wx)ml$/\n\nexport const SKETCH_NAMESPACE = 'skeleton'\n\nexport const ML_COMMON_EXT = /\\.(xhs|wx)ml$/\n\nexport const ML_OPERATOR = /^(xhs|wx):/","import COS, { UploadBody } from 'cos-nodejs-sdk-v5'\nimport { Response, toHump } from './utils'\nimport {\n UploadTempPermit, UploadResponse, GetToken,\n} from './interface'\n\ninterface IFileInfo {\n name: string\n size: number\n type: string\n}\n\nexport class Uploader {\n // 上传业务,用于和 scene 指定上传云服务的 bucket,需业务方从媒体中台申请\n bizName: string\n\n // 上传场景,用于和 bizName 指定上传云服务的 bucket,需业务方从媒体中台申请\n scene: string\n\n // 获取上传 token 的异步请求\n getToken: GetToken\n\n enableResume?: boolean\n\n constructor(\n args: {\n bizName: string\n scene: string\n getToken: GetToken\n enableResume?: boolean\n },\n ) {\n this.bizName = args.bizName\n this.scene = args.scene\n this.getToken = args.getToken\n this.enableResume = args.enableResume\n }\n\n private useCache = false\n\n get cacheKey(): string {\n return `uploader-permit-${this.scene}-${this.bizName}`\n }\n\n private getCachePermit(file: UploadBody, fileInfo: IFileInfo): UploadTempPermit | null {\n try {\n const fileKey = `${fileInfo.name}-${fileInfo.size}`\n const cacheStr = localStorage.getItem(this.cacheKey)\n if (!cacheStr) return null\n const cacheObj = JSON.parse(cacheStr)\n const tempPermit = cacheObj[fileKey]\n if (!tempPermit) return null\n if (tempPermit.expireTime - 2 * 60 * 1000 < Date.now()) { // 过期(2min buffer)\n this.setCachePermit(file, fileInfo, null)\n return null\n }\n return tempPermit\n } catch (e) {\n localStorage.setItem(this.cacheKey, '')\n return null\n }\n }\n\n private setCachePermit(file: UploadBody, fileInfo: IFileInfo, permit: UploadTempPermit | null): void {\n try {\n const fileKey = `${fileInfo.name}-${fileInfo.size}`\n const cacheStr = localStorage.getItem(this.cacheKey)\n const cacheObj = cacheStr ? JSON.parse(cacheStr) : {}\n cacheObj[fileKey] = permit\n localStorage.setItem(this.cacheKey, JSON.stringify(cacheObj))\n } catch (e) {\n // do nothing\n }\n }\n\n private getPermit(\n file: UploadBody,\n fileInfo: IFileInfo,\n fileFormat?: string,\n persistentOps?: string,\n persistentNotifyUrl?: string,\n ): Promise<UploadTempPermit> {\n if (this.enableResume) {\n const cachePermit = this.getCachePermit(file, fileInfo)\n if (cachePermit) {\n this.useCache = true\n return Promise.resolve(cachePermit)\n }\n }\n this.useCache = false\n return this.getToken(\n {\n bizName: this.bizName,\n scene: this.scene,\n fileCount: 1,\n fileFormat,\n persistentOps,\n persistentNotifyUrl,\n },\n )\n .then(\n ({ uploadTempPermits, uploadLimitPolicy }) => {\n const fileType = fileInfo.type\n const fileSize = fileInfo.size\n\n if (uploadLimitPolicy) {\n const { fileTypes, maxSize } = uploadLimitPolicy\n\n if (\n fileTypes?.length\n && !fileTypes\n .reduce(\n (a: string[], c) => [\n ...a,\n ...c.split('/'),\n ],\n [],\n )\n .some(\n f => fileType.endsWith(f),\n )\n ) {\n throw new Error(`文件类型 ${fileType} 不在可上传的文件类型 ${fileTypes.join(', ')} 中。`)\n }\n\n if (maxSize !== undefined && fileSize > maxSize) {\n throw new Error(`文件尺寸(${fileSize / (1024 * 1024)} mb)超过最大尺寸(${maxSize / (1024 * 1024)} mb)。`)\n }\n }\n\n if (!uploadTempPermits?.length) {\n throw new Error('token 获取失败。')\n }\n const [permit] = uploadTempPermits.sort((a, b) => b.qos - a.qos)\n\n // set cache\n if (this.enableResume) {\n this.setCachePermit(file, fileInfo, permit)\n }\n return permit\n },\n )\n }\n\n post(\n options: Omit<COS.UploadFileParams, 'Bucket' | 'Region' | 'Key'> & {\n Body: UploadBody\n fileInfo: IFileInfo\n fileFormat?: string\n onInstanceCreated?: (instance: COS) => void\n },\n ): Promise<Response<UploadResponse>> {\n const startTime = Date.now()\n const { fileFormat, onInstanceCreated, ...rest } = options\n const res = new Response<UploadResponse>(\n {\n info: {\n fileType: options.fileInfo.type,\n fileSize: options.fileInfo.size,\n startTime,\n },\n },\n )\n\n return this.getPermit(options.Body, options.fileInfo, fileFormat)\n .then(\n permit => {\n res.setInfo({\n ...res.info,\n tokenEndTime: Date.now(),\n })\n const [fileId] = permit.fileIds\n const cosInitParams: COS.COSOptions = {\n Domain: permit.uploadAddr,\n getAuthorization(_, callback) {\n callback({\n TmpSecretId: permit.secretId || 'null',\n TmpSecretKey: permit.secretKey || 'null',\n SecurityToken: permit.token,\n StartTime: Math.floor(startTime / 1000),\n ExpiredTime: Math.floor(permit.expireTime / 1000),\n })\n },\n }\n if (permit.bucket === 'unknown') {\n // @ts-ignore 特殊参数,自建通道时没有 bucket\n cosInitParams.AppId = '1251524319'\n }\n\n const cos = new COS(cosInitParams)\n\n if (onInstanceCreated) {\n onInstanceCreated(cos)\n }\n\n return cos\n .uploadFile(\n {\n Bucket: permit.bucket,\n Region: permit.region,\n Key: fileId,\n ...rest,\n },\n )\n .then(\n resp => {\n const payload: UploadResponse = {\n ...resp,\n bizName: this.bizName,\n scene: this.scene,\n cloudType: permit.cloudType,\n fileId,\n useCache: this.useCache,\n }\n\n if (permit.cdnDomain) {\n const cdnLink = `${permit.cdnDomain}/${fileId}`\n payload.cdnDomain = permit.cdnDomain\n payload.url = cdnLink\n payload.previewUrl = cdnLink\n payload.staticUrl = cdnLink\n }\n\n // 返回所有自定义 header( 'x-ros' 自检服务约定)\n if (resp?.headers) {\n Object.keys(resp.headers).forEach(v => {\n if (v.startsWith('x-ros-')) {\n const key = toHump(v.split('x-ros-')[1])\n // @ts-ignore\n payload[key] = resp.headers?.[v]\n }\n })\n }\n\n const metrics = {\n fileId,\n cloudType: permit.cloudType,\n uploaderAddr: permit.uploadAddr,\n sliceSize: rest.SliceSize || 1048576,\n isSlice: options.fileInfo.size > (rest.SliceSize || 1048576),\n tokenFail: false,\n }\n\n // @ts-ignore\n if (resp?.headers?.['x-tracer']) metrics.tracerId = resp.headers?.['x-tracer']\n\n // 上传成功,清除token缓存\n this.setCachePermit(options.Body, options.fileInfo, null)\n\n return res\n .setData(payload)\n .log(this, metrics)\n },\n )\n .catch(\n (e: COS.CosError) => {\n // 非网络问题类型的失败,清除token缓存\n if (this.enableResume && !e?.message?.includes('network error')) {\n this.setCachePermit(options.Body, options.fileInfo, null)\n }\n return res\n .fail()\n .setCode(Number(e?.code || -1))\n .setMsg(e?.message)\n .log(this, {\n fileId,\n cloudType: permit.cloudType,\n uploaderAddr: permit.uploadAddr,\n sliceSize: rest.SliceSize || 1048576,\n isSlice: options.fileInfo.size > (rest.SliceSize || 1048576),\n tokenFail: false,\n serverFail: true,\n })\n },\n )\n },\n )\n .catch(\n (e: Error) => res\n .fail()\n .setInfo({\n ...res.info,\n tokenEndTime: Date.now(),\n })\n .setMsg(e.message)\n .log(this, {\n tokenFail: true,\n }),\n\n )\n }\n}\n"],"names":["Logger","constructor","prefix","this","verbose","global","setVerbose","info","args","console","chalk","blue","log","debug","yellow","warn","error","red","Response","getLogger","window","eaglet","sendApm","success","code","setCode","setMsg","msg","setData","data","setInfo","fail","uploader","metrics","payload","bizName","scene","customerHost","location","host","routePath","pathname","uploadSuccess","errorMsg","successData","JSON","stringify","fileType","fileSize","startTime","formatDate","endTime","Date","now","tokenStartTime","tokenEndTime","tokenTimestamp","uploadTimestamp","uploadSpeed","logger","push","type","value","bind","noConsole","reportToXray","_a","insight","sendCustomPoint","flushApm","Object","keys","forEach","key","Number","measurement_name","measurement_data","timestamp","toISOString","replace","MP_UPLOAD_INFO","qcloudClient","COS","SecretId","SECRET_ID","SecretKey","SECRET_KEY","Bucket","BUCKET_NAME","APP_ID","generFile","filePath","uuidKey","basename","path","extname","Error","Key","FILE_KEY","Region","REGION","FilePath","deleteExistingFiles","async","files","delFileKeyList","map","deleteMultipleObject","Objects","err","length","Array","isArray","every","file","fs","existsSync","onProgress","Promise","resolve","reject","uploadFiles","SliceSize","speed","guid","darwin","win32","linux","hash","createHash","update","digest","getOsVersion","process","platform","execSync","encoding","trim","_b","os","release","formatCupSpeed","arch","num","toFixed","getDeviceInfo","cpus","cpuInfo","os_platform","toUpperCase","slice","os_arch","cpu_speed","cpu_model","model","machine_memory","Math","round","totalmem","os_version","getBundleVersion","deviceInfo","CONTEXT","context_nameTracker","context_platform","context_appVersion","context_osVersion","context_deviceModel","context_deviceId","result","split","toLowerCase","toString","expose","login_user","userInfo","username","env","node_version","version","machineId","context_package","context_networkType","context_matchedPath","context_route","context_userAgent","versions","electron","i","call","filter","Boolean","join","context_artifactName","context_networkQuality","context_artifactVersion","context_userId","ENDPOINT","FeatureReporter","MODULE","AppExtJSON","ComponentJSON","ML","ThirdFramework","DevelopMode","PageJSON","reportQueue","allowReport","eventSeq","context","baseData","timer","setContext","userId","base","startReport","bactchReport","getSequence","context_sdkSeqId","context_sdkSessionId","uuid","v4","context_pageSessionId","clientTime","_request","params","retry","merged","suquence","fetch","method","body","headers","accept","batch","pragma","then","res","json","catch","setTimeout","message","queue","splice","report","clearTimeout","useCache","getToken","enableResume","cacheKey","getCachePermit","fileInfo","fileKey","name","size","cacheStr","localStorage","getItem","tempPermit","parse","expireTime","setCachePermit","e","setItem","permit","cacheObj","getPermit","fileFormat","persistentOps","persistentNotifyUrl","cachePermit","fileCount","uploadTempPermits","uploadLimitPolicy","fileTypes","maxSize","reduce","a","c","some","f","endsWith","undefined","sort","b","qos","post","options","onInstanceCreated","rest","Body","fileId","fileIds","cosInitParams","Domain","uploadAddr","getAuthorization","_","callback","TmpSecretId","secretId","TmpSecretKey","secretKey","SecurityToken","token","StartTime","floor","ExpiredTime","bucket","AppId","cos","uploadFile","region","resp","cloudType","cdnDomain","cdnLink","url","previewUrl","staticUrl","v","startsWith","letter","uploaderAddr","sliceSize","isSlice","tokenFail","tracerId","includes","serverFail"],"mappings":"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"}
|