@hap-toolkit/server 1.9.10 → 1.9.11-beta

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.
@@ -1,2 +1,2 @@
1
- "use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.default=void 0;var _path=_interopRequireDefault(require("path"));function _interopRequireDefault(e){return e&&e.__esModule?e:{default:e}}const pathToolkit=_path.default.resolve(__dirname,"../../..");var _default={defaults:{pathToolkit:pathToolkit},options:{moduleList:[]}};exports.default=_default;
1
+ "use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.default=void 0;var _path=_interopRequireDefault(require("@jayfate/path"));function _interopRequireDefault(e){return e&&e.__esModule?e:{default:e}}const pathToolkit=_path.default.resolve(__dirname,"../../..");var _default={defaults:{pathToolkit:pathToolkit},options:{moduleList:[]}};exports.default=_default;
2
2
  //# sourceMappingURL=index.js.map
@@ -1,2 +1,2 @@
1
- "use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.default=createPreview;var _path=_interopRequireDefault(require("path")),_koa=_interopRequireDefault(require("koa")),_koaMount=_interopRequireDefault(require("koa-mount")),_koaStatic=_interopRequireDefault(require("koa-static")),_createRouter=_interopRequireDefault(require("./create-router")),_shared=require("./shared");function _interopRequireDefault(e){return e&&e.__esModule?e:{default:e}}async function createPreview(e){const t=new _koa.default,r=_path.default.resolve(__dirname,"./static"),a=_path.default.resolve(__dirname,"./views/404.html");t.use((0,_koaMount.default)("/preview-static",(0,_koaStatic.default)(r))),t.use((async(e,t)=>{try{await t()}catch(t){console.error("CreatePreview Error :",t),e.status=404,e.type="text/html",e.body=await(0,_shared.renderPage)(a,{message:""})}}));const u=await(0,_createRouter.default)(e);return t.use((0,_koaMount.default)("/preview",u.routes(),u.allowedMethods())),t}
1
+ "use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.default=createPreview;var _path=_interopRequireDefault(require("@jayfate/path")),_koa=_interopRequireDefault(require("koa")),_koaMount=_interopRequireDefault(require("koa-mount")),_koaStatic=_interopRequireDefault(require("koa-static")),_createRouter=_interopRequireDefault(require("./create-router")),_shared=require("./shared");function _interopRequireDefault(e){return e&&e.__esModule?e:{default:e}}async function createPreview(e){const t=new _koa.default,r=_path.default.resolve(__dirname,"./static"),a=_path.default.resolve(__dirname,"./views/404.html");t.use((0,_koaMount.default)("/preview-static",(0,_koaStatic.default)(r))),t.use((async(e,t)=>{try{await t()}catch(t){console.error("CreatePreview Error :",t),e.status=404,e.type="text/html",e.body=await(0,_shared.renderPage)(a,{message:""})}}));const u=await(0,_createRouter.default)(e);return t.use((0,_koaMount.default)("/preview",u.routes(),u.allowedMethods())),t}
2
2
  //# sourceMappingURL=create-preview.js.map
