braindrops.nicwands.com/bin/dev.js
2026-07-23 15:27:12 -04:00

92 lines
2.4 KiB
JavaScript

import { spawn } from 'child_process'
import fs from 'fs'
import path from 'path'
import { fileURLToPath } from 'url'
const __dirname = path.dirname(fileURLToPath(import.meta.url))
const dropsDir = path.join(__dirname, '../drops')
// Get drop name from command line args
const dropName = process.argv[2]
if (!dropName) {
console.error('❌ Error: Please specify a drop name')
console.log('Usage: npm run dev <drop-name>')
console.log('\nAvailable drops:')
const drops = fs
.readdirSync(dropsDir, { withFileTypes: true })
.filter((dirent) => dirent.isDirectory())
.map((dirent) => dirent.name)
drops.forEach((drop) => console.log(` - ${drop}`))
process.exit(1)
}
const dropPath = path.join(dropsDir, dropName)
if (!fs.existsSync(dropPath)) {
console.error(`❌ Error: Drop "${dropName}" does not exist`)
process.exit(1)
}
console.log(`\n🚀 Starting dev environment for: ${dropName}\n`)
console.log(`📦 Drop dev server: http://localhost:3000`)
console.log(`📝 CMS: http://localhost:8787`)
console.log(`⚡ Backend: http://localhost:3001/api/${dropName}`)
console.log(` WebSocket: ws://localhost:3001/ws/${dropName}\n`)
// Start drop dev server
const dropProcess = spawn('npm', ['run', 'dev'], {
cwd: dropPath,
stdio: 'inherit',
shell: true,
})
// Start CMS with DROP_NAME environment variable
const cmsProcess = spawn('npm', ['run', 'dev', '-w', 'cms'], {
cwd: path.join(__dirname, '..'),
stdio: 'inherit',
shell: true,
env: {
...process.env,
DROP_NAME: dropName,
},
})
// Start backend server with DROP_NAME environment variable
const backendProcess = spawn('npm', ['run', 'dev', '-w', 'backend'], {
cwd: path.join(__dirname, '..'),
stdio: 'inherit',
shell: true,
env: {
...process.env,
DROP_NAME: dropName,
NODE_ENV: 'development',
},
})
// Handle process cleanup
const cleanup = () => {
console.log('\n\n🛑 Shutting down dev servers...')
dropProcess.kill()
cmsProcess.kill()
backendProcess.kill()
process.exit(0)
}
process.on('SIGINT', cleanup)
process.on('SIGTERM', cleanup)
dropProcess.on('error', (err) => {
console.error('❌ Drop server error:', err)
cleanup()
})
cmsProcess.on('error', (err) => {
console.error('❌ CMS server error:', err)
cleanup()
})
backendProcess.on('error', (err) => {
console.error('❌ Backend server error:', err)
cleanup()
})