first commit

This commit is contained in:
2026-09-08 20:28:54 +08:00
commit 2ada8d3d5a
37380 changed files with 4886169 additions and 0 deletions
+3
View File
@@ -0,0 +1,3 @@
# @hap-toolkit/server
快应用`web`服务模块
+2
View File
@@ -0,0 +1,2 @@
"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;
//# sourceMappingURL=index.js.map
+2
View File
@@ -0,0 +1,2 @@
"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;
//# sourceMappingURL=modules.js.map
+2
View File
@@ -0,0 +1,2 @@
"use strict";var _sharedUtils=require("@hap-toolkit/shared-utils"),_config=_interopRequireDefault(require("./config")),_modules=_interopRequireDefault(require("./config/modules")),_server=require("./server");function _interopRequireDefault(e){return e&&e.__esModule?e:{default:e}}module.exports.launchServer=function(e){try{_sharedUtils.colorconsole.init(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)()};
//# sourceMappingURL=index.js.map
+2
View File
@@ -0,0 +1,2 @@
"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,a=_path.default.resolve(__dirname,"./static"),r=_path.default.resolve(__dirname,"./views/err.html");t.use(async(e,t)=>{try{await t()}catch(t){e.status=500,e.type="text/html",e.body=await(0,_shared.renderPage)(r,{message:t.__KNOWN?t.message:t.stack})}});const u=await(0,_createRouter.default)(e);return t.use((0,_koaMount.default)("/preview",u.routes(),u.allowedMethods())),t.use((0,_koaMount.default)("/preview-static",(0,_koaStatic.default)(a))),t}
//# sourceMappingURL=create-preview.js.map
+2
View File
@@ -0,0 +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
+2
View File
@@ -0,0 +1,2 @@
"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};
//# sourceMappingURL=index.js.map
+2
View File
@@ -0,0 +1,2 @@
"use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.renderPage=renderPage,exports.trimSlash=trimSlash,Object.defineProperty(exports,"KnownError",{enumerable:!0,get:function(){return _sharedUtils.KnownError}}),Object.defineProperty(exports,"getLaunchPage",{enumerable:!0,get:function(){return _sharedUtils.getLaunchPage}});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 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,"")}
//# sourceMappingURL=shared.js.map
+3
View File
@@ -0,0 +1,3 @@
body {
background-color: #ffffff;
}
File diff suppressed because one or more lines are too long
+1
View File
@@ -0,0 +1 @@
<!DOCTYPE html><html><head><meta charset="utf-8"><title>找不到页面</title><meta name="viewport" content="width=device-width,initial-scale=1"><meta name="apple-mobile-web-app-capable" content="yes"><meta name="apple-mobile-web-app-status-bar-style" content="black"><meta name="apple-touch-fullscreen" content="yes"><meta name="format-detection" content="telephone=no, email=no"><meta name="referrer" content="no-referrer"><link href="/preview-static/common.css" rel="stylesheet"></head><body><div class="message">404 找不到 /preview/<b>{{requestRoute}}</b></div><a href="/preview">返回首页</a></body></html>
+1
View File
@@ -0,0 +1 @@
<!DOCTYPE html><html><head><meta charset="utf-8"><title>出错了!</title><meta name="viewport" content="width=device-width,initial-scale=1"><meta name="apple-mobile-web-app-capable" content="yes"><meta name="apple-mobile-web-app-status-bar-style" content="black"><meta name="apple-touch-fullscreen" content="yes"><meta name="format-detection" content="telephone=no, email=no"><meta name="referrer" content="no-referrer"><link href="/preview-static/common.css" rel="stylesheet"></head><body><div class="message"><h2>出错了!</h2><div class="text">{{ message }}</div></div></body></html>
+8
View File
@@ -0,0 +1,8 @@
<!DOCTYPE html><html><head><meta charset="utf-8"><title>{{ title }}</title><meta name="viewport" content="width=device-width,initial-scale=1"><meta name="apple-mobile-web-app-capable" content="yes"><meta name="apple-mobile-web-app-status-bar-style" content="black"><meta name="apple-touch-fullscreen" content="yes"><meta name="format-detection" content="telephone=no, email=no"><meta name="referrer" content="no-referrer"><script src="https://statres.quickapp.cn/quickapp/ide/web.js"></script><script type="text/javascript">window.Hap||document.write('<script src="/preview-static/web.js"><\/script>');</script><script type="text/javascript">!function(){Hap.init({base:"/preview"});var e=new EventSource("/preview/__stream");e.addEventListener("reload",e=>{const o=e.data;o?location.replace(`/preview/${o}`):location.reload()}),e.onerror=function(e){console.log("EventSource error",e)}}();</script></head><body><div id="scriptNotFound" style="display: none"><p>找不到页面 js 文件 {{ script }}</p><p>编译可能存在异常</p></div><script type="text/javascript">if ({{ scriptNotFound }}) {
setTimeout(() => {
var el = document.getElementById('scriptNotFound')
if (el) {
el.style.display = 'block'
}
}, 1000)
}</script></body></html>
+2
View File
@@ -0,0 +1,2 @@
"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:s+"/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}`),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"})})}
//# sourceMappingURL=server.js.map
+40
View File
@@ -0,0 +1,40 @@
{
"name": "@hap-toolkit/server",
"version": "0.6.13",
"description": "hap server",
"engines": {
"node": ">=8.0.0"
},
"publishConfig": {
"access": "public"
},
"keywords": [
"hap-toolkit",
"quickapp"
],
"main": "lib/index.js",
"directories": {
"lib": "lib",
"test": "__tests__"
},
"files": [
"lib/**/*.{js,html,css}"
],
"dependencies": {
"@babel/runtime": "^7.3.1",
"@hap-toolkit/debugger": "^0.6.13",
"@hap-toolkit/packager": "^0.6.13",
"@hap-toolkit/shared-utils": "^0.6.13",
"jszip": "^3.2.0",
"koa": "^2.7.0",
"koa-body": "^4.0.8",
"koa-mount": "^4.0.0",
"koa-router": "^7.4.0",
"koa-send": "^5.0.0",
"koa-static": "^5.0.0",
"opn": "^5.4.0",
"portfinder": "^1.0.20",
"qr-image": "^3.2.0"
},
"gitHead": "c5f2e7f25236d50d5ae1493faaec1457e63d1cc1"
}