@@ -1,2 +1,2 @@
1
- "use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.default=createRouter;var _fs=_interopRequireDefault(require("fs")),_path=_interopRequireDefault(require("path")),_stream=require("stream"),_util=_interopRequireDefault(require("util")),_koaRouter=_interopRequireDefault(require("koa-router")),_koaSend=_interopRequireDefault(require("koa-send")),_jszip=_interopRequireDefault(require("jszip")),_sharedUtils=require("@hap-toolkit/shared-utils"),_eventBus=_interopRequireDefault(require("@hap-toolkit/shared-utils/event-bus")),_shared=require("./shared");function _interopRequireDefault(e){return e&&e.__esModule?e:{default:e}}const{PACKAGER_BUILD_DONE:PACKAGER_BUILD_DONE,PACKAGER_WATCH_START:PACKAGER_WATCH_START,PACKAGER_BUILD_PROGRESS:PACKAGER_BUILD_PROGRESS}=_eventBus.default,allowFiles=["sitemap.json","app-chunks.json","page-chunks.json"];function genWebJsUrl(e){return`https://statres.quickapp.cn/quickapp/ide/web${e=e?"-"+e:""}.js`}function jsonParse(e){try{return JSON.parse(e)}catch(e){console.error("Json Parse Error :",e)}}async function createRouter(e){const t=_util.default.debuglog("server.render"),r=new _koaRouter.default;let s=!1;t("preview target",e);_fs.default.existsSync(e)&&(s=_fs.default.lstatSync(e).isFile());const n=_util.default.promisify(_fs.default.readFile),a=_path.default.resolve(__dirname,"./views/page.html"),i=_path.default.resolve(__dirname,"./views/404.html"),o=new Map;let u,l,f;if(s){const t=await n(e);f=await _jszip.default.loadAsync(t),u=async function(){const t=f.file("manifest.json");if(!t)throw new _sharedUtils.KnownError(`从 ${e} 读取 manifest.json 失败!`);return t.async("string").then(jsonParse)},l=function(e){return null!==f.file(e)}}else{const t=_path.default.resolve(e,"manifest.json");u=async function(){let r,s=o.get(t);if(s&&Date.now()-s.timestamp<2e3)r=s.payload;else{if(!_fs.default.existsSync(e))throw new _sharedUtils.KnownError("找不到 build 目录");if(!_fs.default.existsSync(t))throw new _sharedUtils.KnownError("找不到 build 目录下的 manifest.json");r=jsonParse(await n(t)),o.set(t,{timestamp:Date.now(),payload:r})}return r},l=function(t){return _fs.default.existsSync(_path.default.resolve(e,t))}}return r.get("/__stream",(async function(e){const t=new _stream.PassThrough;function r(){e.req.destroyed||(t.write("event: watch\n"),t.write("data: ''\n\n"))}function s(r){e.req.destroyed||(t.write("event: progress\n"),t.write(`data: ${JSON.stringify(r)}\n\n`))}function n(){if(!e.req.destroyed){const e=_sharedUtils.logger.get(),r=(0,_sharedUtils.getLaunchPage)(),s={error:escape((0,_shared.removeAnsiColor)(e)),page:r};t.write("event: reload\n"),t.write(`data: ${JSON.stringify(s)}\n\n`)}}function a(){e.res.end(),t.end(),_eventBus.default.off&&(_eventBus.default.off(PACKAGER_WATCH_START,r),_eventBus.default.off(PACKAGER_BUILD_PROGRESS,s),_eventBus.default.off(PACKAGER_BUILD_DONE,n))}_eventBus.default.on(PACKAGER_WATCH_START,r),_eventBus.default.on(PACKAGER_BUILD_PROGRESS,s),_eventBus.default.on(PACKAGER_BUILD_DONE,n),e.req.on("close",a),e.req.on("finish",a),e.req.on("error",a),e.type="text/event-stream",e.res.connection.setTimeout(0),t.write("event: start\n"),t.write("data: waing for signal\n\n"),e.body=t})),r.get("/",(async function(e,r){const s=await u();if(s&&s.router&&s.router.entry){t("preview home","entry",s.router.entry);const r=(0,_sharedUtils.getLaunchPage)()||s.router.entry;e.redirect(`/preview/${r}`)}else await r()})),r.get("/*",(async function(e,r){const s=await u(),n=await async function(e){let t={};if(e&&e.router&&e.router.pages){const r=e.router.pages;Object.keys(r).forEach((e=>{const s=(0,_shared.trimSlash)(e),n=(0,_shared.trimSlash)(r[e].component);t[s]=`${e}/${n}.js`}))}else new _sharedUtils.KnownError("未配置页面路由信息").__KNOWN=!0;return t}(s),o=Object.keys(n);let f=(0,_shared.trimSlash)(e.path);if(t("requestRoute",f,e.appRoutes),o.indexOf(f)>-1){const t=n[f],r=await(0,_shared.renderPage)(a,{title:s.name,routeName:f,routes:JSON.stringify(n),script:t,scriptNotFound:!l(t),webJsUrl:genWebJsUrl(e.conf.options.webVersion)});e.type="text/html",e.body=r}else if(await r(),404===e.status){if(f.endsWith(".js"))e.type="text/javascript",e.body=`/* 404 */console.log(new Error('找不到 ${f}'))`;else{const t=await(0,_shared.renderPage)(i,{message:`找不到 /preview/${f}`});e.type="text/html",e.body=t}e.status=404}})),s?r.get("/*",(async function(e,t){let r=(0,_shared.trimSlash)(e.path);const s=f.file(r);if(allowFiles.includes(r))return e.status=200,void(s&&(e.body=await s.nodeStream()));s?e.body=await s.nodeStream():(e.status=404,await t())})):r.get("/*",(async function(t,r){let s=(0,_shared.trimSlash)(t.path);if(allowFiles.includes(s)){const r=_path.default.join(e,s);if(_fs.default.existsSync(r))try{const e=require(r);t.type="json",t.body=e}catch(e){}t.status=200}else try{await(0,_koaSend.default)(t,s,{root:e})}catch(e){if(404!==e.status)throw console.error("Build Static File Error",e),e;await r()}})),r}
1
+ "use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.default=createRouter;var _fs=_interopRequireDefault(require("fs")),_path=_interopRequireDefault(require("@jayfate/path")),_stream=require("stream"),_util=_interopRequireDefault(require("util")),_koaRouter=_interopRequireDefault(require("koa-router")),_koaSend=_interopRequireDefault(require("koa-send")),_jszip=_interopRequireDefault(require("jszip")),_sharedUtils=require("@hap-toolkit/shared-utils"),_eventBus=_interopRequireDefault(require("@hap-toolkit/shared-utils/event-bus")),_shared=require("./shared");function _interopRequireDefault(e){return e&&e.__esModule?e:{default:e}}const{PACKAGER_BUILD_DONE:PACKAGER_BUILD_DONE,PACKAGER_WATCH_START:PACKAGER_WATCH_START,PACKAGER_BUILD_PROGRESS:PACKAGER_BUILD_PROGRESS}=_eventBus.default,allowFiles=["sitemap.json","app-chunks.json","page-chunks.json"];function genWebJsUrl(e){return`https://statres.quickapp.cn/quickapp/ide/web${e=e?"-"+e:""}.js`}function jsonParse(e){try{return JSON.parse(e)}catch(e){console.error("Json Parse Error :",e)}}async function createRouter(e){const t=_util.default.debuglog("server.render"),r=new _koaRouter.default;let s=!1;t("preview target",e);_fs.default.existsSync(e)&&(s=_fs.default.lstatSync(e).isFile());const n=_util.default.promisify(_fs.default.readFile),a=_path.default.resolve(__dirname,"./views/page.html"),i=_path.default.resolve(__dirname,"./views/404.html"),o=new Map;let u,l,f;if(s){const t=await n(e);f=await _jszip.default.loadAsync(t),u=async function(){const t=f.file("manifest.json");if(!t)throw new _sharedUtils.KnownError(`从 ${e} 读取 manifest.json 失败!`);return t.async("string").then(jsonParse)},l=function(e){return null!==f.file(e)}}else{const t=_path.default.resolve(e,"manifest.json");u=async function(){let r,s=o.get(t);if(s&&Date.now()-s.timestamp<2e3)r=s.payload;else{if(!_fs.default.existsSync(e))throw new _sharedUtils.KnownError("找不到 build 目录");if(!_fs.default.existsSync(t))throw new _sharedUtils.KnownError("找不到 build 目录下的 manifest.json");r=jsonParse(await n(t)),o.set(t,{timestamp:Date.now(),payload:r})}return r},l=function(t){return _fs.default.existsSync(_path.default.resolve(e,t))}}return r.get("/__stream",(async function(e){const t=new _stream.PassThrough;function r(){e.req.destroyed||(t.write("event: watch\n"),t.write("data: ''\n\n"))}function s(r){e.req.destroyed||(t.write("event: progress\n"),t.write(`data: ${JSON.stringify(r)}\n\n`))}function n(){if(!e.req.destroyed){const e=_sharedUtils.logger.get(),r=(0,_sharedUtils.getLaunchPage)(),s={error:escape((0,_shared.removeAnsiColor)(e)),page:r};t.write("event: reload\n"),t.write(`data: ${JSON.stringify(s)}\n\n`)}}function a(){e.res.end(),t.end(),_eventBus.default.off&&(_eventBus.default.off(PACKAGER_WATCH_START,r),_eventBus.default.off(PACKAGER_BUILD_PROGRESS,s),_eventBus.default.off(PACKAGER_BUILD_DONE,n))}_eventBus.default.on(PACKAGER_WATCH_START,r),_eventBus.default.on(PACKAGER_BUILD_PROGRESS,s),_eventBus.default.on(PACKAGER_BUILD_DONE,n),e.req.on("close",a),e.req.on("finish",a),e.req.on("error",a),e.type="text/event-stream",e.res.connection.setTimeout(0),t.write("event: start\n"),t.write("data: waing for signal\n\n"),e.body=t})),r.get("/",(async function(e,r){const s=await u();if(s&&s.router&&s.router.entry){t("preview home","entry",s.router.entry);const r=(0,_sharedUtils.getLaunchPage)()||s.router.entry;e.redirect(`/preview/${r}`)}else await r()})),r.get("/*",(async function(e,r){const s=await u(),n=await async function(e){let t={};if(e&&e.router&&e.router.pages){const r=e.router.pages;Object.keys(r).forEach((e=>{const s=(0,_shared.trimSlash)(e),n=(0,_shared.trimSlash)(r[e].component);t[s]=`${e}/${n}.js`}))}else new _sharedUtils.KnownError("未配置页面路由信息").__KNOWN=!0;return t}(s),o=Object.keys(n);let f=(0,_shared.trimSlash)(e.path);if(t("requestRoute",f,e.appRoutes),o.indexOf(f)>-1){const t=n[f],r=await(0,_shared.renderPage)(a,{title:s.name,routeName:f,routes:JSON.stringify(n),script:t,scriptNotFound:!l(t),webJsUrl:genWebJsUrl(e.conf.options.webVersion)});e.type="text/html",e.body=r}else if(await r(),404===e.status){if(f.endsWith(".js"))e.type="text/javascript",e.body=`/* 404 */console.log(new Error('找不到 ${f}'))`;else{const t=await(0,_shared.renderPage)(i,{message:`找不到 /preview/${f}`});e.type="text/html",e.body=t}e.status=404}})),s?r.get("/*",(async function(e,t){let r=(0,_shared.trimSlash)(e.path);const s=f.file(r);if(allowFiles.includes(r))return e.status=200,void(s&&(e.body=await s.nodeStream()));s?e.body=await s.nodeStream():(e.status=404,await t())})):r.get("/*",(async function(t,r){let s=(0,_shared.trimSlash)(t.path);if(allowFiles.includes(s)){const r=_path.default.join(e,s);if(_fs.default.existsSync(r))try{const e=require(r);t.type="json",t.body=e}catch(e){}t.status=200}else try{await(0,_koaSend.default)(t,s,{root:e})}catch(e){if(404!==e.status)throw console.error("Build Static File Error",e),e;await r()}})),r}
2
2
  //# sourceMappingURL=create-router.js.map
