UNPKG

@aiot-toolkit/packager

Version:

@aiot-toolkit/packager

3 lines (2 loc) 6.15 kB
"use strict";var _path=_interopRequireDefault(require("path")),_fsExtra=_interopRequireDefault(require("fs-extra")),_aaptjs=_interopRequireDefault(require("@hap-toolkit/aaptjs")),_glob=_interopRequireDefault(require("glob")),_eventBus=_interopRequireDefault(require("@aiot-toolkit/shared-utils/event-bus")),_sharedUtils=require("@aiot-toolkit/shared-utils"),_compilationConfig=require("@aiot-toolkit/shared-utils/compilation-config"),_info=require("../common/info"),_shared=require("../common/shared"),_imageBin=_interopRequireDefault(require("@aiot-toolkit/compiler/lib/imageBin"));function _interopRequireDefault(e){return e&&e.__esModule?e:{default:e}}const{PACKAGER_BUILD_DONE:PACKAGER_BUILD_DONE}=_eventBus.default,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",".vue",".css",".less",".sass",".styl",".html",".json",".md"]),EXT_PATTERN=FILE_EXT_NORES.map((e=>"*"+e)).join("|");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 i=[];return _fsExtra.default.existsSync(t)&&(i=[t]),i}function getSpecifiedJSONFiles(e,t){let i=[];return t.map((t=>{const{directoryName:o,onlyRoot:n=!1}=t,s=_path.default.join(e,o),a=n?"*.json":"**/**.json";_fsExtra.default.existsSync(s)&&(i=i.concat(getFiles(a,s)))})),i}function minifyJson(e,t){try{const i=_fsExtra.default.readFileSync(e,"utf8"),o=JSON.parse(i),n=JSON.stringify(o);_fsExtra.default.writeFileSync(t,n)}catch(t){_sharedUtils.colorconsole.error(`### App Loader ### ${(0,_sharedUtils.relateCwd)(e)} file compression and copy failed`,t.message)}}function minifySpecifiedJSONFiles(e,t){t.map((t=>{const{directoryName:i,onlyRoot:o=!1}=t,n=_path.default.join(e,i),s=o?"*.json":"**/**.json";if(_fsExtra.default.existsSync(n)){getFiles(s,n).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 copyFilePromise(e,t){return _fsExtra.default.copy(e,t).catch((i=>{throw _sharedUtils.colorconsole.error(`Failed to copy file ${e} -> ${t}`),i}))}async function compressImages(e,t){const{enableImagePng8:i,enableImageBin:o}=_compilationConfig.compileOptionsObject,n=_path.default.dirname(t);return o?(compressImagesToBin(e,n),copyFilePromise(e,t)):i&&_imageBin.default.canTranslate(e,"png")?(new _imageBin.default).translate(e,n,"png"):copyFilePromise(e,t)}function compressImagesToBin(e,t){_imageBin.default.canTranslate(e)&&(new _imageBin.default).translate(e,t)}function ResourcePlugin(e){this.options=e}function isEncoded9Png(e){const t=_fsExtra.default.readFileSync(e);return"npTc"===t.slice(37,41).toString()||"npOl"===t.slice(37,41).toString()}ResourcePlugin.prototype.apply=function(e){const t=this.options,i=e.options;e.hooks.watchRun.tapAsync("ResourcePlugin",(function(e,t){Object.keys(i.entry).forEach((function(e){const t=i.entry[e];t instanceof Array&&!/app\.js/.test(e)&&-1!==t[0].indexOf("webpack-dev-server")&&t.shift()})),t()})),e.hooks.emit.tapAsync("ResourcePlugin",(function(e,i){const o=t.src,n=t.dest;let s,a,r=getFiles(`**/+(!(${EXT_PATTERN})|manifest.json|sitemap.json)`,o);r=r.concat(getSpecifiedJSONFiles(o,JSON_DIRECTORY_NEED_PACKAGING),getSkeletonConfigFile(o));try{const e=_path.default.join(o,"manifest.json"),t=(0,_sharedUtils.readJson)(e);s=t.icon,a=t.banner,s=_path.default.join(o,s),a&&(a=_path.default.join(o,a))}catch(e){s="",a=""}let l=r.map((e=>({srcFile:e,destFile:_path.default.resolve(n,_path.default.relative(o,e))})));const{projectRoot:c}=t,f=_path.default.join(c,"node_modules"),u=_compilationConfig.compileOptionsObject.enableMirtos?new Set(e.depFiles||[]):e.fileDependencies;for(let e of u){const t=_path.default.extname(e);e.indexOf(f)>-1&&-1===FILE_EXT_NORES.indexOf(t)&&-1===r.indexOf(e)&&t&&l.push({srcFile:e,destFile:_path.default.resolve(n,_path.default.relative(c,e))})}l=l.filter((e=>{const{srcFile:i}=e;return!t.optimizeUnusedResource||(u.has(i)||i===s||a&&i===a||"manifest.json"===_path.default.relative(o,i))}));const d=l.map((e=>{const{srcFile:t,destFile:i}=e;_fsExtra.default.mkdirSync(_path.default.dirname(i),{recursive:!0});return _compilationConfig.compileOptionsObject.trimDotnine&&/.+\.9\.png$/.test(t)&&!isEncoded9Png(t)?_aaptjs.default.singleCrunch(t,i).catch((e=>{e&&_sharedUtils.colorconsole.error(`aaptjs failed to trim file ${(0,_sharedUtils.relateCwd)(t)}${e.message}`)})):compressImages(t,i)}));Promise.all(d).then((()=>{if(e.errors.length){const t=e.errors.map((e=>e.message)).join("/n");_sharedUtils.logger.add(t)}_eventBus.default.emit(PACKAGER_BUILD_DONE),i()}),(e=>{throw _sharedUtils.colorconsole.log("ERROR: Error copying files",e),e}))})),e.hooks.emit.tapAsync("ResourcePlugin",((e,i)=>{const o=t.src,n=t.dest,s=_path.default.join(o,"manifest.json"),a=_path.default.join(n,"manifest.json"),r=_fsExtra.default.existsSync(s);if(minifySpecifiedJSONFiles(n,JSON_DIRECTORY_NEED_PACKAGING),minifySitemap(n),minifySkeletonConfig(n),r){let o;try{o=(0,_sharedUtils.readJson)(s)}catch(t){return e.errors.push(t),void i()}const{configDebugInManifest:n}=t;-1===[!0,!1].indexOf(n)&&(_sharedUtils.colorconsole.error(`### App Loader ### The parameter configDebugInManifest must be a boolean value:${n}`),i()),o=(0,_shared.updateManifest)(o,n),o.packageInfo=JSON.parse(this.options.comment),o.minAPILevel||(o.minAPILevel=1);const r=JSON.stringify(o,null,n?2:0);_fsExtra.default.writeFile(a,r,"utf8",(e=>{e&&_sharedUtils.colorconsole.error("### App Loader ### Failed to update %s:%s",(0,_sharedUtils.relateCwd)(s),e.message),i()}))}else _sharedUtils.colorconsole.error("### App Loader ### No manifest.json file under %s",(0,_sharedUtils.relateCwd)(o)),i()}))},module.exports=ResourcePlugin; //# sourceMappingURL=resource-plugin.js.map