@hap-toolkit/server 1.9.12 → 1.9.13

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("@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;
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;
2
2
  //# sourceMappingURL=index.js.map
package/lib/index.js CHANGED
@@ -1,2 +1,2 @@
1
- "use strict";var _sharedUtils=require("@hap-toolkit/shared-utils"),_config=_interopRequireDefault(require("./config")),_modules=_interopRequireDefault(require("./config/modules")),_server=require("./server"),_remotePreview=require("./preview/remote-preview");function _interopRequireDefault(e){return e&&e.__esModule?e:{default:e}}module.exports.launchServer=function(e){try{_sharedUtils.colorconsole.attach(e.log),e.modules&&e.modules.length&&Object.assign(_config.default.options,{moduleList:e.modules}),Object.assign(_config.default.options,e),(0,_sharedUtils.setCustomConfig)(e.cwd,e.port),_modules.default.init(_config.default)}catch(e){return Promise.reject(e)}return(0,_server.launch)(_config.default,_modules.default)},module.exports.stopServer=function(){return(0,_server.stop)()},module.exports.remotePreview=_remotePreview.remotePreview;
1
+ "use strict";Object.defineProperty(exports,"__esModule",{value:!0}),Object.defineProperty(exports,"beforeStart",{enumerable:!0,get:function(){return _preview.beforeStart}}),Object.defineProperty(exports,"createPreview",{enumerable:!0,get:function(){return _preview.createPreview}}),exports.default=void 0,exports.launchServer=launchServer,Object.defineProperty(exports,"remotePreview",{enumerable:!0,get:function(){return _remotePreview.remotePreview}}),exports.stopServer=stopServer;var _sharedUtils=require("@hap-toolkit/shared-utils"),_config=_interopRequireDefault(require("./config")),_server=require("./server"),_remotePreview=require("./preview/remote-preview"),_preview=require("./preview");function _interopRequireDefault(e){return e&&e.__esModule?e:{default:e}}function launchServer(e){try{_sharedUtils.colorconsole.attach(e.log),Object.assign(_config.default.options,e),(0,_sharedUtils.setCustomConfig)(e.cwd,e.port)}catch(e){return Promise.reject(e)}return(0,_server.launch)(_config.default)}function stopServer(){return(0,_server.stop)()}var _default={launchServer:launchServer,remotePreview:_remotePreview.remotePreview,stopServer:stopServer,beforeStart:_preview.beforeStart,createPreview:_preview.createPreview};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("@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}
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}
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("@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||e.router.widgets)){const r=e.router.pages||{},s=e.router.widgets||{},n=Object.keys(r),a=Object.keys(s);n.concat(a).forEach((e=>{const n=(0,_shared.trimSlash)(e),a=r[e]||s[e],i=(0,_shared.trimSlash)(a.component);t[n]=`${e}/${i}.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=f in(s.router.widgets||{})?"card":"app",r=n[f],i=await(0,_shared.renderPage)(a,{title:s.name,routeName:f,routes:JSON.stringify(n),type:t,script:r,scriptNotFound:!l(r),webJsUrl:genWebJsUrl(e.conf.options.webVersion)});e.type="text/html",e.body=i}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("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"),_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}=_sharedUtils.eventBus,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,d;if(s){const t=await n(e);d=await _jszip.default.loadAsync(t),u=async function(){const t=d.file("manifest.json");if(!t)throw new _sharedUtils.KnownError(`从 ${e} 读取 manifest.json 失败!`);return t.async("string").then(jsonParse)},l=function(e){return null!==d.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(),_sharedUtils.eventBus.off&&(_sharedUtils.eventBus.off(PACKAGER_WATCH_START,r),_sharedUtils.eventBus.off(PACKAGER_BUILD_PROGRESS,s),_sharedUtils.eventBus.off(PACKAGER_BUILD_DONE,n))}_sharedUtils.eventBus.on(PACKAGER_WATCH_START,r),_sharedUtils.eventBus.on(PACKAGER_BUILD_PROGRESS,s),_sharedUtils.eventBus.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||e.router.widgets)){const r=e.router.pages||{},s=e.router.widgets||{},n=Object.keys(r),a=Object.keys(s);n.concat(a).forEach((e=>{const n=(0,_shared.trimSlash)(e),a=r[e]||s[e],i=(0,_shared.trimSlash)(a.component);t[n]=`${e}/${i}.js`}))}else new _sharedUtils.KnownError("未配置页面路由信息").__KNOWN=!0;return t}(s),o=Object.keys(n);let d=(0,_shared.trimSlash)(e.path);if(t("requestRoute",d,e.appRoutes),o.indexOf(d)>-1){const t=d in(s.router.widgets||{})?"card":"app",r=n[d],i=await(0,_shared.renderPage)(a,{title:s.name,routeName:d,routes:JSON.stringify(n),type:t,script:r,scriptNotFound:!l(r),webJsUrl:genWebJsUrl(e.conf.options.webVersion)});e.type="text/html",e.body=i}else if(await r(),404===e.status){if(d.endsWith(".js"))e.type="text/javascript",e.body=`/* 404 */console.log(new Error('找不到 ${d}'))`;else{const t=await(0,_shared.renderPage)(i,{message:`找不到 /preview/${d}`});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=d.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("@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};
1
+ "use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.beforeStart=beforeStart,Object.defineProperty(exports,"createPreview",{enumerable:!0,get:function(){return _createPreview.default}});var _path=_interopRequireDefault(require("path")),_koaMount=_interopRequireDefault(require("koa-mount")),_sharedUtils=require("@hap-toolkit/shared-utils"),_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(_sharedUtils.globalConfig.projectPath,_sharedUtils.globalConfig.outputPath),a=await(0,_createPreview.default)(r);t.use((0,_koaMount.default)("/",a))}
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("@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);
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+PASSWORD_SIGN_KEY).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("@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}
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}
2
2
  //# sourceMappingURL=shared.js.map
package/lib/server.js CHANGED
@@ -1,2 +1,2 @@
1
- "use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.launch=launch,exports.stop=stop;var _http=_interopRequireDefault(require("http")),_koa=_interopRequireDefault(require("koa")),_opn=_interopRequireDefault(require("opn")),_portfinder=_interopRequireDefault(require("portfinder")),_sharedUtils=require("@hap-toolkit/shared-utils"),_recordClient=require("@hap-toolkit/shared-utils/lib/record-client"),_config=_interopRequireDefault(require("@hap-toolkit/shared-utils/config"));function _interopRequireDefault(e){return e&&e.__esModule?e:{default:e}}let server=null;async function launch(e,r){return new Promise((async o=>{try{const s=new _koa.default;let t=_config.default.server.port;t=await _portfinder.default.getPortPromise({port:t}),Object.assign(e.defaults,{serverPort:t}),s.context.conf=e;const{clearRecords:l,openBrowser:n}=e.options;if(l){const{clientRecordPath:e}=_config.default;(0,_recordClient.clearProjectRecord)(e)}for(let e=0,o=r.moduleList.length;e<o;e++){const o=r.moduleList[e];"function"==typeof o.hash.applyRouter&&s.use(o.hash.applyRouter(s).routes())}server=_http.default.Server(s.callback()),s.server=server;for(let e=0,o=r.moduleList.length;e<o;e++){const o=r.moduleList[e];"function"==typeof o.hash.beforeStart&&await o.hash.beforeStart(server,s)}server.listen(t,(()=>{const e=`http://localhost:${t}`,r=(0,_sharedUtils.getIPv4IPAddress)();if(!r)return _sharedUtils.colorconsole.warn("### App Server ### 本机IP地址为空,无法通过WIFI调试"),void o({launchServerError:null,server:server,address:e,previewAddress:e+"/previewAddress"});const s=`http://${r}:${t}`;_sharedUtils.colorconsole.info(`### App Server ### 服务器地址: ${e}, ${s}`),_sharedUtils.colorconsole.info("### App Server ### 请确保手机与App Server处于相同网段"),(0,_sharedUtils.outputQRCodeOnTerminal)(s),n&&(0,_opn.default)(s),o({launchServerError:null,server:server,address:s,previewAddress:e+"/preview"})})),s.on("error",((e,r)=>{_sharedUtils.colorconsole.error(`### App Server ### 服务器错误: ${e.message}`);const s=`出错了!HTTP error code: ${e.status}, 出错信息: ${e.message}`;r&&(r.body=s),o({launchServerError:e,server:server})})),server.on("error",(e=>{_sharedUtils.colorconsole.error(`### App Server ### 服务器错误: ${e.message}`),"EADDRINUSE"===e.code&&_sharedUtils.colorconsole.error(`### App Server ### 服务器错误:端口 ${t} 被占用, 请检查`),o({launchServerError:e,server:server})})),process.on("SIGINT",(()=>{_sharedUtils.colorconsole.info("### App Server ### SIGINT信号"),_sharedUtils.colorconsole.info(`### App Server ### 退出server进程 pid: ${process.pid}`),s.context.adbDebugger._stop(),process.exit()})),process.on("uncaughtException",(e=>{_sharedUtils.colorconsole.error(`### App Server ### 未定义的异常, 出错信息: ${e.message}`),console.error(e)})),process.on("unhandledRejection",((e,r)=>{_sharedUtils.colorconsole.error(`### App Server ### 未处理的 rejection, 出错信息: ${e}`),r.catch((e=>{console.error(e)}))}))}catch(e){throw _sharedUtils.colorconsole.error(`### App Server ### 服务器启动失败: ${e.message}`),o({launchServerError:e,server:null}),e}}))}function stop(){return new Promise((e=>{if(server)try{server.close((r=>{e({stopServerError:r})}))}catch(r){throw _sharedUtils.colorconsole.error(`### App Server ### 服务器关闭失败: ${r.message}`),e({stopServerError:r}),r}else e({stopServerError:"no server"})}))}
1
+ "use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.launch=launch,exports.stop=stop;var _http=_interopRequireDefault(require("http")),_koa=_interopRequireDefault(require("koa")),_opn=_interopRequireDefault(require("opn")),_portfinder=_interopRequireDefault(require("portfinder")),_sharedUtils=require("@hap-toolkit/shared-utils");function _interopRequireDefault(e){return e&&e.__esModule?e:{default:e}}function _getRequireWildcardCache(e){if("function"!=typeof WeakMap)return null;var r=new WeakMap,o=new WeakMap;return(_getRequireWildcardCache=function(e){return e?o:r})(e)}function _interopRequireWildcard(e,r){if(!r&&e&&e.__esModule)return e;if(null===e||"object"!=typeof e&&"function"!=typeof e)return{default:e};var o=_getRequireWildcardCache(r);if(o&&o.has(e))return o.get(e);var t={},s=Object.defineProperty&&Object.getOwnPropertyDescriptor;for(var n in e)if("default"!==n&&Object.prototype.hasOwnProperty.call(e,n)){var l=s?Object.getOwnPropertyDescriptor(e,n):null;l&&(l.get||l.set)?Object.defineProperty(t,n,l):t[n]=e[n]}return t.default=e,o&&o.set(e,t),t}const moduler=[require("@hap-toolkit/debugger")];let server=null;async function launch(e){return new Promise((async r=>{try{"debug"!==_sharedUtils.globalConfig.command&&moduler.push((await Promise.resolve().then((()=>_interopRequireWildcard(require("@hap-toolkit/packager"))))).router,require("./preview/index.js"));const o=new _koa.default;let t=_sharedUtils.globalConfig.server.port;t=await _portfinder.default.getPortPromise({port:t}),Object.assign(e.defaults,{serverPort:t}),o.context.conf=e;const{clearRecords:s,openBrowser:n}=e.options;if(s){const{clientRecordPath:e}=_sharedUtils.globalConfig;(0,_sharedUtils.clearProjectRecord)(e)}moduler.forEach((e=>{e.applyRouter&&o.use(e.applyRouter(o).routes())})),server=_http.default.Server(o.callback()),o.server=server;for(const e of moduler)e.beforeStart&&await e.beforeStart(server,o);server.listen(t,(()=>{const e=`http://localhost:${t}`,o=(0,_sharedUtils.getIPv4IPAddress)();if(!o)return _sharedUtils.colorconsole.warn("### App Server ### 本机IP地址为空,无法通过WIFI调试"),void r({launchServerError:null,server:server,address:e,previewAddress:e+"/previewAddress"});const s=`http://${o}:${t}`;_sharedUtils.colorconsole.info(`### App Server ### 服务器地址: ${e}, ${s}`),_sharedUtils.colorconsole.info("### App Server ### 请确保手机与App Server处于相同网段"),(0,_sharedUtils.outputQRCodeOnTerminal)(s),n&&(0,_opn.default)(s),r({launchServerError:null,server:server,address:s,previewAddress:e+"/preview"})})),o.on("error",((e,o)=>{_sharedUtils.colorconsole.error(`### App Server ### 服务器错误: ${e.message}`);const t=`出错了!HTTP error code: ${e.status}, 出错信息: ${e.message}`;o&&(o.body=t),r({launchServerError:e,server:server})})),server.on("error",(e=>{_sharedUtils.colorconsole.error(`### App Server ### 服务器错误: ${e.message}`),"EADDRINUSE"===e.code&&_sharedUtils.colorconsole.error(`### App Server ### 服务器错误:端口 ${t} 被占用, 请检查`),r({launchServerError:e,server:server})})),process.on("SIGINT",(()=>{_sharedUtils.colorconsole.info("### App Server ### SIGINT信号"),_sharedUtils.colorconsole.info(`### App Server ### 退出server进程 pid: ${process.pid}`),o.context.adbDebugger._stop(),process.exit()})),process.on("uncaughtException",(e=>{_sharedUtils.colorconsole.error(`### App Server ### 未定义的异常, 出错信息: ${e.message}`),console.error(e)})),process.on("unhandledRejection",((e,r)=>{_sharedUtils.colorconsole.error(`### App Server ### 未处理的 rejection, 出错信息: ${e}`),r.catch((e=>{console.error(e)}))}))}catch(e){throw _sharedUtils.colorconsole.error(`### App Server ### 服务器启动失败: ${e.message}`),r({launchServerError:e,server:null}),e}}))}function stop(){return new Promise((e=>{if(server)try{server.close((r=>{e({stopServerError:r})}))}catch(r){throw _sharedUtils.colorconsole.error(`### App Server ### 服务器关闭失败: ${r.message}`),e({stopServerError:r}),r}else e({stopServerError:"no server"})}))}
2
2
  //# sourceMappingURL=server.js.map
package/package.json CHANGED
@@ -1,9 +1,9 @@
1
1
  {
2
2
  "name": "@hap-toolkit/server",
3
- "version": "1.9.12",
3
+ "version": "1.9.13",
4
4
  "description": "hap server",
5
5
  "engines": {
6
- "node": ">=8.0.0"
6
+ "node": ">=14.0.0"
7
7
  },
8
8
  "publishConfig": {
9
9
  "access": "public"
@@ -13,6 +13,10 @@
13
13
  "quickapp"
14
14
  ],
15
15
  "main": "lib/index.js",
16
+ "exports": {
17
+ "import": "./src/index.js",
18
+ "require": "./lib/index.js"
19
+ },
16
20
  "directories": {
17
21
  "lib": "lib",
18
22
  "test": "__tests__"
@@ -22,9 +26,9 @@
22
26
  ],
23
27
  "dependencies": {
24
28
  "@babel/runtime": "^7.9.6",
25
- "@hap-toolkit/debugger": "1.9.12",
26
- "@hap-toolkit/packager": "1.9.12",
27
- "@hap-toolkit/shared-utils": "1.9.12",
29
+ "@hap-toolkit/debugger": "1.9.13",
30
+ "@hap-toolkit/packager": "1.9.13",
31
+ "@hap-toolkit/shared-utils": "1.9.13",
28
32
  "@jayfate/path": "^0.0.13",
29
33
  "crypto-js": "^4.1.1",
30
34
  "fs-extra": "^10.0.0",
@@ -39,7 +43,8 @@
39
43
  "portfinder": "^1.0.26",
40
44
  "qr-image": "^3.2.0",
41
45
  "qrcode-terminal": "^0.12.0",
42
- "request": "^2.88.2"
46
+ "request": "^2.88.2",
47
+ "resolve": "^1.22.2"
43
48
  },
44
- "gitHead": "db1ba8ad12ce32c83a543af0459a208e1eb97e28"
49
+ "gitHead": "3ddba20aa11d9e9299ab7eb06c4d29f596f07e14"
45
50
  }
@@ -1,2 +0,0 @@
1
- "use strict";function init(e){const t=[{name:"debugger",path:require.resolve("@hap-toolkit/debugger/lib/router")},{name:"packager",path:require.resolve("@hap-toolkit/packager/lib/router")},{name:"preview",path:require.resolve("../preview/index.js")}],o=e.options.moduleList;t.filter((e=>!o.length||o.indexOf(e.name)>=0)).forEach((e=>{const t={name:e.name,path:e.path,hash:require(e.path)};moduler.moduleList.push(t),moduler.moduleHash[t.name]=t}))}function contains(e){return!!moduler.moduleHash[e]}Object.defineProperty(exports,"__esModule",{value:!0}),exports.default=void 0;const moduler={moduleList:[],moduleHash:{},init:init,contains:contains};var _default=moduler;exports.default=_default;
2
- //# sourceMappingURL=modules.js.map