@@ -1,2 +1,2 @@
1
- "use strict";var _path=_interopRequireDefault(require("path")),_koaMount=_interopRequireDefault(require("koa-mount")),_config=_interopRequireDefault(require("@hap-toolkit/shared-utils/config")),_createPreview=_interopRequireDefault(require("./create-preview"));function _interopRequireDefault(e){return e&&e.__esModule?e:{default:e}}async function beforeStart(e,t){const r=_path.default.resolve(_config.default.projectPath,_config.default.outputPath),u=await(0,_createPreview.default)(r);t.use((0,_koaMount.default)("/",u))}module.exports={beforeStart:beforeStart};
1
+ "use strict";var _path=_interopRequireDefault(require("@jayfate/path")),_koaMount=_interopRequireDefault(require("koa-mount")),_config=_interopRequireDefault(require("@hap-toolkit/shared-utils/config")),_createPreview=_interopRequireDefault(require("./create-preview"));function _interopRequireDefault(e){return e&&e.__esModule?e:{default:e}}async function beforeStart(e,t){const r=_path.default.resolve(_config.default.projectPath,_config.default.outputPath),a=await(0,_createPreview.default)(r);t.use((0,_koaMount.default)("/",a))}module.exports={beforeStart:beforeStart};
2
2
  //# sourceMappingURL=index.js.map
