UNPKG

@hap-toolkit/packager

Version:

@hap-toolkit/packager

3 lines (2 loc) 6.7 kB
"use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.ResourcePlugin=ResourcePlugin;var _flat=_interopRequireDefault(require("flat")),_path=_interopRequireDefault(require("path")),_fsExtra=_interopRequireDefault(require("fs-extra")),_aaptjs=_interopRequireDefault(require("@hap-toolkit/aaptjs")),_glob=_interopRequireDefault(require("glob")),_sharedUtils=require("@hap-toolkit/shared-utils"),_info=require("../common/info"),_shared=require("../common/shared");function _interopRequireDefault(e){return e&&e.__esModule?e:{default:e}}const{PACKAGER_BUILD_DONE:PACKAGER_BUILD_DONE}=_sharedUtils.eventBus,I18N_DIRECTORY="i18n",LOTTIE_DIRECTORY="lottie",JSON_DIRECTORY_NEED_PACKAGING=[{directoryName:"i18n",onlyRoot:!0},{directoryName:"lottie",onlyRoot:!1}],FILE_EXT_LIST=_info.name.extList,FILE_EXT_NORES=FILE_EXT_LIST.concat([".js",".jsx",".coffee",".ts",".tsx",".css",".less",".sass",".styl",".html",".json",".md"]),EXT_PATTERN=FILE_EXT_NORES.map((e=>"*"+e)).join("|"),NODE_MODULES="node_modules";function getFiles(e,t){return _glob.default.sync(e,{nodir:!0,cwd:t,ignore:["**/Thumbs.db"],absolute:!0})}function getSkeletonConfigFile(e){const t=_path.default.join(e,"skeleton/config.json");let s=[];return _fsExtra.default.existsSync(t)&&(s=[t]),s}function getSpecifiedJSONFiles(e,t){let s=[];return t.map((t=>{const{directoryName:o,onlyRoot:i=!1}=t,n=_path.default.join(e,o),a=i?"*.json":"**/**.json";_fsExtra.default.existsSync(n)&&(s=s.concat(getFiles(a,n)))})),s}function getWidgetJSONFiles(e,t){let s={};try{const t=_path.default.join(e,"manifest.json"),o=(0,_sharedUtils.readJson)(t);s=(null==o?void 0:o.router.widgets)||{}}catch(e){console.error(e)}let o=[];for(let i in s){s[i].path||(s[i].path=i);const n=s[i].path;t.map((t=>{const{directoryName:s,onlyRoot:i=!1}=t,a=_path.default.join(e,n,s);if(_fsExtra.default.existsSync(a)){const e=i?"*.json":"**/**.json";o=o.concat(getFiles(e,a))}}))}return o}function minifyWidgetJSONFiles(e,t){let s={};try{const t=_path.default.join(e,"manifest.json"),o=(0,_sharedUtils.readJson)(t);s=(null==o?void 0:o.router.widgets)||{}}catch(e){console.error(e)}let o=[];for(let i in s){s[i].path||(s[i].path=i);const n=s[i].path;t.map((t=>{const{directoryName:a,onlyRoot:r=!1}=t,l=_path.default.join(e,n,a),f="i18n"===a&&("lite"===s[i].type||s[i].minCardPlatformVersion&&s[i].minCardPlatformVersion>=2e3);if(_fsExtra.default.existsSync(l)){getFiles(r?"*.json":"**/**.json",l).forEach((e=>{o.push(e),minifyJson(e,e,f)}))}}))}}function minifyJson(e,t,s){try{const o=_fsExtra.default.readFileSync(e,"utf8");let i=JSON.parse(o);s&&(i=_flat.default.flatten(i));const n=JSON.stringify(i);_fsExtra.default.writeFileSync(t,n)}catch(t){_sharedUtils.colorconsole.error(`### App Loader ### ${(0,_sharedUtils.relateCwd)(e)} 文件 压缩拷贝失败`,t.message)}}function minifySpecifiedJSONFiles(e,t){t.map((t=>{const{directoryName:s,onlyRoot:o=!1}=t,i=_path.default.join(e,s),n=o?"*.json":"**/**.json";if(_fsExtra.default.existsSync(i)){getFiles(n,i).forEach((e=>{minifyJson(e,e)}))}}))}function minifySitemap(e){const t=_path.default.join(e,"sitemap.json");_fsExtra.default.existsSync(t)&&minifyJson(t,t)}function minifySkeletonConfig(e){const t=_path.default.join(e,"skeleton/config.json");_fsExtra.default.existsSync(t)&&minifyJson(t,t)}function ResourcePlugin(e){this.options=e}ResourcePlugin.prototype.apply=function(e){const t=this.options,s=e.options;e.hooks.watchRun.tapAsync("ResourcePlugin",(function(e,t){Object.keys(s.entry).forEach((function(e){_sharedUtils.globalConfig.changedJS={};const t=s.entry[e];t instanceof Array&&!/app\.js/.test(e)&&-1!==t[0].indexOf("webpack-dev-server")&&t.shift()})),t()}));let o=!1;e.hooks.emit.tapAsync("ResourcePlugin",(function(e,s){if(o)return void setTimeout((()=>{_sharedUtils.eventBus.emit(PACKAGER_BUILD_DONE),s()}),0);o=!0;const i=t.src,n=t.dest;let a,r,l=getFiles(`**/+(!(${EXT_PATTERN})|manifest.json|sitemap.json)`,i);l=l.concat(getSpecifiedJSONFiles(i,JSON_DIRECTORY_NEED_PACKAGING),getWidgetJSONFiles(i,JSON_DIRECTORY_NEED_PACKAGING),getSkeletonConfigFile(i));try{const e=_path.default.join(i,"manifest.json"),t=(0,_sharedUtils.readJson)(e);a=t.icon,r=t.banner,a=_path.default.join(i,a),r&&(r=_path.default.join(i,r))}catch(e){a="",r=""}let f=l.map((e=>({srcFile:e,destFile:_path.default.resolve(n,_path.default.relative(i,e))})));const{projectRoot:c}=t,d=_path.default.join(c,NODE_MODULES),u=e.fileDependencies;for(let e of u){const t=_path.default.extname(e);if(e.indexOf(NODE_MODULES)>-1&&-1===FILE_EXT_NORES.indexOf(t)&&-1===l.indexOf(e)&&t){let t=_path.default.resolve(n,_path.default.relative(c,e));if(e.indexOf(d)<0){t=e.replace("src","build");const s=e.indexOf(NODE_MODULES);e=_path.default.join(c,e.slice(s))}f.push({srcFile:e,destFile:t})}}f=f.filter((e=>{const{srcFile:s}=e;return!t.optimizeUnusedResource||(u.has(s)||s===a||r&&s===r||"manifest.json"===_path.default.relative(i,s))}));const _=f.map((e=>new Promise(((t,s)=>{const{srcFile:o,destFile:i}=e;_fsExtra.default.mkdirp(_path.default.dirname(i),(()=>{let e;e=/.+\.9\.png$/.test(o)&&_sharedUtils.compileOptionsObject.trimDotnine?_aaptjs.default.singleCrunch(o,i).catch((e=>{e&&_sharedUtils.colorconsole.log(`复制文件 ${(0,_sharedUtils.relateCwd)(o)} 失败:${e.message}`)})):_fsExtra.default.copy(o,i).catch((e=>{throw _sharedUtils.colorconsole.log(`复制 ${o} -> ${i} 失败`),e})),e.then(t,s)}))}))));Promise.all(_).then((()=>{if(e.errors.length){const t=e.errors.map((e=>e.message)).join("/n");_sharedUtils.logger.add(t)}_sharedUtils.eventBus.emit(PACKAGER_BUILD_DONE),s()}),(e=>{throw _sharedUtils.colorconsole.log("ERROR: 拷贝文件出现错误",e),e}))})),e.hooks.emit.tapAsync("ResourcePlugin",((e,s)=>{const o=t.src,i=t.dest,n=_path.default.join(o,"manifest.json"),a=_path.default.join(i,"manifest.json"),r=_fsExtra.default.existsSync(n);if(minifySpecifiedJSONFiles(i,JSON_DIRECTORY_NEED_PACKAGING),minifyWidgetJSONFiles(i,JSON_DIRECTORY_NEED_PACKAGING),minifySitemap(i),minifySkeletonConfig(i),r){let o;try{o=(0,_sharedUtils.readJson)(n)}catch(t){return e.errors.push(t),void s()}const{configDebugInManifest:i}=t;-1===[!0,!1].indexOf(i)&&(_sharedUtils.colorconsole.error(`### App Loader ### 参数configDebugInManifest必须为布尔值:${i}`),s()),o=(0,_shared.updateManifest)(o,i),o.packageInfo=JSON.parse(this.options.comment);const r=JSON.stringify(o,null,i?2:0);_fsExtra.default.writeFile(a,r,"utf8",(e=>{e&&_sharedUtils.colorconsole.error("### App Loader ### 更新 %s 失败:%s",(0,_sharedUtils.relateCwd)(n),e.message),s()}))}else _sharedUtils.colorconsole.error("### App Loader ### %s 下无 manifest.json 文件",(0,_sharedUtils.relateCwd)(o)),s()}))}; //# sourceMappingURL=resource-plugin.js.map