revenge-bundle-next/scripts/dev.ts

82 lines
2.4 KiB
TypeScript
Raw Normal View History

2025-03-21 19:59:16 +07:00
import watcher from '@parcel/watcher'
2025-04-15 14:22:41 +07:00
import { debounce } from '@revenge-mod/utils/callbacks'
2025-03-21 19:59:16 +07:00
import chalk from 'chalk'
2025-06-03 16:24:58 +07:00
import os from 'os'
import { join } from 'path'
import pkg from '../package.json'
2025-05-05 21:17:42 +07:00
import build from './build'
const prod = process.argv.includes('--prod')
const lanHost = process.argv.includes('--lan')
console.info(chalk.redBright(`\nRevenge ${chalk.white(`v${pkg.version}`)}\n`))
2025-03-21 19:59:16 +07:00
const cwdify = (path: string) => join(process.cwd(), path)
const Sources = ['src', 'lib', 'plugins'].map(cwdify)
2025-06-03 16:24:58 +07:00
const ExitTriggers = [
'scripts',
'shims',
'package.json',
'bun.lock',
'tsconfig.json',
].map(cwdify)
2025-03-21 19:59:16 +07:00
2025-06-03 16:24:58 +07:00
const debouncedBuildDev = debounce(
() => ((needRebuild = false), build(true).catch(console.error)),
250,
)
2025-03-21 19:59:16 +07:00
let needRebuild = true
watcher.subscribe(process.cwd(), (err, events) => {
2025-03-21 19:59:16 +07:00
if (err) return console.error(err)
if (events.some(it => ExitTriggers.some(se => it.path.startsWith(se)))) {
2025-06-03 16:24:58 +07:00
console.error(
chalk.redBright(
'\u26A0 Scripts, packages, shims, or tsconfig.json has changed, exiting!',
),
)
2025-03-21 19:59:16 +07:00
process.exit()
}
2025-06-03 16:24:58 +07:00
needRebuild ||= events.some(it =>
Sources.some(src => it.path.startsWith(src)),
)
2025-03-21 19:59:16 +07:00
})
const server = Bun.serve({
hostname: lanHost ? '0.0.0.0' : '127.0.0.1',
async fetch(req, srv) {
if (needRebuild) await debouncedBuildDev()
2025-06-03 16:24:58 +07:00
console.debug(
chalk.gray(
`\u{1F79B} Receiving request from ${srv.requestIP(req)!.address}`,
),
)
2025-03-21 19:59:16 +07:00
return new Response(Bun.file('./dist/revenge.bundle'))
},
port: 4040,
})
if (lanHost) console.info(chalk.gray('\u24D8 Listening on all interfaces...'))
2025-06-03 16:24:58 +07:00
else
console.info(
chalk.gray(
'\u24D8 Listening locally... Use --lan to listen on all interfaces',
),
)
if (!prod) console.info(chalk.gray('\u24D8 Use --prod to build for production'))
else console.info(chalk.gray('\u24D8 Building for production...'))
2025-03-21 19:59:16 +07:00
console.info(chalk.cyanBright(`\u24D8 Serving on port ${server.port}`))
console.info(chalk.gray('\u24D8 Accessible on:'))
for (const int of Object.values(os.networkInterfaces()))
if (int)
for (const det of int) {
if (det.family !== 'IPv4' || (!det.internal && !lanHost)) continue
console.info(chalk.gray(`- http://${det.address}:${server.port}`))
}