@@ -1,2 +1,2 @@
1
- "use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.remotePreview=remotePreview;var _crypto=_interopRequireDefault(require("crypto")),_chalk=_interopRequireDefault(require("chalk")),_path=_interopRequireDefault(require("path")),_inquirer=_interopRequireDefault(require("inquirer")),_cryptoJs=require("crypto-js"),_request=_interopRequireDefault(require("request")),_fsExtra=_interopRequireDefault(require("fs-extra")),_qrcodeTerminal=_interopRequireDefault(require("qrcode-terminal")),_qrImage=_interopRequireDefault(require("qr-image"));function _interopRequireDefault(e){return e&&e.__esModule?e:{default:e}}const home=require("os").homedir(),SIGN_KEY="02D3411146BE7892BAC13E2C835B465E",PASSWORD_SIGN_KEY="lightapp@2017",apiConfig={production:"https://www.quickapp.cn",development:"http://test.so-quick.cn"};let ideToken="",cacheUserName="",qrOutputPath="",rpkUserNameHash="";const previewRpkTemp=_path.default.join(home,"/quickAppPreviewTempPath/"),tokenPath=_path.default.join(home,"/quickAppToken.json");let currentApi=apiConfig.production;async function remotePreview(e){if(e.env){if("production"!==e.env&&"development"!==e.env)return console.log(_chalk.default.red("[ERROR] 环境参数只支持production或development!"));currentApi=apiConfig[e.env]}e.qrOutput&&(qrOutputPath=e.qrOutput);if(!await takeToken()){const e=await collectUserInfo();if(!e)return console.log(_chalk.default.red("[ERROR] 🤣 登录失败或者账号密码错误"));updateToken(e.ideToken)}compilePreviewRpk(e)}async function takeToken(){if(!_fsExtra.default.pathExistsSync(tokenPath))return!1;const e=_fsExtra.default.readJsonSync(tokenPath);if(e&&e.token){ideToken=e.token,console.log(_chalk.default.green("[INFO] 用户ideToken已存在,校验合法性..."));const t=await checkUser();return 0===JSON.parse(t).code?(console.log(_chalk.default.green("用户ideToken已存在,并且token可用")),ideToken=e.token,!0):(console.log(_chalk.default.green("[INFO] 🤣 存在token但不合法,需要重新登录")),!1)}return console.log(_chalk.default.green("[INFO] 用户token不存在,需要重新登录;")),!1}function updateToken(e){_fsExtra.default.writeJsonSync(tokenPath,{token:e})&&console.log(_chalk.default.red("[ERROR] 🤣 token保存失败;"));_fsExtra.default.accessSync(tokenPath,_fsExtra.default.constants.F_OK|_fsExtra.default.constants.R_OK|_fsExtra.default.constants.W_OK)||console.log(_chalk.default.green(`[INFO] 👍 token保存成功(${tokenPath});`))}async function collectUserInfo(){console.log(_chalk.default.green("[INFO] 在命令行内使用扫码预览功能需要使用快应用联盟账号登录;")),console.log(_chalk.default.green("[INFO] 如果没有账号,请到https://www.quickapp.cn/account/register注册;"));const e=await _inquirer.default.prompt([{type:"username",message:"请键入你的用户名",name:"username"},{type:"password",message:"请键入密码",name:"password"}]),{username:t,password:r}=e,a=await login(t,r),n=JSON.parse(a);if(0===n.code){const e=n.data;return ideToken=e.ideToken,console.log(_chalk.default.green("[INFO] 👍 登录成功;")),e}console.log(_chalk.default.red(`[ERROR] ${n.msg};`))}function login(e,t){const r=dealRequestParams({userName:e,password:(0,_cryptoJs.MD5)(t+"lightapp@2017").toString(),versionCode:"3.7"}),a=`${currentApi}/api/ide/account/login`,n={form:r};return new Promise((function(t,r){_request.default.post(a,n,(function(a,n,o){a&&(console.log(a),r(a)),cacheUserName=e,t(o)}))}))}function checkUser(){const e=`${currentApi}/api/ide/account/checkUser`,t={form:dealRequestParams({ideToken:ideToken})};return new Promise((function(r,a){_request.default.post(e,t,(function(e,t,a){e&&console.log(e),r(a)}))}))}function dealRequestParams(e,t){const r=Date.now();t||(e.timestamp=r);let a="";const n=Object.keys(e).sort();for(let t=0,r=n.length;t<r;t++)a+=t===r-1?[n[t]]+"="+e[n[t]]:[n[t]]+"="+e[n[t]]+"&";const o=(0,_cryptoJs.HmacSHA256)(a,SIGN_KEY);return e.sign=_cryptoJs.enc.Hex.stringify(o),e}async function compilePreviewRpk(e){console.log(_chalk.default.green("\n[INFO] 开始打预览包...")),rpkUserNameHash=getUserNameHash(cacheUserName);const{compileError:t}=await e.compile("native","prod",!1,Object.assign({originType:"ide",buildPreviewRpkOptions:{setPreviewPkgPath:previewRpkTemp,userNameHash:rpkUserNameHash}},e)),r=_fsExtra.default.readdirSync(previewRpkTemp);null===t&&0!==r.length?(console.log(_chalk.default.green(`[INFO] 👍 预览包打包成功(${previewRpkTemp});`)),updatePreviewRpk()):console.log(_chalk.default.red("[ERROR] 🤣 预览包打包失败;"))}async function updatePreviewRpk(){console.log(_chalk.default.green("\n[INFO] 开始上传预览包..."));let e="";const t=_fsExtra.default.readdirSync(previewRpkTemp);for(let r=0;r<t.length;r++){const a=t[r];if(/rpks$/.test(a)){e=a;break}/rpk$/.test(a)&&(e=a)}const r=_path.default.join(previewRpkTemp,e);if(!_fsExtra.default.existsSync(r))return console.log(_chalk.default.green(`[ERROR] 🤣 ${previewRpkTemp}下不存在预览包文件`));const a=_path.default.resolve(process.cwd(),"src/manifest.json"),n=_fsExtra.default.readJsonSync(a).package+".__preview__",o=_crypto.default.createHash("md5");o.update(_fsExtra.default.readFileSync(r));const i=o.digest("hex"),s=dealRequestParams({rpkPackage:n,ideToken:ideToken,file:i});uploadRemote({rpkPackage:n,ideToken:ideToken,sign:s.sign,timestamp:s.timestamp},r).catch((e=>{console.log(_chalk.default.red(`[ERROR] 🤣 上传预览rpk失败:${e}`))})).then((e=>{const{data:t,code:r}=JSON.parse(e);if(0===r){const{previewRpkId:e}=t;console.log(_chalk.default.green("[INFO] 👍 上传预览包成功;")),generateQrcode(e)}else console.log(_chalk.default.red(`[ERROR] 🤣 上传预览rpk失败:${JSON.stringify(e)}`))}))}function uploadRemote(e,t){return new Promise(((r,a)=>{const n=`${currentApi}/api/ide/previewRpk/upload`;_request.default.post(n,{formData:{ideToken:e.ideToken,sign:e.sign,rpkPackage:e.rpkPackage,file:_fsExtra.default.createReadStream(t),timestamp:e.timestamp}},(function(e,t,n){e&&a(e),r(n)}))}))}function generateQrcode(e){const{sign:t}=dealRequestParams({pid:e},!0),r=`${currentApi}/api/ide/_p?pid=${e}&sign=${t}`;_qrcodeTerminal.default.generate(r,{small:!0}),console.log(_chalk.default.green("[INFO] 👏👏👏请使用微信、内置浏览器或者其他扫码工具扫描上面的二维码,打开预览版快应用;")),qrOutputPath&&generateQrPicToPath(r)}function generateQrPicToPath(e){_qrImage.default.image(e,{type:"png"}).pipe(require("fs").createWriteStream(_path.default.resolve(qrOutputPath,`${rpkUserNameHash}.png`))),qrOutputPath=""}function getUserNameHash(e){const t=_crypto.default.createHash("md5");return t.update(e+(new Date).getTime()),`qid_${t.digest("hex").slice(0,8)}`}_fsExtra.default.ensureDirSync(previewRpkTemp);
1
+ "use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.remotePreview=remotePreview;var _crypto=_interopRequireDefault(require("crypto")),_chalk=_interopRequireDefault(require("chalk")),_path=_interopRequireDefault(require("@jayfate/path")),_inquirer=_interopRequireDefault(require("inquirer")),_cryptoJs=require("crypto-js"),_request=_interopRequireDefault(require("request")),_fsExtra=_interopRequireDefault(require("fs-extra")),_qrcodeTerminal=_interopRequireDefault(require("qrcode-terminal")),_qrImage=_interopRequireDefault(require("qr-image"));function _interopRequireDefault(e){return e&&e.__esModule?e:{default:e}}const home=require("os").homedir(),SIGN_KEY="02D3411146BE7892BAC13E2C835B465E",PASSWORD_SIGN_KEY="lightapp@2017",apiConfig={production:"https://www.quickapp.cn",development:"http://test.so-quick.cn"};let ideToken="",cacheUserName="",qrOutputPath="",rpkUserNameHash="";const previewRpkTemp=_path.default.join(home,"/quickAppPreviewTempPath/"),tokenPath=_path.default.join(home,"/quickAppToken.json");let currentApi=apiConfig.production;async function remotePreview(e){if(e.env){if("production"!==e.env&&"development"!==e.env)return console.log(_chalk.default.red("[ERROR] 环境参数只支持production或development!"));currentApi=apiConfig[e.env]}e.qrOutput&&(qrOutputPath=e.qrOutput);if(!await takeToken()){const e=await collectUserInfo();if(!e)return console.log(_chalk.default.red("[ERROR] 🤣 登录失败或者账号密码错误"));updateToken(e.ideToken)}compilePreviewRpk(e)}async function takeToken(){if(!_fsExtra.default.pathExistsSync(tokenPath))return!1;const e=_fsExtra.default.readJsonSync(tokenPath);if(e&&e.token){ideToken=e.token,console.log(_chalk.default.green("[INFO] 用户ideToken已存在,校验合法性..."));const t=await checkUser();return 0===JSON.parse(t).code?(console.log(_chalk.default.green("用户ideToken已存在,并且token可用")),ideToken=e.token,!0):(console.log(_chalk.default.green("[INFO] 🤣 存在token但不合法,需要重新登录")),!1)}return console.log(_chalk.default.green("[INFO] 用户token不存在,需要重新登录;")),!1}function updateToken(e){_fsExtra.default.writeJsonSync(tokenPath,{token:e})&&console.log(_chalk.default.red("[ERROR] 🤣 token保存失败;"));_fsExtra.default.accessSync(tokenPath,_fsExtra.default.constants.F_OK|_fsExtra.default.constants.R_OK|_fsExtra.default.constants.W_OK)||console.log(_chalk.default.green(`[INFO] 👍 token保存成功(${tokenPath});`))}async function collectUserInfo(){console.log(_chalk.default.green("[INFO] 在命令行内使用扫码预览功能需要使用快应用联盟账号登录;")),console.log(_chalk.default.green("[INFO] 如果没有账号,请到https://www.quickapp.cn/account/register注册;"));const e=await _inquirer.default.prompt([{type:"username",message:"请键入你的用户名",name:"username"},{type:"password",message:"请键入密码",name:"password"}]),{username:t,password:r}=e,a=await login(t,r),n=JSON.parse(a);if(0===n.code){const e=n.data;return ideToken=e.ideToken,console.log(_chalk.default.green("[INFO] 👍 登录成功;")),e}console.log(_chalk.default.red(`[ERROR] ${n.msg};`))}function login(e,t){const r=dealRequestParams({userName:e,password:(0,_cryptoJs.MD5)(t+"lightapp@2017").toString(),versionCode:"3.7"}),a=`${currentApi}/api/ide/account/login`,n={form:r};return new Promise((function(t,r){_request.default.post(a,n,(function(a,n,o){a&&(console.log(a),r(a)),cacheUserName=e,t(o)}))}))}function checkUser(){const e=`${currentApi}/api/ide/account/checkUser`,t={form:dealRequestParams({ideToken:ideToken})};return new Promise((function(r,a){_request.default.post(e,t,(function(e,t,a){e&&console.log(e),r(a)}))}))}function dealRequestParams(e,t){const r=Date.now();t||(e.timestamp=r);let a="";const n=Object.keys(e).sort();for(let t=0,r=n.length;t<r;t++)a+=t===r-1?[n[t]]+"="+e[n[t]]:[n[t]]+"="+e[n[t]]+"&";const o=(0,_cryptoJs.HmacSHA256)(a,SIGN_KEY);return e.sign=_cryptoJs.enc.Hex.stringify(o),e}async function compilePreviewRpk(e){console.log(_chalk.default.green("\n[INFO] 开始打预览包...")),rpkUserNameHash=getUserNameHash(cacheUserName);const{compileError:t}=await e.compile("native","prod",!1,Object.assign({originType:"ide",buildPreviewRpkOptions:{setPreviewPkgPath:previewRpkTemp,userNameHash:rpkUserNameHash}},e)),r=_fsExtra.default.readdirSync(previewRpkTemp);null===t&&0!==r.length?(console.log(_chalk.default.green(`[INFO] 👍 预览包打包成功(${previewRpkTemp});`)),updatePreviewRpk()):console.log(_chalk.default.red("[ERROR] 🤣 预览包打包失败;"))}async function updatePreviewRpk(){console.log(_chalk.default.green("\n[INFO] 开始上传预览包..."));let e="";const t=_fsExtra.default.readdirSync(previewRpkTemp);for(let r=0;r<t.length;r++){const a=t[r];if(/rpks$/.test(a)){e=a;break}/rpk$/.test(a)&&(e=a)}const r=_path.default.join(previewRpkTemp,e);if(!_fsExtra.default.existsSync(r))return console.log(_chalk.default.green(`[ERROR] 🤣 ${previewRpkTemp}下不存在预览包文件`));const a=_path.default.resolve(process.cwd(),"src/manifest.json"),n=_fsExtra.default.readJsonSync(a).package+".__preview__",o=_crypto.default.createHash("md5");o.update(_fsExtra.default.readFileSync(r));const i=o.digest("hex"),s=dealRequestParams({rpkPackage:n,ideToken:ideToken,file:i});uploadRemote({rpkPackage:n,ideToken:ideToken,sign:s.sign,timestamp:s.timestamp},r).catch((e=>{console.log(_chalk.default.red(`[ERROR] 🤣 上传预览rpk失败:${e}`))})).then((e=>{const{data:t,code:r}=JSON.parse(e);if(0===r){const{previewRpkId:e}=t;console.log(_chalk.default.green("[INFO] 👍 上传预览包成功;")),generateQrcode(e)}else console.log(_chalk.default.red(`[ERROR] 🤣 上传预览rpk失败:${JSON.stringify(e)}`))}))}function uploadRemote(e,t){return new Promise(((r,a)=>{const n=`${currentApi}/api/ide/previewRpk/upload`;_request.default.post(n,{formData:{ideToken:e.ideToken,sign:e.sign,rpkPackage:e.rpkPackage,file:_fsExtra.default.createReadStream(t),timestamp:e.timestamp}},(function(e,t,n){e&&a(e),r(n)}))}))}function generateQrcode(e){const{sign:t}=dealRequestParams({pid:e},!0),r=`${currentApi}/api/ide/_p?pid=${e}&sign=${t}`;_qrcodeTerminal.default.generate(r,{small:!0}),console.log(_chalk.default.green("[INFO] 👏👏👏请使用微信、内置浏览器或者其他扫码工具扫描上面的二维码,打开预览版快应用;")),qrOutputPath&&generateQrPicToPath(r)}function generateQrPicToPath(e){_qrImage.default.image(e,{type:"png"}).pipe(require("fs").createWriteStream(_path.default.resolve(qrOutputPath,`${rpkUserNameHash}.png`))),qrOutputPath=""}function getUserNameHash(e){const t=_crypto.default.createHash("md5");return t.update(e+(new Date).getTime()),`qid_${t.digest("hex").slice(0,8)}`}_fsExtra.default.ensureDirSync(previewRpkTemp);
2
2
  //# sourceMappingURL=remote-preview.js.map
