#!/usr/bin/env node /** * Development helper script for Insertr * Provides common development tasks and utilities */ import { execSync, spawn } from 'child_process'; import fs from 'fs'; import path from 'path'; const commands = { serve: { description: 'Start full-stack development (demo + API server)', action: () => { console.log('šŸš€ Starting Full-Stack Insertr Development...'); console.log('šŸ“‚ Demo site: http://localhost:3000'); console.log('šŸ”Œ API server: http://localhost:8080'); console.log('šŸ’¾ Content persistence: ENABLED'); console.log('\nāš ļø This command uses justfile orchestration - redirecting to "just dev-full"...\n'); // Use justfile for proper orchestration const { execSync } = require('child_process'); try { execSync('just dev-full', { stdio: 'inherit' }); } catch (error) { console.log('\nšŸ’” Alternative: Start components separately:'); console.log(' Terminal 1: just server'); console.log(' Terminal 2: just demo-only'); process.exit(1); } } }, check: { description: 'Check project status and validate setup', action: () => { console.log('šŸ” Checking Insertr project status...\n'); // Check files exist const requiredFiles = [ 'demo-site/index.html', 'demo-site/about.html', 'lib/dist/insertr.js', 'lib/dist/insertr.min.js', 'insertr-server/cmd/server/main.go', 'package.json' ]; const optionalFiles = [ 'insertr-cli/insertr', 'insertr-server/insertr-server' ]; let allGood = true; requiredFiles.forEach(file => { if (fs.existsSync(file)) { console.log('āœ…', file); } else { console.log('āŒ', file, '(missing)'); allGood = false; } }); // Check optional files console.log('\nšŸ“¦ Build artifacts:'); optionalFiles.forEach(file => { if (fs.existsSync(file)) { console.log('āœ…', file, '(built)'); } else { console.log('⚪', file, '(not built - run "just build")'); } }); if (allGood) { console.log('\nšŸŽ‰ All core files present!'); console.log('\nšŸ“Š Project stats:'); // Count editable elements const indexContent = fs.readFileSync('demo-site/index.html', 'utf8'); const aboutContent = fs.readFileSync('demo-site/about.html', 'utf8'); const insertrMatches = (indexContent + aboutContent).match(/class="insertr"/g) || []; console.log(` šŸ“ Editable elements: ${insertrMatches.length}`); // Check library size const libSize = fs.statSync('lib/dist/insertr.js').size; console.log(` šŸ“¦ Library size: ${(libSize / 1024).toFixed(1)}KB`); console.log('\nšŸš€ Development options:'); console.log(' npm run dev - Full-stack development (recommended)'); console.log(' just dev - Full-stack development (recommended)'); console.log(' just demo-only - Demo site only (no persistence)'); console.log(' just server - API server only (localhost:8080)'); console.log('\nšŸ’” Primary workflow: npm run dev or just dev'); } else { console.log('\nāŒ Some files are missing. Please check your setup.'); process.exit(1); } } }, demo: { description: 'Show demo instructions', action: () => { console.log('šŸŽ¬ Insertr Demo Instructions\n'); console.log('1. 🌐 Start server: npm run serve'); console.log('2. šŸ‘€ Customer view: Browse the site normally'); console.log('3. šŸ”‘ Client login: Click "Login as Client"'); console.log('4. āœļø Edit mode: Click "Edit Mode: Off" to enable editing'); console.log('5. šŸ“ Edit content: Click any āœļø button to edit'); console.log('6. šŸ”„ Try different content types (simple text vs rich markdown)'); console.log('7. šŸ“„ Multi-page: Navigate to About page to see persistence\n'); console.log('šŸŽÆ Key features to test:'); console.log(' • Inline text editing'); console.log(' • Markdown editing for rich content'); console.log(' • Auto-save with visual feedback'); console.log(' • Content persistence across pages'); console.log(' • Responsive design on mobile\n'); } } }; // Parse command line arguments const command = process.argv[2] || 'help'; if (commands[command]) { commands[command].action(); } else if (command === 'help' || command === '--help' || command === '-h') { console.log('šŸ› ļø Insertr Development Helper\n'); console.log('Available commands:\n'); Object.entries(commands).forEach(([name, cmd]) => { console.log(` ${name.padEnd(12)} ${cmd.description}`); }); console.log('\nUsage: node scripts/dev.js '); console.log(' or: npm run check\n'); } else { console.log(`āŒ Unknown command: ${command}`); console.log('Run: node scripts/dev.js help'); process.exit(1); }