| | #!/usr/bin/env node |
| |
|
| | import { spawn } from 'child_process'; |
| | import { join, dirname } from 'path'; |
| | import { fileURLToPath } from 'url'; |
| |
|
| | const __filename = fileURLToPath(import.meta.url); |
| | const __dirname = dirname(__filename); |
| |
|
| | console.log('π Starting development server with LaTeX watching...\n'); |
| |
|
| | |
| | function startProcess(command, args, cwd, name, color) { |
| | const process = spawn(command, args, { |
| | cwd, |
| | stdio: 'pipe', |
| | shell: true |
| | }); |
| |
|
| | |
| | const colors = { |
| | reset: '\x1b[0m', |
| | bright: '\x1b[1m', |
| | red: '\x1b[31m', |
| | green: '\x1b[32m', |
| | yellow: '\x1b[33m', |
| | blue: '\x1b[34m', |
| | magenta: '\x1b[35m', |
| | cyan: '\x1b[36m' |
| | }; |
| |
|
| | const prefix = `${colors[color]}[${name}]${colors.reset}`; |
| |
|
| | process.stdout.on('data', (data) => { |
| | const lines = data.toString().split('\n').filter(line => line.trim()); |
| | lines.forEach(line => { |
| | console.log(`${prefix} ${line}`); |
| | }); |
| | }); |
| |
|
| | process.stderr.on('data', (data) => { |
| | const lines = data.toString().split('\n').filter(line => line.trim()); |
| | lines.forEach(line => { |
| | console.log(`${prefix} ${colors.red}${line}${colors.reset}`); |
| | }); |
| | }); |
| |
|
| | process.on('close', (code) => { |
| | console.log(`${prefix} ${colors.red}Process exited with code ${code}${colors.reset}`); |
| | }); |
| |
|
| | return process; |
| | } |
| |
|
| | |
| | console.log('π Converting LaTeX to MDX initially...'); |
| | const initialConvert = spawn('npm', ['run', 'latex:convert'], { |
| | cwd: join(__dirname, '..'), |
| | stdio: 'inherit' |
| | }); |
| |
|
| | initialConvert.on('close', (code) => { |
| | if (code === 0) { |
| | console.log('β
Initial LaTeX conversion completed!\n'); |
| |
|
| | |
| | const latexWatcher = startProcess( |
| | 'npm', |
| | ['run', 'latex:watch'], |
| | join(__dirname, '..'), |
| | 'LaTeX', |
| | 'blue' |
| | ); |
| |
|
| | |
| | const astroServer = startProcess( |
| | 'npm', |
| | ['run', 'dev'], |
| | join(__dirname, '..'), |
| | 'Astro', |
| | 'green' |
| | ); |
| |
|
| | |
| | process.on('SIGINT', () => { |
| | console.log('\nπ Shutting down development servers...'); |
| | latexWatcher.kill(); |
| | astroServer.kill(); |
| | process.exit(0); |
| | }); |
| |
|
| | console.log('π Development environment ready!'); |
| | console.log(' π LaTeX files: Watch mode active for scripts/latex-to-mdx/input/'); |
| | console.log(' π Astro server: http://localhost:4321'); |
| | console.log(' π Any change in LaTeX input/ will auto-regenerate MDX\n'); |
| |
|
| | } else { |
| | console.error('β Initial LaTeX conversion failed!'); |
| | process.exit(1); |
| | } |
| | }); |
| |
|