jj-cli
Version:
1 lines • 2.77 kB
JavaScript
;const e=require("../../untils/logs"),r=require("http"),n=require("connect"),t=require("sirv"),o=require("chokidar"),i=require("path"),s=require("faye-websocket"),c=require("fs"),{replaceContent:l}=require("../../untils/fs");var a={clients:[],watcher:null,server:null,shutdown:()=>{}};const d=e=>{const r=o.watch(e,{ignored:[/\.git\//,/\.svn\//,/\.hg\//,"**/node_modules/**","**/.git/**"],ignoreInitial:!0});return h(r),a.watcher=r,r},u=r=>{var n=".css"===i.extname(r);a.clients.forEach((function(e){e&&e.send(n?"refreshcss":"reload")})),e.logInfo("building...")},h=r=>{r&&r.on("change",u).on("add",u).on("unlink",u).on("addDir",u).on("unlinkDir",u).on("ready",(function(){e.logInfo("Ready for changes")})).on("error",(function(r){e.logInfo("watcher ERROR:",r)}))},f=r=>{const n=i.resolve(r,"index.html");let t=c.readFileSync(n,"utf8");if(~t.indexOf("Code injected by jj-cli"))return void e.logFriendly("Inject Code Already Exists.");let o=c.readFileSync(i.join(__dirname,"injected.html"),"utf8");const s=[new RegExp("</body>","i"),new RegExp("</head>","i"),new RegExp("</svg>"),new RegExp("<\/script>","i")];let a,d;for(var u=0;u<s.length;++u){a=s[u].exec(t);const e=a&&a[0];if(e){d=e;break}}if(!d)return void e.logWarn(`Failed to inject refresh script! Couldn't find any of the tags : ${s}, from index.html`);const h=~d.indexOf("script")?d+"\n"+o:o+d;l(n,d,h)},v=e=>{let r;r=void 0===e||!1===e||"localhost"===e?"127.0.0.1":!0===e?void 0:e;return{host:r,name:"127.0.0.1"!==e&&"127.0.0.1"===r||"0.0.0.0"===r||"::"===r||void 0===r?"localhost":r}},g=(r,n)=>new Promise(((t,o)=>{let{port:i,host:s}=n;const c=t=>{"EADDRINUSE"===t.code?(e.logInfo(`Port ${i} is in use, trying another one...`),++n.port,r.listen(++i,s,(()=>{l(i)}))):(r.removeListener("error",c),a.shutdown(),o(t))},l=e=>{r.removeListener("error",c),t(e)};r.on("error",c),r.listen(i,s,(()=>{l(i)}))})),p=async e=>{(await Promise.resolve().then((()=>require("open"))))(e,{wait:!1})},w=({server:e,port:r,host:n,wait:t=2e3})=>{e&&e.addListener("upgrade",(function(e,r,n){var o,i,c=new s(e,r,n);c.onopen=function(){c.send("connected")},t>0&&(i=c.send,c.send=function(){var e=arguments;o&&clearTimeout(o),o=setTimeout((function(){i.apply(c,e)}),t)}),c.onclose=function(){a.clients=a.clients.filter((function(e){return e!==c}))},a.clients.push(c)}))},y=async(o,i,s)=>{f(s);var c=n();c.use("/",t(s,{etag:!0,dev:!0,single:!0}));const l=r.createServer(c);a.server=l,w({server:l});try{let r={port:i,host:o};try{await g(l,r)}catch(r){e.logError(r)}p(`http://${o}:${r.port}`),d(s),e.green("\nbuild preview server running at:\n");const n=v(r.host);e.printServerUrls(n,"http",r.port)}catch(e){throw e}};a.shutdown=()=>{var e=a.watcher;e&&e.close();var r=a.server;r&&r.close()},module.exports={runPreview:y};