@@ -1,2 +1,2 @@
1
- "use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.removeAnsiColor=removeAnsiColor,exports.renderPage=renderPage,exports.trimSlash=trimSlash;var _fs=_interopRequireDefault(require("fs")),_path=_interopRequireDefault(require("path")),_util=_interopRequireDefault(require("util")),_sharedUtils=require("@hap-toolkit/shared-utils");function _interopRequireDefault(e){return e&&e.__esModule?e:{default:e}}const ANSI_COLOR=/[\u001b\u009b][[()#;?]*(?:[0-9]{1,4}(?:;[0-9]{0,4})*)?[0-9A-ORZcf-nqry=><]/g,read=_util.default.promisify(_fs.default.readFile);async function renderPage(e,r){const t=await read(e,"utf8");return(0,_sharedUtils.renderString)(t,r)}function trimSlash(e){return _path.default.normalize(e).replace(/\\/g,"/").replace(/(^\/+|\/+$)/g,"")}function removeAnsiColor(e){return e&&"string"==typeof e?e.replace(ANSI_COLOR,""):e}
1
+ "use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.removeAnsiColor=removeAnsiColor,exports.renderPage=renderPage,exports.trimSlash=trimSlash;var _fs=_interopRequireDefault(require("fs")),_path=_interopRequireDefault(require("@jayfate/path")),_util=_interopRequireDefault(require("util")),_sharedUtils=require("@hap-toolkit/shared-utils");function _interopRequireDefault(e){return e&&e.__esModule?e:{default:e}}const ANSI_COLOR=/[\u001b\u009b][[()#;?]*(?:[0-9]{1,4}(?:;[0-9]{0,4})*)?[0-9A-ORZcf-nqry=><]/g,read=_util.default.promisify(_fs.default.readFile);async function renderPage(e,r){const t=await read(e,"utf8");return(0,_sharedUtils.renderString)(t,r)}function trimSlash(e){return _path.default.normalize(e).replace(/\\/g,"/").replace(/(^\/+|\/+$)/g,"")}function removeAnsiColor(e){return e&&"string"==typeof e?e.replace(ANSI_COLOR,""):e}
2
2
  //# sourceMappingURL=shared.js.map
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@hap-toolkit/server",
3
- "version": "1.9.10",
3
+ "version": "1.9.11-beta",
4
4
  "description": "hap server",
5
5
  "engines": {
6
6
  "node": ">=8.0.0"
@@ -22,9 +22,10 @@
22
22
  ],
23
23
  "dependencies": {
24
24
  "@babel/runtime": "^7.9.6",
25
- "@hap-toolkit/debugger": "1.9.10",
26
- "@hap-toolkit/packager": "1.9.10",
27
- "@hap-toolkit/shared-utils": "1.9.10",
25
+ "@hap-toolkit/debugger": "1.9.11-beta",
26
+ "@hap-toolkit/packager": "1.9.11-beta",
27
+ "@hap-toolkit/shared-utils": "1.9.11-beta",
28
+ "@jayfate/path": "^0.0.13",
28
29
  "crypto-js": "^4.1.1",
29
30
  "fs-extra": "^10.0.0",
30
31
  "jszip": "^3.4.0",
@@ -40,5 +41,5 @@
40
41
  "qrcode-terminal": "^0.12.0",
41
42
  "request": "^2.88.2"
42
43
  },
43
- "gitHead": "f922974c10e94fb516ad76c942797d2ac297b3af"
44
+ "gitHead": "f8b59a625456070f0bf06a521b33e2fe3af30b82"
44
45
  }