'a'
mh-two-thousand-and-two
2024-04-12 44d2c92345cd156a59fc327b3060292a282d2893
1
2
"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")),_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}=_eventBus.default;async function createRouter(e){const t=_util.default.debuglog("server.render"),r=new _koaRouter.default;let a=!1;t("preview target",e),_fs.default.existsSync(e)&&(a=_fs.default.lstatSync(e).isFile());const n=_util.default.promisify(_fs.default.readFile),s=_path.default.resolve(__dirname,"./views/page.html"),i=_path.default.resolve(__dirname,"./views/404.html"),o=new Map;let u,l,f;if(a){const t=await n(e);f=await _jszip.default.loadAsync(t),u=async function(){const t=f.file("manifest.json");if(!t)throw new _shared.KnownError(`从 ${e} 读取 manifest.json 失败!`);return t.async("string").then(JSON.parse)},l=function(e){return null!==f.file(e)}}else{const t=_path.default.resolve(e,"manifest.json");u=async function(){let r,a=o.get(t);if(a&&Date.now()-a.timestamp<2e3)r=a.payload;else{if(!_fs.default.existsSync(e))throw new _shared.KnownError("找不到 build 目录");if(!_fs.default.existsSync(t))throw new _shared.KnownError("找不到 build 目录下的 manifest.json");r=JSON.parse(await n(t),"utf8"),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(){if(!e.req.destroyed){const e=(0,_shared.getLaunchPage)();t.write("event: reload\n"),t.write(`data: ${e}\n\n`)}}function a(){e.res.end(),t.end(),_eventBus.default.off&&_eventBus.default.off(PACKAGER_BUILD_DONE,r)}_eventBus.default.once(PACKAGER_BUILD_DONE,r),e.req.on("close",a),e.req.on("finish",a),e.req.on("error",a),e.type="text/event-stream",t.write("event: start\n"),t.write("data: waing for signal\n\n"),e.body=t})),r.get("/",(async function(e,r){const a=await u();if(a&&a.router&&a.router.entry){t("preview home","entry",a.router.entry);const r=(0,_shared.getLaunchPage)()||a.router.entry;e.redirect(`/preview/${r}`)}else await r()})),r.get("/*",(async function(e,r){const a=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 a=(0,_shared.trimSlash)(e),n=(0,_shared.trimSlash)(r[e].component);t[a]=`${e}/${n}.js`})}else{new _shared.KnownError("未配置页面路由信息").__KNOWN=!0}return t}(a),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)(s,{title:a.name,routeName:f,routes:JSON.stringify(n),script:t,scriptNotFound:!l(t)});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,{requestRoute:f});e.type="text/html",e.body=t}e.status=404}})),a?r.get("/*",(async function(e,t){let r=(0,_shared.trimSlash)(e.path);const a=f.file(r);a?e.body=await a.nodeStream():(e.status=404,await t())})):r.get("/*",(async function(t,r){let a=(0,_shared.trimSlash)(t.path);try{await(0,_koaSend.default)(t,a,{root:e})}catch(e){if(404!==e.status)throw e;await r()}})),r}
//# sourceMappingURL=create-router.js.map