Skip to content

Instantly share code, notes, and snippets.

@JakeCooper
Created November 5, 2021 01:05
Show Gist options
  • Save JakeCooper/3aa2233f4f068a07d0ab5f8ad5882850 to your computer and use it in GitHub Desktop.
Save JakeCooper/3aa2233f4f068a07d0ab5f8ad5882850 to your computer and use it in GitHub Desktop.
const swc = require("@swc/core");
const { exec, spawn } = require("child_process");
const chokidar = require("chokidar");
const fs = require("fs");
const { dirname, basename } = require("path");
const DEBOUNCE_TIME_MS = 100;
let options = {
jsc: {
parser: {
syntax: "typescript",
tsx: false,
dynamicImport: true,
},
target: "es5",
},
module: {
type: "commonjs",
},
};
let rootOut = "./dist";
let entrypoint = "src/index.ts";
let run_point = `${rootOut}/${entrypoint}`;
let appOut = `${rootOut}/${dirname(entrypoint)}`;
const mkdir_force = dir =>
!fs.existsSync(dir) && fs.mkdirSync(dir, { recursive: true });
mkdir_force(appOut);
let isWatch = () => process.argv.reduce((acc, curr) => acc || curr === "--watch", false)
let firstPass = true;
let program = {
pid: null,
}
let restart = () => {
if (program.pid != null) {
process.kill(program.pid, "SIGTERM");
}
console.log("\n===========================")
console.log(firstPass ? "\t Running\t": "\t Restarting\t");
console.log("===========================\n")
firstPass = false;
let cmd = exec(`node ${run_point}`);
cmd.stderr.on("data", data => process.stdout.write(data));
cmd.stdout.on("data", data => process.stdout.write(data));
cmd.on("exit", code => code != 0 && process.stdout.write(`\nNonzero Exit! ${code}\n`));
program.pid = cmd.pid;
}
let hotreloader = {
debouncer: setTimeout(restart, DEBOUNCE_TIME_MS),
program: null,
}
let hotreload = () => {
if (!(firstPass || isWatch())) return;
clearTimeout(hotreloader.debouncer)
hotreloader.debouncer = setTimeout(restart, DEBOUNCE_TIME_MS)
}
let start = () => {
chokidar.watch("./src/**/*.ts").on("all", (event, path) => {
let res = swc.transformFileSync(path, options);
let dist_path = dirname(path).split("/").slice(1).join("/");
mkdir_force(`${appOut}/${dist_path}`);
fs.writeFileSync(
`${appOut}/${dist_path}/${basename(path, ".ts")}.js`,
res.code,
);
hotreload();
});
}
start();
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment