UNPKG

@hap-toolkit/server

Version:

hap server

3 lines (2 loc) 5.46 kB
"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")),_config=require("../config"),_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"),o=_path.default.resolve(__dirname,"./views/404.html"),i=new Map;let u,l,c;if(s){const t=await n(e);c=await _jszip.default.loadAsync(t),u=async function(){const t=c.file("manifest.json");if(!t)throw new _sharedUtils.KnownError(`从 ${e} 读取 manifest.json 失败!`);return t.async("string").then(jsonParse)},l=function(e){return null!==c.file(e)}}else{const t=_path.default.resolve(e,"manifest.json");u=async function(){let r,s=i.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)),i.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{const t=(0,_sharedUtils.getLaunchPage)();e.redirect(`/preview/${t}`)}})),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],o=(0,_shared.trimSlash)(a.component);t[n]=`${e}/${o}.js`}))}else new _sharedUtils.KnownError("未配置页面路由信息").__KNOWN=!0;return t}(s),i=Object.keys(n);let c=(0,_shared.trimSlash)(e.path);if(t("requestRoute",c,e.appRoutes),i.indexOf(c)>-1){const t=c in(s.router.widgets||{})?"card":"app",r=n[c],o=JSON.parse(process.env.VSCODE_NLS_CONFIG||'{"locale":"zh-CN"}').locale,i=_config.browerOptions.options.mediaQueryParams||{},u=await(0,_shared.renderPage)(a,{title:s.name,routeName:c,routes:JSON.stringify(n),type:t,script:r,scriptNotFound:!l(r),devtoolUrl:_config.browerOptions.options.devtoolUrl||"",webJsUrl:genWebJsUrl(_config.browerOptions.options.version||e.conf.options.webVersion),language:o,mediaQueryParams:JSON.stringify(i)});e.type="text/html",e.body=u}else if(await r(),404===e.status){if(c.endsWith(".js"))e.type="text/javascript",e.body=`/* 404 */console.log(new Error('找不到 ${c}'))`;else{const t=await(0,_shared.renderPage)(o,{message:`找不到 /preview/${c}`});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=c.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} //# sourceMappingURL=create-router.js.map