rprcli
Version:
Reaper.js is a powerful TypeScript-based framework designed to streamline backend development. It offers built-in database migrations, seeders, and SQL query utilities, making it easy to manage data efficiently. With native support for TSX and JSX renderi
73 lines (63 loc) • 2.02 kB
JavaScript
const build = require("./build");
const start = require("./start");
const chokidar = require("chokidar");
const { reloadApp } = require("reaperjs/server/lib/load");
const logger = require("../utils/logger")
logger.info("Starting up dev server...");
module.exports = () => {
const cwd = process.cwd();
let server = null;
let sockets = null;
let buildTimeout = null;
const DEBOUNCE_DELAY = 500;
const stopServer = async () => {
if (server) {
await new Promise((resolve, reject) => {
sockets();
server.close((err) => {
if (err) {
reject(err);
} else {
resolve();
}
});
});
server = null;
}
};
const restart = async (count = 2) => {
await stopServer();
if(count == 2){
logger.startLoading('Building server...')
}
try {
reloadApp();
await build.client();
await build.server();
web = start(null,()=>{
if(count == 1){
const port = process.env.SERVER_PORT?process.env.SERVER_PORT : 3000;
logger.stopLoading(`Server is running on port ${port}`)
}
});
server = web.server;
sockets = web.closeWebsockets;
} catch (err) {
logger.error(err);
}
if (count > 1) {
setTimeout(() => restart(count - 1), 1000);
}
};
// Watch for file changes
const watcher = chokidar.watch(cwd, {
ignored: /node_modules|\.git|\.reaper/,
persistent: true,
});
watcher.on("change", (filePath) => {
reloadApp();
clearTimeout(buildTimeout);
buildTimeout = setTimeout(() => restart(2), DEBOUNCE_DELAY); // Restart twice on changes
});
restart(2); // Initial start with two restarts
};