revenge-bundle-next/scripts/dev.ts

52 lines
1.5 KiB
TypeScript
Raw Normal View History

2025-03-21 19:59:16 +07:00
import { join } from 'path'
import watcher from '@parcel/watcher'
import chalk from 'chalk'
import build from './build'
const cwdify = (path: string) => join(process.cwd(), path)
const Sources = ['src', 'lib', 'plugins'].map(cwdify)
const ExitTriggers = ['scripts', 'package.json', 'bun.lock'].map(cwdify)
function debounce<F extends (...args: any[]) => any>(func: F, timeout: number) {
let timer: NodeJS.Timer
return (...args: Parameters<F>) =>
new Promise(rs => {
clearTimeout(timer)
timer = setTimeout(() => {
rs(func(...args))
}, timeout)
})
}
const buildDevWithDebounceAndCatchErrors = debounce(async () => {
try {
return await build(true)
} catch (e) {
console.error(e)
}
}, 250)
watcher.subscribe(process.cwd(), async (err, events) => {
if (err) return console.error(err)
if (events.some(it => ExitTriggers.some(se => it.path.startsWith(se)))) {
console.error(chalk.redBright('\u26A0 Scripts or packages has changed, exiting!'))
process.exit()
}
if (events.some(it => Sources.some(src => it.path.startsWith(src)))) await buildDevWithDebounceAndCatchErrors()
})
const server = Bun.serve({
fetch(req, srv) {
console.debug(chalk.gray(`\u{1F79B} Receiving request from ${srv.requestIP(req)!.address}`))
return new Response(Bun.file('./dist/revenge.bundle'))
},
port: 4040,
})
console.info(chalk.cyanBright(`\u24D8 Serving on port ${server.port}`))
await buildDevWithDebounceAndCatchErrors()