UNPKG

@hap-toolkit/packager

Version:

@hap-toolkit/packager

3 lines (2 loc) 3.89 kB
"use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.WidgetFingerprintPlugin=void 0;var _fsExtra=_interopRequireDefault(require("fs-extra")),_path=_interopRequireDefault(require("path")),_utils=require("../common/utils"),_sharedUtils=require("@hap-toolkit/shared-utils"),_constant=require("../common/constant");function _interopRequireDefault(t){return t&&t.__esModule?t:{default:t}}const MANIFEST_PATH="manifest.json",EXCLUDE_FILE_EXTS=[".ux",".vue",".jsx",".tsx",".js",".ts",".css",".less",".scss",".sass",""],EXCLUDE_FILES=["manifest.json","sitemap.json"],APP="app";class WidgetFingerprintPlugin{constructor(t={}){this.options=t||{}}apply(t){t.hooks.done.tap("WidgetFingerprintPlugin",(({compilation:t})=>{const e=this.options,s=e.pathSrc;let i,n;if(i=_fsExtra.default.pathExistsSync(_path.default.join(s,"manifest-phone.json"))?_path.default.join(s,"manifest-phone.json"):_path.default.join(s,MANIFEST_PATH),_fsExtra.default.pathExistsSync(i)){n=_fsExtra.default.readFileSync(i,"utf8");const t=JSON.parse(n),{package:s,versionCode:a,versionName:r,router:o}=t;e.name=s,e.versionName=r,e.versionCode=a,e.widgets=o.widgets||{}}const a=e.widgets||{},r={},o=Object.keys(a)||{},u=o.map((t=>{const e=a[t],s=_path.default.join(t,e.component);return r[s]=t,s})),l=this.calculateAllAssetsDigest(s,s,{},o),c={};for(const e of t.chunks){const i=e.name;if(u.indexOf(i)>=0){const a={};this.getModuleDigestFromChunk(t,e,a,s);const o=r[i];this.updateDigest(t,o,a,l,n)}else this.getModuleDigestFromChunk(t,e,c,s)}this.updateDigest(t,APP,c,l,n)}))}updateDigest(t,e,s,i,n){const a=i[e]||{};Object.assign(s,a),s[MANIFEST_PATH]=this.getManifestDigest(e,n);const r=Object.keys(s).sort();let o="";r.forEach((t=>{o+=`${t}:${s[t]};`}));const u=(0,_sharedUtils.calcDataDigest)(Buffer.from(o,"utf-8")).toString("hex"),{_widgetDigestMap:l={}}=t;e===APP?l[`app:${e}`]=u:l[`widget:${e}`]=u,t._widgetDigestMap||(t._widgetDigestMap=l)}getModuleDigestFromChunk(t,e,s,i){for(const n of t.chunkGraph.getChunkModules(e)){const{_source:t,request:e}=n;if(!e)continue;const a=e.replace(/\\/g,"/"),r=(0,_utils.getLastLoaderPath)(a);if(r===_constant.LOADER_PATH_UX.path||r===_constant.LOADER_PATH_APP.path||r===_constant.LOADER_PATH_DEVICETYPE.path)continue;const{absPath:o}=this.parseABSPath(a,i),{_valueAsString:u,_valueAsBuffer:l}=t||{},c=u||(null==l?void 0:l.toString())||"";let f="";if(""!==c){f=(0,_sharedUtils.calcDataDigest)(Buffer.from(c,"utf-8")).toString("hex")}s[o]=f}}parseABSPath(t,e){if(!t)return null;const s=t.split("!"),i=s[s.length-1];if(i){let s="";const n=(0,_utils.getLastLoaderPath)(t);if(n){const t=_constant.LOADER_INFO_LIST.find((t=>t.path===n));s=t&&t.type||""}const a=i.split("?")[0];if(0===a.indexOf(e)){return{absPath:`${a.substring(e.length)}${s&&"?"}${s}`,type:s}}}return{absPath:t,type:""}}getManifestDigest(t,e){if(!t||!e)return(new Date).getTime();const s=JSON.parse(e);s.versionName="",s.versionCode="",s["template/official"]="",t===APP?s.router.widgets&&(s.router.widgets=""):(s.router.entry="",s.router.pages&&(s.router.pages=""),s.router.widgets={[t]:s.router.widgets[t]});const i=JSON.stringify(s);return(0,_sharedUtils.calcDataDigest)(Buffer.from(i,"utf-8")).toString("hex")}calculateAllAssetsDigest(t,e,s,i){const n=_fsExtra.default.readdirSync(t);for(let a=0;a<n.length;a++){let r=_path.default.join(t,n[a]);if(_fsExtra.default.statSync(r).isDirectory())this.calculateAllAssetsDigest(r,e,s,i);else{const t=_path.default.extname(r);if(EXCLUDE_FILE_EXTS.includes(t))continue;const n=_path.default.relative(e,r);if(EXCLUDE_FILES.includes(n))continue;const a=(0,_sharedUtils.calcDataDigest)(_fsExtra.default.readFileSync(r)).toString("hex"),o=i.find((t=>n.startsWith(t+"/")));o?(s[o]||(s[o]={}),s[o][n]=a):(s[APP]||(s[APP]={}),s[APP][n]=a)}}return s}}exports.WidgetFingerprintPlugin=WidgetFingerprintPlugin; //# sourceMappingURL=widget-fingerprint-plugin.js.map