Files
sapien/server/dev.js
2026-05-14 12:44:15 -05:00

50 lines
1.3 KiB
JavaScript

import { spawn } from 'node:child_process'
import fs from 'node:fs'
const loadLocalEnv = () => {
if (!fs.existsSync('.env.local')) return {}
return Object.fromEntries(
fs.readFileSync('.env.local', 'utf8')
.split(/\r?\n/)
.map((line) => line.trim())
.filter((line) => line && !line.startsWith('#') && line.includes('='))
.map((line) => {
const index = line.indexOf('=')
return [line.slice(0, index), line.slice(index + 1).replace(/^["']|["']$/g, '')]
}),
)
}
const env = { ...process.env, ...loadLocalEnv() }
const processes = [
spawn(process.execPath, ['server/server.js'], {
stdio: 'inherit',
env: { ...env, PORT: env.PORT || '3001', DEV_SEED_MEMBERS: env.DEV_SEED_MEMBERS || 'true' },
}),
spawn(process.execPath, ['node_modules/vite/bin/vite.js', '--host'], {
stdio: 'inherit',
env,
}),
]
let isShuttingDown = false
const shutdown = (code = 0) => {
if (isShuttingDown) return
isShuttingDown = true
for (const child of processes) {
if (!child.killed) child.kill('SIGTERM')
}
process.exit(code)
}
for (const child of processes) {
child.on('exit', (code) => {
if (!isShuttingDown && code !== 0) shutdown(code || 1)
})
}
process.on('SIGINT', () => shutdown(0))
process.on('SIGTERM', () => shutdown(0))