browser-reloader
Version:
A lightweight, configurable file watcher with live-reload capability for browser development via WebSocket.
16 lines (14 loc) • 2.89 kB
JavaScript
var P=Object.defineProperty;var i=(e,o)=>()=>(e&&(o=e(e=0)),o);var D=(e,o)=>{for(var n in o)P(e,n,{get:o[n],enumerable:!0})};var r=i(()=>{"use strict"});var c,m=i(()=>{"use strict";r();c={watch:["."],ignore:["node_modules/**",".git/**"],debounce:300,quiet:!1}});function b(e,o){let n;return function(...l){clearTimeout(n),n=setTimeout(()=>e(...l),o)}}var R=i(()=>{"use strict";r()});import{Command as k,Option as f}from"commander";var g,C=i(()=>{"use strict";r();m();g=new k;g.name("reloader").description("Watch files and reload browsers on change based on ReloaderConfig").version("1.0.0").addOption(new f("-w, --watch <paths...>","Files or directories to watch").default(c.watch.slice())).addOption(new f("-i, --ignore <patterns...>","Glob patterns to ignore").argParser((e,o)=>o.concat(e)).default(c.ignore.slice())).addOption(new f("-d, --debounce <ms>","Debounce filesystem events (ms)").argParser(e=>parseInt(e,10)).default(c.debounce)).addOption(new f("--quiet","Suppress non-error output").default(c.quiet)).action(()=>{Promise.resolve().then(()=>(u(),x)).then(({reloader:e})=>{e()})})});var $,y=i(()=>{"use strict";r();$=process.cwd()});import{cosmiconfigSync as I}from"cosmiconfig";import{TypeScriptLoader as A}from"cosmiconfig-typescript-loader";var t,j,S,E,L,h,v=i(()=>{"use strict";r();C();y();m();t="reloader",j=g.opts(),S=j.config||null,E=I(t,{searchPlaces:["package.json",`.${t}rc`,`.${t}rc.json`,`.${t}rc.yaml`,`.${t}rc.yml`,`.${t}rc.js`,`.${t}rc.ts`,`.${t}rc.cjs`,`${t}.config.js`,`${t}.config.ts`,`${t}.config.cjs`].concat(S?[S]:[]),loaders:{".ts":A()}}),L=E.search($),h={...c,...L?.config,...j}});var x={};D(x,{reloader:()=>F});import W from"express";import B from"http";import{WebSocketServer as H}from"ws";import N from"chokidar";function F(e){let o={...h,...e,ignore:[...h.ignore].concat(e?.ignore||[])},n=W(),l=B.createServer(n),q=new H({server:l}),O=N.watch(o.watch,{ignored:o.ignore,ignoreInitial:!0}),T=(a=>b(a,o.debounce))(()=>{q.clients.forEach(a=>{a.readyState===1&&a.send("reload")}),o.quiet||console.log("\u{1F501} Reload broadcast sent to clients.")});O.on("change",a=>{o.quiet||console.log(`\u{1F4C1} File changed: ${a}`),T()}),n.get("/reloader.js",(a,p)=>{let _=`
try {
const rh = new URL(
Array.from(document.scripts).find((s) => s.src.includes("reloader.js"))
?.src || ""
);
const ws = new WebSocket("ws://" + rh?.host);
ws.onmessage = ({ data }) => {
if (data === "reload") location.reload();
};
} catch {
console.log("Reloader initialize failed");
}
`;p.setHeader("Content-Type","application/javascript"),p.writeHead(200),p.end(_)});let w=43878;l.listen(w,()=>{o.quiet||console.log(`Reloader server running at http://localhost:${w}`)})}var u=i(()=>{"use strict";r();R();v()});r();m();u();export{F as reloader};