Created
November 5, 2021 01:05
-
-
Save JakeCooper/3aa2233f4f068a07d0ab5f8ad5882850 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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